remove reflections in XmlBeans

git-svn-id: https://svn.apache.org/repos/asf/xmlbeans/trunk@1879046 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES.txt b/CHANGES.txt
index e1de461..5c776a7 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,14 @@
-Changes in V3.0.3 since V3.0.2
+Changes in V4.0.0 since V3.1.0
 
+* XMLBEANS-548: XmlDocumentProperties.setStandalone is ignored when saving
+* XMLBEANS-542: SAX Parsing should not fail if parser does not allow the setting of declaration-handler
+* XMLBEANS-541, XMLBEANS-544, XMLBEANS-545: Fixes to ant build scripts
+* XMLBEANS-540: Prevent trim of elements when pretty print is used
+* XMLBEANS-539: Support Saxon-HE 10 as an XPath engine
+
+Changes in V3.1.0 since V3.0.2
+
+* update build and deployment artifacts to standardize naming and remove unused items 
 * XMLBEANS-502: Allow to clear all ThreadLocals from the current thread
 * XMLBEANS-503: Allow to specify -nowarn in the Ant task
 * XMLBEANS-537: Add missing StscState.end() to avoid memory leaks
diff --git a/KEYS b/KEYS
index bb73098..6f0a569 100644
--- a/KEYS
+++ b/KEYS
@@ -2749,4 +2749,98 @@
 egfcIxtZ0AuggFN6ijBJqATbj0DlomeKrnHLVloD6lEDgB/j0SoYsGbv9kpYPqvU
 lSeSg2C31/20JYI=
 =/nGR
+-----END PGP PUBLIC KEY BLOCK-----
+pub   2048R/1556F3A4 2016-10-04
+uid                  Greg Woolsey <gwoolsey@apache.org>
+uid                  Greg Woolsey (personal) <greg.woolsey@gmail.com>
+sub   2048R/8CF53C56 2016-10-04
+sub   4096R/D5718BA4 2017-01-09
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBFfz7TQBCAC8O+eiVCz76SgBDty51fYXvp9IfIBNyVSCa5tOQiasICmXAZjn
+L0EZqLtoZheR1z7qYV2zgDX0goGYx2NukWB4X1nrbVRQgmTOIoyNZ36L6BTV32Is
+0v1gcPrFshenQoGna+VlUl5W/W13CdvmqeP2CUwOcPD2Wk+ySD4sBa4V3/hmLvjw
+3ARek8c8/E7ctdMJ29iMPlnf9lIHzeCg2p9Gv+SUO9codZs7+n5cZHLA32mgek6P
+eh7fuyh/2U34EnILeXgkiv80afn9udPYDNAjDZhOD3b72YcjSrBFN4GbShF71jkw
+VX30E2t/lGGXpa3yhK7Qcjy+f7RFyvUdTipbABEBAAG0MEdyZWcgV29vbHNleSAo
+cGVyc29uYWwpIDxncmVnLndvb2xzZXlAZ21haWwuY29tPokBOAQTAQIAIgUCV/Pt
+NAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQLRXlShVW86SRXgf/QvbE
+HWBOILgbysKjDcy34r9S5sf8fgawxTSTXoQaEQoANebz/ooR1wDgc+yvOvcAtDaO
+y5ukO73oE6pIT7x9FGoELQtbvSSSIornG6IK93xidbLwYRK4oPDmiOyIeTsfEUVX
+Lp0HgbDhadWZwQaSgP4kQPROZcP34u9YozqEFIdvVO4G0VZGK/GakwC21tL8t1e6
+DaialULlCTMma42nxHuKxpDpPlJuAr3JtUM+Q9153P9xLIhdh2cmQ4XrHI6eWo6j
+PLatowbPDzYdevr5OYH6bjO/q47TzNZQakLThxE4fA84zpBqcrnhWreCT+umme6s
+g3NXyen1z9cDjyV994kCHAQTAQIABgUCWHch5gAKCRDmZ3rGi6vdbMorD/sHmSER
+4I3nW6VWaIihcaaqzzA+kPwlMc1aP5y7hfGpic/gUa8I2VX69tPnryfjD22Xvtzw
+mX0FuNWDyvDczlgXl+xCeRdykAhQYqRHH+To65mMHVTN4m0wsz3zhuY4C6Tx79D8
+BJtzk14gfmkn4mzMP+vTF0rlGVccN84Ysrnf9AhEyatNvyPrejnrOmYQziN1nLPf
+K7L3tox6a7sciOxM3jfTd5t4pUO+ZcWLGnmtssBGC5mZ3SSuxFLMVLvQ/vYRHBSc
+J/FGP2bSZ/e3e9k4UAB51GZnwjhR6JbGx6K2qTYh1Lnr6BffLmDEkV+XfUI9Y5xg
+mNmq8NEC8EisA5eLYeMXnqDUgp+/pCwfk4+bX8OZ1MGDOx6Q2kI6JqEXtFYMXgcb
+EYNyoZygIunNJAPzuPy2DjLO79PhZlV97UTJ9mup/UlQPHMEy+WbsnCIkf5Dh5T/
+1EdhBkWrUAMDcbQI/8i0Cxnyqdu+gnL0zxmyMut+gzVSzaAEEUlxOs7oZLz/SUsd
+MQeyCGsuU/4L/j4DxWOkHuC65TIdb6wf6chGa72Q9zZzrPbG2j8+B4EGPAs6c8L4
+UzTFtMTL6iL5B8BkkBhaf10EBuNKQWpu85dFcJfLNi4JTRc5oe7apbWIefLoI+k1
+Rl6DdZ0088+B1bc2kA0QSYZ3kIkAvKcaIX54DrQiR3JlZyBXb29sc2V5IDxnd29v
+bHNleUBhcGFjaGUub3JnPokBOAQTAQIAIgUCWHPLIAIbAwYLCQgHAwIGFQgCCQoL
+BBYCAwECHgECF4AACgkQLRXlShVW86Tk2gf+LDN1vEw7SIdes+3XaYalaDPaSWnA
+HpLwpFTRHjy7knNL006ttx3yrH2+kuKSTy+D/XCty2U8gPFV8KbPSXWUgkwzJgbA
+VzzbwvpXgN7Dlt5oLFajF56F4Ba5ZS0rOUvrz43cbb7t1SodUfNl0rvlWdEBmGbJ
+smTzDCuzX8D0zTGI2x4bgBRbtzTtrZ866EEE5NT0LGClAl+HElTyzRCmabzFSnaV
+TwLZTMI0Z1ZXZ/HIE/fFraddjM1SllDrRMGrKzmFtH3ryQlhJBX1m5/6WsOyn7xE
+FRXc8IJmkli0yu5gg3HS6apLR0NglDwFrS0gkEIcoipv8/hSz6hCymZnRIkCHAQT
+AQIABgUCWHch2gAKCRDmZ3rGi6vdbJ1nD/9Q/v+TomMOSS/dm1EklT1p8YkCMVYA
+ToPYi7mkBFdjfrRMozYEVaUZKEo2Cc/xwWkvqfyls4afSZ+2k+1jpp8DQCA69KXx
+htltTXdHAOnAQ/MrFZ0h833XKNYxHEw5nIwiq2RDUBLA5vHJ7HLxUQW3wHNXwACm
+HaAXq3a78gfv52YRqUvHJL2X0MhJ6mxtok6f0m0yqXXbdk6lPXxCkjiWbbia4jZY
+aoCdTLam+8lvDFC0m4NF3NOw9b8aIZmy/ZHgU3KyWgItG2FjKLdHGQcxgEg8Mgkj
+WT24KuURIf+cMM4zClmFwQIzWBnCmzlIJMo96LogywkTYQ1+QxqTAQXbSwlawGHH
+yXE+8Daa3q4svJCaOuP3TjTTTo17Ef554JTTIQDsPfd9DdtKvKfb1BLVZhcyMRCH
+0cl/tXMt62frgDgK2Fm9+s8wJhDmURAPSyMcLUH0L4g15huTOGgQkJscuueD9PLD
+SXjsrJ5vYbGr/sf+KPBNMh8Ajms7VlWlAzyrGU7TWCrQfr6DIkKVXWjm8g9NclkG
+gg3E2Y8dA4ZNlLSm7Cq3mmv1Y+KvXmVgJYOE0oHQhsVSAQTdgJ3+ZKp2OnpNACfn
+BUhHZw5VBPoHmEKKxVisxvhj8zYGu3eC3KpOFuF6WGlKlnL+vmsUNlHC52Q167tn
+zgxnEbre0TAbp7kBDQRX8+00AQgAo4qasXoWEZkjgWqsNLSecysZ3o+7BYRxv4xu
+I07x5sGjTKEqbNEW8jiBgur25nnLEWILYH2HMPdbOD21wBkJyCJ8qxfyxWy79bv/
+HUkwOWwLe7BPV912kmzk8DTLHJpQlhvQ1okXdUw6U66/OA69JgA1xwSIq3OiVTD/
+hgdHiKbmbXzjETeLK/lAYxuWL7PpRkuDlTCFvD+Tnns1j9B3C3ybkj3r7oRXQ/sr
+NVG8R53AGmiihmkRtViE6D+/wjJ8OKm73XYGECYuIuQuKjpJufy/eCyImZ6APHcu
+M3LQfzBJmvI8MvOSPBNvjyO1v/OYX7/lM2ChvDsoXv7KsLqH1wARAQABiQEfBBgB
+AgAJBQJX8+00AhsMAAoJEC0V5UoVVvOkfDkIAITaVfsvNc5BUHoDKaEvHGihLqKm
+NrzcLuQuvYttAVm8mCfSLsf1VvDTwOh2zMswF6OOVN8IlehGPyeByDiV60+zYAk5
+9a/UL3iVvlAnYMDYweOVIC+pfvjXOEbJRh6PIuDKDH77xotmlMsLF4ZTDQt5VLzY
+tn9yB5aCdaQYOfdIQbxZbVzBnGc9Qb89u9d1pzPN3GJo9aCVNs5cB+EsDtbAltK0
+Bx2diGvuXtNGUY4AtnyDcOyWPF8e/Tf/Yl9qWJ8DN9CiFwWDSpMAUxveZSuC9CbB
+LxsUrhzlD5FFuE13hjDe3Wy+fG+2OghF9VehA7xdEhbyGW15MTB9kHNXy/u5Ag0E
+WHPICAEQANLw5I8gBGTvt5WRb3Xja325LY6DkPj1GexZO3NiAT4BoAuK+Pub2eII
+iws0kF1UT13LKOvruzeKza1mJylNGzwwcV/NW5q3i398RWcAw3cF0Zz9E6+GSx9+
+r35CylciO72ACQzINbDvxwvN4DVRKNitpjeAnzDRm7gdISkFjSgFgey4hLxBR3BE
+3J0BB2l1A/xn2RwVs+/4YG37Dc1tJBKI33KR3dtmjTtb9v5A5YktdDOAK0Oo617B
+WS6VioP5DpKOL1LkvKpA5yPs3JCx3FZ2PD/4UMX66WLkierPq7vZ9rMk6BFqpVI+
+OfLrDobITzOVlqsYFuJcxW5DVohoiVrQi94vvV25m1KZ92DY80z7NoJL3tQiJ48j
+bskgxWPi8w3M+/AebnfjEaRjSomUlMzxr5+/slTueNZGADUBIoOCY3N/yCqe3X36
+JvJC7tmpi3ckpTxy1YrUepeJUmLsTX7MY0Ta/Gj3mbq3iP5Ofp1R4isjWgj0tmi6
+Md5K5MBayy4ZzNNIFphGGXTqgP6U8WpjV3vAdq8Ll5aPKlqpiJf4ALaIjNWGiJRb
+xocXqEC4iN5gbL15jwh0VM+CY6zy+XffF1pN6fFJMX80csxirhYzNbDPQeAsp8TH
++gopEP7t3ezpUMnEatcChXyErIwXuxgysbV+syCIZuGuKPzCxtuxABEBAAGJAz4E
+GAECAAkFAlhzyAgCGwICKQkQLRXlShVW86TBXSAEGQECAAYFAlhzyAgACgkQ2Ydr
+uNVxi6Tdug//bNCLnSQDSPuVTP5IBggeSMniSfVbwDiQiDxtmdlLtVF9fnofGjEa
+NadzxhKyz8QZXnsJgbpQ47WKeJcuJlCi6COR2gAs6gpCk4i8tjJpGnP34D5mDEnb
+7MxM78+GPLIOGktnByXv1xxxixpZBRAthmGVI1kHo5NtzCUvKIeQLlDtmquPCThI
+ZYpSBf9FFh8iJDXsnnoomeYp4YOcN4x0JRdfAU4NowFRxf6JV8VDts3VPL75lq9z
+he+ICdGxRVWPfJ+9UTeeUmYSxdYnTVVcnNYCIeS6VjwzXLjFTnAZUAhnShAly6pi
+F+mpg7FRDHxdulxQuIuCmpNWp6PHEeI2ynHX/5NyJ+90HeuDi+UC4kUc2PB2NNzt
+79GprNnWiR8J7Zz00lisX5oD82IXKl1RnbgDMK1GafeLJwsfGEt3cUXyIyp+F5xW
+Qp4nxSlGenEpi0ZIPUNoHMB7QTPG/mqVDHqNFvXRY6JiwXUZRvW88h45vNJ+V6np
+Aa4eaNDQIKkawEcKMnpdL3okF8yWTT/7YTvpFMWGbC6zjFFemqxjc/y+eRMu9m+U
+r9BHs8a6DtfGHlP55bx4+PA4nrRIj367wshLZQIj0i/vMue5sSxLKN8iM6rvaOaZ
+XgwcGHx6+g33c9v+BwzH/OVdNKypvluhm5DU+LXL1bb9QH0DMFWL0T26ZAf/RtvQ
+SiyzKFTrb0uFZs6ZOsgTzpI50LlM4Jkq4ejD7Bay5ZokH3rNM66JjDtnrzE2qpCp
+LrvphHvbH5G2uOiirM5GjHwyXV1oYIIkXP3DMtc8biqZoGR22SLDsFORvUCYRHfk
+MQbJRK/Bz9lZLhVWNUIIbq5WCBGQeeqsWu5E8XkOnaKnjamJ2LbvuSOHgDv4Vslf
+cOgiy5G0KyQ1Nnm7tKWDFw6rtY2DuVu78ql0mgAh7VXXu0/QiKBC3xUenr3HOg1S
+3w1duYfKrRYa7dLqI607wiz03pgmicV7JfWZH5ythHnOImQGnlzWGpyBElYTpUyg
+NTeD7OEx91V/30fH3Q==
+=Jrt1
 -----END PGP PUBLIC KEY BLOCK-----
\ No newline at end of file
diff --git a/README.txt b/README.txt
index 445390b..1cfd6a9 100644
--- a/README.txt
+++ b/README.txt
@@ -18,13 +18,13 @@
 Layout of the tree:
 - README.txt    this file
 - build.xml     ant build file for building XmlBeans code and utilities
-- testbuild.xml ant build file for building and running tests
 - STATUS        essential info about the project
 - xbeanenv.cmd  sets the XMLBEANS_HOME environment variable on Windows
 - xbeanenv.sh   sets the XMLBEANS_HOME environment variable on Unix
 - bin           contains useful command-line scripts for Win and Unix
 - docs          contains several documentation files
-- external      contains external jars upon which XmlBeans depends
+- javadocs      API documentation
+- maven-plugin  source and documentation on using the xmlbeans2 Maven plugin
 - samples       contains ... samples
 - src           the source code for XmlBeans, organized by area
 - test          contains test cases and infrastructure
@@ -54,4 +54,4 @@
 (O) means that the library is optional
 
 For licensing information, see ./src/license/LICENSE.txt
-Updated: 11/25/09.
+Updated: 3/22/2019.
diff --git a/STATUS b/STATUS
index 41d2cdf..689736b 100644
--- a/STATUS
+++ b/STATUS
@@ -10,6 +10,7 @@
 Jacob Danner            jacob dot danner at gmail.com
 Wing Yew Poon           wing.yew.poon at oracle dot com
 
+Apache POI team
 
 FAQ:
 
diff --git a/build.xml b/build.xml
index 1a5270c..13d8079 100644
--- a/build.xml
+++ b/build.xml
@@ -17,27 +17,58 @@
      xmlns:mvn="antlib:org.apache.maven.artifact.ant"
      xmlns:if="ant:if" xmlns:unless="ant:unless">
 
-    <property name="build.compiler" value="javac1.6"/>
-    <property name="ant.build.javac.source" value="1.6"/>
-    <property name="ant.build.javac.target" value="1.6"/>
+    <property name="build.compiler" value="javac1.8"/>
+    <property name="ant.build.javac.source" value="1.8"/>
+    <property name="ant.build.javac.target" value="1.8"/>
 
-    <property name="version.base" value="3.0.3"/>
-    <property name="version.rc" value=""/>
+    <property name="version.base" value="4.0.0"/>
+    <property name="version.rc" value="rc0"/>
 
-    <property name="repository.m2" value="http://repo1.maven.org"/>
+    <property name="repository.m2" value="https://repo1.maven.org/maven2"/>
     <property environment="ENV"/>
 
-    <property name="compile.lib" location="compile-lib"/>
+    <scriptdef name="dependency" language="javascript" description="define properties for library dependency">
+        <attribute name="prefix"/>
+        <attribute name="artifact"/>
+        <attribute name="usage"/>
+        <attribute name="packaging"/>
+        <attribute name="repo"/>
+        <attribute name="snapshot"/>
+        <attribute name="query"/>
+        <attribute name="target"/>
+        <![CDATA[
+            var parts = attributes.get("artifact").split(/:/);
+            var packaging = attributes.get("packaging") || "jar";
+            var version = attributes.get("snapshot") || parts[2];
+            var repo = attributes.get("repo");
+            if (repo == null) {
+                repo = project.getProperty("repository.m2");
+            }
+            var query = attributes.get("query") || "";
+            var usageDir = attributes.get("usage");
+            usageDir = project.getProperty("basedir")+(usageDir.charAt(0) == '/' ? "" : "/lib/")+usageDir;
+            var jarLoc = usageDir+"/"+(attributes.get("target")||(parts[1]+"-"+parts[2]+"."+packaging));
+            var urlLoc = repo+"/"+parts[0].replace(/\./g,"/")+"/"+parts[1]+"/"+parts[2]+"/"+
+                parts[1]+"-"+(attributes.get("snapshot") || parts[2])+"."+packaging+query;
+            project.setProperty(attributes.get("prefix")+"."+packaging, jarLoc);
+            project.setProperty(attributes.get("prefix")+".url", urlLoc);
+        ]]>
+        <!-- TODO: add library to a queue for downloading ... -->
+    </scriptdef>
+
+    <dependency prefix="old.xmlbeans" artifact="org.apache.xmlbeans:xmlbeans:3.1.0" usage="previous"/>
+    <dependency prefix="javaparser.core" artifact="com.github.javaparser:javaparser-core:3.15.21" usage="main"/>
+
 
     <!-- Apache RAT license check properties -->
     <property name="rat.reportdir" value="build/rat"/>
     <property name="rat.report" value="${rat.reportdir}/report.txt"/>
-    <property name="rat.jar" location="${compile.lib}/apache-rat-0.12.jar"/>
-    <property name="rat.url" value="${repository.m2}/maven2/org/apache/rat/apache-rat/0.12/apache-rat-0.12.jar"/>
+
+    <dependency prefix="rat" artifact="org.apache.rat:apache-rat:0.12" usage="util"/>
 
     <!-- api checks -->
-    <property name="forbidden.jar" location="${compile.lib}/forbiddenapis-2.5.jar"/>
-    <property name="forbidden.url" value="${repository.m2}/maven2/de/thetaphi/forbiddenapis/2.5/forbiddenapis-2.5.jar"/>
+    <dependency prefix="forbidden" artifact="de.thetaphi:forbiddenapis:2.6" usage="util"/>
+
 
     <!-- dependencies -->
 
@@ -46,44 +77,25 @@
         http://easynews.dl.sourceforge.net/sourceforge/saxon/saxonb8-7-3j.zip
         http://easynews.dl.sourceforge.net/sourceforge/saxon/saxonb8-8j.zip
     -->
-    <property name="saxon.zip" location="${compile.lib}/saxonb9-0-0-4j.zip"/>
-    <property name="saxon.jar" location="${compile.lib}/saxon9.jar"/>
-    <property name="saxon-dom.jar" location="${compile.lib}/saxon9-dom.jar"/>
-    <property name="saxon.url" value="http://master.dl.sourceforge.net/project/saxon/OldFiles/9.0/9.0.0.4/saxonb9-0-0-4j.zip"/>
-
-    <property name="xcresolver.zip" location="${compile.lib}/xcresolver.zip"/>
-    <property name="xcresolver.jar" location="${compile.lib}/resolver.jar"/>
-    <property name="xcresolver.url" value="http://archive.apache.org/dist/xml/commons/binaries/xml-commons-resolver-1.1.zip"/>
+    <dependency prefix="saxon" artifact="net.sf.saxon:Saxon-HE:10.1" usage="tests"/>
 
     <!-- test dependencies -->
-    <property name="junit.jar" location="${compile.lib}/junit-4.12.jar"/>
-    <property name="junit.url" value="${repository.m2}/maven2/junit/junit/4.12/junit-4.12.jar"/>
-    <property name="hamcrest.jar" location="${compile.lib}/hamcrest-core-1.3.jar"/>
-    <property name="hamcrest.url" value="${repository.m2}/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"/>
-
-    <property name="xerces.jar" location="${compile.lib}/xercesImpl-2.11.0.jar"/>
-    <property name="xerces.url" value="${repository.m2}/maven2/xerces/xercesImpl/2.11.0/xercesImpl-2.11.0.jar"/>
-
-    <property name="xml-apis.jar" location="${compile.lib}/xml-apis-1.4.01.jar"/>
-    <property name="xml-apis.url" value="${repository.m2}/maven2/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar"/>
-
-    <path id="saxon">
-        <pathelement location="${saxon.jar}"/>
-        <pathelement location="${saxon-dom.jar}"/>
-    </path>
+    <dependency prefix="junit" artifact="junit:junit:4.13" usage="tests"/>
+    <dependency prefix="hamcrest" artifact="org.hamcrest:hamcrest:2.2" usage="tests"/>
+    <dependency prefix="xerces" artifact="xerces:xercesImpl:2.12.0" usage="tests"/>
+    <dependency prefix="xml-apis" artifact="xml-apis:xml-apis:1.4.01" usage="tests"/>
 
     <path id="xmlbeans-test">
         <pathelement location="build/classes"/>
         <pathelement location="build/generated-resources"/>
         <dirset dir="resources" includes="*" excludes="maven"/>
-        <path refid="saxon"/>
-        <pathelement location="${xcresolver.jar}"/>
+        <pathelement location="${saxon.jar}"/>
         <pathelement location="test/lib/w3c_domts.jar"/>
         <pathelement location="${junit.jar}"/>
         <pathelement location="${hamcrest.jar}"/>
         <pathelement location="${xerces.jar}"/>
         <pathelement location="${xml-apis.jar}"/>
-        <pathelement location="${ENV.JAVA_HOME}/lib/tools.jar"/>
+        <pathelement location="${javaparser.core.jar}"/>
     </path>
 
     <path id="sources">
@@ -103,7 +115,6 @@
         <pathelement location="src/typestore"/>
         <pathelement location="src/xmlcomp"/>
         <pathelement location="src/xmlconfig"/>
-        <pathelement location="src/jamsupport"/>
         <pathelement location="build/generated-sources"/>
     </path>
 
@@ -119,25 +130,15 @@
     </target>
 
     <target name="-check-jars" description="Removes old dependencies and verifies downloaded ones">
-        <mkdir dir="${compile.lib}"/>
         <!-- remove previous versions of third-party jars to prevent them from lingering around,
             we often had hard-to-find build/CI-problems because of these! -->
-        <delete>
-            <fileset dir="${compile.lib}">
-                <include name="saxonb8-8j.zip"/>
-                <include name="saxonb8-7-3j.zip"/>
-                <include name="saxonb8-6-1.zip"/>
-                <include name="saxonb8-2.zip"/>
-                <include name="saxonb8-1.zip"/>
-                <include name="saxon8.jar"/>
-                <include name="saxon8-dom.jar"/>
-            </fileset>
-        </delete>
+        <delete dir="compile-lib"/>
         <condition property="jars.present">
             <or>
                 <and>
+                    <available file="${old.xmlbeans.jar}"/>
+                    <available file="${javaparser.core.jar}"/>
                     <available file="${saxon.jar}"/>
-                    <available file="${xcresolver.jar}"/>
                     <available file="${junit.jar}"/>
                     <available file="${hamcrest.jar}"/>
                     <available file="${xerces.jar}"/>
@@ -152,37 +153,18 @@
         <attribute name="src"/>
         <attribute name="dest"/>
         <sequential>
-            <echo>src: @{src}</echo>
-            <echo>dest: @{dest}</echo>
-            <!--fail
-                message="Java version might be uncapable to download https URLs - see https://stackoverflow.com/questions/6851461/java-why-does-ssl-handshake-give-could-not-generate-dh-keypair-exception">
-                <condition>
-                    <and>
-                        <equals arg1="${ant.java.version}" arg2="1.6"/>
-                        <contains string="@{src}" substring="https"/>
-                    </and>
-                </condition>
-            </fail-->
+            <local name="destdir"/>
+            <dirname property="destdir" file="@{dest}"/>
+            <mkdir dir="${destdir}"/>
             <get src="@{src}" dest="@{dest}" skipexisting="true"/>
         </sequential>
     </macrodef>
 
     <target name="-fetch-jars" depends="-check-jars" unless="jars.present"
             description="Fetches needed JAR files from the Internet">
-        <downloadfile dest="${saxon.zip}" src="${saxon.url}"/>
-        <unzip src="${saxon.zip}" dest="${compile.lib}">
-            <patternset>
-                <include name="saxon9.jar"/>
-                <include name="saxon9-dom.jar"/>
-            </patternset>
-        </unzip>
-        <downloadfile dest="${xcresolver.zip}" src="${xcresolver.url}"/>
-        <unzip src="${xcresolver.zip}" dest="${compile.lib}">
-            <patternset>
-                <include name="*/resolver.jar"/>
-            </patternset>
-            <mapper type="flatten"/>
-        </unzip>
+        <downloadfile dest="${old.xmlbeans.jar}" src="${old.xmlbeans.url}"/>
+        <downloadfile dest="${javaparser.core.jar}" src="${javaparser.core.url}"/>
+        <downloadfile dest="${saxon.jar}" src="${saxon.url}"/>
         <downloadfile dest="${junit.jar}" src="${junit.url}"/>
         <downloadfile dest="${hamcrest.jar}" src="${hamcrest.url}"/>
         <downloadfile dest="${xerces.jar}" src="${xerces.url}"/>
@@ -216,6 +198,29 @@
                 <jvmarg value="-ea"/>
                 <arg line="-name @{schemaName} -srconly -noann -d ${rscDir} -src ${srcDir} @{src}"/>
             </java>
+
+        </sequential>
+    </macrodef>
+
+    <macrodef name="replaceHolder">
+        <attribute name="srcDir"/>
+        <attribute name="rscDir"/>
+        <attribute name="schemaName"/>
+        <sequential>
+            <!-- if replaceHolder: copy TypeSystemHolder and replace package name, then compile -->
+            <mkdir dir="@{srcDir}/org/apache/xmlbeans/metadata/system/@{schemaName}"/>
+            <copy file="src/typeholder/org/apache/xmlbeans/impl/schema/TypeSystemHolder.java" todir="@{srcDir}/org/apache/xmlbeans/metadata/system/@{schemaName}">
+                <filterchain>
+                    <replacestring from="package org.apache.xmlbeans.impl.schema" to="package org.apache.xmlbeans.metadata.system.@{schemaName}"/>
+                </filterchain>
+            </copy>
+
+            <javac destdir="@{rscDir}" debug="true" debuglevel="lines,vars,source" includeantruntime="true">
+                <src path="@{srcDir}/org/apache/xmlbeans/metadata/system/@{schemaName}"/>
+                <classpath>
+                    <pathelement location="${old.xmlbeans.jar}"/>
+                </classpath>
+            </javac>
         </sequential>
     </macrodef>
 
@@ -223,52 +228,53 @@
         <attribute name="classpathref"/>
         <attribute name="dest"/>
         <sequential>
-            <schemaComp schemaName="sXMLLANG" src="src/xmlschema/schema" dest="@{dest}" classpathref="@{classpathref}" />
-            <schemaComp schemaName="sXMLSCHEMA" src="src/xsdschema/schema" dest="@{dest}" classpathref="@{classpathref}" />
-            <schemaComp schemaName="sXMLCONFIG" src="src/configschema/schema" dest="@{dest}" classpathref="@{classpathref}" />
-            <schemaComp schemaName="sXMLTOOLS" src="src/toolschema" dest="@{dest}" classpathref="@{classpathref}" />
+            <schemaComp schemaName="sXMLLANG" src="src/xmlschema/schema" dest="@{dest}" classpathref="@{classpathref}"/>
+            <schemaComp schemaName="sXMLSCHEMA" src="src/xsdschema/schema" dest="@{dest}" classpathref="@{classpathref}"/>
+            <schemaComp schemaName="sXMLCONFIG" src="src/configschema/schema" dest="@{dest}" classpathref="@{classpathref}"/>
+            <schemaComp schemaName="sXMLTOOLS" src="src/toolschema" dest="@{dest}" classpathref="@{classpathref}"/>
         </sequential>
     </macrodef>
 
 
     <target name="process-resources" depends="-fetch-jars" description="Generate sources and resources based on schema files">
-        <mkdir dir="build/classes"/>
-
-        <copy todir="build/generated-sources/org/apache/xmlbeans/impl">
-            <zipfileset src="lib/jam-0.1.0-src.jar" includes="src/org/**"/>
-            <cutdirsmapper dirs="3"/>
-            <filterchain>
-                <replacestring from="org.codehaus.jam" to="org.apache.xmlbeans.impl.jam"/>
-            </filterchain>
-        </copy>
-
         <!-- Note that this is tricky because it bootstraps xmlbeans on itself. -->
         <!-- The basic strategy is to rely on the oldxbeans.jar checked into lib -->
 
         <path id="oldxbean">
-            <pathelement location="lib/oldxbean.jar"/>
+            <pathelement location="${old.xmlbeans.jar}"/>
         </path>
 
         <schemaCompProd classpathref="oldxbean" dest="build/bootstrap"/>
 
+        <move file="build/bootstrap/generated-resources/schemaorg_apache_xmlbeans" tofile="build/bootstrap/generated-resources/org/apache/xmlbeans/metadata"/>
+
+        <replaceHolder srcDir="build/bootstrap/generated-sources" rscDir="build/bootstrap/generated-resources" schemaName="sXMLLANG"/>
+        <replaceHolder srcDir="build/bootstrap/generated-sources" rscDir="build/bootstrap/generated-resources" schemaName="sXMLSCHEMA"/>
+        <replaceHolder srcDir="build/bootstrap/generated-sources" rscDir="build/bootstrap/generated-resources" schemaName="sXMLCONFIG"/>
+        <replaceHolder srcDir="build/bootstrap/generated-sources" rscDir="build/bootstrap/generated-resources" schemaName="sXMLTOOLS"/>
+
+        <replace dir="build/bootstrap/generated-sources" token="schemaorg_apache_xmlbeans" value="org.apache.xmlbeans.metadata" includes="**/*.java"/>
+
+        <mkdir dir="build/classes"/>
+        <mkdir dir="build/generated-sources"/>
         <javac destdir="build/classes" debug="true" debuglevel="lines,vars,source" includeantruntime="true">
             <src refid="sources"/>
             <src path="build/bootstrap/generated-sources"/>
             <src path="src/typeholder"/>
             <classpath>
                 <path refid="oldxbean"/>
-                <path refid="saxon"/>
+                <pathelement location="${saxon.jar}"/>
+                <pathelement location="${javaparser.core.jar}"/>
             </classpath>
         </javac>
-
         <mkdir dir="build/generated-resources/org/apache/xmlbeans/impl/schema"/>
 
         <!-- need to provide the template also in classes - generated-resources will be ignored on bootstrapping -->
-        <copy file="build/classes/org/apache/xmlbeans/impl/schema/TypeSystemHolder.class"
+        <move file="build/classes/org/apache/xmlbeans/impl/schema/TypeSystemHolder.class"
               tofile="build/classes/org/apache/xmlbeans/impl/schema/TypeSystemHolder.template"/>
 
-        <move file="build/classes/org/apache/xmlbeans/impl/schema/TypeSystemHolder.class"
-              tofile="build/generated-resources/org/apache/xmlbeans/impl/schema/TypeSystemHolder.template"/>
+        <copy file="build/classes/org/apache/xmlbeans/impl/schema/TypeSystemHolder.template"
+              todir="build/generated-resources/org/apache/xmlbeans/impl/schema"/>
 
         <!-- now generate new xmlbeans re-/sources and remove the traces of the oldxbean generated re-/sources -->
         <path id="oldschemas">
@@ -287,8 +293,9 @@
         <!-- delete old schema classes -->
         <delete dir="build/classes/org/apache/xmlbeans/impl/xb"/>
 
-        <javac destdir="build/classes" debug="true" debuglevel="lines,vars,source" includeantruntime="true" classpathref="saxon">
+        <javac destdir="build/classes" debug="true" debuglevel="lines,vars,source" includeantruntime="true">
             <src refid="sources"/>
+            <classpath path="${saxon.jar}"/>
         </javac>
     </target>
 
@@ -451,17 +458,16 @@
             <excludepackage name="repackage.*"/>
             <excludepackage name="org.apache.xmlbeans.impl.xb.*"/>
             <excludepackage name="org.apache.xmlbeans.impl.jam.*"/>
-            <link href="http://xmlbeans.apache.org/${version.base}/docs/reference/index.html"/>
-            <link href="http://docs.oracle.com/javase/6/docs/api/"/>
-            <link href="http://docs.oracle.com/javaee/6/api/"/>
-            <link href="http://xml.apache.org/xerces-j/apiDocs/"/>
-            <link href="http://ant.apache.org/manual-1.9.x/api/"/>
+            <link href="https://docs.oracle.com/javase/8/docs/api/"/>
+            <link href="https://docs.oracle.com/javaee/7/api/"/>
+            <link href="https://xml.apache.org/xerces-j/apiDocs/"/>
+            <link href="https://ant.apache.org/manual-1.9.x/api/"/>
         </javadoc>
     </target>
 
     <target name="package" depends="compile,javadocs" description="Builds our jars in the build directory">
         <jar jarfile="build/xmlbeans-${version.base}.jar" update="false" index="true">
-            <fileset dir="build/classes"/>
+            <fileset dir="build/classes" excludes="org/apache/xmlbeans/impl/schema/TypeSystemHolder.template"/>
             <fileset dir="." includes="LICENSE.txt,NOTICE.txt"/>
             <fileset dir="build/generated-resources"/>
             <mappedresources>
@@ -474,7 +480,7 @@
                     <attribute name="Implementation-Title" value="org.apache.xmlbeans"/>
                     <attribute name="Implementation-Version" value="${version.base}"/>
                     <attribute name="Implementation-Vendor" value="Apache Software Foundation"/>
-                    <attribute name="Implementation-URL" value="http://xmlbeans.apache.org/"/>
+                    <attribute name="Implementation-URL" value="https://xmlbeans.apache.org/"/>
                 </section>
             </manifest>
         </jar>
@@ -488,7 +494,7 @@
                     <attribute name="Implementation-Title" value="org.apache.xmlbeans"/>
                     <attribute name="Implementation-Version" value="${version.base}"/>
                     <attribute name="Implementation-Vendor" value="Apache Software Foundation"/>
-                    <attribute name="Implementation-URL" value="http://xmlbeans.apache.org/"/>
+                    <attribute name="Implementation-URL" value="https://xmlbeans.apache.org/"/>
                 </section>
             </manifest>
         </jar>
@@ -519,7 +525,7 @@
                     <attribute name="Implementation-Title" value="org.apache.xmlbeans"/>
                     <attribute name="Implementation-Version" value="${version.base}"/>
                     <attribute name="Implementation-Vendor" value="Apache Software Foundation"/>
-                    <attribute name="Implementation-URL" value="http://xmlbeans.apache.org/"/>
+                    <attribute name="Implementation-URL" value="https://xmlbeans.apache.org/"/>
                 </section>
             </manifest>
         </jar>
@@ -531,14 +537,20 @@
         <property name="prefix" value="xmlbeans-${version.base}"/>
 
         <zip destfile="build/xmlbeans-src-${version.base}-${tstamp.dist}.zip" update="false">
-            <zipfileset dir="." excludes="build/**,tmp/**,.idea/**,bin/**,compile-lib/**" prefix="${prefix}"/>
+            <zipfileset dir="." excludes="build/**,tmp/**,.idea/**,bin/**,lib/**,/src/shell/**,.settings/**,.project,build.javacheck.xml,release-guide.txt" prefix="${prefix}"/>
+        	<zipfileset dir="src/shell" prefix="${prefix}/bin" />
+            <zipfileset dir="build/javadocs" prefix="${prefix}/javadocs" />
         </zip>
+        <tar destfile="build/xmlbeans-src-${version.base}-${tstamp.dist}.tgz" compression="gzip">
+            <tarfileset dir="." excludes="build/**,tmp/**,.idea/**,bin/**,lib/**,/src/shell/**,.settings/**,.project,build.javacheck.xml,release-guide.txt" prefix="${prefix}"/>
+        	<tarfileset dir="src/shell" prefix="${prefix}/bin" />
+            <tarfileset dir="build/javadocs" prefix="${prefix}/javadocs" />
+        </tar>
 
         <zip destfile="build/xmlbeans-bin-${version.base}-${tstamp.dist}.zip" update="false">
             <zipfileset dir="." includes="LICENSE.txt,NOTICE.txt,docs/**" prefix="${prefix}"/>
             <zipfileset dir="samples" includes="Any/**,DateTime/**,MixedContent/**,OrderMatters/**,SchemaEnum/**,Validation/**,XQueryXPath/**,XsdConfig/**" prefix="${prefix}/samples"/>
             <zipfileset dir="src/shell" prefix="${prefix}/bin"/>
-            <zipfileset dir="compile-lib" includes="resolver.jar" prefix="${prefix}/lib"/>
             <zipfileset dir="xkit" prefix="${prefix}"/>
             <zipfileset dir="src/xsdschema/schema" includes="*.xsd" prefix="${prefix}/schemas/s4s"/>
             <zipfileset dir="src/xmlschema/schema" includes="*.xsd" prefix="${prefix}/schemas/s4s"/>
@@ -549,6 +561,20 @@
                 <include name="xmlbeans-${version.base}-sources.jar"/>
             </zipfileset>
         </zip>
+        <tar destfile="build/xmlbeans-bin-${version.base}-${tstamp.dist}.tgz" compression="gzip">
+            <tarfileset dir="." includes="LICENSE.txt,NOTICE.txt,docs/**" prefix="${prefix}"/>
+            <tarfileset dir="samples" includes="Any/**,DateTime/**,MixedContent/**,OrderMatters/**,SchemaEnum/**,Validation/**,XQueryXPath/**,XsdConfig/**" prefix="${prefix}/samples"/>
+            <tarfileset dir="src/shell" prefix="${prefix}/bin"/>
+            <tarfileset dir="xkit" prefix="${prefix}"/>
+            <tarfileset dir="src/xsdschema/schema" includes="*.xsd" prefix="${prefix}/schemas/s4s"/>
+            <tarfileset dir="src/xmlschema/schema" includes="*.xsd" prefix="${prefix}/schemas/s4s"/>
+            <tarfileset dir="test/cases/xbean/xmlobject" includes="numerals.xsd,easypo.xsd*,nameworld.xsd" prefix="${prefix}/schemas"/>
+            <tarfileset dir="build" prefix="${prefix}/lib">
+                <include name="xmlbeans-${version.base}.jar"/>
+                <include name="xmlbeans-${version.base}-javadoc.jar"/>
+                <include name="xmlbeans-${version.base}-sources.jar"/>
+            </tarfileset>
+        </tar>
 
     </target>
 
diff --git a/docs/guide/conSelectingXMLwithXQueryPathXPath.html b/docs/guide/conSelectingXMLwithXQueryPathXPath.html
index 648cde6..41b7849 100644
--- a/docs/guide/conSelectingXMLwithXQueryPathXPath.html
+++ b/docs/guide/conSelectingXMLwithXQueryPathXPath.html
@@ -225,9 +225,9 @@
   <p>You use the <span class="langinline">execQuery</span> method to execute XQuery
     expressions. With XQuery expressions, XML returned is a copy of XML in the document queried against. In other words, changes your code makes to the values returned by <code>execQuery</code> are not reflected in the document queried against.</p>
   <blockquote>
-      <p><a name="saxon_jars"></a><strong>Note:</strong> To execute XQuery expressions, you must have the SaxonB 8.6.1 versions of the saxon8.jar and saxon8-dom.jar files on your classpath. These are two of the jars from inside the zip file saxonb8-6-1.zip
+      <p><a name="saxon_jars"></a><strong>Note:</strong> To execute XQuery expressions, you must have the SaxonB 9.0.0.4 versions of the saxon9.jar and saxon9-dom.jar files on your classpath. These are two of the jars from inside the zip file saxonb9-0-0-4j.zip
       which can be downloaded from the <a href="http://sourceforge.net/project/showfiles.php?group_id=29872&package_id=21888">Saxon web site</a>.
-      If you build XMLBeans from source then the saxonb8-6-1.zip file and the two Saxon jar files are available in the external/lib directory.</p>
+      If you build XMLBeans from source then the saxonb9-0-0-4j.zip file and the two Saxon jar files are available in the external/lib directory.</p>
   </blockquote>
   <h3>Calling XmlObject.execQuery</h3>
   <p>As with <span class="langinline">selectPath</span>, calling <span class="langinline">execQuery</span>
diff --git a/lib/jam-0.1.0-src.jar b/lib/jam-0.1.0-src.jar
deleted file mode 100644
index 158a023..0000000
--- a/lib/jam-0.1.0-src.jar
+++ /dev/null
Binary files differ
diff --git a/lib/jam.LICENSE.txt b/lib/jam.LICENSE.txt
deleted file mode 100644
index 57bc88a..0000000
--- a/lib/jam.LICENSE.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-                                 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/lib/oldxbean.jar b/lib/oldxbean.jar
deleted file mode 100644
index 4a74001..0000000
--- a/lib/oldxbean.jar
+++ /dev/null
Binary files differ
diff --git a/release-guide.txt b/release-guide.txt
new file mode 100644
index 0000000..e2eee97
--- /dev/null
+++ b/release-guide.txt
@@ -0,0 +1,235 @@
+# 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.
+
+
+             ==============================
+                   XMLBeans Release Guide
+             ==============================
+
+
+(I) Prerequisites
+
+   1. You should read the <a href="https://www.apache.org/dev/release.html">Apache Release FAQ</a>
+   2a. You must have shell access to people.apache.org; and you should
+       have key-based authentication set up
+       1. Generate ssh key with ssh-keygen -t rsa -b 4096
+       (e.g. <a href="http://www.linuxproblem.org/art_9.html">how to</a>.)
+       2. Add contents of id_rsa.pub to SSH Key (authorized_keys) line on https://id.apache.org/
+       3. ssh -v username@people.apache.org
+          Verify authenticity of host: https://www.apache.org/dev/machines
+       4. Only sftp access is necessary
+   2b. You must be a member of the committee group
+   3. Release manager must have their public key appended to the KEYS file checked in to SVN and the key published on one of the public key servers.
+      More info can be found here: <a href="https://www.apache.org/dev/release-signing.html">https://www.apache.org/dev/release-signing.html</a>
+   4. You must have Java JDK 8 installed and active.
+   5. You must have the following utilities installed on your local machine and available in your path:
+          * <a href="www.openssh.com">ssh</a>
+          * <a href="www.gnupg.org">gnupg</a>
+          * <a href="www.openssl.org">openssl</a>
+      For Windows users, install Cygwin and make sure you have the above utilities
+   6a. The POI build system requires two components to perform a build
+          * <a href="https://ant.apache.org">Ant</a> 1.9.x or higher
+          * <a href="https://forrest.apache.org/">Forrest</a> 0.90.
+      Make sure ANT_HOME and FORREST_HOME are set.
+
+   6b. Ensure you can log in to https://repository.apache.org/ with your Apache
+        credentials, and that you can see the "Staging Repositories" area on
+        the left hand side.
+
+   6c. It's a good idea to check at 
+       https://builds.apache.org/view/P/view/POI/job/POI-XMLBeans-DSL-1.8/
+       that Jenkins is in a good state (i.e. most recent build passed
+       and is up to date with SVN). You probably also want to e-mail
+       the dev list with a note to say you're building a release.
+
+   7. Before building, you should run the "rat-check" build task, which
+      uses <a href="https://incubator.apache.org/rat/">Apache Rat</a>
+      to check the source tree for files lacking license headers. Files
+      without headers should be either fixed, or added to the exclude list
+
+   8. Check file permissions are correct in SVN.
+      There can be  files in the SVN tree marked executable (have the
+      svn:executable property set), but which should not be. Checking them
+      out will cause the executable bit to be set for them on filesystems
+      which support it. The flag can be removed in batch using
+
+{code:sh}
+svn pd 'svn:executable' $(find -name .svn -prune -or -type f ! -name \*.sh \
+ -print0 | xargs -0 svn pg 'svn:executable' | cut -d ' ' -f 1)
+{code}
+
+   9. Before building, review any new or updated dependencies to ensure that
+      if they required LICENSE or NOTICE updates then these were done.
+
+  10. Ensure that CHANGES.txt is up to date
+
+  11. Ensure that the KEYS files in the dist areas are up-to-date with the
+      latest ones in POI svn:
+      https://dist.apache.org/repos/dist/dev/poi/KEYS
+      https://dist.apache.org/repos/dist/release/poi/KEYS
+      Dist is a regular svn repo that can be checked out and committed to.
+      To upload to dist: https://www.apache.org/dev/release-distribution
+
+
+(II) Making release artifacts
+
+  1. Grab the output from a successful Jenkins build for the desired revision:
+     https://builds.apache.org/view/P/view/POI/job/POI-XMLBeans-DSL-1.8/lastBuild/artifact/build/
+     - xmlbeans-VERSION.jar
+     - xmlbeans-VERSION-javadoc.jar
+     - xmlbeans-VERSION-sources.jar
+     - xmlbeans-bin-VERSION-DATE.zip
+     - xmlbeans-bin-VERSION-DATE.tgz
+     - xmlbeans-src-VERSION-DATE.zip
+     - xmlbeans-src-VERSION-DATE.tgz
+
+  2. Grab the current deployed POM, and edit the version # and anything else that has changed:
+     https://repository.apache.org/service/local/repo_groups/public/content/org/apache/xmlbeans/xmlbeans/VERSION/xmlbeans-VERSION.pom
+
+  3. Sign the jars, zip, tgz, and pom with your key (gpg doesn't sign via --multifile yet):
+     for f in *.jar *.zip *.tgz *.pom; do gpg --default-key 1556F3A4 -ab $f; done
+
+  4. Build the nexus bundle.jar to upload to 
+     repository.apache.org:
+     jar -cvf bundle.jar *.pom *.pom.asc *.jar *.jar.asc
+
+  5. Upload the bundle to https://repository.apache.org/
+
+  6. Generate checksums (sha256sum, sha512sum) for the *.zip and *.tgz files
+
+     for f in *.zip *.tgz
+     do 
+         for b in 256 512
+         do 
+             sha${b}sum $f > $f.sha$b
+         done
+     done
+
+  7. Commit the *.tgz and *.zip files, their signatures, and sha256 and sha512
+     checksums to the release candidate repo at
+     https://dist.apache.org/repos/dist/dev/poi/xmlbeans/
+
+
+ (III) Calling the vote:
+
+   1. The release manager should call the vote
+   2. Include the URL of the release artifacts
+   3. Include the time for the vote to run (3 day minimum, can be longer)
+   4. Provide guidance on what needs to be checked
+   5. Complete a tally, and send a result once the time has passed
+
+ (IV) After the vote:
+
+Deploy the artifacts from the staging area (https://dist.apache.org/repos/dist/dev/poi/xmlbeans)
+to the release area of the dist repo:
+    https://dist.apache.org/repos/dist/release/poi/xmlbeans/release/
+
+Perform a sparse checkout of the dist repo to move artifacts in the staging area to the release area
+In the following example, replace FIXME3.0.2 or FIXME3.1.0 with the version you are releasing
+
+{code:sh}
+svn checkout https://dist.apache.org/repos/dist/ --depth immediates
+svn update --set-depth immediates dist/dev/poi/
+svn update --set-depth infinity   dist/dev/poi/xmlbeans/
+svn update --set-depth infinity   dist/release/poi/xmlbeans/
+svn rm dist/release/poi/xmlbeans/release/src/* dist/release/poi/xmlbeans/release/bin/*
+svn mv dist/dev/poi/xmlbeans/src/* dist/release/poi/xmlbeans/release/src/
+svn mv dist/dev/poi/xmlbeans/bin/* dist/release/poi/xmlbeans/release/bin/
+svn mv dist/release/poi/xmlbeans/release/dev/RELEASE-NOTES-FIXME3.0.2.txt dist/release/poi/xmlbeans/dev/
+# non-SVN copy to create a new artifact with its own history
+cp dist/release/poi/xmlbeans/dev/RELEASE-NOTES-FIXME3.0.2.txt dist/release/poi/xmlbeans/release/dev/RELEASE-NOTES-FIXME3.1.0.txt
+# edit the RELEASE-NOTES file to reflect the current version
+svn add dist/release/poi/xmlbeans/release/dev/RELEASE-NOTES-FIXME3.1.0.txt
+svn ci dist/ -m "deploy FIXME3.1.0 release artifacts from staging area"
+{code}
+
+
+You should get an email from the Apache Reporter Service (no-reply@reporter.apache.org)
+at your Apache email address.
+The email instructions will ask you to log on to https://reporter.apache.org/addrelease.html?poi
+and add your release data (version and date) to the database.
+
+Log into https://repository.apache.org/ and go to the "Staging Repositories" area.
+Find the "orgapachexmlbeans" entry, check it has the right content, then Close the repository
+Select all artifacts and Release (and Automatically Drop) them.
+Refresh to verify that the artifacts are no longer in the Staging Repositories area.
+
+2. Wait for the distributions to appear on your favourite mirror (anywhere from 3-24 hours)
+  https://www.apache.org/dyn/closer.lua/xmlbeans/dev/
+
+3. Wait for the maven artifacts to appear on Maven Central, and ensure they work:
+  Maven Central: https://search.maven.org/#search|ga|1|g%3A%22org.apache.xmlbeans%22
+
+4. Edit the website homepage and list the new release there.
+   https://xmlbeans.apache.org/index.html
+   https://xmlbeans.apache.org/changes.html
+   remove older releases.
+
+5. Edit the website, in particular the download page, listing the new release there. 
+   This should reference the checksums, so take care when updating
+
+   site/src/documentation/content/xdocs/index.xml
+   site/src/documentation/content/xdocs/news.xml
+   site/src/documentation/content/xdocs/site.xml
+   site/src/documentation/content/xdocs/status.xml
+   site/src/documentation/content/xdocs/download/index.xml
+   
+6. Build site using a recent version of Java 1.8
+   Generating with Forrest may result in line ending changes, making change diffs
+   hard to read.  That may be fixed eventually, but for now dos2linux and linux2dos
+   are your friend to minimize these.
+   
+   Or, you can follow this process to only replace generated files where you know
+   the source changed:
+   
+   forrest run
+   * inspect the generated changed pages in a local browser
+   * save the generated HTML, replacing originals in the site/build/ directory
+   * compare new HTML with SVN source, and pass files through dos2unix or unix2dos as needed
+   ** some files generate with line endings different than stored in SVN, making diffs annoying
+   
+6a.Commit the site changes to svn, and publish live
+
+7. Don't forget to upload the latest version of the site and javadocs
+
+8. Send announcements:
+From: your @apache.org e-mail address
+To: user@poi.apache.org, dev@poi.apache.org, general@poi.apache.org, and announce@apache.org
+Subject: [ANNOUNCE] Apache XMLBeans FIXME3.1.0 released
+Body: 
+"""
+The Apache POI PMC is pleased to announce the release of Apache XMLBeans FIXME3.1.0.
+
+Apache XMLBeans is a technology for accessing XML by binding it to Java types.
+
+For detailed changes in this release, refer to the release notes [1] and the changelog [2].
+
+Thank you to all our contributors for making this release possible.
+
+On behalf of the Apache POI PMC,
+Your Name
+
+[1] Release notes: https://www.apache.org/dyn/closer.lua/poi/xmlbeans/release/dev/RELEASE-NOTES-FIXME3.1.0.txt
+[2] Changelog: https://xmlbeans.apache.org/status.html#rel_FIXME310
+"""
+
+Note, announcements should be sent from your @apache.org e-mail address.
+
+9. Add the version to the DOAP file too
+  https://svn.apache.org/repos/asf/xmlbeans/trunk/xkit/doap_XMLBeans.rdf
+
+11. Delete directory that held RC, if any.
diff --git a/resources/maven/pom.xml b/resources/maven/pom.xml
index b2bd8cc..a24c52d 100644
--- a/resources/maven/pom.xml
+++ b/resources/maven/pom.xml
@@ -106,6 +106,13 @@
         </developer>
     </developers>
 
-    <dependencies/>
+    <dependencies>
+        <dependency>
+            <groupId>net.sf.saxon</groupId>
+            <artifactId>Saxon-HE</artifactId>
+            <version>10.1</version>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
 
 </project>
diff --git a/resources/typeimpl/org/apache/xmlbeans/impl/schema/TypeSystemHolder.template b/resources/typeimpl/org/apache/xmlbeans/impl/schema/TypeSystemHolder.template
deleted file mode 100644
index 89fe7c4..0000000
--- a/resources/typeimpl/org/apache/xmlbeans/impl/schema/TypeSystemHolder.template
+++ /dev/null
Binary files differ
diff --git a/samples/AbstractTypes/build.xml b/samples/AbstractTypes/build.xml
index e7e8dd3..d90fb66 100644
--- a/samples/AbstractTypes/build.xml
+++ b/samples/AbstractTypes/build.xml
@@ -70,7 +70,7 @@
                 <path refid="xmlbeans.classpath"/>

             </classpath>

         </scomp>

-        <javac srcdir="src" destdir="build" debug="on" source="1.6">

+        <javac srcdir="src" destdir="build" debug="on" source="1.8">

             <classpath>

                 <path refid="xmlbeans.classpath"/>

                 <pathelement location="build/${abstract.jar}"/>

diff --git a/samples/Any/build.xml b/samples/Any/build.xml
index 3b8a564..7555baf 100644
--- a/samples/Any/build.xml
+++ b/samples/Any/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="Any.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />
     </target>
 
diff --git a/samples/DateTime/build.xml b/samples/DateTime/build.xml
index 0704a6d..d6fd9ef 100644
--- a/samples/DateTime/build.xml
+++ b/samples/DateTime/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="DateTime.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />  
     </target>
      	
diff --git a/samples/MixedContent/build.xml b/samples/MixedContent/build.xml
index c450919..ab2f525 100644
--- a/samples/MixedContent/build.xml
+++ b/samples/MixedContent/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="MixedContent.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />
     </target>
 
diff --git a/samples/OrderMatters/build.xml b/samples/OrderMatters/build.xml
index 44d94a2..4253690 100644
--- a/samples/OrderMatters/build.xml
+++ b/samples/OrderMatters/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="OrderMatters.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />
     </target>
 
diff --git a/samples/SampleTemplate/build.xml b/samples/SampleTemplate/build.xml
index 7eb97e6..639a1c7 100644
--- a/samples/SampleTemplate/build.xml
+++ b/samples/SampleTemplate/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="SampleTemplate.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />
     </target>
 
diff --git a/samples/SchemaEnum/build.xml b/samples/SchemaEnum/build.xml
index 6c78e93..77d16ce 100644
--- a/samples/SchemaEnum/build.xml
+++ b/samples/SchemaEnum/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="SchemaEnum.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />
     </target>
 
diff --git a/samples/SchemaEnum/src/org/apache/xmlbeans/samples/enumeration/SchemaEnum.java b/samples/SchemaEnum/src/org/apache/xmlbeans/samples/enumeration/SchemaEnum.java
index f48104b..50d6f50 100644
--- a/samples/SchemaEnum/src/org/apache/xmlbeans/samples/enumeration/SchemaEnum.java
+++ b/samples/SchemaEnum/src/org/apache/xmlbeans/samples/enumeration/SchemaEnum.java
@@ -163,13 +163,13 @@
         PriceSummaryDocument.PriceSummary summary = summaryDoc.getPriceSummary();
         PriceType[] priceElements = summary.getPriceArray();
 
-        StringBuffer responseBuffer = new StringBuffer();
+        StringBuilder responseBuffer = new StringBuilder();
 
         // Create string buffers to hold the sorted results of the values
         // retrieved.
-        StringBuffer zeroBuffer = new StringBuffer("\nItems under 10 dollars: \n");
-        StringBuffer tenBuffer = new StringBuffer("\nItems between 10 and 20 dollars: \n");
-        StringBuffer twentyBuffer = new StringBuffer("\nItems more than 20 dollars: \n");
+        StringBuilder zeroBuffer = new StringBuilder("\nItems under 10 dollars: \n");
+        StringBuilder tenBuffer = new StringBuilder("\nItems between 10 and 20 dollars: \n");
+        StringBuilder twentyBuffer = new StringBuilder("\nItems more than 20 dollars: \n");
 
         // Loop through the price elements, extracting the array of <item> child
         // elements in each.
diff --git a/samples/SubstitutionGroup/build.xml b/samples/SubstitutionGroup/build.xml
index 524b4c6..d56d0f9 100644
--- a/samples/SubstitutionGroup/build.xml
+++ b/samples/SubstitutionGroup/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="SubstitutionGroup.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />
     </target>
 
diff --git a/samples/Validation/build.xml b/samples/Validation/build.xml
index 777ecce..19afee5 100644
--- a/samples/Validation/build.xml
+++ b/samples/Validation/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="Validation.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />
     </target>
 
diff --git a/samples/XQueryXPath/build.xml b/samples/XQueryXPath/build.xml
index 96b11af..1f20a72 100644
--- a/samples/XQueryXPath/build.xml
+++ b/samples/XQueryXPath/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"

             classpathref="XQueryXPath.path"

             debug="on"

-            source="1.6"

+            source="1.8"

             />

     </target>

 

diff --git a/samples/XmlSort/build.xml b/samples/XmlSort/build.xml
index 4389038..5fd27b7 100644
--- a/samples/XmlSort/build.xml
+++ b/samples/XmlSort/build.xml
@@ -65,7 +65,7 @@
             destdir="build/classes"

             classpathref="XmlSort.path"

             debug="on"

-            source="1.6"

+            source="1.8"

             />

     </target>

 

diff --git a/samples/XmlTree/build.xml b/samples/XmlTree/build.xml
index 6d44c54..be193b6 100644
--- a/samples/XmlTree/build.xml
+++ b/samples/XmlTree/build.xml
@@ -89,7 +89,7 @@
             destdir="build/classes"
             classpathref="XmlTree.path"
             debug="on"
-            source="1.6"
+            source="1.8"
             />
     </target>
 
diff --git a/samples/XsdConfig/build.xml b/samples/XsdConfig/build.xml
index af78db9..c43b427 100644
--- a/samples/XsdConfig/build.xml
+++ b/samples/XsdConfig/build.xml
@@ -120,13 +120,13 @@
             destdir="build/classes"

             classpathref="XsdConfig.path"

             debug="on"

-            source="1.6"

+            source="1.8"

             />  

         <javac srcdir="src" includes="org/apache/xmlbeans/samples/xsdconfig/CatalogXsd.java org/apache/xmlbeans/samples/xsdconfig/XsdTest.java "

             destdir="build/classes"

             classpathref="Xsd.path"

             debug="on"

-            source="1.6"

+            source="1.8"

             />  

             

     </target>

diff --git a/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java b/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java
index 7dd0bbf..f0d4746 100644
--- a/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java
+++ b/src/common/org/apache/xmlbeans/impl/common/DocumentHelper.java
@@ -84,7 +84,7 @@
      * @throws IllegalStateException If creating the DocumentBuilder fails, e.g.
      *  due to {@link ParserConfigurationException}.
      */
-    public static synchronized DocumentBuilder newDocumentBuilder(XmlOptionsBean xmlOptions) {
+    public static DocumentBuilder newDocumentBuilder(XmlOptionsBean xmlOptions) {
         try {
             DocumentBuilder documentBuilder = documentBuilderFactory(xmlOptions).newDocumentBuilder();
             documentBuilder.setEntityResolver(SAXHelper.IGNORING_ENTITY_RESOLVER);
@@ -176,7 +176,7 @@
     /**
      * Creates a new DOM Document
      */
-    public static synchronized Document createDocument() {
+    public static Document createDocument() {
         return documentBuilderSingleton.newDocument();
     }
 }
diff --git a/src/common/org/apache/xmlbeans/impl/common/NameUtil.java b/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
index 7278f86..85ac33f 100644
--- a/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
+++ b/src/common/org/apache/xmlbeans/impl/common/NameUtil.java
@@ -411,7 +411,7 @@
 
     private static String jls77String(String name)
     {
-        StringBuffer buf = new StringBuffer(name);
+        StringBuilder buf = new StringBuilder(name);
         for (int i = 0; i < name.length(); i++)
         {
             // We need to also make sure that our package names don't contain the
@@ -518,7 +518,7 @@
             }
         }
 
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         for (Iterator it = result.iterator(); it.hasNext(); )
         {
             String part = nonJavaKeyword(lowerCamelCase((String)it.next(), useJaxRpcRules, true));
@@ -549,7 +549,7 @@
      */
     public static String upperCaseUnderbar(String xml_name)
     {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         List words = splitWords(xml_name, false);
 
         final int sz = words.size() - 1;
@@ -595,7 +595,7 @@
      */
     public static String upperCamelCase(String xml_name, boolean useJaxRpcRules)
     {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         List words = splitWords(xml_name, useJaxRpcRules);
 
         if (words.size() > 0)
@@ -630,7 +630,7 @@
     public static String lowerCamelCase(String xml_name, boolean useJaxRpcRules,
                                         boolean fixGeneratedName)
     {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         List words = splitWords(xml_name, useJaxRpcRules);
 
         if (words.size() > 0)
@@ -654,7 +654,7 @@
         if (s.length() == 0 || Character.isUpperCase(s.charAt(0)))
             return s;
 
-        StringBuffer buf = new StringBuffer(s);
+        StringBuilder buf = new StringBuilder(s);
         buf.setCharAt(0, Character.toUpperCase(buf.charAt(0)));
         return buf.toString();
     }
diff --git a/src/common/org/apache/xmlbeans/impl/common/QNameHelper.java b/src/common/org/apache/xmlbeans/impl/common/QNameHelper.java
index b6c4458..8ca53ed 100644
--- a/src/common/org/apache/xmlbeans/impl/common/QNameHelper.java
+++ b/src/common/org/apache/xmlbeans/impl/common/QNameHelper.java
@@ -108,7 +108,7 @@
 
     public static String hexsafe(String s)
     {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         for (int i = 0; i < s.length(); i++)
         {
             char ch = s.charAt(i);
@@ -157,7 +157,7 @@
             }
             byte[] digest = md.digest(inputBytes);
             assert(digest.length == 20); // SHA1 160 bits == 20 bytes
-            result = new StringBuffer(URI_SHA1_PREFIX);
+            result = new StringBuilder(URI_SHA1_PREFIX);
             for (int j = 0; j < digest.length; j++)
             {
                 result.append(hexdigits[(digest[j] >> 4) & 0xF]);
diff --git a/src/common/org/apache/xmlbeans/impl/common/XMLNameHelper.java b/src/common/org/apache/xmlbeans/impl/common/XMLNameHelper.java
index 505c76c..eceeec7 100644
--- a/src/common/org/apache/xmlbeans/impl/common/XMLNameHelper.java
+++ b/src/common/org/apache/xmlbeans/impl/common/XMLNameHelper.java
@@ -76,7 +76,7 @@
 
     public static String hexsafe(String s)
     {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         for (int i = 0; i < s.length(); i++)
         {
             char ch = s.charAt(i);
diff --git a/src/common/org/apache/xmlbeans/impl/common/XPath.java b/src/common/org/apache/xmlbeans/impl/common/XPath.java
index e3edd92..fe8a2ff 100644
--- a/src/common/org/apache/xmlbeans/impl/common/XPath.java
+++ b/src/common/org/apache/xmlbeans/impl/common/XPath.java
@@ -580,7 +580,7 @@
             if (!isNCNameStart())
                 throw newError( "Expected non-colonized name" );
 
-            StringBuffer sb = new StringBuffer();
+            StringBuilder sb = new StringBuilder();
 
             sb.append( (char) currChar() );
 
@@ -622,7 +622,7 @@
             else
                 throw newError( "Expected quote (\" or ')" );
 
-            StringBuffer sb = new StringBuffer();
+            StringBuilder sb = new StringBuilder();
 
             for ( ; ; )
             {
diff --git a/src/common/org/apache/xmlbeans/impl/common/XmlObjectList.java b/src/common/org/apache/xmlbeans/impl/common/XmlObjectList.java
index ca8970e..cce6f24 100644
--- a/src/common/org/apache/xmlbeans/impl/common/XmlObjectList.java
+++ b/src/common/org/apache/xmlbeans/impl/common/XmlObjectList.java
@@ -120,7 +120,7 @@
     }
 
     public String toString() {
-        StringBuffer b = new StringBuffer();
+        StringBuilder b = new StringBuilder();
 
         for (int i = 0 ; i < _objects.length ; i++)
         {
diff --git a/src/jamsupport/org/apache/xmlbeans/impl/jam/internal/javadoc/JavadocTigerDelegateImpl_150.java b/src/jamsupport/org/apache/xmlbeans/impl/jam/internal/javadoc/JavadocTigerDelegateImpl_150.java
deleted file mode 100644
index a5583f4..0000000
--- a/src/jamsupport/org/apache/xmlbeans/impl/jam/internal/javadoc/JavadocTigerDelegateImpl_150.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   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.
- */
-package org.apache.xmlbeans.impl.jam.internal.javadoc;
-
-import com.sun.javadoc.ClassDoc;
-import com.sun.javadoc.ExecutableMemberDoc;
-import com.sun.javadoc.Parameter;
-import com.sun.javadoc.ProgramElementDoc;
-import org.apache.xmlbeans.impl.jam.internal.elements.ElementContext;
-import org.apache.xmlbeans.impl.jam.provider.JamLogger;
-import org.apache.xmlbeans.impl.jam.mutable.MAnnotatedElement;
-import org.apache.xmlbeans.impl.jam.mutable.MClass;
-
-
-/**
- * This class is required by JAM so it runs under JDK1.5
- * Since XmlBeans doesn't require 1.5 in order to run
- * this stub replaces the real impl.
- */
-public final class JavadocTigerDelegateImpl_150 extends JavadocTigerDelegate
-{
-    public void init(ElementContext ctx)
-    {}
-
-    public void init(JamLogger logger)
-    {}
-
-    public void populateAnnotationTypeIfNecessary(ClassDoc cd,
-        MClass clazz,
-        JavadocClassBuilder builder)
-    {
-    }
-
-
-    // ========================================================================
-    // OLD STUFF remove someday
-
-
-    public void extractAnnotations(MAnnotatedElement dest, ProgramElementDoc src)
-    {
-    }
-
-    public void extractAnnotations(MAnnotatedElement dest,
-                                 ExecutableMemberDoc method,
-                                 Parameter src)
-    {
-    }
-
-    public boolean isEnum(ClassDoc cd)
-    {
-        return false; // under 1.4, nothing is enum
-    }
-}
diff --git a/src/jamsupport/org/apache/xmlbeans/impl/jam/internal/reflect/ReflectTigerDelegateImpl_150.java b/src/jamsupport/org/apache/xmlbeans/impl/jam/internal/reflect/ReflectTigerDelegateImpl_150.java
deleted file mode 100644
index 0fe8a42..0000000
--- a/src/jamsupport/org/apache/xmlbeans/impl/jam/internal/reflect/ReflectTigerDelegateImpl_150.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   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.
- */
-package org.apache.xmlbeans.impl.jam.internal.reflect;
-
-import org.apache.xmlbeans.impl.jam.JClass;
-import org.apache.xmlbeans.impl.jam.mutable.MAnnotatedElement;
-import org.apache.xmlbeans.impl.jam.mutable.MAnnotation;
-import org.apache.xmlbeans.impl.jam.mutable.MClass;
-import org.apache.xmlbeans.impl.jam.mutable.MConstructor;
-import org.apache.xmlbeans.impl.jam.mutable.MField;
-import org.apache.xmlbeans.impl.jam.mutable.MMember;
-import org.apache.xmlbeans.impl.jam.mutable.MParameter;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-
-/**
- * This class is required by JAM so it runs under JDK1.5
- * Since XmlBeans doesn't require 1.5 in order to run
- * this stub replaces the real impl.
- */
-public final class ReflectTigerDelegateImpl_150 extends ReflectTigerDelegate
-{
-  // ========================================================================
-  // Reflect15Delegate implementation
-
-    public void populateAnnotationTypeIfNecessary(Class cd,
-                                                MClass clazz,
-                                                ReflectClassBuilder builder)
-    {
-    }
-
-    public void extractAnnotations(MMember dest, Method src)
-    {
-    }
-
-    public void extractAnnotations(MConstructor dest, Constructor src)
-    {
-    }
-
-    public void extractAnnotations(MField dest, Field src)
-    {
-    }
-
-    public void extractAnnotations(MClass dest, Class src)
-    {
-    }
-
-    public void extractAnnotations(MParameter dest, Method src,
-                                 int paramNum)
-    {
-    }
-
-    public void extractAnnotations(MParameter dest, Constructor src,
-                                 int paramNum)
-    {
-    }
-
-    public boolean isEnum(Class clazz)
-    {   return false; }
-
-    public Constructor getEnclosingConstructor(Class clazz)
-    {
-        return null; // JDK1.4 doesn't support this
-    }
-
-    public Method getEnclosingMethod(Class clazz)
-    {
-        return null; // JDK1.4 doesn't support this
-    }
-}
diff --git a/src/shell/_setlib b/src/shell/_setlib
index c3beccc..16fd307 100755
--- a/src/shell/_setlib
+++ b/src/shell/_setlib
@@ -20,13 +20,13 @@
 fi
 
 XMLBEANS_LIB=
-if [ -f "$XMLBEANS_HOME"/build/lib/xbean.jar ]; then
+if [ -f "$XMLBEANS_HOME"/build/lib/xmlbeans*.jar ]; then
     XMLBEANS_LIB=$XMLBEANS_HOME/build/lib
 fi
-if [ -f "$XMLBEANS_HOME"/lib/xbean.jar ]; then
+if [ -f "$XMLBEANS_HOME"/lib/xmlbeans*.jar ]; then
     XMLBEANS_LIB=$XMLBEANS_HOME/lib
 fi
 
 if [ -z "$XMLBEANS_LIB" ]; then
-    echo "ERROR: Could not find xbean.jar, try set XMLBEANS_LIB to the directory containing xbean.jar"
+    echo "ERROR: Could not find xmlbeans*.jar, try set XMLBEANS_LIB to the directory containing xmlbeans*.jar"
 fi
diff --git a/src/shell/_setlib.cmd b/src/shell/_setlib.cmd
index 6344731..c52209b 100644
--- a/src/shell/_setlib.cmd
+++ b/src/shell/_setlib.cmd
@@ -15,14 +15,14 @@
 @REM

 

 @rem Common script to set the XMLBEANS_LIB variable

-@rem to the directory containing xbean.jar

+@rem to the directory containing xmlbeans.jar

 @echo off

 

 if "%XMLBEANS_HOME%" EQU "" (set XMLBEANS_HOME=%~dp0..)

 

 set XMLBEANS_LIB=

 

-if exist "%XMLBEANS_HOME%\build\lib\xbean.jar" set XMLBEANS_LIB=%XMLBEANS_HOME%\build\lib

-if exist "%XMLBEANS_HOME%\lib\xbean.jar" set XMLBEANS_LIB=%XMLBEANS_HOME%\lib

+if exist "%XMLBEANS_HOME%\build\lib\xmlbeans*.jar" set XMLBEANS_LIB=%XMLBEANS_HOME%\build\lib

+if exist "%XMLBEANS_HOME%\lib\xmlbeans*.jar" set XMLBEANS_LIB=%XMLBEANS_HOME%\lib

 

-if "%XMLBEANS_LIB%" EQU "" echo "ERROR: Could not find xbean.jar, try setting XMLBEANS_LIB to the directory containing xbean.jar"

+if "%XMLBEANS_LIB%" EQU "" echo "ERROR: Could not find xmlbeans*.jar, try setting XMLBEANS_LIB to the directory containing xmlbeans*.jar"

diff --git a/src/shell/dumpxsb b/src/shell/dumpxsb
index 78ab292..9b60dcd 100755
--- a/src/shell/dumpxsb
+++ b/src/shell/dumpxsb
@@ -22,7 +22,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar
+cp=$XMLBEANS_LIB/*
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/dumpxsb.cmd b/src/shell/dumpxsb.cmd
index 39fb50b..6d2f910 100644
--- a/src/shell/dumpxsb.cmd
+++ b/src/shell/dumpxsb.cmd
@@ -23,7 +23,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar;%XMLBEANS_LIB%\xmlbeans-qname.jar;%XMLBEANS_LIB%\jsr173_1.0_api.jar
+set cp=%cp%;%XMLBEANS_LIB%\*;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 
 java -classpath "%cp%" org.apache.xmlbeans.impl.tool.XsbDumper %*
 
diff --git a/src/shell/inst2xsd b/src/shell/inst2xsd
index 9873954..9ab65cf 100755
--- a/src/shell/inst2xsd
+++ b/src/shell/inst2xsd
@@ -20,7 +20,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar
+cp=$XMLBEANS_LIB/*
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/inst2xsd.cmd b/src/shell/inst2xsd.cmd
index 9d1a3d8..da225c8 100644
--- a/src/shell/inst2xsd.cmd
+++ b/src/shell/inst2xsd.cmd
@@ -24,7 +24,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar;%XMLBEANS_LIB%\xmlbeans-qname.jar
+set cp=%cp%;%XMLBEANS_LIB%\*
 set cp=%cp%;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 set cp=%cp%;%XMLBEANS_LIB%\resolver.jar
 
diff --git a/src/shell/scomp b/src/shell/scomp
index 68d29b1..9906132 100755
--- a/src/shell/scomp
+++ b/src/shell/scomp
@@ -20,7 +20,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar:$JAVA_HOME/lib/tools.jar:$XMLBEANS_LIB/resolver.jar
+cp=$XMLBEANS_LIB/*:$JAVA_HOME/lib/tools.jar
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/scomp.cmd b/src/shell/scomp.cmd
index e82a9e8..1681f7b 100644
--- a/src/shell/scomp.cmd
+++ b/src/shell/scomp.cmd
@@ -24,8 +24,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar
-set cp=%cp%;%XMLBEANS_LIB%\xmlbeans-qname.jar
+set cp=%cp%;%XMLBEANS_LIB%\*
 set cp=%cp%;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 set cp=%cp%;%JAVA_HOME%\lib\tools.jar
 set cp=%cp%;%XMLBEANS_LIB%\resolver.jar
diff --git a/src/shell/scopy.cmd b/src/shell/scopy.cmd
index ff68c31..9006b51 100644
--- a/src/shell/scopy.cmd
+++ b/src/shell/scopy.cmd
@@ -24,7 +24,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar;%XMLBEANS_LIB%\xmlbeans-qname.jar;%XMLBEANS_LIB%\jsr173_1.0_api.jar
+set cp=%cp%;%XMLBEANS_LIB%\*;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 
 java -classpath "%cp%" org.apache.xmlbeans.impl.tool.SchemaCopy %*
 
diff --git a/src/shell/sdownload b/src/shell/sdownload
index 118c717..49ebde7 100755
--- a/src/shell/sdownload
+++ b/src/shell/sdownload
@@ -20,7 +20,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar
+cp=$XMLBEANS_LIB/*
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/sdownload.cmd b/src/shell/sdownload.cmd
index 3d2b603..eaa1b54 100644
--- a/src/shell/sdownload.cmd
+++ b/src/shell/sdownload.cmd
@@ -24,8 +24,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar
-set cp=%cp%;%XMLBEANS_LIB%\xmlbeans-qname.jar
+set cp=%cp%;%XMLBEANS_LIB%\*
 set cp=%cp%;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 set cp=%cp%;%XMLBEANS_LIB%\resolver.jar
 
diff --git a/src/shell/sfactor b/src/shell/sfactor
index 0554b5e..a4f078f 100755
--- a/src/shell/sfactor
+++ b/src/shell/sfactor
@@ -22,7 +22,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar:$XMLBEANS_LIB/resolver.jar
+cp=$XMLBEANS_LIB/*:$XMLBEANS_LIB/resolver.jar
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/sfactor.cmd b/src/shell/sfactor.cmd
index 27c6321..4d00d91 100644
--- a/src/shell/sfactor.cmd
+++ b/src/shell/sfactor.cmd
@@ -24,7 +24,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar;%XMLBEANS_LIB%\xmlbeans-qname.jar;%XMLBEANS_LIB%\jsr173_1.0_api.jar;%XMLBEANS_LIB%\resolver.jar;
+set cp=%cp%;%XMLBEANS_LIB%\*;%XMLBEANS_LIB%\jsr173_1.0_api.jar;%XMLBEANS_LIB%\resolver.jar;
 
 java -classpath "%cp%" org.apache.xmlbeans.impl.tool.FactorImports %*
 
diff --git a/src/shell/svalidate b/src/shell/svalidate
index 13a6ad6..b4b60c4 100755
--- a/src/shell/svalidate
+++ b/src/shell/svalidate
@@ -21,7 +21,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar:$XMLBEANS_LIB/jsr173_1.0_ri.jar
+cp=$XMLBEANS_LIB/*:$XMLBEANS_LIB/jsr173_1.0_ri.jar
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/svalidate.cmd b/src/shell/svalidate.cmd
index 551a952..e5dde53 100644
--- a/src/shell/svalidate.cmd
+++ b/src/shell/svalidate.cmd
@@ -24,8 +24,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar
-set cp=%cp%;%XMLBEANS_LIB%\xmlbeans-qname.jar
+set cp=%cp%;%XMLBEANS_LIB%\*
 set cp=%cp%;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 set cp=%cp%;%XMLBEANS_LIB%\jsr173_1.0_ri.jar
 
diff --git a/src/shell/validate b/src/shell/validate
index 62a75fa..7e3b8d5 100755
--- a/src/shell/validate
+++ b/src/shell/validate
@@ -21,7 +21,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar
+cp=$XMLBEANS_LIB/*
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/validate.cmd b/src/shell/validate.cmd
index d2fc318..32efc26 100644
--- a/src/shell/validate.cmd
+++ b/src/shell/validate.cmd
@@ -24,8 +24,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar
-set cp=%cp%;%XMLBEANS_LIB%\xmlbeans-qname.jar
+set cp=%cp%;%XMLBEANS_LIB%\*
 set cp=%cp%;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 
 java -classpath "%cp%" org.apache.xmlbeans.impl.tool.InstanceValidator %*
diff --git a/src/shell/xpretty b/src/shell/xpretty
index 2deb8c6..001349b 100755
--- a/src/shell/xpretty
+++ b/src/shell/xpretty
@@ -19,7 +19,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar
+cp=$XMLBEANS_LIB/*
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/xpretty.cmd b/src/shell/xpretty.cmd
index aa1f581..ec379c0 100644
--- a/src/shell/xpretty.cmd
+++ b/src/shell/xpretty.cmd
@@ -22,6 +22,6 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar;%XMLBEANS_LIB%\xmlbeans-qname.jar;%XMLBEANS_LIB%\jsr173_1.0_api.jar
+set cp=%cp%;%XMLBEANS_LIB%\*;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 
 java -classpath "%cp%" org.apache.xmlbeans.impl.tool.PrettyPrinter %*
diff --git a/src/shell/xsd2inst b/src/shell/xsd2inst
index c3e43f4..b1ea81f 100755
--- a/src/shell/xsd2inst
+++ b/src/shell/xsd2inst
@@ -19,7 +19,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar
+cp=$XMLBEANS_LIB/*
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/xsd2inst.cmd b/src/shell/xsd2inst.cmd
index a1a3d48..7ece129 100644
--- a/src/shell/xsd2inst.cmd
+++ b/src/shell/xsd2inst.cmd
@@ -23,8 +23,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"

 

 set cp=

-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar

-set cp=%cp%;%XMLBEANS_LIB%\xmlbeans-qname.jar

+set cp=%cp%;%XMLBEANS_LIB%\*

 set cp=%cp%;%XMLBEANS_LIB%\jsr173_1.0_api.jar

 

 java -classpath "%cp%" org.apache.xmlbeans.impl.xsd2inst.SchemaInstanceGenerator %*

diff --git a/src/shell/xsdtree b/src/shell/xsdtree
index 03e140b..1962369 100755
--- a/src/shell/xsdtree
+++ b/src/shell/xsdtree
@@ -19,7 +19,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar
+cp=$XMLBEANS_LIB/*
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/xsdtree.cmd b/src/shell/xsdtree.cmd
index 7ec0497..01cdd79 100644
--- a/src/shell/xsdtree.cmd
+++ b/src/shell/xsdtree.cmd
@@ -22,6 +22,6 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar;%XMLBEANS_LIB%\xmlbeans-qname.jar;%XMLBEANS_LIB%\jsr173_1.0_api.jar;
+set cp=%cp%;%XMLBEANS_LIB%\*;%XMLBEANS_LIB%\jsr173_1.0_api.jar;
 
 java -classpath "%cp%" org.apache.xmlbeans.impl.tool.TypeHierarchyPrinter %*
diff --git a/src/shell/xstc b/src/shell/xstc
index 80abf1c..7daf0d8 100755
--- a/src/shell/xstc
+++ b/src/shell/xstc
@@ -19,7 +19,7 @@
 
 if [ -z "$XMLBEANS_LIB" ]; then . `dirname $0`/_setlib; fi
 
-cp=$XMLBEANS_LIB/xbean.jar:$XMLBEANS_LIB/xmlbeans-qname.jar:$XMLBEANS_LIB/jsr173_1.0_api.jar:$XMLBEANS_LIB/resolver.jar
+cp=$XMLBEANS_LIB/*:$XMLBEANS_LIB/resolver.jar
 
 case "`uname`" in
     CYGWIN*)
diff --git a/src/shell/xstc.cmd b/src/shell/xstc.cmd
index f024a5a..b5ef780 100644
--- a/src/shell/xstc.cmd
+++ b/src/shell/xstc.cmd
@@ -22,8 +22,7 @@
 if "%XMLBEANS_LIB%" EQU "" call "%~dp0_setlib"
 
 set cp=
-set cp=%cp%;%XMLBEANS_LIB%\xbean.jar
-set cp=%cp%;%XMLBEANS_LIB%\xmlbeans-qname.jar
+set cp=%cp%;%XMLBEANS_LIB%\*
 set cp=%cp%;%XMLBEANS_LIB%\jsr173_1.0_api.jar
 set cp=%cp%;%XMLBEANS_LIB%\resolver.jar
 
diff --git a/src/store/org/apache/xmlbeans/impl/store/AttrIdXobj.java b/src/store/org/apache/xmlbeans/impl/store/AttrIdXobj.java
new file mode 100644
index 0000000..77d092d
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/AttrIdXobj.java
@@ -0,0 +1,27 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+package org.apache.xmlbeans.impl.store;
+
+import javax.xml.namespace.QName;
+
+class AttrIdXobj extends AttrXobj {
+    AttrIdXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    public boolean isId() {
+        return true;
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/AttrXobj.java b/src/store/org/apache/xmlbeans/impl/store/AttrXobj.java
new file mode 100644
index 0000000..957dfee
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/AttrXobj.java
@@ -0,0 +1,70 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.TypeInfo;
+
+import javax.xml.namespace.QName;
+
+class AttrXobj extends NamedNodeXobj implements Attr {
+    AttrXobj(Locale l, QName name) {
+        super(l, ATTR, DomImpl.ATTR);
+        _name = name;
+    }
+
+    Xobj newNode(Locale l) {
+        return new AttrXobj(l, _name);
+    }
+
+    //
+    public Node getNextSibling() {
+        return null;
+    }
+    //
+
+    public String getName() {
+        return DomImpl._node_getNodeName(this);
+    }
+
+    public Element getOwnerElement() {
+        return DomImpl._attr_getOwnerElement(this);
+    }
+
+    public boolean getSpecified() {
+        return DomImpl._attr_getSpecified(this);
+    }
+
+    public String getValue() {
+        return DomImpl._node_getNodeValue(this);
+    }
+
+    public void setValue(String value) {
+        DomImpl._node_setNodeValue(this, value);
+    }
+
+    // DOM Level 3
+    public TypeInfo getSchemaTypeInfo() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public boolean isId() {
+        return false;
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/Bookmark.java b/src/store/org/apache/xmlbeans/impl/store/Bookmark.java
new file mode 100644
index 0000000..542dbb5
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/Bookmark.java
@@ -0,0 +1,109 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.XmlCursor;
+
+class Bookmark implements XmlCursor.XmlMark {
+    boolean isOnList(Bookmark head) {
+        for (; head != null; head = head._next)
+            if (head == this)
+                return true;
+
+        return false;
+    }
+
+    Bookmark listInsert(Bookmark head) {
+        assert _next == null && _prev == null;
+
+        if (head == null)
+            head = _prev = this;
+        else {
+            _prev = head._prev;
+            head._prev = head._prev._next = this;
+        }
+
+        return head;
+    }
+
+    Bookmark listRemove(Bookmark head) {
+        assert _prev != null && isOnList(head);
+
+        if (_prev == this) {
+            head = null;
+        } else {
+            if (head == this) {
+                head = _next;
+            } else {
+                _prev._next = _next;
+            }
+
+            if (_next == null) {
+                if (head != null) {
+                    head._prev = _prev;
+                }
+            } else {
+                _next._prev = _prev;
+                _next = null;
+            }
+        }
+
+        _prev = null;
+        assert _next == null;
+
+        return head;
+    }
+
+    void moveTo(Xobj x, int p) {
+        assert isOnList(_xobj._bookmarks);
+
+        if (_xobj != x) {
+            _xobj._bookmarks = listRemove(_xobj._bookmarks);
+            x._bookmarks = listInsert(x._bookmarks);
+
+            _xobj = x;
+        }
+
+        _pos = p;
+    }
+
+    //
+    // XmlCursor.XmlMark method
+    //
+
+    public XmlCursor createCursor() {
+        if (_xobj == null) {
+            throw new IllegalStateException(
+                "Attempting to create a cursor on a bookmark that " +
+                "has been cleared or replaced.");
+        }
+
+        return Cursor.newCursor(_xobj, _pos);
+    }
+
+    //
+    //
+    //
+
+    Xobj _xobj;
+    int _pos;
+
+    Bookmark _next;
+    Bookmark _prev;
+
+    Object _key;
+    Object _value;
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/CdataNode.java b/src/store/org/apache/xmlbeans/impl/store/CdataNode.java
new file mode 100644
index 0000000..e0d3380
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/CdataNode.java
@@ -0,0 +1,33 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.CDATASection;
+
+class CdataNode extends TextNode implements CDATASection {
+    CdataNode(Locale l) {
+        super(l);
+    }
+
+    public int nodeType() {
+        return DomImpl.CDATA;
+    }
+
+    public String name() {
+        return "#cdata-section";
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/CharNode.java b/src/store/org/apache/xmlbeans/impl/store/CharNode.java
new file mode 100644
index 0000000..67b1d6c
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/CharNode.java
@@ -0,0 +1,421 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.*;
+
+import javax.xml.namespace.QName;
+import java.io.PrintStream;
+
+abstract class CharNode implements DomImpl.Dom, Node, CharacterData {
+
+    public CharNode(Locale l) {
+        assert l != null;
+
+        _locale = l;
+    }
+
+    public QName getQName() {
+        return null;
+    }
+
+    public Locale locale() {
+        assert isValid();
+
+        return _locale == null ? ((DomImpl.Dom) _src).locale() : _locale;
+    }
+
+    public void setChars(Object src, int off, int cch) {
+        assert CharUtil.isValid(src, off, cch);
+        assert (_locale != null || _src instanceof DomImpl.Dom);
+
+        if (_locale == null) {
+            _locale = ((DomImpl.Dom) _src).locale();
+        }
+
+        _src = src;
+        _off = off;
+        _cch = cch;
+    }
+
+    public DomImpl.Dom getDom() {
+        assert isValid();
+
+        if (_src instanceof DomImpl.Dom)
+            return (DomImpl.Dom) _src;
+
+        return null;
+    }
+
+    public void setDom(DomImpl.Dom d) {
+        assert d != null;
+
+        _src = d;
+        _locale = null;
+    }
+
+    public Cur tempCur() {
+        assert isValid();
+
+        if (!(_src instanceof DomImpl.Dom))
+            return null;
+
+        Cur c = locale().tempCur();
+        c.moveToCharNode(this);
+
+        return c;
+    }
+
+    private boolean isValid() {
+        return (_src instanceof DomImpl.Dom) == (_locale == null);
+
+    }
+
+    public static boolean isOnList(CharNode nodes, CharNode node) {
+        assert node != null;
+
+        for (CharNode cn = nodes; cn != null; cn = cn._next) {
+            if (cn == node) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public static CharNode remove(CharNode nodes, CharNode node) {
+        assert isOnList(nodes, node);
+
+        if (nodes == node) {
+            nodes = node._next;
+        } else {
+            node._prev._next = node._next;
+        }
+
+        if (node._next != null) {
+            node._next._prev = node._prev;
+        }
+
+        node._prev = node._next = null;
+
+        return nodes;
+    }
+
+    public static CharNode insertNode(CharNode nodes, CharNode newNode, CharNode before) {
+        assert !isOnList(nodes, newNode);
+        assert before == null || isOnList(nodes, before);
+        assert newNode != null;
+        assert newNode._prev == null && newNode._next == null;
+
+        if (nodes == null) {
+            assert before == null;
+            nodes = newNode;
+        } else if (nodes == before) {
+            nodes._prev = newNode;
+            newNode._next = nodes;
+            nodes = newNode;
+        } else {
+            CharNode n = nodes;
+
+            while (n._next != before)
+                n = n._next;
+
+            if ((newNode._next = n._next) != null)
+                n._next._prev = newNode;
+
+            newNode._prev = n;
+            n._next = newNode;
+        }
+
+        return nodes;
+    }
+
+    public static CharNode appendNode(CharNode nodes, CharNode newNode) {
+        return insertNode(nodes, newNode, null);
+    }
+
+    public static CharNode appendNodes(CharNode nodes, CharNode newNodes) {
+        assert newNodes != null;
+        assert newNodes._prev == null;
+
+        if (nodes == null)
+            return newNodes;
+
+        CharNode n = nodes;
+
+        while (n._next != null)
+            n = n._next;
+
+        n._next = newNodes;
+        newNodes._prev = n;
+
+        return nodes;
+    }
+
+    public static CharNode copyNodes(CharNode nodes, Object newSrc) {
+        CharNode newNodes = null;
+
+        for (CharNode n = null; nodes != null; nodes = nodes._next) {
+            CharNode newNode;
+
+            if (nodes instanceof TextNode)
+                newNode = nodes.locale().createTextNode();
+            else
+                newNode = nodes.locale().createCdataNode();
+
+            // How to deal with entity refs??
+
+            newNode.setChars(newSrc, nodes._off, nodes._cch);
+
+            if (newNodes == null)
+                newNodes = newNode;
+
+            if (n != null) {
+                n._next = newNode;
+                newNode._prev = n;
+            }
+
+            n = newNode;
+        }
+
+        return newNodes;
+    }
+
+    public boolean nodeCanHavePrefixUri() {
+        return false;
+    }
+
+    public boolean isNodeAftertext() {
+        assert _src instanceof Xobj :
+            "this method is to only be used for nodes backed up by Xobjs";
+        Xobj src = (Xobj) _src;
+        return src._charNodesValue == null ? true :
+            src._charNodesAfter == null ? false :
+                CharNode.isOnList(src._charNodesAfter, this);
+    }
+
+    public void dump(PrintStream o, Object ref) {
+        if (_src instanceof DomImpl.Dom)
+            ((DomImpl.Dom) _src).dump(o, ref);
+        else
+            o.println("Lonely CharNode: \"" + CharUtil.getString(_src, _off, _cch) + "\"");
+    }
+
+    public void dump(PrintStream o) {
+        dump(o, (Object) this);
+    }
+
+    public void dump() {
+        dump(System.out);
+    }
+
+    public Node appendChild(Node newChild) {
+        return DomImpl._node_appendChild(this, newChild);
+    }
+
+    public Node cloneNode(boolean deep) {
+        return DomImpl._node_cloneNode(this, deep);
+    }
+
+    public NamedNodeMap getAttributes() {
+        return null;
+    }
+
+    public NodeList getChildNodes() {
+        return DomImpl._emptyNodeList;
+    }
+
+    public Node getParentNode() {
+        return DomImpl._node_getParentNode(this);
+    }
+
+    public Node removeChild(Node oldChild) {
+        return DomImpl._node_removeChild(this, oldChild);
+    }
+
+    public Node getFirstChild() {
+        return null;
+    }
+
+    public Node getLastChild() {
+        return null;
+    }
+
+    public String getLocalName() {
+        return DomImpl._node_getLocalName(this);
+    }
+
+    public String getNamespaceURI() {
+        return DomImpl._node_getNamespaceURI(this);
+    }
+
+    public Node getNextSibling() {
+        return DomImpl._node_getNextSibling(this);
+    }
+
+    public String getNodeName() {
+        return DomImpl._node_getNodeName(this);
+    }
+
+    public short getNodeType() {
+        return DomImpl._node_getNodeType(this);
+    }
+
+    public String getNodeValue() {
+        return DomImpl._node_getNodeValue(this);
+    }
+
+    public Document getOwnerDocument() {
+        return DomImpl._node_getOwnerDocument(this);
+    }
+
+    public String getPrefix() {
+        return DomImpl._node_getPrefix(this);
+    }
+
+    public Node getPreviousSibling() {
+        return DomImpl._node_getPreviousSibling(this);
+    }
+
+    public boolean hasAttributes() {
+        return false;
+    }
+
+    public boolean hasChildNodes() {
+        return false;
+    }
+
+    public Node insertBefore(Node newChild, Node refChild) {
+        return DomImpl._node_insertBefore(this, newChild, refChild);
+    }
+
+    public boolean isSupported(String feature, String version) {
+        return DomImpl._node_isSupported(this, feature, version);
+    }
+
+    public void normalize() {
+        DomImpl._node_normalize(this);
+    }
+
+    public Node replaceChild(Node newChild, Node oldChild) {
+        return DomImpl._node_replaceChild(this, newChild, oldChild);
+    }
+
+    public void setNodeValue(String nodeValue) {
+        DomImpl._node_setNodeValue(this, nodeValue);
+    }
+
+    public void setPrefix(String prefix) {
+        DomImpl._node_setPrefix(this, prefix);
+    }
+
+    // DOM Level 3
+    public Object getUserData(String key) {
+        return DomImpl._node_getUserData(this, key);
+    }
+
+    public Object setUserData(String key, Object data, UserDataHandler handler) {
+        return DomImpl._node_setUserData(this, key, data, handler);
+    }
+
+    public Object getFeature(String feature, String version) {
+        return DomImpl._node_getFeature(this, feature, version);
+    }
+
+    public boolean isEqualNode(Node arg) {
+        return DomImpl._node_isEqualNode(this, arg);
+    }
+
+    public boolean isSameNode(Node arg) {
+        return DomImpl._node_isSameNode(this, arg);
+    }
+
+    public String lookupNamespaceURI(String prefix) {
+        return DomImpl._node_lookupNamespaceURI(this, prefix);
+    }
+
+    public String lookupPrefix(String namespaceURI) {
+        return DomImpl._node_lookupPrefix(this, namespaceURI);
+    }
+
+    public boolean isDefaultNamespace(String namespaceURI) {
+        return DomImpl._node_isDefaultNamespace(this, namespaceURI);
+    }
+
+    public void setTextContent(String textContent) {
+        DomImpl._node_setTextContent(this, textContent);
+    }
+
+    public String getTextContent() {
+        return DomImpl._node_getTextContent(this);
+    }
+
+    public short compareDocumentPosition(Node other) {
+        return DomImpl._node_compareDocumentPosition(this, other);
+    }
+
+    public String getBaseURI() {
+        return DomImpl._node_getBaseURI(this);
+    }
+
+    public void appendData(String arg) {
+        DomImpl._characterData_appendData(this, arg);
+    }
+
+    public void deleteData(int offset, int count) {
+        DomImpl._characterData_deleteData(this, offset, count);
+    }
+
+    public String getData() {
+        return DomImpl._characterData_getData(this);
+    }
+
+    public int getLength() {
+        return DomImpl._characterData_getLength(this);
+    }
+
+    public void insertData(int offset, String arg) {
+        DomImpl._characterData_insertData(this, offset, arg);
+    }
+
+    public void replaceData(int offset, int count, String arg) {
+        DomImpl._characterData_replaceData(this, offset, count, arg);
+    }
+
+    public void setData(String data) {
+        DomImpl._characterData_setData(this, data);
+    }
+
+    public String substringData(int offset, int count) {
+        return DomImpl._characterData_substringData(this, offset, count);
+    }
+
+    Object getObject() {
+        return _src;
+    }
+
+    private Locale _locale;
+
+    CharNode _next;
+    CharNode _prev;
+
+    private Object _src;
+
+    int _off;
+    int _cch;
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/CommentXobj.java b/src/store/org/apache/xmlbeans/impl/store/CommentXobj.java
new file mode 100644
index 0000000..bf11049
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/CommentXobj.java
@@ -0,0 +1,71 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.Comment;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+class CommentXobj extends NodeXobj implements Comment {
+    CommentXobj(Locale l) {
+        super(l, COMMENT, DomImpl.COMMENT);
+    }
+
+    Xobj newNode(Locale l) {
+        return new CommentXobj(l);
+    }
+
+    public NodeList getChildNodes() {
+        return DomImpl._emptyNodeList;
+    }
+
+    public void appendData(String arg) {
+        DomImpl._characterData_appendData(this, arg);
+    }
+
+    public void deleteData(int offset, int count) {
+        DomImpl._characterData_deleteData(this, offset, count);
+    }
+
+    public String getData() {
+        return DomImpl._characterData_getData(this);
+    }
+
+    public int getLength() {
+        return DomImpl._characterData_getLength(this);
+    }
+
+    public Node getFirstChild() {
+        return null;
+    }
+
+    public void insertData(int offset, String arg) {
+        DomImpl._characterData_insertData(this, offset, arg);
+    }
+
+    public void replaceData(int offset, int count, String arg) {
+        DomImpl._characterData_replaceData(this, offset, count, arg);
+    }
+
+    public void setData(String data) {
+        DomImpl._characterData_setData(this, data);
+    }
+
+    public String substringData(int offset, int count) {
+        return DomImpl._characterData_substringData(this, offset, count);
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/Cur.java b/src/store/org/apache/xmlbeans/impl/store/Cur.java
index fcb8bfe..5721fc8 100755
--- a/src/store/org/apache/xmlbeans/impl/store/Cur.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Cur.java
@@ -15,110 +15,39 @@
 
 package org.apache.xmlbeans.impl.store;
 
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Comment;
+import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.XmlCursor.XmlBookmark;
+import org.apache.xmlbeans.impl.soap.*;
+import org.apache.xmlbeans.impl.store.DomImpl.Dom;
+import org.apache.xmlbeans.impl.store.Locale.LoadContext;
+import org.apache.xmlbeans.impl.values.TypeStoreUser;
 import org.w3c.dom.Document;
 import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.DOMImplementation;
-import org.w3c.dom.Element;
-import org.w3c.dom.EntityReference;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.ProcessingInstruction;
-import org.w3c.dom.Text;
-import org.w3c.dom.DOMImplementation;
-
-// DOM Level 3
-import org.w3c.dom.UserDataHandler;
-import org.w3c.dom.DOMConfiguration;
-import org.w3c.dom.TypeInfo;
-
-
-import javax.xml.transform.Source;
-
-import java.io.PrintStream;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.xmlbeans.impl.soap.Detail;
-import org.apache.xmlbeans.impl.soap.DetailEntry;
-import org.apache.xmlbeans.impl.soap.MimeHeaders;
-import org.apache.xmlbeans.impl.soap.Name;
-import org.apache.xmlbeans.impl.soap.SOAPBody;
-import org.apache.xmlbeans.impl.soap.SOAPBodyElement;
-import org.apache.xmlbeans.impl.soap.SOAPElement;
-import org.apache.xmlbeans.impl.soap.SOAPEnvelope;
-import org.apache.xmlbeans.impl.soap.SOAPException;
-import org.apache.xmlbeans.impl.soap.SOAPFactory;
-import org.apache.xmlbeans.impl.soap.SOAPFault;
-import org.apache.xmlbeans.impl.soap.SOAPFaultElement;
-import org.apache.xmlbeans.impl.soap.SOAPHeader;
-import org.apache.xmlbeans.impl.soap.SOAPHeaderElement;
-import org.apache.xmlbeans.impl.soap.SOAPPart;
-import org.apache.xmlbeans.impl.store.Xobj.Bookmark;
-
-import org.apache.xmlbeans.impl.store.Locale.LoadContext;
-
-import org.apache.xmlbeans.impl.store.DomImpl.Dom;
-import org.apache.xmlbeans.impl.store.DomImpl.CharNode;
-import org.apache.xmlbeans.impl.store.DomImpl.TextNode;
-import org.apache.xmlbeans.impl.store.DomImpl.CdataNode;
-import org.apache.xmlbeans.impl.store.DomImpl.SaajTextNode;
-import org.apache.xmlbeans.impl.store.DomImpl.SaajCdataNode;
-
-import org.apache.xmlbeans.CDataBookmark;
-import org.apache.xmlbeans.XmlBeans;
-import org.apache.xmlbeans.XmlLineNumber;
-import org.apache.xmlbeans.SchemaField;
-import org.apache.xmlbeans.SchemaType;
-import org.apache.xmlbeans.SchemaTypeLoader;
-import org.apache.xmlbeans.XmlCursor;
-import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.QNameSet;
-import org.apache.xmlbeans.XmlDocumentProperties;
-import org.apache.xmlbeans.XmlCursor.XmlBookmark;
-
-import org.apache.xmlbeans.impl.values.TypeStore;
-import org.apache.xmlbeans.impl.values.TypeStoreUser;
-import org.apache.xmlbeans.impl.values.TypeStoreVisitor;
-import org.apache.xmlbeans.impl.values.TypeStoreUserFactory;
 
 import javax.xml.namespace.QName;
+import java.io.PrintStream;
+import java.util.Map;
 
-import org.apache.xmlbeans.impl.common.ValidatorListener;
-import org.apache.xmlbeans.impl.common.XmlLocale;
-import org.apache.xmlbeans.impl.common.QNameHelper;
+// DOM Level 3
 
 
-final class Cur
-{
-    static final int TEXT     = 0; // Must be 0
-    static final int ROOT     = 1;
-    static final int ELEM     = 2;
-    static final int ATTR     = 3;
-    static final int COMMENT  = 4;
+final class Cur {
+    static final int TEXT = 0; // Must be 0
+    static final int ROOT = 1;
+    static final int ELEM = 2;
+    static final int ATTR = 3;
+    static final int COMMENT = 4;
     static final int PROCINST = 5;
 
-    static final int POOLED       = 0;
-    static final int REGISTERED   = 1;
-    static final int EMBEDDED     = 2;
-    static final int DISPOSED     = 3;
+    static final int POOLED = 0;
+    static final int REGISTERED = 1;
+    static final int EMBEDDED = 2;
+    static final int DISPOSED = 3;
 
     static final int END_POS = -1;
-    static final int NO_POS  = -2;
+    static final int NO_POS = -2;
 
-    Cur ( Locale l )
-    {
+    Cur(Locale l) {
         _locale = l;
         _pos = NO_POS;
 
@@ -133,120 +62,199 @@
         _selectionCount = 0;
     }
 
-    boolean isPositioned ( ) { assert isNormal(); return _xobj != null; }
-
-    static boolean kindIsContainer ( int k ) { return k ==  ELEM || k ==  ROOT; }
-    static boolean kindIsFinish    ( int k ) { return k == -ELEM || k == -ROOT; }
-
-    int kind ( )
-    {
-        assert isPositioned();
-        int kind = _xobj.kind();
-        return _pos == 0 ? kind : (_pos == END_POS ? - kind : TEXT);
+    boolean isPositioned() {
+        assert isNormal();
+        return _xobj != null;
     }
 
-    boolean isRoot      ( ) { assert isPositioned(); return _pos == 0 && _xobj.kind() == ROOT;     }
-    boolean isElem      ( ) { assert isPositioned(); return _pos == 0 && _xobj.kind() == ELEM;     }
-    boolean isAttr      ( ) { assert isPositioned(); return _pos == 0 && _xobj.kind() == ATTR;     }
-    boolean isComment   ( ) { assert isPositioned(); return _pos == 0 && _xobj.kind() == COMMENT;  }
-    boolean isProcinst  ( ) { assert isPositioned(); return _pos == 0 && _xobj.kind() == PROCINST; }
-    boolean isText      ( ) { assert isPositioned(); return _pos > 0; }
-    boolean isEnd       ( ) { assert isPositioned(); return _pos == END_POS && _xobj.kind() ==ELEM;}
-    boolean isEndRoot   ( ) { assert isPositioned(); return _pos == END_POS && _xobj.kind() ==ROOT;}
-    boolean isNode      ( ) { assert isPositioned(); return _pos == 0; }
-    boolean isContainer ( ) { assert isPositioned(); return _pos == 0       && kindIsContainer( _xobj.kind() ); }
-    boolean isFinish    ( ) { assert isPositioned(); return _pos == END_POS && kindIsContainer( _xobj.kind() ); }
-    boolean isUserNode  ( ) { assert isPositioned(); int k = kind(); return k == ELEM || k == ROOT || (k == ATTR && !isXmlns()); }
+    static boolean kindIsContainer(int k) {
+        return k == ELEM || k == ROOT;
+    }
 
-    boolean isContainerOrFinish ( )
-    {
+    static boolean kindIsFinish(int k) {
+        return k == -ELEM || k == -ROOT;
+    }
+
+    int kind() {
+        assert isPositioned();
+        int kind = _xobj.kind();
+        return _pos == 0 ? kind : (_pos == END_POS ? -kind : TEXT);
+    }
+
+    boolean isRoot() {
+        assert isPositioned();
+        return _pos == 0 && _xobj.kind() == ROOT;
+    }
+
+    boolean isElem() {
+        assert isPositioned();
+        return _pos == 0 && _xobj.kind() == ELEM;
+    }
+
+    boolean isAttr() {
+        assert isPositioned();
+        return _pos == 0 && _xobj.kind() == ATTR;
+    }
+
+    boolean isComment() {
+        assert isPositioned();
+        return _pos == 0 && _xobj.kind() == COMMENT;
+    }
+
+    boolean isProcinst() {
+        assert isPositioned();
+        return _pos == 0 && _xobj.kind() == PROCINST;
+    }
+
+    boolean isText() {
+        assert isPositioned();
+        return _pos > 0;
+    }
+
+    boolean isEnd() {
+        assert isPositioned();
+        return _pos == END_POS && _xobj.kind() == ELEM;
+    }
+
+    boolean isEndRoot() {
+        assert isPositioned();
+        return _pos == END_POS && _xobj.kind() == ROOT;
+    }
+
+    boolean isNode() {
+        assert isPositioned();
+        return _pos == 0;
+    }
+
+    boolean isContainer() {
+        assert isPositioned();
+        return _pos == 0 && kindIsContainer(_xobj.kind());
+    }
+
+    boolean isFinish() {
+        assert isPositioned();
+        return _pos == END_POS && kindIsContainer(_xobj.kind());
+    }
+
+    boolean isUserNode() {
+        assert isPositioned();
+        int k = kind();
+        return k == ELEM || k == ROOT || (k == ATTR && !isXmlns());
+    }
+
+    boolean isContainerOrFinish() {
         assert isPositioned();
 
-        if (_pos!=0 && _pos!= END_POS)
+        if (_pos != 0 && _pos != END_POS)
             return false;
 
         int kind = _xobj.kind();
         return kind == ELEM || kind == -ELEM || kind == ROOT || kind == -ROOT;
     }
 
-    boolean isNormalAttr ( ) { return isNode() && _xobj.isNormalAttr(); }
-    boolean isXmlns      ( ) { return isNode() && _xobj.isXmlns(); }
+    boolean isNormalAttr() {
+        return isNode() && _xobj.isNormalAttr();
+    }
 
-    boolean isTextCData  ( ) { return _xobj.hasBookmark(CDataBookmark.class, _pos); }
+    boolean isXmlns() {
+        return isNode() && _xobj.isXmlns();
+    }
 
-    QName   getName  ( ) { assert isNode() || isEnd(); return _xobj._name; }
-    String  getLocal ( ) { return getName().getLocalPart(); }
-    String  getUri   ( ) { return getName().getNamespaceURI(); }
+    boolean isTextCData() {
+        return _xobj.hasBookmark(CDataBookmark.class, _pos);
+    }
 
-    String  getXmlnsPrefix ( ) { assert isXmlns(); return _xobj.getXmlnsPrefix(); }
-    String  getXmlnsUri    ( ) { assert isXmlns(); return _xobj.getXmlnsUri(); }
+    QName getName() {
+        assert isNode() || isEnd();
+        return _xobj._name;
+    }
 
-    boolean isDomDocRoot  ( ) { return isRoot() && _xobj.getDom() instanceof Document; }
-    boolean isDomFragRoot ( ) { return isRoot() && _xobj.getDom() instanceof DocumentFragment; }
+    String getLocal() {
+        return getName().getLocalPart();
+    }
 
-    int cchRight ( ) { assert isPositioned(); return _xobj.cchRight( _pos ); }
-    int cchLeft  ( ) { assert isPositioned(); return _xobj.cchLeft ( _pos ); }
+    String getUri() {
+        return getName().getNamespaceURI();
+    }
+
+    String getXmlnsPrefix() {
+        assert isXmlns();
+        return _xobj.getXmlnsPrefix();
+    }
+
+    String getXmlnsUri() {
+        assert isXmlns();
+        return _xobj.getXmlnsUri();
+    }
+
+    boolean isDomDocRoot() {
+        return isRoot() && _xobj.getDom() instanceof Document;
+    }
+
+    boolean isDomFragRoot() {
+        return isRoot() && _xobj.getDom() instanceof DocumentFragment;
+    }
+
+    int cchRight() {
+        assert isPositioned();
+        return _xobj.cchRight(_pos);
+    }
+
+    int cchLeft() {
+        assert isPositioned();
+        return _xobj.cchLeft(_pos);
+    }
 
     //
     // Creation methods
     //
 
-    void createRoot ( )
-    {
+    void createRoot() {
         createDomDocFragRoot();
     }
 
-    void createDomDocFragRoot ( )
-    {
-        moveTo( new Xobj.DocumentFragXobj( _locale ) );
+    void createDomDocFragRoot() {
+        moveTo(new DocumentFragXobj(_locale));
     }
 
-    void createDomDocumentRoot ( )
-    {
-        moveTo( createDomDocumentRootXobj( _locale ) );
+    void createDomDocumentRoot() {
+        moveTo(createDomDocumentRootXobj(_locale));
     }
 
-    void createAttr ( QName name )
-    {
-        createHelper( new Xobj.AttrXobj( _locale, name ) );
+    void createAttr(QName name) {
+        createHelper(new AttrXobj(_locale, name));
     }
 
-    void createComment ( )
-    {
-        createHelper( new Xobj.CommentXobj( _locale ) );
+    void createComment() {
+        createHelper(new CommentXobj(_locale));
     }
 
-    void createProcinst ( String target )
-    {
-        createHelper( new Xobj.ProcInstXobj( _locale, target ) );
+    void createProcinst(String target) {
+        createHelper(new ProcInstXobj(_locale, target));
     }
 
-    void createElement ( QName name )
-    {
-        createElement( name, null );
+    void createElement(QName name) {
+        createElement(name, null);
     }
 
-    void createElement ( QName name, QName parentName )
-    {
-        createHelper( createElementXobj( _locale, name, parentName ) );
+    void createElement(QName name, QName parentName) {
+        createHelper(createElementXobj(_locale, name, parentName));
     }
 
-    static Xobj createDomDocumentRootXobj ( Locale l )
-    {
+    static Xobj createDomDocumentRootXobj(Locale l) {
         return createDomDocumentRootXobj(l, false);
     }
 
-    static Xobj createDomDocumentRootXobj ( Locale l , boolean fragment)
-    {
+    static Xobj createDomDocumentRootXobj(Locale l, boolean fragment) {
         Xobj xo;
 
         if (l._saaj == null)
             if (fragment)
-                xo = new Xobj.DocumentFragXobj( l );
+                xo = new DocumentFragXobj(l);
             else
-                xo = new Xobj.DocumentXobj( l );
+                xo = new DocumentXobj(l);
         else
-            xo = new Xobj.SoapPartDocXobj( l );
+            xo = new SoapPartDocXobj(l);
 
         if (l._ownerDoc == null)
             l._ownerDoc = xo.getDom();
@@ -254,49 +262,45 @@
         return xo;
     }
 
-    static Xobj createElementXobj ( Locale l, QName name, QName parentName )
-    {
+    static Xobj createElementXobj(Locale l, QName name, QName parentName) {
         if (l._saaj == null)
-            return new Xobj.ElementXobj( l, name );
+            return new ElementXobj(l, name);
 
-        Class c = l._saaj.identifyElement( name, parentName );
+        Class c = l._saaj.identifyElement(name, parentName);
 
-        if (c == SOAPElement.class)       return new Xobj.SoapElementXobj       ( l, name );
-        if (c == SOAPBody.class)          return new Xobj.SoapBodyXobj          ( l, name );
-        if (c == SOAPBodyElement.class)   return new Xobj.SoapBodyElementXobj   ( l, name );
-        if (c == SOAPEnvelope.class)      return new Xobj.SoapEnvelopeXobj      ( l, name );
-        if (c == SOAPHeader.class)        return new Xobj.SoapHeaderXobj        ( l, name );
-        if (c == SOAPHeaderElement.class) return new Xobj.SoapHeaderElementXobj ( l, name );
-        if (c == SOAPFaultElement.class)  return new Xobj.SoapFaultElementXobj  ( l, name );
-        if (c == Detail.class)            return new Xobj.DetailXobj            ( l, name );
-        if (c == DetailEntry.class)       return new Xobj.DetailEntryXobj       ( l, name );
-        if (c == SOAPFault.class)         return new Xobj.SoapFaultXobj         ( l, name );
+        if (c == SOAPElement.class) return new SoapElementXobj(l, name);
+        if (c == SOAPBody.class) return new SoapBodyXobj(l, name);
+        if (c == SOAPBodyElement.class) return new SoapBodyElementXobj(l, name);
+        if (c == SOAPEnvelope.class) return new SoapEnvelopeXobj(l, name);
+        if (c == SOAPHeader.class) return new SoapHeaderXobj(l, name);
+        if (c == SOAPHeaderElement.class) return new SoapHeaderElementXobj(l, name);
+        if (c == SOAPFaultElement.class) return new SoapFaultElementXobj(l, name);
+        if (c == Detail.class) return new DetailXobj(l, name);
+        if (c == DetailEntry.class) return new DetailEntryXobj(l, name);
+        if (c == SOAPFault.class) return new SoapFaultXobj(l, name);
 
-        throw new IllegalStateException( "Unknown SAAJ element class: " + c );
+        throw new IllegalStateException("Unknown SAAJ element class: " + c);
     }
 
-    private void createHelper ( Xobj x )
-    {
+    private void createHelper(Xobj x) {
         assert x._locale == _locale;
 
         // insert the new Xobj into an exisiting tree.
 
-        if (isPositioned())
-        {
-            Cur from = tempCur( x, 0 );
-            from.moveNode( this );
+        if (isPositioned()) {
+            Cur from = tempCur(x, 0);
+            from.moveNode(this);
             from.release();
         }
 
-        moveTo( x );
+        moveTo(x);
     }
 
     //
     // General operations
     //
 
-    boolean isSamePos ( Cur that )
-    {
+    boolean isSamePos(Cur that) {
         assert isNormal() && (that == null || that.isNormal());
 
         return _xobj == that._xobj && _pos == that._pos;
@@ -304,36 +308,31 @@
 
     // is this just after the end of that (that must be the start of a node)
 
-    boolean isJustAfterEnd ( Cur that )
-    {
+    boolean isJustAfterEnd(Cur that) {
         assert isNormal() && that != null && that.isNormal() && that.isNode();
 
-        return that._xobj.isJustAfterEnd( _xobj, _pos );
+        return that._xobj.isJustAfterEnd(_xobj, _pos);
     }
 
-    boolean isJustAfterEnd ( Xobj x )
-    {
-        return x.isJustAfterEnd( _xobj, _pos );
+    boolean isJustAfterEnd(Xobj x) {
+        return x.isJustAfterEnd(_xobj, _pos);
     }
 
-    boolean isAtEndOf ( Cur that )
-    {
+    boolean isAtEndOf(Cur that) {
         assert that != null && that.isNormal() && that.isNode();
 
         return _xobj == that._xobj && _pos == END_POS;
     }
 
-    boolean isInSameTree ( Cur that )
-    {
+    boolean isInSameTree(Cur that) {
         assert isPositioned() && that.isPositioned();
 
-        return _xobj.isInSameTree( that._xobj );
+        return _xobj.isInSameTree(that._xobj);
     }
 
     // Retunr -1, 0 or 1 for relative cursor positions.  Return 2 is not in sames trees.
 
-    int comparePosition ( Cur that )
-    {
+    int comparePosition(Cur that) {
         assert isPositioned() && that.isPositioned();
 
         // If in differnet locales, then can't comapre
@@ -344,10 +343,10 @@
         // No need to denormalize, but I want positions which I can compare (no END_POS)
 
         Xobj xThis = _xobj;
-        int  pThis = _pos == END_POS ? xThis.posAfter() - 1 : _pos;
+        int pThis = _pos == END_POS ? xThis.posAfter() - 1 : _pos;
 
         Xobj xThat = that._xobj;
-        int  pThat = that._pos == END_POS ? xThat.posAfter() - 1 : that._pos;
+        int pThat = that._pos == END_POS ? xThat.posAfter() - 1 : that._pos;
 
         // There are several cases:
         //
@@ -360,49 +359,59 @@
         // cursors are on, checkin for case 2
         //
 
-        if (xThis == xThat)
-            return pThis < pThat ? -1 : pThis == pThat ? 0 : 1;
+        if (xThis == xThat) {
+            return Integer.compare(pThis, pThat);
+        }
 
         // Compute the depth of xThis.  See if I hit xThat (case 2)
 
         int dThis = 0;
 
-        for ( Xobj x = xThis._parent ; x != null ; x = x._parent )
-        {
+        for (Xobj x = xThis._parent; x != null; x = x._parent) {
             dThis++;
 
-            if (x == xThat)
+            if (x == xThat) {
                 return pThat < xThat.posAfter() - 1 ? 1 : -1;
+            }
         }
 
         // Compute the depth of xThat.  See if I hit xThis (case 2)
 
         int dThat = 0;
 
-        for ( Xobj x = xThat._parent ; x != null ; x = x._parent )
-        {
+        for (Xobj x = xThat._parent; x != null; x = x._parent) {
             dThat++;
 
-            if (x == xThis)
+            if (x == xThis) {
                 return pThis < xThis.posAfter() - 1 ? -1 : 1;
+            }
         }
 
         // Must be case 3 or 4 now.  Find a common parent.  If none, then it's case 4
 
-        while ( dThis > dThat ) { dThis--; xThis = xThis._parent; }
-        while ( dThat > dThis ) { dThat--; xThat = xThat._parent; }
+        while (dThis > dThat) {
+            dThis--;
+            assert(xThis != null);
+            xThis = xThis._parent;
+        }
+        while (dThat > dThis) {
+            dThat--;
+            assert(xThat != null);
+            xThat = xThat._parent;
+        }
 
         assert dThat == dThis;
 
-        if (dThat == 0)
+        if (dThat == 0) {
             return 2;
+        }
 
-        assert xThis._parent != null && xThat._parent != null;
+        assert xThis != null && xThis._parent != null && xThat != null && xThat._parent != null;
 
-        while ( xThis._parent != xThat._parent )
-        {
-            if ((xThis = xThis._parent) == null)
+        while (xThis._parent != xThat._parent) {
+            if ((xThis = xThis._parent) == null) {
                 return 2;
+            }
 
             xThat = xThat._parent;
         }
@@ -410,53 +419,52 @@
         // Now, see where xThis and XThat are relative to eachother in the childlist.  Apply
         // some quick common checks before iterating.
 
-        if (xThis._prevSibling == null || xThat._nextSibling == null)
+        if (xThis._prevSibling == null || xThat._nextSibling == null) {
             return -1;
+        }
 
-        if (xThis._nextSibling == null || xThat._prevSibling == null)
+        if (xThis._nextSibling == null || xThat._prevSibling == null) {
             return 1;
+        }
 
-        while ( xThis != null )
-            if ((xThis = xThis._prevSibling) == xThat)
+        while (xThis != null) {
+            if ((xThis = xThis._prevSibling) == xThat) {
                 return 1;
+            }
+        }
 
         return -1;
     }
 
-    void setName ( QName newName )
-    {
+    void setName(QName newName) {
         assert isNode() && newName != null;
 
-        _xobj.setName( newName );
+        _xobj.setName(newName);
     }
 
-    void moveTo ( Xobj x )
-    {
-        moveTo( x, 0 );
+    void moveTo(Xobj x) {
+        moveTo(x, 0);
     }
 
-    void moveTo ( Xobj x, int p )
-    {
+    void moveTo(Xobj x, int p) {
         // This cursor may not be normalized upon entry, don't assert isNormal() here
 
         assert x == null || _locale == x._locale;
         assert x != null || p == NO_POS;
-        assert x == null || x.isNormal( p ) ||  ( x.isVacant() && x._cchValue==0 && x._user == null );
+        assert x == null || x.isNormal(p) || (x.isVacant() && x._cchValue == 0 && x._user == null);
         assert _state == REGISTERED || _state == EMBEDDED;
-        assert _state == EMBEDDED || (_xobj == null || !isOnList( _xobj._embedded ));
-        assert _state == REGISTERED || (_xobj != null && isOnList( _xobj._embedded ));
+        assert _state == EMBEDDED || (_xobj == null || !isOnList(_xobj._embedded));
+        assert _state == REGISTERED || (_xobj != null && isOnList(_xobj._embedded));
 
-        moveToNoCheck( x, p );
+        moveToNoCheck(x, p);
 
-        assert isNormal() ||  ( _xobj.isVacant() && _xobj._cchValue==0 && _xobj._user == null );
+        assert isNormal() || (_xobj.isVacant() && _xobj._cchValue == 0 && _xobj._user == null);
     }
 
-    void moveToNoCheck ( Xobj x, int p )
-    {
-        if (_state == EMBEDDED && x != _xobj)
-        {
-            _xobj._embedded = listRemove( _xobj._embedded );
-            _locale._registered = listInsert( _locale._registered );
+    void moveToNoCheck(Xobj x, int p) {
+        if (_state == EMBEDDED && x != _xobj) {
+            _xobj._embedded = listRemove(_xobj._embedded);
+            _locale._registered = listInsert(_locale._registered);
             _state = REGISTERED;
         }
 
@@ -464,429 +472,396 @@
         _pos = p;
     }
 
-    void moveToCur ( Cur to )
-    {
+    void moveToCur(Cur to) {
         assert isNormal() && (to == null || to.isNormal());
 
-        if (to == null)
-            moveTo( null, NO_POS );
-        else
-            moveTo( to._xobj, to._pos );
+        if (to == null) {
+            moveTo(null, NO_POS);
+        } else {
+            moveTo(to._xobj, to._pos);
+        }
     }
 
-    void moveToDom ( Dom d )
-    {
+    void moveToDom(Dom d) {
         assert _locale == d.locale();
-        assert d instanceof Xobj || d instanceof Xobj.SoapPartDom;
+        assert d instanceof Xobj || d instanceof SoapPartDom;
 
-        moveTo( d instanceof Xobj ? (Xobj) d : ((Xobj.SoapPartDom) d)._docXobj );
+        moveTo(d instanceof Xobj ? (Xobj) d : ((SoapPartDom) d)._docXobj);
     }
 
-    static final class Locations
-    {
+    static final class Locations {
         private static final int NULL = -1;
 
-        Locations ( Locale l )
-        {
+        Locations(Locale l) {
             _locale = l;
 
-            _xobjs = new Xobj [ _initialSize ];
-            _poses = new int  [ _initialSize ];
-            _curs  = new Cur  [ _initialSize ];
-            _next  = new int  [ _initialSize ];
-            _prev  = new int  [ _initialSize ];
-            _nextN = new int  [ _initialSize ];
-            _prevN = new int  [ _initialSize ];
+            _xobjs = new Xobj[_initialSize];
+            _poses = new int[_initialSize];
+            _curs = new Cur[_initialSize];
+            _next = new int[_initialSize];
+            _prev = new int[_initialSize];
+            _nextN = new int[_initialSize];
+            _prevN = new int[_initialSize];
 
-            for ( int i = _initialSize - 1 ; i >= 0 ; i-- )
-            {
-                assert _xobjs[ i ] == null;
-                _poses [ i ] = NO_POS;
-                _next  [ i ] = i + 1;
-                _prev  [ i ] = NULL;
-                _nextN [ i ] = NULL;
-                _prevN [ i ] = NULL;
+            for (int i = _initialSize - 1; i >= 0; i--) {
+                assert _xobjs[i] == null;
+                _poses[i] = NO_POS;
+                _next[i] = i + 1;
+                _prev[i] = NULL;
+                _nextN[i] = NULL;
+                _prevN[i] = NULL;
             }
 
-            _next [ _initialSize - 1 ] = NULL;
+            _next[_initialSize - 1] = NULL;
 
             _free = 0;
             _naked = NULL;
         }
 
-        boolean isSamePos ( int i, Cur c )
-        {
-            if (_curs[ i ] == null)
-                return c._xobj == _xobjs[ i ] && c._pos == _poses[ i ];
-            else
-                return c.isSamePos( _curs[ i ] );
-        }
-
-        boolean isAtEndOf ( int i, Cur c )
-        {
-            assert _curs[ i ] != null || _poses[ i ] == 0;
-            assert _curs[ i ] == null || _curs[ i ].isNode();
-
-            if (_curs[ i ] == null)
-                return c._xobj == _xobjs[ i ] && c._pos == END_POS;
-            else
-                return c.isAtEndOf( _curs[ i ] );
-        }
-
-        void moveTo ( int i, Cur c )
-        {
-            if (_curs[ i ] == null)
-                c.moveTo( _xobjs[ i ], _poses[ i ] );
-            else
-                c.moveToCur( _curs[ i ] );
-        }
-
-        int insert ( int head, int before, int i )
-        {
-            return insert( head, before, i, _next, _prev );
-        }
-
-        int remove ( int head, int i )
-        {
-            Cur c = _curs[ i ];
-
-            assert c != null || _xobjs[ i ] != null;
-            assert c != null || _xobjs[ i ] != null;
-
-            if (c != null)
-            {
-                _curs[ i ].release();
-                _curs[ i ] = null;
-
-                assert _xobjs[ i ] == null;
-                assert _poses [ i ] == NO_POS;
+        boolean isSamePos(int i, Cur c) {
+            if (_curs[i] == null) {
+                return c._xobj == _xobjs[i] && c._pos == _poses[i];
+            } else {
+                return c.isSamePos(_curs[i]);
             }
-            else
-            {
-                assert _xobjs[ i ] != null && _poses[ i ] != NO_POS;
+        }
 
-                _xobjs[ i ] = null;
-                _poses[ i ] = NO_POS;
+        boolean isAtEndOf(int i, Cur c) {
+            assert _curs[i] != null || _poses[i] == 0;
+            assert _curs[i] == null || _curs[i].isNode();
 
-                _naked = remove( _naked, i, _nextN, _prevN );
+            if (_curs[i] == null) {
+                return c._xobj == _xobjs[i] && c._pos == END_POS;
+            } else {
+                return c.isAtEndOf(_curs[i]);
+            }
+        }
+
+        void moveTo(int i, Cur c) {
+            if (_curs[i] == null) {
+                c.moveTo(_xobjs[i], _poses[i]);
+            } else {
+                c.moveToCur(_curs[i]);
+            }
+        }
+
+        int insert(int head, int before, int i) {
+            return insert(head, before, i, _next, _prev);
+        }
+
+        int remove(int head, int i) {
+            Cur c = _curs[i];
+
+            assert c != null || _xobjs[i] != null;
+            assert c != null || _xobjs[i] != null;
+
+            if (c != null) {
+                _curs[i].release();
+                _curs[i] = null;
+
+                assert _xobjs[i] == null;
+                assert _poses[i] == NO_POS;
+            } else {
+                assert _xobjs[i] != null && _poses[i] != NO_POS;
+
+                _xobjs[i] = null;
+                _poses[i] = NO_POS;
+
+                _naked = remove(_naked, i, _nextN, _prevN);
             }
 
-            head = remove( head, i, _next, _prev );
+            head = remove(head, i, _next, _prev);
 
-            _next[ i ] = _free;
+            _next[i] = _free;
             _free = i;
 
             return head;
         }
 
-        int allocate ( Cur addThis )
-        {
+        int allocate(Cur addThis) {
             assert addThis.isPositioned();
 
-            if (_free == NULL)
+            if (_free == NULL) {
                 makeRoom();
+            }
 
             int i = _free;
 
-            _free = _next [ i ];
+            _free = _next[i];
 
-            _next [ i ] = NULL;
-            assert _prev [ i ] == NULL;
+            _next[i] = NULL;
+            assert _prev[i] == NULL;
 
-            assert _curs [ i ] == null;
-            assert _xobjs[ i ] == null;
-            assert _poses[ i ] == NO_POS;
+            assert _curs[i] == null;
+            assert _xobjs[i] == null;
+            assert _poses[i] == NO_POS;
 
-            _xobjs [ i ] = addThis._xobj;
-            _poses [ i ] = addThis._pos;
+            _xobjs[i] = addThis._xobj;
+            _poses[i] = addThis._pos;
 
-            _naked = insert( _naked, NULL, i, _nextN, _prevN );
+            _naked = insert(_naked, NULL, i, _nextN, _prevN);
 
             return i;
         }
 
-        private static int insert ( int head, int before, int i, int[] next, int[] prev )
-        {
-            if (head == NULL)
-            {
+        private static int insert(int head, int before, int i, int[] next, int[] prev) {
+            if (head == NULL) {
                 assert before == NULL;
-                prev[ i ] = i;
+                prev[i] = i;
                 head = i;
-            }
-            else if (before != NULL)
-            {
-                prev[ i ] = prev[ before ];
-                next[ i ] = before;
-                prev[ before ] = i;
+            } else if (before != NULL) {
+                prev[i] = prev[before];
+                next[i] = before;
+                prev[before] = i;
 
                 if (head == before)
                     head = i;
-            }
-            else
-            {
-                prev[ i ] = prev[ head ];
-                assert next[ i ] == NULL;
-                next[ prev[ head ] ] = i;
-                prev[ head ] = i;
+            } else {
+                prev[i] = prev[head];
+                assert next[i] == NULL;
+                next[prev[head]] = i;
+                prev[head] = i;
             }
 
             return head;
         }
 
-        private static int remove ( int head, int i, int[] next, int[] prev )
-        {
-            if (prev[ i ] == i)
-            {
+        private static int remove(int head, int i, int[] next, int[] prev) {
+            if (prev[i] == i) {
                 assert head == i;
                 head = NULL;
-            }
-            else
-            {
-                if (head == i)
-                    head = next[ i ];
-                else
-                    next[ prev [ i ] ] = next[ i ];
+            } else {
+                if (head == i) {
+                    head = next[i];
+                } else {
+                    next[prev[i]] = next[i];
+                }
 
-                if (next[ i ] == NULL)
-                    prev[ head ] = prev[ i ];
-                else
-                {
-                    prev[ next[ i ] ] = prev[ i ];
-                    next[ i ] = NULL;
+                if (next[i] == NULL) {
+                    prev[head] = prev[i];
+                } else {
+                    prev[next[i]] = prev[i];
+                    next[i] = NULL;
                 }
             }
 
-            prev[ i ] = NULL;
-            assert next[ i ] == NULL;
+            prev[i] = NULL;
+            assert next[i] == NULL;
 
             return head;
         }
 
-        void notifyChange ( )
-        {
-            for ( int i ; (i = _naked) != NULL ; )
-            {
-                assert _curs[ i ] == null && _xobjs[ i ] != null && _poses[ i ] != NO_POS;
+        void notifyChange() {
+            for (int i; (i = _naked) != NULL; ) {
+                assert _curs[i] == null && _xobjs[i] != null && _poses[i] != NO_POS;
 
-                _naked = remove( _naked, i, _nextN, _prevN );
+                _naked = remove(_naked, i, _nextN, _prevN);
 
-                _curs[ i ] = _locale.getCur();
-                _curs[ i ].moveTo( _xobjs[ i ], _poses[ i ] );
+                _curs[i] = _locale.getCur();
+                _curs[i].moveTo(_xobjs[i], _poses[i]);
 
-                _xobjs[ i ] = null;
-                _poses[ i ] = NO_POS;
+                _xobjs[i] = null;
+                _poses[i] = NO_POS;
             }
         }
 
-        int next ( int i ) { return _next[ i ]; }
-        int prev ( int i ) { return _prev[ i ]; }
+        int next(int i) {
+            return _next[i];
+        }
 
-        private void makeRoom ( )
-        {
+        int prev(int i) {
+            return _prev[i];
+        }
+
+        private void makeRoom() {
             assert _free == NULL;
 
             int l = _xobjs.length;
 
-            Xobj [] oldXobjs = _xobjs;
-            int  [] oldPoses = _poses;
-            Cur  [] oldCurs  = _curs;
-            int  [] oldNext  = _next;
-            int  [] oldPrev  = _prev;
-            int  [] oldNextN = _nextN;
-            int  [] oldPrevN = _prevN;
+            Xobj[] oldXobjs = _xobjs;
+            int[] oldPoses = _poses;
+            Cur[] oldCurs = _curs;
+            int[] oldNext = _next;
+            int[] oldPrev = _prev;
+            int[] oldNextN = _nextN;
+            int[] oldPrevN = _prevN;
 
-            _xobjs = new Xobj [ l * 2 ];
-            _poses = new int  [ l * 2 ];
-            _curs  = new Cur  [ l * 2 ];
-            _next  = new int  [ l * 2 ];
-            _prev  = new int  [ l * 2 ];
-            _nextN = new int  [ l * 2 ];
-            _prevN = new int  [ l * 2 ];
+            _xobjs = new Xobj[l * 2];
+            _poses = new int[l * 2];
+            _curs = new Cur[l * 2];
+            _next = new int[l * 2];
+            _prev = new int[l * 2];
+            _nextN = new int[l * 2];
+            _prevN = new int[l * 2];
 
-            System.arraycopy( oldXobjs, 0, _xobjs, 0, l );
-            System.arraycopy( oldPoses,  0, _poses, 0, l );
-            System.arraycopy( oldCurs,  0, _curs,  0, l );
-            System.arraycopy( oldNext,  0, _next,  0, l );
-            System.arraycopy( oldPrev,  0, _prev,  0, l );
-            System.arraycopy( oldNextN, 0, _nextN, 0, l );
-            System.arraycopy( oldPrevN, 0, _prevN, 0, l );
+            System.arraycopy(oldXobjs, 0, _xobjs, 0, l);
+            System.arraycopy(oldPoses, 0, _poses, 0, l);
+            System.arraycopy(oldCurs, 0, _curs, 0, l);
+            System.arraycopy(oldNext, 0, _next, 0, l);
+            System.arraycopy(oldPrev, 0, _prev, 0, l);
+            System.arraycopy(oldNextN, 0, _nextN, 0, l);
+            System.arraycopy(oldPrevN, 0, _prevN, 0, l);
 
-            for ( int i = l * 2 - 1 ; i >= l ; i-- )
-            {
-                _next  [ i ] = i + 1;
-                _prev  [ i ] = NULL;
-                _nextN [ i ] = NULL;
-                _prevN [ i ] = NULL;
-                _poses [ i ] = NO_POS;
+            for (int i = l * 2 - 1; i >= l; i--) {
+                _next[i] = i + 1;
+                _prev[i] = NULL;
+                _nextN[i] = NULL;
+                _prevN[i] = NULL;
+                _poses[i] = NO_POS;
             }
 
-            _next [ l * 2 - 1 ] = NULL;
+            _next[l * 2 - 1] = NULL;
 
             _free = l;
         }
 
         private static final int _initialSize = 32;
 
-        private Locale _locale;
+        private final Locale _locale;
 
-        private Xobj [] _xobjs;
-        private int  [] _poses;
-        private Cur  [] _curs;
-        private int  [] _next;
-        private int  [] _prev;
-        private int  [] _nextN;
-        private int  [] _prevN;
+        private Xobj[] _xobjs;
+        private int[] _poses;
+        private Cur[] _curs;
+        private int[] _next;
+        private int[] _prev;
+        private int[] _nextN;
+        private int[] _prevN;
 
         private int _free;   // Unused entries
         private int _naked;  // Entries without Curs
     }
 
-    void push ( )
-    {
+    void push() {
         assert isPositioned();
 
-        int i = _locale._locations.allocate( this );
-        _stackTop = _locale._locations.insert( _stackTop, _stackTop, i );
+        int i = _locale._locations.allocate(this);
+        _stackTop = _locale._locations.insert(_stackTop, _stackTop, i);
     }
 
-    void pop ( boolean stay )
-    {
-        if (stay)
-            popButStay();
-        else
-            pop();
+    void popButStay() {
+        if (_stackTop != Locations.NULL) {
+            _stackTop = _locale._locations.remove(_stackTop, _stackTop);
+        }
     }
 
-    void popButStay ( )
-    {
-        if (_stackTop != Locations.NULL)
-            _stackTop = _locale._locations.remove( _stackTop, _stackTop );
-    }
-
-    boolean pop ( )
-    {
-        if (_stackTop == Locations.NULL)
+    boolean pop() {
+        if (_stackTop == Locations.NULL) {
             return false;
+        }
 
-        _locale._locations.moveTo( _stackTop, this );
-        _stackTop = _locale._locations.remove( _stackTop, _stackTop );
+        _locale._locations.moveTo(_stackTop, this);
+        _stackTop = _locale._locations.remove(_stackTop, _stackTop);
 
         return true;
     }
 
-    boolean isAtLastPush ( )
-    {
+    boolean isAtLastPush() {
         assert _stackTop != Locations.NULL;
 
-        return _locale._locations.isSamePos( _stackTop, this );
+        return _locale._locations.isSamePos(_stackTop, this);
     }
 
-    boolean isAtEndOfLastPush ( )
-    {
+    boolean isAtEndOfLastPush() {
         assert _stackTop != Locations.NULL;
 
-        return _locale._locations.isAtEndOf( _stackTop, this );
+        return _locale._locations.isAtEndOf(_stackTop, this);
     }
 
-    void addToSelection ( Cur that )
-    {
+    void addToSelection(Cur that) {
         assert that != null && that.isNormal();
         assert isPositioned() && that.isPositioned();
 
-        int i = _locale._locations.allocate( that );
-        _selectionFirst = _locale._locations.insert( _selectionFirst, Locations.NULL, i );
+        int i = _locale._locations.allocate(that);
+        _selectionFirst = _locale._locations.insert(_selectionFirst, Locations.NULL, i);
 
         _selectionCount++;
     }
 
-    void addToSelection ( )
-    {
+    void addToSelection() {
         assert isPositioned();
 
-        int i = _locale._locations.allocate( this );
-        _selectionFirst = _locale._locations.insert( _selectionFirst, Locations.NULL, i );
+        int i = _locale._locations.allocate(this);
+        _selectionFirst = _locale._locations.insert(_selectionFirst, Locations.NULL, i);
 
         _selectionCount++;
     }
 
-    private int selectionIndex ( int i )
-    {
+    private int selectionIndex(int i) {
         assert _selectionN >= -1 && i >= 0 && i < _selectionCount;
 
-        if (_selectionN == -1)
-        {
+        if (_selectionN == -1) {
             _selectionN = 0;
             _selectionLoc = _selectionFirst;
         }
 
-        while ( _selectionN < i )
-        {
-            _selectionLoc = _locale._locations.next( _selectionLoc );
+        while (_selectionN < i) {
+            _selectionLoc = _locale._locations.next(_selectionLoc);
             _selectionN++;
         }
 
-        while ( _selectionN > i )
-        {
-            _selectionLoc = _locale._locations.prev( _selectionLoc );
+        while (_selectionN > i) {
+            _selectionLoc = _locale._locations.prev(_selectionLoc);
             _selectionN--;
         }
 
         return _selectionLoc;
     }
 
-    void removeSelection ( int i )
-    {
-        assert i >= 0 && i < _selectionCount;
+    void removeFirstSelection() {
+        final int i = 0;
+        assert i < _selectionCount;
 
-        int j = selectionIndex( i );
+        int j = selectionIndex(i);
 
         // Update the nth selection indices to accomodate the deletion
 
-        if (i < _selectionN)
+        if (i < _selectionN) {
             _selectionN--;
-        else if (i == _selectionN)
-        {
+        } else if (i == _selectionN) {
             _selectionN--;
-
-            if (i == 0)
-                _selectionLoc = Locations.NULL;
-            else
-                _selectionLoc = _locale._locations.prev( _selectionLoc );
+            _selectionLoc = Locations.NULL;
         }
 
-        _selectionFirst = _locale._locations.remove( _selectionFirst, j );
+        _selectionFirst = _locale._locations.remove(_selectionFirst, j);
 
         _selectionCount--;
     }
 
-    int selectionCount ( )
-    {
+    int selectionCount() {
         return _selectionCount;
     }
 
-    void moveToSelection ( int i )
-    {
+    void moveToSelection(int i) {
         assert i >= 0 && i < _selectionCount;
 
-        _locale._locations.moveTo( selectionIndex( i ), this );
+        _locale._locations.moveTo(selectionIndex(i), this);
     }
 
-    void clearSelection ( )
-    {
+    void clearSelection() {
         assert _selectionCount >= 0;
 
-        while ( _selectionCount > 0 )
-            removeSelection( 0 );
+        while (_selectionCount > 0) {
+            removeFirstSelection();
+        }
     }
 
-    boolean toParent    ( ) { return toParent( false ); }
-    boolean toParentRaw ( ) { return toParent( true  ); }
+    boolean toParent() {
+        return toParent(false);
+    }
 
-    Xobj getParent    ( ) { return getParent( false ); }
-    Xobj getParentRaw ( ) { return getParent( true  ); }
+    boolean toParentRaw() {
+        return toParent(true);
+    }
 
-    boolean hasParent ( )
-    {
+    Xobj getParent() {
+        return getParent(false);
+    }
+
+    Xobj getParentRaw() {
+        return getParent(true);
+    }
+
+    boolean hasParent() {
         assert isPositioned();
 
         if (_pos == END_POS || (_pos >= 1 && _pos < _xobj.posAfter()))
@@ -897,8 +872,7 @@
         return _xobj._parent != null;
     }
 
-    Xobj getParentNoRoot()
-    {
+    Xobj getParentNoRoot() {
         assert isPositioned();
 
         if (_pos == END_POS || (_pos >= 1 && _pos < _xobj.posAfter()))
@@ -912,8 +886,7 @@
         return null;
     }
 
-    Xobj getParent ( boolean raw )
-    {
+    Xobj getParent(boolean raw) {
         assert isPositioned();
 
         if (_pos == END_POS || (_pos >= 1 && _pos < _xobj.posAfter()))
@@ -934,31 +907,27 @@
         Xobj root = r._xobj;
 
         r.next();
-        moveNode( r );
+        moveNode(r);
         r.release();
 
         return root;
     }
 
-    boolean toParent ( boolean raw )
-    {
-        Xobj parent = getParent( raw );
+    boolean toParent(boolean raw) {
+        Xobj parent = getParent(raw);
 
         if (parent == null)
             return false;
 
-        moveTo( parent );
+        moveTo(parent);
 
         return true;
     }
 
-    void toRoot ()
-    {
+    void toRoot() {
         Xobj xobj = _xobj;
-        while (!xobj.isRoot())
-        {
-            if (xobj._parent==null)
-            {
+        while (!xobj.isRoot()) {
+            if (xobj._parent == null) {
                 Cur r = _locale.tempCur();
 
                 r.createRoot();
@@ -966,7 +935,7 @@
                 Xobj root = r._xobj;
 
                 r.next();
-                moveNode( r );
+                moveNode(r);
                 r.release();
 
                 xobj = root;
@@ -977,121 +946,104 @@
         moveTo(xobj);
     }
 
-    boolean hasText ( )
-    {
+    boolean hasText() {
         assert isNode();
 
         return _xobj.hasTextEnsureOccupancy();
     }
 
-    boolean hasAttrs ( )
-    {
+    boolean hasAttrs() {
         assert isNode();
 
         return _xobj.hasAttrs();
     }
 
-    boolean hasChildren ( )
-    {
+    boolean hasChildren() {
         assert isNode();
 
         return _xobj.hasChildren();
     }
 
-    boolean toFirstChild ( )
-    {
+    boolean toFirstChild() {
         assert isNode();
 
         if (!_xobj.hasChildren())
             return false;
 
-        for ( Xobj x = _xobj._firstChild ; ; x = x._nextSibling )
-        {
-            if (!x.isAttr())
-            {
-                moveTo( x );
+        for (Xobj x = _xobj._firstChild; ; x = x._nextSibling) {
+            if (!x.isAttr()) {
+                moveTo(x);
                 return true;
             }
         }
     }
 
-    protected boolean toLastChild ( )
-    {
+    protected boolean toLastChild() {
         assert isNode();
 
         if (!_xobj.hasChildren())
             return false;
 
-        moveTo( _xobj._lastChild );
+        moveTo(_xobj._lastChild);
 
         return true;
     }
 
-    boolean toNextSibling ( )
-    {
+    boolean toNextSibling() {
         assert isNode();
 
-        if (_xobj.isAttr())
-        {
-            if (_xobj._nextSibling != null && _xobj._nextSibling.isAttr())
-            {
-                moveTo( _xobj._nextSibling );
+        if (_xobj.isAttr()) {
+            if (_xobj._nextSibling != null && _xobj._nextSibling.isAttr()) {
+                moveTo(_xobj._nextSibling);
                 return true;
             }
-        }
-        else if (_xobj._nextSibling != null)
-        {
-            moveTo( _xobj._nextSibling );
+        } else if (_xobj._nextSibling != null) {
+            moveTo(_xobj._nextSibling);
             return true;
         }
 
         return false;
     }
 
-    void setValueAsQName ( QName qname )
-    {
+    void setValueAsQName(QName qname) {
         assert isNode();
 
-        String value  = qname.getLocalPart();
-        String ns     = qname.getNamespaceURI();
+        String value = qname.getLocalPart();
+        String ns = qname.getNamespaceURI();
 
         String prefix =
             prefixForNamespace(
-                ns, qname.getPrefix().length() > 0 ? qname.getPrefix() : null, true );
+                ns, qname.getPrefix().length() > 0 ? qname.getPrefix() : null, true);
 
         if (prefix.length() > 0)
             value = prefix + ":" + value;
 
-        setValue( value );
+        setValue(value);
     }
 
-    void setValue ( String value )
-    {
+    void setValue(String value) {
         assert isNode();
 
-        moveNodeContents( null, false );
+        moveNodeContents(null, false);
 
         next();
 
-        insertString( value );
+        insertString(value);
 
         toParent();
     }
 
-    void removeFollowingAttrs ( )
-    {
+    void removeFollowingAttrs() {
         assert isAttr();
 
         QName attrName = getName();
 
         push();
 
-        if (toNextAttr())
-        {
-            while ( isAttr() )
-            {
-                if (getName().equals( attrName ))
-                    moveNode( null );
+        if (toNextAttr()) {
+            while (isAttr()) {
+                if (getName().equals(attrName))
+                    moveNode(null);
                 else if (!toNextAttr())
                     break;
             }
@@ -1100,131 +1052,121 @@
         pop();
     }
 
-    String getAttrValue ( QName name )
-    {
+    String getAttrValue(QName name) {
         String s = null;
 
         push();
 
-        if (toAttr( name ))
+        if (toAttr(name)) {
             s = getValueAsString();
+        }
 
         pop();
 
         return s;
     }
 
-    void setAttrValueAsQName ( QName name, QName value )
-    {
+    void setAttrValueAsQName(QName value) {
         assert isContainer();
 
-        if (value == null)
-        {
-            _xobj.removeAttr( name );
+        final QName name = Locale._xsiType;
+
+        if (value == null) {
+            _xobj.removeAttr(name);
+            return;
         }
-        else
-        {
-            if (toAttr( name ))
-            {
-                removeFollowingAttrs();
-            }
-            else
-            {
-                next();
-                createAttr( name );
-            }
 
-            setValueAsQName( value );
-
-            toParent();
+        if (toAttr(name)) {
+            removeFollowingAttrs();
+        } else {
+            next();
+            createAttr(name);
         }
+        setValueAsQName(value);
+        toParent();
     }
 
-    boolean removeAttr ( QName name )
-    {
+    boolean removeAttr(QName name) {
         assert isContainer();
 
-        return _xobj.removeAttr( name );
+        return _xobj.removeAttr(name);
     }
 
-    void setAttrValue ( QName name, String value )
-    {
+    void setAttrValue(QName name, String value) {
         assert isContainer();
 
-        _xobj.setAttr( name, value );
+        _xobj.setAttr(name, value);
     }
 
-    boolean toAttr ( QName name )
-    {
+    boolean toAttr(QName name) {
         assert isNode();
 
-        Xobj a = _xobj.getAttr( name );
+        Xobj a = _xobj.getAttr(name);
 
         if (a == null)
             return false;
 
-        moveTo( a );
+        moveTo(a);
 
         return true;
     }
 
-    boolean toFirstAttr ( )
-    {
+    boolean toFirstAttr() {
         assert isNode();
 
         Xobj firstAttr = _xobj.firstAttr();
 
-        if (firstAttr == null)
+        if (firstAttr == null) {
             return false;
+        }
 
-        moveTo( firstAttr );
+        moveTo(firstAttr);
 
         return true;
     }
 
-    boolean toLastAttr ( )
-    {
+    boolean toLastAttr() {
         assert isNode();
 
-        if (!toFirstAttr())
+        if (!toFirstAttr()) {
             return false;
+        }
 
-        while ( toNextAttr() )
-            ;
+        //noinspection StatementWithEmptyBody
+        while (toNextAttr()) ;
 
         return true;
     }
 
-    boolean toNextAttr ( )
-    {
+    boolean toNextAttr() {
         assert isAttr() || isContainer();
 
         Xobj nextAttr = _xobj.nextAttr();
 
-        if (nextAttr == null)
+        if (nextAttr == null) {
             return false;
+        }
 
-        moveTo( nextAttr );
+        moveTo(nextAttr);
 
         return true;
     }
 
-    boolean toPrevAttr ( )
-    {
-        if (isAttr())
-        {
-            if (_xobj._prevSibling == null)
-                moveTo( _xobj.ensureParent() );
-            else
-                moveTo( _xobj._prevSibling );
+    @SuppressWarnings("UnusedReturnValue")
+    boolean toPrevAttr() {
+        if (isAttr()) {
+            if (_xobj._prevSibling == null) {
+                moveTo(_xobj.ensureParent());
+            } else {
+                moveTo(_xobj._prevSibling);
+            }
 
             return true;
         }
 
         prev();
 
-        if (!isContainer())
-        {
+        if (!isContainer()) {
             next();
             return false;
         }
@@ -1232,15 +1174,17 @@
         return toLastAttr();
     }
 
-    boolean skipWithAttrs ( )
-    {
+    @SuppressWarnings("UnusedReturnValue")
+    boolean skipWithAttrs() {
         assert isNode();
 
-        if (skip())
+        if (skip()) {
             return true;
+        }
 
-        if (_xobj.isRoot())
+        if (_xobj.isRoot()) {
             return false;
+        }
 
         assert _xobj.isAttr();
 
@@ -1251,63 +1195,54 @@
         return true;
     }
 
-    boolean skip ( )
-    {
+    boolean skip() {
         assert isNode();
 
         if (_xobj.isRoot())
             return false;
 
-        if (_xobj.isAttr())
-        {
+        if (_xobj.isAttr()) {
             if (_xobj._nextSibling == null || !_xobj._nextSibling.isAttr())
                 return false;
 
-            moveTo( _xobj._nextSibling, 0 );
-        }
-        else
-            moveTo( getNormal( _xobj, _xobj.posAfter() ), _posTemp );
+            moveTo(_xobj._nextSibling, 0);
+        } else
+            moveTo(getNormal(_xobj, _xobj.posAfter()), _posTemp);
 
         return true;
     }
 
-    void toEnd ( )
-    {
+    void toEnd() {
         assert isNode();
 
-        moveTo( _xobj, END_POS );
+        moveTo(_xobj, END_POS);
     }
 
-    void moveToCharNode ( CharNode node )
-    {
+    void moveToCharNode(CharNode node) {
         assert node.getDom() != null && node.getDom().locale() == _locale;
 
-        moveToDom( node.getDom() );
+        moveToDom(node.getDom());
 
         CharNode n;
 
         _xobj.ensureOccupancy();
 
         n = _xobj._charNodesValue =
-            updateCharNodes( _locale, _xobj, _xobj._charNodesValue, _xobj._cchValue );
+            updateCharNodes(_locale, _xobj, _xobj._charNodesValue, _xobj._cchValue);
 
-        for ( ; n != null ; n = n._next )
-        {
-            if (node == n)
-            {
-                moveTo( getNormal( _xobj, n._off + 1 ), _posTemp );
+        for (; n != null; n = n._next) {
+            if (node == n) {
+                moveTo(getNormal(_xobj, n._off + 1), _posTemp);
                 return;
             }
         }
 
         n = _xobj._charNodesAfter =
-            updateCharNodes( _locale, _xobj, _xobj._charNodesAfter, _xobj._cchAfter );
+            updateCharNodes(_locale, _xobj, _xobj._charNodesAfter, _xobj._cchAfter);
 
-        for ( ; n != null ; n = n._next )
-        {
-            if (node == n)
-            {
-                moveTo( getNormal( _xobj, n._off + _xobj._cchValue + 2 ), _posTemp );
+        for (; n != null; n = n._next) {
+            if (node == n) {
+                moveTo(getNormal(_xobj, n._off + _xobj._cchValue + 2), _posTemp);
                 return;
             }
         }
@@ -1315,40 +1250,42 @@
         assert false;
     }
 
-    boolean prevWithAttrs ( )
-    {
-        if (prev())
+    @SuppressWarnings("UnusedReturnValue")
+    boolean prevWithAttrs() {
+        if (prev()) {
             return true;
+        }
 
-        if (!isAttr())
+        if (!isAttr()) {
             return false;
+        }
 
         toParent();
 
         return true;
     }
 
-    boolean prev ( )
-    {
+    boolean prev() {
         assert isPositioned();
 
-        if (_xobj.isRoot() && _pos == 0)
+        if (_xobj.isRoot() && _pos == 0) {
             return false;
+        }
 
-        if (_xobj.isAttr() && _pos == 0 && _xobj._prevSibling == null)
+        if (_xobj.isAttr() && _pos == 0 && _xobj._prevSibling == null) {
             return false;
+        }
 
         Xobj x = getDenormal();
-        int  p = _posTemp;
+        int p = _posTemp;
 
-        assert p > 0 && p != END_POS;
+        assert p > 0;
 
         int pa = x.posAfter();
 
-        if (p > pa)
+        if (p > pa) {
             p = pa;
-        else if (p == pa)
-        {
+        } else if (p == pa) {
             // Text after an attr is allowed only on the last attr,
             // and that text belongs to the parent container..
             //
@@ -1356,122 +1293,104 @@
             // inside the container, and we need to skip the attrs.
 
             if (x.isAttr() &&
-                (x._cchAfter > 0 || x._nextSibling == null || !x._nextSibling.isAttr()))
-            {
+                (x._cchAfter > 0 || x._nextSibling == null || !x._nextSibling.isAttr())) {
                 x = x.ensureParent();
                 p = 0;
-            }
-            else
+            } else {
                 p = END_POS;
-        }
-        else if (p == pa - 1)
-        {
+            }
+        } else if (p == pa - 1) {
             x.ensureOccupancy();
             p = x._cchValue > 0 ? 1 : 0;
-        }
-        else if (p > 1)
+        } else if (p > 1) {
             p = 1;
-        else
-        {
+        } else {
+            //noinspection ConstantConditions
             assert p == 1;
             p = 0;
         }
 
-        moveTo( getNormal( x, p ), _posTemp );
+        moveTo(getNormal(x, p), _posTemp);
 
         return true;
     }
 
-    boolean next ( boolean withAttrs )
-    {
+    @SuppressWarnings("UnusedReturnValue")
+    boolean next(boolean withAttrs) {
         return withAttrs ? nextWithAttrs() : next();
     }
 
-    boolean nextWithAttrs ( )
-    {
+    boolean nextWithAttrs() {
         int k = kind();
 
-        if (kindIsContainer( k ))
-        {
-            if (toFirstAttr())
+        if (kindIsContainer(k)) {
+            if (toFirstAttr()) {
                 return true;
-        }
-        else if (k == -ATTR)
-        {
-            if (next())
+            }
+        } else if (k == -ATTR) {
+            if (next()) {
                 return true;
+            }
 
             toParent();
 
-            if (!toParentRaw())
+            if (!toParentRaw()) {
                 return false;
+            }
         }
 
         return next();
     }
 
-    boolean next ( )
-    {
+    boolean next() {
         assert isNormal();
 
         Xobj x = _xobj;
-        int  p = _pos;
+        int p = _pos;
 
         int pa = x.posAfter();
 
-        if (p >= pa)
+        if (p >= pa) {
             p = _xobj.posMax();
-        else if (p == END_POS)
-        {
-            if (x.isRoot() || (x.isAttr() && (x._nextSibling == null || !x._nextSibling.isAttr())))
+        } else if (p == END_POS) {
+            if (x.isRoot() || (x.isAttr() && (x._nextSibling == null || !x._nextSibling.isAttr()))) {
                 return false;
+            }
 
             p = pa;
-        }
-        else if (p > 0)
-        {
+        } else if (p > 0) {
             assert x._firstChild == null || !x._firstChild.isAttr();
 
-            if (x._firstChild != null)
-            {
+            if (x._firstChild != null) {
                 x = x._firstChild;
                 p = 0;
-            }
-            else
+            } else {
                 p = END_POS;
-        }
-        else
-        {
+            }
+        } else {
             assert p == 0;
 
             x.ensureOccupancy();
 
             p = 1;
 
-            if (x._cchValue == 0)
-            {
-                if (x._firstChild != null)
-                {
-                    if (x._firstChild.isAttr())
-                    {
+            if (x._cchValue == 0) {
+                if (x._firstChild != null) {
+                    if (x._firstChild.isAttr()) {
                         Xobj a = x._firstChild;
 
-                        while ( a._nextSibling != null && a._nextSibling.isAttr() )
+                        while (a._nextSibling != null && a._nextSibling.isAttr()) {
                             a = a._nextSibling;
+                        }
 
-                        if (a._cchAfter > 0)
-                        {
+                        if (a._cchAfter > 0) {
                             x = a;
                             p = a.posAfter();
-                        }
-                        else if (a._nextSibling != null)
-                        {
+                        } else if (a._nextSibling != null) {
                             x = a._nextSibling;
                             p = 0;
                         }
-                    }
-                    else
-                    {
+                    } else {
                         x = x._firstChild;
                         p = 0;
                     }
@@ -1479,13 +1398,12 @@
             }
         }
 
-        moveTo( getNormal( x, p ), _posTemp );
+        moveTo(getNormal(x, p), _posTemp);
 
         return true;
     }
 
-    int prevChars ( int cch )
-    {
+    int prevChars(int cch) {
         assert isPositioned();
 
         int cchLeft = cchLeft();
@@ -1496,13 +1414,12 @@
         // Dang, I love this stmt :-)
 
         if (cch != 0)
-            moveTo( getNormal( getDenormal(), _posTemp - cch ), _posTemp );
+            moveTo(getNormal(getDenormal(), _posTemp - cch), _posTemp);
 
         return cch;
     }
 
-    int nextChars ( int cch )
-    {
+    int nextChars(int cch) {
         assert isPositioned();
 
         int cchRight = cchRight();
@@ -1510,25 +1427,23 @@
         if (cchRight == 0)
             return 0;
 
-        if (cch < 0 || cch >= cchRight)
-        {
+        if (cch < 0 || cch >= cchRight) {
             // Use next to not skip over children
             next();
             return cchRight;
         }
 
-        moveTo( getNormal( _xobj, _pos + cch ), _posTemp );
+        moveTo(getNormal(_xobj, _pos + cch), _posTemp);
 
         return cch;
     }
 
-    void setCharNodes ( CharNode nodes )
-    {
+    void setCharNodes(CharNode nodes) {
         assert nodes == null || _locale == nodes.locale();
         assert isPositioned();
 
         Xobj x = getDenormal();
-        int  p = _posTemp;
+        int p = _posTemp;
 
         assert !x.isRoot() || (p > 0 && p < x.posAfter());
 
@@ -1537,15 +1452,14 @@
         else
             x._charNodesValue = nodes;
 
-        for ( ; nodes != null ; nodes = nodes._next )
-            nodes.setDom( (Dom) x );
+        for (; nodes != null; nodes = nodes._next)
+            nodes.setDom((Dom) x);
 
         // No Need to notify text change or alter version, text nodes are
         // not part of the infoset
     }
 
-    CharNode getCharNodes ( )
-    {
+    CharNode getCharNodes() {
         assert isPositioned();
         assert !isRoot();
 
@@ -1553,36 +1467,32 @@
 
         CharNode nodes;
 
-        if (_posTemp >= x.posAfter())
-        {
+        if (_posTemp >= x.posAfter()) {
             nodes = x._charNodesAfter =
-                updateCharNodes( _locale, x, x._charNodesAfter, x._cchAfter );
-        }
-        else
-        {
+                updateCharNodes(_locale, x, x._charNodesAfter, x._cchAfter);
+        } else {
             x.ensureOccupancy();
 
             nodes = x._charNodesValue =
-                updateCharNodes( _locale, x, x._charNodesValue, x._cchValue );
+                updateCharNodes(_locale, x, x._charNodesValue, x._cchValue);
         }
 
         return nodes;
     }
 
-   // private
-    static CharNode updateCharNodes ( Locale l, Xobj x, CharNode nodes, int cch )
-    {
+    // private
+    static CharNode updateCharNodes(Locale l, Xobj x, CharNode nodes, int cch) {
         assert nodes == null || nodes.locale() == l;
 
         CharNode node = nodes;
         int i = 0;
 
-        while ( node != null && cch > 0 )
-        {
+        while (node != null && cch > 0) {
             assert node.getDom() == x;
 
-            if (node._cch > cch)
+            if (node._cch > cch) {
                 node._cch = cch;
+            }
 
             node._off = i;
             i += node._cch;
@@ -1591,81 +1501,66 @@
             node = node._next;
         }
 
-        if (cch <= 0)
-        {
-            for ( ; node != null ; node = node._next )
-            {
+        if (cch <= 0) {
+            for (; node != null; node = node._next) {
                 assert node.getDom() == x;
 
-                if (node._cch != 0)
+                if (node._cch != 0) {
                     node._cch = 0;
+                }
 
                 node._off = i;
             }
-        }
-        else
-        {
+        } else {
             node = l.createTextNode();
-            node.setDom( (Dom) x );
+            node.setDom((Dom) x);
             node._cch = cch;
             node._off = i;
-            nodes = CharNode.appendNode( nodes, node );
+            nodes = CharNode.appendNode(nodes, node);
         }
 
         return nodes;
     }
 
-    final QName getXsiTypeName ( )
-    {
+    final QName getXsiTypeName() {
         assert isNode();
 
         return _xobj.getXsiTypeName();
     }
 
-    final void setXsiType ( QName value )
-    {
+    final void setXsiType(QName value) {
         assert isContainer();
 
-        setAttrValueAsQName( Locale._xsiType, value );
+        setAttrValueAsQName(value);
     }
 
-    final QName valueAsQName ( )
-    {
-        throw new RuntimeException( "Not implemented" );
+    final String namespaceForPrefix(String prefix, boolean defaultAlwaysMapped) {
+        return _xobj.namespaceForPrefix(prefix, defaultAlwaysMapped);
     }
 
-    final String namespaceForPrefix ( String prefix, boolean defaultAlwaysMapped )
-    {
-        return _xobj.namespaceForPrefix( prefix, defaultAlwaysMapped );
-    }
-
-    final String prefixForNamespace ( String ns, String suggestion, boolean createIfMissing )
-    {
+    final String prefixForNamespace(String ns, String suggestion, boolean createIfMissing) {
         return
             (isContainer() ? _xobj : getParent()).
-                prefixForNamespace( ns, suggestion, createIfMissing );
+                prefixForNamespace(ns, suggestion, createIfMissing);
     }
 
     // Does the node at this cursor properly contain the position specified by the argument
 
-    boolean contains ( Cur that )
-    {
+    boolean contains(Cur that) {
         assert isNode();
         assert that != null && that.isPositioned();
 
-        return _xobj.contains( that );
+        return _xobj.contains(that);
     }
 
-    void insertString ( String s )
-    {
+    void insertString(String s) {
         if (s != null)
-            insertChars( s, 0, s.length() );
+            insertChars(s, 0, s.length());
     }
 
-    void insertChars ( Object src, int off, int cch )
-    {
+    void insertChars(Object src, int off, int cch) {
         assert isPositioned() && !isRoot();
-        assert CharUtil.isValid( src, off, cch );
+        assert CharUtil.isValid(src, off, cch);
 
         // Check for nothing to insert
 
@@ -1687,7 +1582,7 @@
         // the new chars.  Note that a denormalized position can never be <= 0.
 
         Xobj x = getDenormal();
-        int  p = _posTemp;
+        int p = _posTemp;
 
         assert p > 0;
 
@@ -1695,13 +1590,13 @@
         // position after.  This insertChars takes care of all the appropriate invalidations
         // (passing true as last arg).
 
-        x.insertCharsHelper( p, src, off, cch, true );
+        x.insertCharsHelper(p, src, off, cch, true);
 
         // Reposition the cursor to be just before the newly inserted text.  It's current
         // position could have been shifted, or it may have been just before the end tag, or
         // normalized on another Xobj.
 
-        moveTo( x, p );
+        moveTo(x, p);
 
         _locale._versionAll++;
     }
@@ -1709,8 +1604,7 @@
     // Move the chars just after this Cur to the "to" Cur.  If no "to" Cur is specified,
     // then remove the chars.
 
-    Object moveChars ( Cur to, int cchMove )
-    {
+    Object moveChars(Cur to, int cchMove) {
         assert isPositioned();
         assert cchMove <= 0 || cchMove <= cchRight();
         assert to == null || (to.isPositioned() && !to.isRoot());
@@ -1720,8 +1614,7 @@
 
         // If we're instructed to move 0 characters, then return the null triple.
 
-        if (cchMove == 0)
-        {
+        if (cchMove == 0) {
             _offSrc = 0;
             _cchSrc = 0;
 
@@ -1731,40 +1624,35 @@
         // Here I record the triple of the chars to move.  I will return this.  No need to save
         // cch 'cause cchMove will be that value.
 
-        Object srcMoved = getChars( cchMove );
-        int    offMoved = _offSrc;
+        Object srcMoved = getChars(cchMove);
+        int offMoved = _offSrc;
 
         // Either I'm moving text from the value or the after text.  If after, then the container
         // must be occupied.  If in the value, because we're just before text, it must be occupied.
 
         assert isText() && (_pos >= _xobj.posAfter() ? _xobj._parent : _xobj).isOccupied();
 
-        if (to == null)
-        {
+        if (to == null) {
             // In this case, I'm removing chars vs moving them.  Normally I would like to blow
             // them away entirely, but if there are any references to those chars via a bookmark
             // I need to keep them alive.  I do this by moving these chars to a new root.  Note
             // that because Curs will stay behind, I don't have to check for them.
 
-            for ( Bookmark b = _xobj._bookmarks ; b != null ; b = b._next )
-            {
-                if (inChars( b, cchMove, false ))
-                {
+            for (Bookmark b = _xobj._bookmarks; b != null; b = b._next) {
+                if (inChars(b, cchMove, false)) {
                     Cur c = _locale.tempCur();
 
                     c.createRoot();
                     c.next();
 
-                    Object chars = moveChars( c, cchMove );
+                    Object chars = moveChars(c, cchMove);
 
                     c.release();
 
                     return chars;
                 }
             }
-        }
-        else
-        {
+        } else {
             // If the target, "to", is inside or on the edge of the text to be moved, then this
             // is a no-op.  In this case, I still want to return the text "moved".
             //
@@ -1773,13 +1661,12 @@
             // different location, then "to" would be at the beginning of the newly moved chars,
             // and "this" would be at the gap left by the newly removed chars.
 
-            if (inChars( to, cchMove, true ))
-            {
+            if (inChars(to, cchMove, true)) {
                 // BUGBUG - may want to consider shuffling the interior cursors to the right just
                 // like I move "this" to the right...
 
-                to.moveToCur( this );
-                nextChars( cchMove );
+                to.moveToCur(this);
+                nextChars(cchMove);
 
                 _offSrc = offMoved;
                 _cchSrc = cchMove;
@@ -1789,7 +1676,7 @@
 
             // Copy the chars here, I'll remove the originals next
 
-            to.insertChars( srcMoved, offMoved, cchMove );
+            to.insertChars(srcMoved, offMoved, cchMove);
         }
 
         // Notice that I can delay the general change notification to this point because any
@@ -1803,9 +1690,9 @@
         //if ( _xobj != null )
         {
             if (to == null)
-                _xobj.removeCharsHelper( _pos, cchMove, null, NO_POS, false, true );
+                _xobj.removeCharsHelper(_pos, cchMove, null, NO_POS, false, true);
             else
-                _xobj.removeCharsHelper( _pos, cchMove, to._xobj, to._pos, false, true );
+                _xobj.removeCharsHelper(_pos, cchMove, to._xobj, to._pos, false, true);
         }
 
         // Need to update the position of this cursor even though it did not move anywhere.  This
@@ -1821,11 +1708,10 @@
         return srcMoved;
     }
 
-    void moveNode ( Cur to )
-    {
+    void moveNode(Cur to) {
         assert isNode() && !isRoot();
         assert to == null || to.isPositioned();
-        assert to == null || !contains( to );
+        assert to == null || !contains(to);
         assert to == null || !to.isRoot();
 
         // TODO - should assert that is an attr is being moved, it is ok there
@@ -1843,7 +1729,7 @@
         // worry about messing with "this" here given that it not should be treated like any other
         // cursor after this point.
 
-        moveNode( x, to );
+        moveNode(x, to);
     }
 
     // Moves text from one place to another in a low-level way, used as a helper for the higher
@@ -1852,13 +1738,12 @@
     // arguments are denormalized.  The Xobj's must be different from eachother but from the same
     // locale.  The destination must not be not be vacant.
 
-    private static void transferChars ( Xobj xFrom, int pFrom, Xobj xTo, int pTo, int cch )
-    {
+    private static void transferChars(Xobj xFrom, int pFrom, Xobj xTo, int pTo, int cch) {
         assert xFrom != xTo;
         assert xFrom._locale == xTo._locale;
-        assert pFrom > 0 && pFrom <  xFrom.posMax();
-        assert pTo   > 0 && pTo   <= xTo  .posMax();
-        assert cch > 0 && cch <= xFrom.cchRight( pFrom );
+        assert pFrom > 0 && pFrom < xFrom.posMax();
+        assert pTo > 0 && pTo <= xTo.posMax();
+        assert cch > 0 && cch <= xFrom.cchRight(pFrom);
         assert pTo >= xTo.posAfter() || xTo.isOccupied();
 
         // Copy the chars from -> to without performing any invalidations.  This will scoot curs
@@ -1867,23 +1752,21 @@
         // exactly be "correct" here.
 
         xTo.insertCharsHelper(
-            pTo, xFrom.getCharsHelper( pFrom, cch ),
-            xFrom._locale._offSrc, xFrom._locale._cchSrc, false );
+            pTo, xFrom.getCharsHelper(pFrom, cch),
+            xFrom._locale._offSrc, xFrom._locale._cchSrc, false);
 
-        xFrom.removeCharsHelper( pFrom, cch, xTo, pTo, true, false );
+        xFrom.removeCharsHelper(pFrom, cch, xTo, pTo, true, false);
     }
 
     // Moves the node x to "to", or removes it if to is null.
 
-    static void moveNode ( Xobj x, Cur to )
-    {
+    static void moveNode(Xobj x, Cur to) {
         assert x != null && !x.isRoot();
         assert to == null || to.isPositioned();
-        assert to == null || !x.contains( to );
+        assert to == null || !x.contains(to);
         assert to == null || !to.isRoot();
 
-        if (to != null)
-        {
+        if (to != null) {
             // Before I go much further, I want to make sure that if "to" is in the container of
             // a vacant node, I get it occupied.  I do not need to worry about the source being
             // vacant.
@@ -1896,11 +1779,10 @@
             // that I make sure that to gets oved to the beginning of the node.  The position of
             // to in all operations should leave to just before the content moved/inserted.
 
-            if ((to._pos == 0 && to._xobj == x) || to.isJustAfterEnd( x ))
-            {
+            if ((to._pos == 0 && to._xobj == x) || to.isJustAfterEnd(x)) {
                 // TODO - should shuffle contained curs to the right???
 
-                to.moveTo( x );
+                to.moveTo(x);
                 return;
             }
         }
@@ -1912,8 +1794,7 @@
         x._locale._versionAll++;
         x._locale._versionSansText++;
 
-        if (to != null && to._locale != x._locale)
-        {
+        if (to != null && to._locale != x._locale) {
             to._locale.notifyChange();
 
             to._locale._versionAll++;
@@ -1924,9 +1805,8 @@
         // Also, this node may be an attribute -- invalidate special attrs ...
 
         if (x.isAttr())
-            x.invalidateSpecialAttr( to == null ? null : to.getParentRaw() );
-        else
-        {
+            x.invalidateSpecialAttr(to == null ? null : to.getParentRaw());
+        else {
             if (x._parent != null)
                 x._parent.invalidateUser();
 
@@ -1941,8 +1821,9 @@
         // I need to move this text away here so that when I walk the tree next, *all* curs
         // embedded in this node or deeper will be moved off this node.
 
-        if (x._cchAfter > 0)
-            transferChars( x, x.posAfter(), x.getDenormal( 0 ), x.posTemp(), x._cchAfter );
+        if (x._cchAfter > 0) {
+            transferChars(x, x.posAfter(), x.getDenormal(0), x.posTemp(), x._cchAfter);
+        }
 
         assert x._cchAfter == 0;
 
@@ -1952,15 +1833,16 @@
 
         x._locale.embedCurs();
 
-        for ( Xobj y = x ; y != null ; y = y.walk( x, true ) )
-        {
-            while ( y._embedded != null )
-                y._embedded.moveTo( x.getNormal( x.posAfter() ) );
+        for (Xobj y = x; y != null; y = y.walk(x, true)) {
+            while (y._embedded != null) {
+                y._embedded.moveTo(x.getNormal(x.posAfter()));
+            }
 
             y.disconnectUser();
 
-            if (to != null)
+            if (to != null) {
                 y._locale = to._locale;
+            }
         }
 
         // Now, actually remove the node
@@ -1970,8 +1852,7 @@
         // Now, if there is a destination, insert the node there and shuffle the text in the
         // vicinity of the destination appropriately.
 
-        if (to != null)
-        {
+        if (to != null) {
             // To know where I should insert/append the node to move, I need to see where "to"
             // would be if there were no text after it.  However, I need to keep "to" where it
             // is when I move the text after it later.
@@ -1981,8 +1862,7 @@
 
             int cchRight = to.cchRight();
 
-            if (cchRight > 0)
-            {
+            if (cchRight > 0) {
                 to.push();
                 to.next();
                 here = to._xobj;
@@ -1991,33 +1871,31 @@
             }
 
             if (append)
-                here.appendXobj( x );
+                here.appendXobj(x);
             else
-                here.insertXobj( x );
+                here.insertXobj(x);
 
             // The only text I need to move is that to the right of "to".  Even considering all
             // the cases where an attribute is involed!
 
             if (cchRight > 0)
-                transferChars( to._xobj, to._pos, x, x.posAfter(), cchRight );
+                transferChars(to._xobj, to._pos, x, x.posAfter(), cchRight);
 
-            to.moveTo( x );
+            to.moveTo(x);
         }
     }
 
-    void moveNodeContents ( Cur to, boolean moveAttrs )
-    {
-        assert _pos==0;
+    void moveNodeContents(Cur to, boolean moveAttrs) {
+        assert _pos == 0;
         assert to == null || !to.isRoot();
 
         // By calling this helper, I do not have to deal with this Cur any longer.  Basically,
         // this Cur is out of the picture, it behaves like any other cur at this point.
 
-        moveNodeContents( _xobj, to, moveAttrs );
+        moveNodeContents(_xobj, to, moveAttrs);
     }
 
-    static void moveNodeContents ( Xobj x, Cur to, boolean moveAttrs )
-    {
+    static void moveNodeContents(Xobj x, Cur to, boolean moveAttrs) {
         // TODO - should assert that is an attr is being moved, it is ok there
 
         assert to == null || !to.isRoot();
@@ -2030,25 +1908,21 @@
 
         // Deal with the cases where only text is involved in the move
 
-        if (noSubNodesToMove)
-        {
+        if (noSubNodesToMove) {
             // If we're vacant and there is no place to move a potential value, then I can avoid
             // acquiring the text from the TypeStoreUser.  Otherwise, there may be text here I
             // need to move somewhere else.
 
-            if (x.isVacant() && to == null)
-            {
-                x.clearBit( Xobj.VACANT );
+            if (x.isVacant() && to == null) {
+                x.clearBit(Xobj.VACANT);
 
                 x.invalidateUser();
-                x.invalidateSpecialAttr( null );
+                x.invalidateSpecialAttr(null);
                 x._locale._versionAll++;
-            }
-            else if (x.hasTextEnsureOccupancy())
-            {
+            } else if (x.hasTextEnsureOccupancy()) {
                 Cur c = x.tempCur();
                 c.next();
-                c.moveChars( to, -1 );
+                c.moveChars(to, -1);
                 c.release();
             }
 
@@ -2058,17 +1932,15 @@
         // Here I check to see if "to" is just inside x.  In this case this is a no-op.  Note that
         // the value of x may still be vacant.
 
-        if (to != null)
-        {
+        if (to != null) {
             // Quick check of the right edge.  If it is there, I need to move "to" to the left edge
             // so that it is positioned at the beginning of the "moved" content.
 
-            if (x == to._xobj && to._pos == END_POS)
-            {
+            if (x == to._xobj && to._pos == END_POS) {
                 // TODO - shuffle interior curs?
 
-                to.moveTo( x );
-                to.next( moveAttrs && hasAttrs );
+                to.moveTo(x);
+                to.next(moveAttrs && hasAttrs);
 
                 return;
             }
@@ -2080,11 +1952,10 @@
 
             boolean isAtLeftEdge = false;
 
-            if (to._locale == x._locale)
-            {
+            if (to._locale == x._locale) {
                 to.push();
-                to.moveTo( x );
-                to.next( moveAttrs && hasAttrs );
+                to.moveTo(x);
+                to.next(moveAttrs && hasAttrs);
                 isAtLeftEdge = to.isAtLastPush();
                 to.pop();
             }
@@ -2096,7 +1967,7 @@
 
             // Now, after dealing with the edge condition, I can assert that to is not inside x
 
-            assert !x.contains( to );
+            assert !x.contains(to);
 
             // So, at this point, I've taken case of the no-op cases and the movement of just text.
             // Also, to must be occupied because I took care of the text only and nothing to move
@@ -2113,15 +1984,14 @@
 
         int valueMovedCch = 0;
 
-        if (x.hasTextNoEnsureOccupancy())
-        {
+        if (x.hasTextNoEnsureOccupancy()) {
             Cur c = x.tempCur();
             c.next();
-            c.moveChars( to, -1 );
+            c.moveChars(to, -1);
             c.release();
 
             if (to != null)
-                to.nextChars( valueMovedCch = c._cchSrc );
+                to.nextChars(valueMovedCch = c._cchSrc);
         }
 
         // Now, walk all the contents, invalidating special attrs, reportioning cursors,
@@ -2130,26 +2000,23 @@
 
         x._locale.embedCurs();
 
-        Xobj firstToMove = x.walk( x, true );
+        Xobj firstToMove = x.walk(x, true);
         boolean sawBookmark = false;
 
-        for ( Xobj y = firstToMove ; y != null ; y = y.walk( x, true ) )
-        {
-            if (y._parent == x && y.isAttr())
-            {
+        for (Xobj y = firstToMove; y != null; y = y.walk(x, true)) {
+            if (y._parent == x && y.isAttr()) {
                 assert y._cchAfter == 0;
 
-                if (!moveAttrs)
-                {
+                if (!moveAttrs) {
                     firstToMove = y._nextSibling;
                     continue;
                 }
 
-                y.invalidateSpecialAttr( to == null ? null : to.getParent() );
+                y.invalidateSpecialAttr(to == null ? null : to.getParent());
             }
 
-            for ( Cur c ; (c = y._embedded) != null ; )
-                c.moveTo( x, END_POS );
+            for (Cur c; (c = y._embedded) != null; )
+                c.moveTo(x, END_POS);
 
             y.disconnectUser();
 
@@ -2169,8 +2036,7 @@
 
         Cur surragateTo = null;
 
-        if (sawBookmark && to == null)
-        {
+        if (sawBookmark && to == null) {
             surragateTo = to = x._locale.tempCur();
             to.createRoot();
             to.next();
@@ -2186,8 +2052,7 @@
         x._locale._versionAll++;
         x._locale._versionSansText++;
 
-        if (to != null && valueMovedCch == 0)
-        {
+        if (to != null && valueMovedCch == 0) {
             to.getParent().invalidateUser();
             to._locale._versionAll++;
             to._locale._versionSansText++;
@@ -2195,10 +2060,9 @@
 
         // Remove the children and, if needed, move them
 
-        x.removeXobjs( firstToMove, lastToMove );
+        x.removeXobjs(firstToMove, lastToMove);
 
-        if (to != null)
-        {
+        if (to != null) {
             // To know where I should insert/append the contents to move, I need to see where "to"
             // would be if there were no text after it.
 
@@ -2207,8 +2071,7 @@
 
             int cchRight = to.cchRight();
 
-            if (cchRight > 0)
-            {
+            if (cchRight > 0) {
                 to.push();
                 to.next();
                 here = to._xobj;
@@ -2227,53 +2090,51 @@
             // as the containers value text when the last new node being inserted is an attr!
             // Whew!
 
-            if (firstToMove.isAttr())
-            {
+            if (firstToMove.isAttr()) {
                 Xobj lastNewAttr = firstToMove;
 
-                while ( lastNewAttr._nextSibling != null && lastNewAttr._nextSibling.isAttr() )
+                while (lastNewAttr._nextSibling != null && lastNewAttr._nextSibling.isAttr())
                     lastNewAttr = lastNewAttr._nextSibling;
 
                 // Get to's parnet now before I potentially move him with the next transfer
 
                 Xobj y = to.getParent();
 
-                if (cchRight > 0)
-                    transferChars( to._xobj, to._pos, lastNewAttr, lastNewAttr.posMax(), cchRight );
+                if (cchRight > 0) {
+                    transferChars(to._xobj, to._pos, lastNewAttr, lastNewAttr.posMax(), cchRight);
+                }
 
-                if (y.hasTextNoEnsureOccupancy())
-                {
+                if (y.hasTextNoEnsureOccupancy()) {
                     int p, cch;
 
-                    if (y._cchValue > 0)
-                    {
+                    if (y._cchValue > 0) {
                         p = 1;
                         cch = y._cchValue;
-                    }
-                    else
-                    {
+                    } else {
                         y = y.lastAttr();
+                        assert(y != null);
                         p = y.posAfter();
                         cch = y._cchAfter;
                     }
 
-                    transferChars( y, p, lastNewAttr, lastNewAttr.posAfter(), cch );
+                    transferChars(y, p, lastNewAttr, lastNewAttr.posAfter(), cch);
                 }
+            } else if (cchRight > 0) {
+                transferChars(to._xobj, to._pos, lastToMove, lastToMove.posMax(), cchRight);
             }
-            else if (cchRight > 0)
-                transferChars( to._xobj, to._pos, lastToMove, lastToMove.posMax(), cchRight );
 
             // After mucking with the text, splice the new tree in
 
-            if (append)
-                here.appendXobjs( firstToMove, lastToMove );
-            else
-                here.insertXobjs( firstToMove, lastToMove );
+            if (append) {
+                here.appendXobjs(firstToMove, lastToMove);
+            } else {
+                here.insertXobjs(firstToMove, lastToMove);
+            }
 
             // Position "to" to be at the beginning of the newly inserted contents
 
-            to.moveTo( firstToMove );
-            to.prevChars( valueMovedCch );
+            to.moveTo(firstToMove);
+            to.prevChars(valueMovedCch);
         }
 
         // If I consed up a to, release it here
@@ -2282,28 +2143,25 @@
             surragateTo.release();
     }
 
-    protected final Bookmark setBookmark ( Object key, Object value )
-    {
+    protected final Bookmark setBookmark(Object key, Object value) {
         assert isNormal();
         assert key != null;
 
-        return _xobj.setBookmark( _pos, key, value );
+        return _xobj.setBookmark(_pos, key, value);
     }
 
-    Object getBookmark ( Object key )
-    {
+    Object getBookmark(Object key) {
         assert isNormal();
         assert key != null;
 
-        for ( Bookmark b = _xobj._bookmarks ; b != null ; b = b._next )
+        for (Bookmark b = _xobj._bookmarks; b != null; b = b._next)
             if (b._pos == _pos && b._key == key)
                 return b._value;
 
         return null;
     }
 
-    int firstBookmarkInChars ( Object key, int cch )
-    {
+    int firstBookmarkInChars(Object key, int cch) {
         assert isNormal();
         assert key != null;
         assert cch > 0;
@@ -2311,18 +2169,16 @@
 
         int d = -1;
 
-        if (isText())
-        {
-            for ( Bookmark b = _xobj._bookmarks ; b != null ; b = b._next )
-                if (b._key == key && inChars( b, cch, false ))
+        if (isText()) {
+            for (Bookmark b = _xobj._bookmarks; b != null; b = b._next)
+                if (b._key == key && inChars(b, cch, false))
                     d = (d == -1 || b._pos - _pos < d) ? b._pos - _pos : d;
         }
 
         return d;
     }
 
-    int firstBookmarkInCharsLeft ( Object key, int cch )
-    {
+    int firstBookmarkInCharsLeft(Object key, int cch) {
         assert isNormal();
         assert key != null;
         assert cch > 0;
@@ -2330,55 +2186,50 @@
 
         int d = -1;
 
-        if (cchLeft() > 0)
-        {
+        if (cchLeft() > 0) {
             Xobj x = getDenormal();
-            int  p = _posTemp - cch;
+            int p = _posTemp - cch;
 
-            for ( Bookmark b = x._bookmarks ; b != null ; b = b._next )
-                if (b._key == key && x.inChars( p, b._xobj, b._pos, cch, false ))
+            for (Bookmark b = x._bookmarks; b != null; b = b._next) {
+                if (b._key == key && x.inChars(p, b._xobj, b._pos, cch, false)) {
                     d = (d == -1 || b._pos - p < d) ? b._pos - p : d;
+                }
+            }
         }
 
         return d;
     }
 
-    String getCharsAsString ( int cch )
-    {
+    String getCharsAsString() {
         assert isNormal() && _xobj != null;
 
-        return getCharsAsString( cch, Locale.WS_PRESERVE );
+        return getCharsAsString(Locale.WS_PRESERVE);
     }
 
-    String getCharsAsString ( int cch, int wsr )
-    {
-        return _xobj.getCharsAsString( _pos, cch, wsr );
+    String getCharsAsString(int wsr) {
+        return _xobj.getCharsAsString(_pos, -1, wsr);
     }
 
-    String getValueAsString ( int wsr )
-    {
+    String getValueAsString(int wsr) {
         assert isNode();
 
-        return _xobj.getValueAsString( wsr );
+        return _xobj.getValueAsString(wsr);
     }
 
-    String getValueAsString ( )
-    {
+    String getValueAsString() {
         assert isNode();
-        assert ! hasChildren();
+        assert !hasChildren();
 
         return _xobj.getValueAsString();
     }
 
-    Object getChars ( int cch )
-    {
+    Object getChars(int cch) {
         assert isPositioned();
 
-        return _xobj.getChars( _pos, cch, this );
+        return _xobj.getChars(_pos, cch, this);
     }
 
-    Object getFirstChars ( )
-    {
+    Object getFirstChars() {
         assert isNode();
 
         Object src = _xobj.getFirstChars();
@@ -2389,49 +2240,43 @@
         return src;
     }
 
-    void copyNode ( Cur to )
-    {
+    void copyNode(Cur to) {
         assert to != null;
         assert isNode();
 
-        Xobj copy = _xobj.copyNode( to._locale );
+        Xobj copy = _xobj.copyNode(to._locale);
 
         // TODO - in the moveNode case, I would not have to walk the tree for cursors ... optimize
 
-        if (to.isPositioned())
-            Cur.moveNode( copy, to );
-        else
-            to.moveTo( copy );
+        if (to.isPositioned()) {
+            Cur.moveNode(copy, to);
+        } else {
+            to.moveTo(copy);
+        }
     }
 
-    Cur weakCur ( Object o )
-    {
-        Cur c = _locale.weakCur( o );
-        c.moveToCur( this );
+    Cur weakCur(Object o) {
+        Cur c = _locale.weakCur(o);
+        c.moveToCur(this);
         return c;
     }
 
-    Cur tempCur ( )
-    {
-        return tempCur( null );
-    }
-
-    Cur tempCur ( String id )
-    {
-        Cur c = _locale.tempCur( id );
-        c.moveToCur( this );
+    Cur tempCur() {
+        String id = null;
+        Cur c = _locale.tempCur(id);
+        c.moveToCur(this);
         return c;
     }
 
-    private Cur tempCur ( Xobj x, int p )
-    {
-        assert _locale == x._locale;
-        assert x != null || p == NO_POS;
+    private Cur tempCur(Xobj x, int p) {
+        assert (x == null || _locale == x._locale);
+        assert (x != null || p == NO_POS);
 
         Cur c = _locale.tempCur();
 
-        if (x != null)
-            c.moveTo( getNormal( x, p ), _posTemp );
+        if (x != null) {
+            c.moveTo(getNormal(x, p), _posTemp);
+        }
 
         return c;
     }
@@ -2440,66 +2285,59 @@
     // Is inclusive on the left, and inclusive/exclusive on the right depending on the value
     // of includeEnd.
 
-    boolean inChars ( Cur c, int cch, boolean includeEnd )
-    {
+    boolean inChars(Cur c, int cch, boolean includeEnd) {
         assert isPositioned() && isText() && cchRight() >= cch;
         assert c.isNormal();
 
-        return _xobj.inChars( _pos, c._xobj, c._pos, cch, includeEnd );
+        return _xobj.inChars(_pos, c._xobj, c._pos, cch, includeEnd);
     }
 
-    boolean inChars ( Bookmark b, int cch, boolean includeEnd )
-    {
+    boolean inChars(Bookmark b, int cch, boolean includeEnd) {
         assert isPositioned() && isText() && cchRight() >= cch;
-        assert b._xobj.isNormal( b._pos );
+        assert b._xobj.isNormal(b._pos);
 
-        return _xobj.inChars( _pos, b._xobj, b._pos, cch, includeEnd );
+        return _xobj.inChars(_pos, b._xobj, b._pos, cch, includeEnd);
     }
 
     // Can't be static because I need to communicate pos in _posTemp :-(
     // I wish I had multiple return vars ...
 
-    private Xobj getNormal ( Xobj x, int p )
-    {
-        Xobj nx = x.getNormal( p );
+    private Xobj getNormal(Xobj x, int p) {
+        Xobj nx = x.getNormal(p);
         _posTemp = x._locale._posTemp;
         return nx;
     }
 
-    private Xobj getDenormal ( )
-    {
+    private Xobj getDenormal() {
         assert isPositioned();
 
-        return getDenormal( _xobj, _pos );
+        return getDenormal(_xobj, _pos);
     }
 
-    private Xobj getDenormal ( Xobj x, int p )
-    {
-        Xobj dx = x.getDenormal( p );
+    private Xobj getDenormal(Xobj x, int p) {
+        Xobj dx = x.getDenormal(p);
         _posTemp = x._locale._posTemp;
         return dx;
     }
 
     // May throw IllegalArgumentException if can't change the type
 
-    void setType ( SchemaType type )
-    {
-        setType( type, true );
+    void setType(SchemaType type) {
+        setType(type, true);
     }
 
-    void setType ( SchemaType type, boolean complain )
-    {
+    void setType(SchemaType type, boolean complain) {
         assert type != null;
         assert isUserNode();
 
         TypeStoreUser user = peekUser();
 
-        if (user != null && user.get_schema_type() == type)
+        if (user != null && user.get_schema_type() == type) {
             return;
+        }
 
-        if (isRoot())
-        {
-            _xobj.setStableType( type );
+        if (isRoot()) {
+            _xobj.setStableType(type);
             return;
         }
 
@@ -2510,13 +2348,9 @@
         // One may only set the type of an attribute to its 'natural' type because
         // attributes cannot take advantage of the xsiType attribute.
 
-        if (isAttr())
-        {
-            if (complain && parentUser.get_attribute_type( getName() ) != type)
-            {
-                throw
-                    new IllegalArgumentException(
-                        "Can't set type of attribute to " + type.toString() );
+        if (isAttr()) {
+            if (complain && parentUser.get_attribute_type(getName()) != type) {
+                throw new IllegalArgumentException("Can't set type of attribute to " + type.toString());
             }
 
             return;
@@ -2527,9 +2361,8 @@
         // First check to see if this type can be here sans xsi:type.
         // If so, make sure there is no xsi:type
 
-        if (parentUser.get_element_type( getName(), null ) == type)
-        {
-            removeAttr( Locale._xsiType );
+        if (parentUser.get_element_type(getName(), null) == type) {
+            removeAttr(Locale._xsiType);
             return;
         }
 
@@ -2538,45 +2371,39 @@
 
         QName typeName = type.getName();
 
-        if (typeName == null)
-        {
-            if (complain)
-                throw new IllegalArgumentException( "Can't set type of element, type is un-named" );
-            else
+        if (typeName == null) {
+            if (complain) {
+                throw new IllegalArgumentException("Can't set type of element, type is un-named");
+            } else {
                 return;
+            }
         }
 
         // See if setting xsiType would result in the target type
 
-        if (parentUser.get_element_type( getName(), typeName ) != type)
-        {
-            if (complain)
-                throw new IllegalArgumentException( "Can't set type of element, invalid type" );
-            else
+        if (parentUser.get_element_type(getName(), typeName) != type) {
+            if (complain) {
+                throw new IllegalArgumentException("Can't set type of element, invalid type");
+            } else {
                 return;
+            }
         }
 
-        setAttrValueAsQName( Locale._xsiType, typeName );
+        setAttrValueAsQName(typeName);
     }
 
-    void setSubstitution ( QName name, SchemaType type )
-    {
-        setSubstitution( name, type, true );
-    }
-    
-    void setSubstitution ( QName name, SchemaType type, boolean complain )
-    {
+    void setSubstitution(QName name, SchemaType type) {
         assert name != null;
         assert type != null;
         assert isUserNode();
 
         TypeStoreUser user = peekUser();
 
-        if (user != null && user.get_schema_type() == type && name.equals(getName()))
+        if (user != null && user.get_schema_type() == type && name.equals(getName())) {
             return;
+        }
 
-        if (isRoot())
-        {
+        if (isRoot()) {
             // If this is the root node, we can't set its name, so the whole
             // operation is aborted
             return;
@@ -2589,15 +2416,8 @@
         // One may only set the type of an attribute to its 'natural' type because
         // attributes cannot take advantage of the xsiType attribute.
 
-        if (isAttr())
-        {
-            if (complain)
-            {
-                throw
-                    new IllegalArgumentException(
-                        "Can't use substitution with attributes");
-            }
-
+        if (isAttr()) {
+            // Can't use substitution with attributes
             return;
         }
 
@@ -2606,10 +2426,9 @@
         // First check to see if this type can be here sans xsi:type.
         // If so, make sure there is no xsi:type
 
-        if (parentUser.get_element_type( name, null ) == type)
-        {
-            setName( name );
-            removeAttr( Locale._xsiType );
+        if (parentUser.get_element_type(name, null) == type) {
+            setName(name);
+            removeAttr(Locale._xsiType);
             return;
         }
 
@@ -2618,92 +2437,77 @@
 
         QName typeName = type.getName();
 
-        if (typeName == null)
-        {
-            if (complain)
-                throw new IllegalArgumentException( "Can't set xsi:type on element, type is un-named" );
-            else
-                return;
+        if (typeName == null) {
+            // Can't set xsi:type on element, type is un-named
+            return;
         }
 
         // See if setting xsiType would result in the target type
-        
-        if (parentUser.get_element_type( name, typeName ) != type)
-        {
-            if (complain)
-                throw new IllegalArgumentException( "Can't set xsi:type on element, invalid type" );
-            else
-                return;
+
+        if (parentUser.get_element_type(name, typeName) != type) {
+            // Can't set xsi:type on element, invalid type
+            return;
         }
 
-        setName( name );
-        setAttrValueAsQName( Locale._xsiType, typeName );
+        setName(name);
+        setAttrValueAsQName(typeName);
     }
 
-    TypeStoreUser peekUser ( )
-    {
+    TypeStoreUser peekUser() {
         assert isUserNode();
 
         return _xobj._user;
     }
 
-    XmlObject getObject ( )
-    {
+    XmlObject getObject() {
         return isUserNode() ? (XmlObject) getUser() : null;
     }
 
-    TypeStoreUser getUser ( )
-    {
+    TypeStoreUser getUser() {
         assert isUserNode();
 
         return _xobj.getUser();
     }
 
-    Dom getDom ( )
-    {
+    Dom getDom() {
         assert isNormal();
         assert isPositioned();
 
-        if (isText())
-        {
+        if (isText()) {
             int cch = cchLeft();
 
-            for ( CharNode cn = getCharNodes() ; ; cn = cn._next )
-                if ((cch -= cn._cch) < 0)
+            for (CharNode cn = getCharNodes(); ; cn = cn._next) {
+                if ((cch -= cn._cch) < 0) {
                     return cn;
+                }
+            }
         }
 
         return _xobj.getDom();
     }
 
-    static void release ( Cur c )
-    {
-        if (c != null)
-            c.release();
-    }
-
-    void release ( )
-    {
-        if (_tempFrame >= 0)
-        {
-            if (_nextTemp != null)
+    void release() {
+        if (_tempFrame >= 0) {
+            if (_nextTemp != null) {
                 _nextTemp._prevTemp = _prevTemp;
+            }
 
-            if (_prevTemp == null)
-                _locale._tempFrames[ _tempFrame ] = _nextTemp;
-            else
+            if (_prevTemp == null) {
+                _locale._tempFrames[_tempFrame] = _nextTemp;
+            } else {
                 _prevTemp._nextTemp = _nextTemp;
+            }
 
             _prevTemp = _nextTemp = null;
             _tempFrame = -1;
         }
 
-        if (_state != POOLED && _state != DISPOSED)
-        {
+        if (_state != POOLED && _state != DISPOSED) {
             // Clean up any state
 
-            while ( _stackTop != -1 )
+            while (_stackTop != -1) {
                 popButStay();
+            }
 
             clearSelection();
 
@@ -2711,17 +2515,16 @@
 
             // Unposition
 
-            moveToCur( null );
+            moveToCur(null);
 
             assert isNormal();
 
             assert _xobj == null;
-            assert _pos  == NO_POS;
+            assert _pos == NO_POS;
 
             // Release weak reference and attacked value
 
-            if (_ref != null)
-            {
+            if (_ref != null) {
                 _ref.clear();
                 _ref._cur = null;
             }
@@ -2731,39 +2534,35 @@
             // Unregister and either diapose of cursor or add it back to pool
 
             assert _state == REGISTERED;
-            _locale._registered = listRemove( _locale._registered );
+            _locale._registered = listRemove(_locale._registered);
 
-            if (_locale._curPoolCount < 16)
-            {
-                _locale._curPool = listInsert( _locale._curPool );
+            if (_locale._curPoolCount < 16) {
+                _locale._curPool = listInsert(_locale._curPool);
                 _state = POOLED;
                 _locale._curPoolCount++;
-            }
-            else
-            {
+            } else {
                 _locale = null;
                 _state = DISPOSED;
             }
         }
     }
 
-    boolean isOnList ( Cur head )
-    {
-        for ( ; head != null ; head = head._next )
-            if (head == this)
+    boolean isOnList(Cur head) {
+        for (; head != null; head = head._next) {
+            if (head == this) {
                 return true;
+            }
+        }
 
         return false;
     }
 
-    Cur listInsert ( Cur head )
-    {
+    Cur listInsert(Cur head) {
         assert _next == null && _prev == null;
 
-        if (head == null)
+        if (head == null) {
             head = _prev = this;
-        else
-        {
+        } else {
             _prev = head._prev;
             head._prev = head._prev._next = this;
         }
@@ -2771,23 +2570,23 @@
         return head;
     }
 
-    Cur listRemove ( Cur head )
-    {
-        assert _prev != null && isOnList( head );
+    Cur listRemove(Cur head) {
+        assert _prev != null && isOnList(head);
 
-        if (_prev == this)
+        if (_prev == this) {
             head = null;
-        else
-        {
-            if (head == this)
+        } else {
+            if (head == this) {
                 head = _next;
-            else
+            } else {
                 _prev._next = _next;
+            }
 
-            if (_next == null)
-                head._prev = _prev;
-            else
-            {
+            if (_next == null) {
+                if (head != null) {
+                    head._prev = _prev;
+                }
+            } else {
                 _next._prev = _prev;
                 _next = null;
             }
@@ -2804,58 +2603,58 @@
 //        return isNormal() && (that == null || (_locale == that._locale && that.isNormal()));
 //    }
 
-    boolean isNormal ( )
-    {
-        if (_state == POOLED || _state == DISPOSED)
+    boolean isNormal() {
+        if (_state == POOLED || _state == DISPOSED) {
             return false;
+        }
 
-        if (_xobj == null)
+        if (_xobj == null) {
             return _pos == NO_POS;
+        }
 
-        if (!_xobj.isNormal( _pos ))
+        if (!_xobj.isNormal(_pos)) {
             return false;
+        }
 
-        if (_state == EMBEDDED)
-            return isOnList( _xobj._embedded );
+        if (_state == EMBEDDED) {
+            return isOnList(_xobj._embedded);
+        }
 
         assert _state == REGISTERED;
 
-        return isOnList( _locale._registered );
+        return isOnList(_locale._registered);
     }
 
     static final String LOAD_USE_LOCALE_CHAR_UTIL = "LOAD_USE_LOCALE_CHAR_UTIL";
 
-    static final class CurLoadContext extends LoadContext
-    {
-        CurLoadContext ( Locale l, XmlOptions options )
-        {
-            options = XmlOptions.maskNull( options );
+    static final class CurLoadContext extends LoadContext {
+        CurLoadContext(Locale l, XmlOptions options) {
+            options = XmlOptions.maskNull(options);
 
             _locale = l;
 
             _charUtil =
-                options.hasOption( LOAD_USE_LOCALE_CHAR_UTIL )
+                options.hasOption(LOAD_USE_LOCALE_CHAR_UTIL)
                     ? _locale.getCharUtil()
                     : CharUtil.getThreadLocalCharUtil();
 
-            _frontier = createDomDocumentRootXobj( _locale );
+            _frontier = createDomDocumentRootXobj(_locale);
             _after = false;
 
             _lastXobj = _frontier;
-            _lastPos  = 0;
+            _lastPos = 0;
 
-            if (options.hasOption( XmlOptions.LOAD_REPLACE_DOCUMENT_ELEMENT ))
-            {
-                _replaceDocElem = (QName) options.get( XmlOptions.LOAD_REPLACE_DOCUMENT_ELEMENT );
+            if (options.hasOption(XmlOptions.LOAD_REPLACE_DOCUMENT_ELEMENT)) {
+                _replaceDocElem = (QName) options.get(XmlOptions.LOAD_REPLACE_DOCUMENT_ELEMENT);
                 _discardDocElem = true;
             }
 
-            _stripWhitespace = options.hasOption( XmlOptions.LOAD_STRIP_WHITESPACE );
-            _stripComments   = options.hasOption( XmlOptions.LOAD_STRIP_COMMENTS   );
-            _stripProcinsts  = options.hasOption( XmlOptions.LOAD_STRIP_PROCINSTS  );
+            _stripWhitespace = options.hasOption(XmlOptions.LOAD_STRIP_WHITESPACE);
+            _stripComments = options.hasOption(XmlOptions.LOAD_STRIP_COMMENTS);
+            _stripProcinsts = options.hasOption(XmlOptions.LOAD_STRIP_PROCINSTS);
 
-            _substituteNamespaces = (Map) options.get( XmlOptions.LOAD_SUBSTITUTE_NAMESPACES );
-            _additionalNamespaces = (Map) options.get( XmlOptions.LOAD_ADDITIONAL_NAMESPACES );
+            _substituteNamespaces = (Map) options.get(XmlOptions.LOAD_SUBSTITUTE_NAMESPACES);
+            _additionalNamespaces = (Map) options.get(XmlOptions.LOAD_ADDITIONAL_NAMESPACES);
 
             _locale._versionAll++;
             _locale._versionSansText++;
@@ -2865,93 +2664,83 @@
         // Really primitive load context operations
         //
 
-        private void start ( Xobj xo )
-        {
+        private void start(Xobj xo) {
             assert _frontier != null;
             assert !_after || _frontier._parent != null;
 
             flushText();
 
-            if (_after)
-            {
+            if (_after) {
                 _frontier = _frontier._parent;
                 _after = false;
             }
 
-            _frontier.appendXobj( xo );
+            _frontier.appendXobj(xo);
             _frontier = xo;
 
             _lastXobj = xo;
-            _lastPos  = 0;
+            _lastPos = 0;
         }
 
-        private void end ( )
-        {
+        private void end() {
             assert _frontier != null;
             assert !_after || _frontier._parent != null;
 
             flushText();
 
-            if (_after)
+            if (_after) {
                 _frontier = _frontier._parent;
-            else
+            } else {
                 _after = true;
+            }
 
             _lastXobj = _frontier;
-            _lastPos  = END_POS;
+            _lastPos = END_POS;
         }
 
-        private void text ( Object src, int off, int cch )
-        {
-            if (cch <= 0)
+        private void text(Object src, int off, int cch) {
+            if (cch <= 0) {
                 return;
+            }
 
             _lastXobj = _frontier;
-            _lastPos  = _frontier._cchValue + 1;
+            _lastPos = _frontier._cchValue + 1;
 
-            if (_after)
-            {
+            if (_after) {
                 _lastPos += _frontier._cchAfter + 1;
 
                 _frontier._srcAfter =
                     _charUtil.saveChars(
                         src, off, cch,
-                        _frontier._srcAfter, _frontier._offAfter, _frontier._cchAfter );
+                        _frontier._srcAfter, _frontier._offAfter, _frontier._cchAfter);
 
                 _frontier._offAfter = _charUtil._offSrc;
                 _frontier._cchAfter = _charUtil._cchSrc;
 
-            }
-            else
-            {
+            } else {
                 _frontier._srcValue =
                     _charUtil.saveChars(
                         src, off, cch,
-                        _frontier._srcValue, _frontier._offValue, _frontier._cchValue );
+                        _frontier._srcValue, _frontier._offValue, _frontier._cchValue);
 
                 _frontier._offValue = _charUtil._offSrc;
                 _frontier._cchValue = _charUtil._cchSrc;
             }
         }
 
-        private void flushText ( )
-        {
-            if (_stripWhitespace)
-            {
-                if (_after)
-                {
+        private void flushText() {
+            if (_stripWhitespace) {
+                if (_after) {
                     _frontier._srcAfter =
                         _charUtil.stripRight(
-                            _frontier._srcAfter, _frontier._offAfter, _frontier._cchAfter );
+                            _frontier._srcAfter, _frontier._offAfter, _frontier._cchAfter);
 
                     _frontier._offAfter = _charUtil._offSrc;
                     _frontier._cchAfter = _charUtil._cchSrc;
-                }
-                else
-                {
+                } else {
                     _frontier._srcValue =
                         _charUtil.stripRight(
-                            _frontier._srcValue, _frontier._offValue, _frontier._cchValue );
+                            _frontier._srcValue, _frontier._offValue, _frontier._cchValue);
 
                     _frontier._offValue = _charUtil._offSrc;
                     _frontier._cchValue = _charUtil._cchSrc;
@@ -2959,239 +2748,211 @@
             }
         }
 
-        private Xobj parent ( )
-        {
+        private Xobj parent() {
             return _after ? _frontier._parent : _frontier;
         }
 
-        private QName checkName ( QName name, boolean local )
-        {
-            if (_substituteNamespaces != null && (!local || name.getNamespaceURI().length() > 0))
-            {
-                String substituteUri = (String) _substituteNamespaces.get( name.getNamespaceURI() );
+        private QName checkName(QName name, boolean local) {
+            if (_substituteNamespaces != null && (!local || name.getNamespaceURI().length() > 0)) {
+                String substituteUri = (String) _substituteNamespaces.get(name.getNamespaceURI());
 
-                if (substituteUri != null)
-                    name = _locale.makeQName( substituteUri, name.getLocalPart(), name.getPrefix());
+                if (substituteUri != null) {
+                    name = _locale.makeQName(substituteUri, name.getLocalPart(), name.getPrefix());
+                }
             }
 
             return name;
         }
 
-        //
-        //
-        //
-
-        protected void startDTD (String name, String publicId, String systemId )
-        {
+        protected void startDTD(String name, String publicId, String systemId) {
             _doctypeName = name;
             _doctypePublicId = publicId;
             _doctypeSystemId = systemId;
         }
-        
-        protected void endDTD ( )
-        {
+
+        protected void endDTD() {
         }
-        
-        protected void startElement ( QName name )
-        {
-            start( createElementXobj( _locale, checkName( name, false ), parent()._name ) );
+
+        protected void startElement(QName name) {
+            start(createElementXobj(_locale, checkName(name, false), parent()._name));
             _stripLeft = true;
         }
 
-        protected void endElement ( )
-        {
+        protected void endElement() {
             assert parent().isElem();
 
             end();
             _stripLeft = true;
         }
 
-        protected void xmlns ( String prefix, String uri )
-        {
+        protected void xmlns(String prefix, String uri) {
             assert parent().isContainer();
             // BUGBUG - should assert there that there is no text before this attr
 
             // Namespace attrs are different than regular attrs -- I don't change their name,
             // I change their value!
 
-            if (_substituteNamespaces != null)
-            {
-                String substituteUri = (String) _substituteNamespaces.get( uri );
+            if (_substituteNamespaces != null) {
+                String substituteUri = (String) _substituteNamespaces.get(uri);
 
-                if (substituteUri != null)
+                if (substituteUri != null) {
                     uri = substituteUri;
+                }
             }
 
-            Xobj x = new Xobj.AttrXobj( _locale, _locale.createXmlns( prefix ) );
+            Xobj x = new AttrXobj(_locale, _locale.createXmlns(prefix));
 
-            start( x );
-            text( uri, 0, uri.length() );
+            start(x);
+            text(uri, 0, uri.length());
             end();
 
             _lastXobj = x;
-            _lastPos  = 0;
+            _lastPos = 0;
         }
 
-        protected void attr ( QName name, String value )
-         {
+        protected void attr(QName name, String value) {
             assert parent().isContainer();
             // BUGBUG - should assert there that there is no text before this attr
 
-            QName parentName = _after?
-                _lastXobj._parent.getQName(): _lastXobj.getQName();
+            QName parentName = _after ?
+                _lastXobj._parent.getQName() : _lastXobj.getQName();
             boolean isId = isAttrOfTypeId(name, parentName);
 
             Xobj x = isId ?
-                new Xobj.AttrIdXobj(_locale, checkName(name, true)) :
-                new Xobj.AttrXobj(_locale, checkName(name, true));
+                new AttrIdXobj(_locale, checkName(name, true)) :
+                new AttrXobj(_locale, checkName(name, true));
             start(x);
             text(value, 0, value.length());
             end();
-            if (isId)
-            {
+            if (isId) {
                 Cur c1 = x.tempCur();
                 c1.toRoot();
                 Xobj doc = c1._xobj;
                 c1.release();
-                if (doc instanceof Xobj.DocumentXobj)
-                    ((Xobj.DocumentXobj) doc).addIdElement(value,
+                if (doc instanceof DocumentXobj) {
+                    ((DocumentXobj) doc).addIdElement(value,
                         x._parent.getDom());
+                }
             }
             _lastXobj = x;
             _lastPos = 0;
         }
-        protected void attr ( String local, String uri, String prefix, String value )
-        {
-            attr( _locale.makeQName( uri, local, prefix ), value );
+
+        protected void attr(String local, String uri, String prefix, String value) {
+            attr(_locale.makeQName(uri, local, prefix), value);
         }
 
-        protected void procInst ( String target, String value )
-        {
-            if (!_stripProcinsts)
-            {
-                Xobj x = new Xobj.ProcInstXobj( _locale, target );
+        protected void procInst(String target, String value) {
+            if (!_stripProcinsts) {
+                Xobj x = new ProcInstXobj(_locale, target);
 
-                start( x );
-                text( value, 0, value.length() );
+                start(x);
+                text(value, 0, value.length());
                 end();
 
                 _lastXobj = x;
-                _lastPos  = 0;
+                _lastPos = 0;
             }
             _stripLeft = true;
         }
 
-        protected void comment ( String comment )
-        {
+        protected void comment(String comment) {
             if (!_stripComments)
-                comment( comment, 0, comment.length() );
+                comment(comment, 0, comment.length());
             _stripLeft = true;
         }
 
-        protected void comment ( char[] chars, int off, int cch )
-        {
-            if (!_stripComments)
-            {
+        protected void comment(char[] chars, int off, int cch) {
+            if (!_stripComments) {
                 comment(
-                    _charUtil.saveChars( chars, off, cch ),
-                    _charUtil._offSrc, _charUtil._cchSrc );
+                    _charUtil.saveChars(chars, off, cch),
+                    _charUtil._offSrc, _charUtil._cchSrc);
             }
             _stripLeft = true;
         }
 
-        private void comment ( Object src, int off, int cch )
-        {
-            Xobj x = new Xobj.CommentXobj( _locale );
+        private void comment(Object src, int off, int cch) {
+            Xobj x = new CommentXobj(_locale);
 
-            start( x );
-            text( src, off, cch );
+            start(x);
+            text(src, off, cch);
             end();
 
             _lastXobj = x;
-            _lastPos  = 0;
+            _lastPos = 0;
         }
 
         private boolean _stripLeft = true;
 
-        private void stripText ( Object src, int off, int cch )
-        {
-            if (_stripWhitespace)
-            {
+        private void stripText(Object src, int off, int cch) {
+            if (_stripWhitespace) {
                 // this is to avoid bug in cases like <company>Procter &amp; Gamble</company>
-                if (_stripLeft)
-                {
-                    src = _charUtil.stripLeft( src, off, cch );
+                if (_stripLeft) {
+                    src = _charUtil.stripLeft(src, off, cch);
                     _stripLeft = false;
                     off = _charUtil._offSrc;
                     cch = _charUtil._cchSrc;
                 }
             }
 
-            text( src, off, cch );
+            text(src, off, cch);
         }
 
-        protected void text ( String s )
-        {
-            if (s == null)
+        protected void text(String s) {
+            if (s == null) {
                 return;
+            }
 
-            stripText( s, 0, s.length() );
+            stripText(s, 0, s.length());
         }
 
-        protected void text ( char[] src, int off, int cch )
-        {
-            stripText( src, off, cch );
+        protected void text(char[] src, int off, int cch) {
+            stripText(src, off, cch);
         }
 
-        protected void bookmark ( XmlBookmark bm )
-        {
-            _lastXobj.setBookmark( _lastPos, bm.getKey(), bm );
+        protected void bookmark(XmlBookmark bm) {
+            _lastXobj.setBookmark(_lastPos, bm.getKey(), bm);
         }
 
-        protected void bookmarkLastNonAttr ( XmlBookmark bm )
-        {
+        protected void bookmarkLastNonAttr(XmlBookmark bm) {
             if (_lastPos > 0 || !_lastXobj.isAttr())
-                _lastXobj.setBookmark( _lastPos, bm.getKey(), bm );
-            else
-            {
+                _lastXobj.setBookmark(_lastPos, bm.getKey(), bm);
+            else {
                 assert _lastXobj._parent != null;
 
-                _lastXobj._parent.setBookmark( 0, bm.getKey(), bm );
+                _lastXobj._parent.setBookmark(0, bm.getKey(), bm);
             }
         }
 
-        protected void bookmarkLastAttr ( QName attrName, XmlBookmark bm )
-        {
-            if (_lastPos == 0 && _lastXobj.isAttr())
-            {
+        protected void bookmarkLastAttr(QName attrName, XmlBookmark bm) {
+            if (_lastPos == 0 && _lastXobj.isAttr()) {
                 assert _lastXobj._parent != null;
 
-                Xobj a = _lastXobj._parent.getAttr( attrName );
+                Xobj a = _lastXobj._parent.getAttr(attrName);
 
-                if (a != null)
-                    a.setBookmark( 0, bm.getKey(), bm );
+                if (a != null) {
+                    a.setBookmark(0, bm.getKey(), bm);
+                }
             }
         }
 
-        protected void lineNumber ( int line, int column, int offset )
-        {
+        protected void lineNumber(int line, int column, int offset) {
             _lastXobj.setBookmark(
                 _lastPos,
                 XmlLineNumber.class,
-                new XmlLineNumber( line, column, offset ) );
+                new XmlLineNumber(line, column, offset));
         }
 
-        protected void abort ( )
-        {
+        protected void abort() {
             _stripLeft = true;
-            while ( !parent().isRoot() )
+            while (!parent().isRoot()) {
                 end();
+            }
 
             finish().release();
         }
 
-        protected Cur finish ( )
-        {
+        protected Cur finish() {
             flushText();
 
             if (_after)
@@ -3201,35 +2962,44 @@
 
             Cur c = _frontier.tempCur();
 
-            if (!Locale.toFirstChildElement( c ))
+            if (!Locale.toFirstChildElement(c)) {
                 return c;
+            }
 
             // See if the document element is a fragment
 
-            boolean isFrag = Locale.isFragmentQName( c.getName() );
+            boolean isFrag = Locale.isFragmentQName(c.getName());
 
-            if (_discardDocElem || isFrag)
-            {
-                if (_replaceDocElem != null)
-                    c.setName( _replaceDocElem );
-                else
-                {
+            if (_discardDocElem || isFrag) {
+                if (_replaceDocElem != null) {
+                    c.setName(_replaceDocElem);
+                } else {
                     // Remove the content around the element to remove so that that content
                     // does not appear to have been the contents of the removed element.
 
-                    while ( c.toParent() )
-                        ;
+                    //noinspection StatementWithEmptyBody
+                    while (c.toParent()) ;
 
                     c.next();
 
-                    while ( !c.isElem() )
-                        if (c.isText()) c.moveChars( null, -1 ); else c.moveNode( null );
+                    while (!c.isElem()) {
+                        if (c.isText()) {
+                            c.moveChars(null, -1);
+                        } else {
+                            c.moveNode(null);
+                        }
+                    }
 
                     assert c.isElem();
                     c.skip();
 
-                    while ( !c.isFinish() )
-                        if (c.isText()) c.moveChars( null, -1 ); else c.moveNode( null );
+                    while (!c.isFinish()) {
+                        if (c.isText()) {
+                            c.moveChars(null, -1);
+                        } else {
+                            c.moveNode(null);
+                        }
+                    }
 
                     c.toParent();
 
@@ -3239,39 +3009,36 @@
 
                     Cur c2 = c.tempCur();
 
-                    c.moveNodeContents( c, true );
+                    c.moveNodeContents(c, true);
 
-                    c.moveToCur( c2 );
+                    c.moveToCur(c2);
 
                     c2.release();
 
-                    c.moveNode( null );
+                    c.moveNode(null);
                 }
 
                 // Remove the fragment namespace decl
 
-                if (isFrag)
-                {
-                    c.moveTo( _frontier );
+                if (isFrag) {
+                    c.moveTo(_frontier);
 
-                    if (c.toFirstAttr())
-                    {
-                        for ( ; ; )
-                        {
-                            if (c.isXmlns() && c.getXmlnsUri().equals( Locale._openFragUri ))
-                            {
-                                c.moveNode( null );
+                    if (c.toFirstAttr()) {
+                        for (; ; ) {
+                            if (c.isXmlns() && c.getXmlnsUri().equals(Locale._openFragUri)) {
+                                c.moveNode(null);
 
-                                if (!c.isAttr())
+                                if (!c.isAttr()) {
                                     break;
-                            }
-                            else if (!c.toNextAttr())
+                                }
+                            } else if (!c.toNextAttr()) {
                                 break;
+                            }
                         }
                     }
 
                     c.moveTo(_frontier);
-                    _frontier = createDomDocumentRootXobj( _locale, true );
+                    _frontier = createDomDocumentRootXobj(_locale, true);
 
                     Cur c2 = _frontier.tempCur();
                     c2.next();
@@ -3282,304 +3049,266 @@
             }
 
 
-            if (_additionalNamespaces != null)
-            {
-                c.moveTo( _frontier );
-                Locale.toFirstChildElement( c );
-                Locale.applyNamespaces( c, _additionalNamespaces );
+            if (_additionalNamespaces != null) {
+                c.moveTo(_frontier);
+                Locale.toFirstChildElement(c);
+                Locale.applyNamespaces(c, _additionalNamespaces);
             }
 
-            if (_doctypeName != null && (_doctypePublicId != null || _doctypeSystemId != null))
-            {
+            if (_doctypeName != null && (_doctypePublicId != null || _doctypeSystemId != null)) {
                 XmlDocumentProperties props = Locale.getDocProps(c, true);
                 props.setDoctypeName(_doctypeName);
-                if (_doctypePublicId != null)
+                if (_doctypePublicId != null) {
                     props.setDoctypePublicId(_doctypePublicId);
-                if (_doctypeSystemId != null)
+                }
+                if (_doctypeSystemId != null) {
                     props.setDoctypeSystemId(_doctypeSystemId);
+                }
             }
-            
-            c.moveTo( _frontier );
+
+            c.moveTo(_frontier);
 
             assert c.isRoot();
 
             return c;
         }
 
-        public void dump ( )
-        {
+        public void dump() {
             _frontier.dump();
         }
 
-        private Locale   _locale;
-        private CharUtil _charUtil;
+        private final Locale _locale;
+        private final CharUtil _charUtil;
 
-        private Xobj     _frontier;
-        private boolean  _after;
+        private Xobj _frontier;
+        private boolean _after;
 
-        private Xobj     _lastXobj;
-        private int      _lastPos;
+        private Xobj _lastXobj;
+        private int _lastPos;
 
-        private boolean  _discardDocElem;
-        private QName    _replaceDocElem;
-        private boolean  _stripWhitespace;
-        private boolean  _stripComments;
-        private boolean  _stripProcinsts;
-        private Map      _substituteNamespaces;
-        private Map      _additionalNamespaces;
-        
-        private String   _doctypeName;
-        private String   _doctypePublicId;
-        private String   _doctypeSystemId;
+        private boolean _discardDocElem;
+        private QName _replaceDocElem;
+        private final boolean _stripWhitespace;
+        private final boolean _stripComments;
+        private final boolean _stripProcinsts;
+        private final Map _substituteNamespaces;
+        private final Map _additionalNamespaces;
+
+        private String _doctypeName;
+        private String _doctypePublicId;
+        private String _doctypeSystemId;
     }
 
-    //
-    //
-    //
-
-    static String kindName ( int kind )
-    {
-        switch ( kind )
-        {
-            case ROOT     : return "ROOT";
-            case ELEM     : return "ELEM";
-            case ATTR     : return "ATTR";
-            case COMMENT  : return "COMMENT";
-            case PROCINST : return "PROCINST";
-            case TEXT     : return "TEXT";
-            default       : return "<< Unknown Kind (" + kind + ") >>";
+    static String kindName(int kind) {
+        switch (kind) {
+            case ROOT:
+                return "ROOT";
+            case ELEM:
+                return "ELEM";
+            case ATTR:
+                return "ATTR";
+            case COMMENT:
+                return "COMMENT";
+            case PROCINST:
+                return "PROCINST";
+            case TEXT:
+                return "TEXT";
+            default:
+                return "<< Unknown Kind (" + kind + ") >>";
         }
     }
 
-    static void dump ( PrintStream o, Dom d, Object ref )
-    {
+    void dump() {
+        dump(System.out, _xobj, this);
     }
 
-    static void dump ( PrintStream o, Dom d )
-    {
-        d.dump( o );
-    }
-
-    static void dump ( Dom d )
-    {
-        dump( System.out, d );
-    }
-
-    static void dump ( Node n )
-    {
-        dump( System.out, n );
-    }
-
-    static void dump ( PrintStream o, Node n )
-    {
-        dump( o, (Dom) n );
-    }
-
-    void dump ( )
-    {
-        dump( System.out, _xobj, this );
-    }
-
-    void dump ( PrintStream o )
-    {
-        if (_xobj == null)
-        {
-            o.println( "Unpositioned xptr" );
+    void dump(PrintStream o) {
+        if (_xobj == null) {
+            o.println("Unpositioned xptr");
             return;
         }
 
-        dump( o, _xobj, this );
+        dump(o, _xobj, this);
     }
 
-    public static void dump ( PrintStream o, Xobj xo, Object ref )
-    {
-        if (ref == null)
+    public static void dump(PrintStream o, Xobj xo, Object ref) {
+        if (ref == null) {
             ref = xo;
+        }
 
-        while ( xo._parent != null )
+        while (xo._parent != null) {
             xo = xo._parent;
+        }
 
-        dumpXobj( o, xo, 0, ref );
+        dumpXobj(o, xo, 0, ref);
 
         o.println();
     }
 
-    private static void dumpCur ( PrintStream o, String prefix, Cur c, Object ref )
-    {
-        o.print( " " );
+    private static void dumpCur(PrintStream o, String prefix, Cur c, Object ref) {
+        o.print(" ");
 
-        if (ref == c)
-            o.print( "*:" );
-
-        o.print( prefix + (c._id == null ? "<cur>" : c._id) + "[" + c._pos + "]" );
-    }
-
-    private static void dumpCurs ( PrintStream o, Xobj xo, Object ref )
-    {
-        for ( Cur c = xo._embedded ; c != null ; c = c._next )
-            dumpCur( o, "E:", c, ref );
-
-        for ( Cur c = xo._locale._registered ; c != null ; c = c._next )
-        {
-            if (c._xobj == xo)
-                dumpCur( o, "R:", c, ref );
+        if (ref == c) {
+            o.print("*:");
         }
+
+        o.print(prefix + (c._id == null ? "<cur>" : c._id) + "[" + c._pos + "]");
     }
 
-    private static void dumpBookmarks ( PrintStream o, Xobj xo, Object ref )
-    {
-        for ( Bookmark b = xo._bookmarks ; b != null ; b = b._next )
-        {
-            o.print( " " );
+    private static void dumpCurs(PrintStream o, Xobj xo, Object ref) {
+        for (Cur c = xo._embedded; c != null; c = c._next) {
+            dumpCur(o, "E:", c, ref);
+        }
 
-            if (ref == b)
-                o.print( "*:" );
-
-            if (b._value instanceof XmlLineNumber)
-            {
-                XmlLineNumber l = (XmlLineNumber) b._value;
-                o.print( "<line:" + l.getLine() + ">" + "[" + b._pos + "]" );
+        for (Cur c = xo._locale._registered; c != null; c = c._next) {
+            if (c._xobj == xo) {
+                dumpCur(o, "R:", c, ref);
             }
-            else
-                o.print( "<mark>" + "[" + b._pos + "]" );
         }
     }
 
-    private static void dumpCharNodes ( PrintStream o, CharNode nodes, Object ref )
-    {
-        for ( CharNode n = nodes ; n != null ; n = n._next )
-        {
-            o.print( " " );
+    private static void dumpBookmarks(PrintStream o, Xobj xo, Object ref) {
+        for (Bookmark b = xo._bookmarks; b != null; b = b._next) {
+            o.print(" ");
 
-            if (n == ref)
-                o.print( "*" );
+            if (ref == b) {
+                o.print("*:");
+            }
 
-            o.print( (n instanceof TextNode ? "TEXT" : "CDATA") + "[" + n._cch + "]" );
+            if (b._value instanceof XmlLineNumber) {
+                XmlLineNumber l = (XmlLineNumber) b._value;
+                o.print("<line:" + l.getLine() + ">" + "[" + b._pos + "]");
+            } else {
+                o.print("<mark>" + "[" + b._pos + "]");
+            }
         }
     }
 
-    private static void dumpChars ( PrintStream o, Object src, int off, int cch )
-    {
-//        CharUtil.dumpChars( o, src, off, cch );
+    private static void dumpCharNodes(PrintStream o, CharNode nodes, Object ref) {
+        for (CharNode n = nodes; n != null; n = n._next) {
+            o.print(" ");
 
-        o.print( "\"" );
+            if (n == ref) {
+                o.print("*");
+            }
 
-        String s = CharUtil.getString( src, off, cch );
+            o.print((n instanceof TextNode ? "TEXT" : "CDATA") + "[" + n._cch + "]");
+        }
+    }
 
-        for ( int i = 0 ; i < s.length(); )
-        {
-            if (i == 36)
-            {
-                o.print( "..." );
+    private static void dumpChars(PrintStream o, Object src, int off, int cch) {
+
+        o.print("\"");
+
+        String s = CharUtil.getString(src, off, cch);
+
+        for (int i = 0; i < s.length(); ) {
+            if (i == 36) {
+                o.print("...");
                 break;
             }
 
-            int codePoint = s.codePointAt( i );
+            int codePoint = s.codePointAt(i);
             char[] chars = Character.toChars(codePoint);
-            
-            if ( chars.length == 1 ) {
+
+            if (chars.length == 1) {
                 char ch = chars[0];
-                if (ch >= 32 && ch < 127)
-                    o.print( ch );
-                else if (ch == '\n')
-                    o.print( "\\n" );
-                else if (ch == '\r')
-                    o.print( "\\r" );
-                else if (ch == '\t')
-                    o.print( "\\t" );
-                else if (ch == '\"')
-                    o.print( "\\\"" );
-                else
-                    o.print( "<#" + ((int) ch) + ">" );
+                if (ch >= 32 && ch < 127 && ch != '\"') {
+                    o.print(ch);
+                } else if (ch == '\n') {
+                    o.print("\\n");
+                } else if (ch == '\r') {
+                    o.print("\\r");
+                } else if (ch == '\t') {
+                    o.print("\\t");
+                } else if (ch == '\"') {
+                    o.print("\\\"");
+                } else {
+                    o.print("<#" + ((int) ch) + ">");
+                }
             } else {
-                o.print( "<#" + codePoint + ">" );
+                o.print("<#" + codePoint + ">");
             }
-            
+
             i += Character.charCount(codePoint);
         }
 
-        o.print( "\"" );
+        o.print("\"");
     }
 
-    private static void dumpXobj ( PrintStream o, Xobj xo, int level, Object ref )
-    {
+    private static void dumpXobj(PrintStream o, Xobj xo, int level, Object ref) {
         if (xo == null)
             return;
 
         if (xo == ref)
-            o.print( "* " );
+            o.print("* ");
         else
-            o.print( "  " );
+            o.print("  ");
 
-        for ( int i = 0 ; i < level ; i++ )
-            o.print( "  " );
+        for (int i = 0; i < level; i++)
+            o.print("  ");
 
-        o.print( kindName( xo.kind() ) );
+        o.print(kindName(xo.kind()));
 
-        if (xo._name != null)
-        {
-            o.print( " " );
+        if (xo._name != null) {
+            o.print(" ");
 
             if (xo._name.getPrefix().length() > 0)
-                o.print( xo._name.getPrefix() + ":" );
+                o.print(xo._name.getPrefix() + ":");
 
-            o.print( xo._name.getLocalPart() );
+            o.print(xo._name.getLocalPart());
 
             if (xo._name.getNamespaceURI().length() > 0)
-                o.print( "@" + xo._name.getNamespaceURI() );
+                o.print("@" + xo._name.getNamespaceURI());
         }
 
-        if (xo._srcValue != null || xo._charNodesValue != null)
-        {
-            o.print( " Value( " );
-            dumpChars( o, xo._srcValue, xo._offValue, xo._cchValue );
-            dumpCharNodes( o, xo._charNodesValue, ref );
-            o.print( " )" );
+        if (xo._srcValue != null || xo._charNodesValue != null) {
+            o.print(" Value( ");
+            dumpChars(o, xo._srcValue, xo._offValue, xo._cchValue);
+            dumpCharNodes(o, xo._charNodesValue, ref);
+            o.print(" )");
         }
 
         if (xo._user != null)
-            o.print( " (USER)" );
+            o.print(" (USER)");
 
         if (xo.isVacant())
-            o.print( " (VACANT)" );
+            o.print(" (VACANT)");
 
-        if (xo._srcAfter != null || xo._charNodesAfter != null)
-        {
-            o.print( " After( " );
-            dumpChars( o, xo._srcAfter, xo._offAfter, xo._cchAfter );
-            dumpCharNodes( o, xo._charNodesAfter, ref );
-            o.print( " )" );
+        if (xo._srcAfter != null || xo._charNodesAfter != null) {
+            o.print(" After( ");
+            dumpChars(o, xo._srcAfter, xo._offAfter, xo._cchAfter);
+            dumpCharNodes(o, xo._charNodesAfter, ref);
+            o.print(" )");
         }
 
-        dumpCurs( o, xo, ref );
-        dumpBookmarks( o, xo, ref );
+        dumpCurs(o, xo, ref);
+        dumpBookmarks(o, xo, ref);
 
         String className = xo.getClass().getName();
 
-        int i = className.lastIndexOf( '.' );
+        int i = className.lastIndexOf('.');
 
-        if (i > 0)
-        {
-            className = className.substring( i + 1 );
+        if (i > 0) {
+            className = className.substring(i + 1);
 
-            i = className.lastIndexOf( '$' );
+            i = className.lastIndexOf('$');
 
             if (i > 0)
-                className = className.substring( i + 1 );
+                className = className.substring(i + 1);
         }
 
-        o.print( " (" );
-        o.print( className );
-        o.print( ")" );
+        o.print(" (");
+        o.print(className);
+        o.print(")");
 
         o.println();
 
-        for ( xo = xo._firstChild ; xo != null ; xo = xo._nextSibling )
-            dumpXobj( o, xo, level + 1, ref );
+        for (xo = xo._firstChild; xo != null; xo = xo._nextSibling)
+            dumpXobj(o, xo, level + 1, ref);
     }
 
-    void setId ( String id )
-    {
+    void setId(String id) {
         _id = id;
     }
 
diff --git a/src/store/org/apache/xmlbeans/impl/store/Cursor.java b/src/store/org/apache/xmlbeans/impl/store/Cursor.java
index fc3708f..decbe7c 100755
--- a/src/store/org/apache/xmlbeans/impl/store/Cursor.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Cursor.java
@@ -15,46 +15,27 @@
 
 package org.apache.xmlbeans.impl.store;
 
-import java.util.ArrayList;
-
-import java.io.PrintStream;
-
-import javax.xml.namespace.QName;
-
-import javax.xml.stream.XMLStreamReader;
-
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-
-import org.apache.xmlbeans.SchemaTypeLoader;
-import org.apache.xmlbeans.SchemaType;
 import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlDocumentProperties;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.XmlDocumentProperties;
-
-import org.apache.xmlbeans.impl.common.XMLChar;
 import org.apache.xmlbeans.impl.common.GlobalLock;
-
-import java.util.Map;
-import java.util.Collection;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.io.File;
-import java.io.IOException;
-import java.io.FileOutputStream;
-
-import org.w3c.dom.Node;
-
-import org.xml.sax.ContentHandler;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.SAXException;
-
-import org.apache.xmlbeans.impl.store.Saver.TextSaver;
+import org.apache.xmlbeans.impl.common.XMLChar;
 import org.apache.xmlbeans.impl.store.Locale.ChangeListener;
 import org.apache.xmlbeans.impl.store.Path.PathEngine;
+import org.apache.xmlbeans.impl.store.Saver.TextSaver;
+import org.apache.xmlbeans.xml.stream.XMLInputStream;
+import org.w3c.dom.Node;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+import org.xml.sax.ext.LexicalHandler;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+import java.io.*;
+import java.util.Collection;
+import java.util.Map;
+import java.util.function.Supplier;
 
 public final class Cursor implements XmlCursor, ChangeListener {
     static final int ROOT = Cur.ROOT;
@@ -64,6 +45,12 @@
     static final int PROCINST = Cur.PROCINST;
     static final int TEXT = Cur.TEXT;
 
+    private Cur _cur;
+    private PathEngine _pathEngine;
+    private int _currentSelection;
+
+    private ChangeListener _nextChangeListener;
+
     Cursor(Xobj x, int p) {
         _cur = x._locale.weakCur(this);
         _cur.moveTo(x, p);
@@ -191,7 +178,7 @@
         _cur.toEnd();
         _cur.nextWithAttrs();
     }
-    
+
     //
     //
     //
@@ -200,7 +187,7 @@
     // Can I move the ref from one q to another?  If not I will have to
     // change from a phantom ref to a soft/weak ref so I can know what
     // to do when I dequeue from the old q.
-    
+
     public void _dispose() {
         _cur.release();
         _cur = null;
@@ -212,7 +199,7 @@
 
     public QName _getName() {
         // TODO - consider taking this out of the gateway
-        
+
         switch (_cur.kind()) {
             case ATTR:
 
@@ -222,7 +209,7 @@
                 }
 
                 // Fall thru
-                
+
             case ELEM:
             case PROCINST:
                 return _cur.getName();
@@ -412,25 +399,27 @@
         // if the Cur in in attrs, it will not jump out of attrs.  Also, if moving backwards and
         // text is to the left and right, Cur will move to the beginning of that text, while
         // Cursor will move further so that the token type to the right is not text.
-        
+
         boolean wasText = _cur.isText();
 
         if (!_cur.prev()) {
             assert _cur.isRoot() || _cur.isAttr();
 
-            if (_cur.isRoot())
+            if (_cur.isRoot()) {
                 return TokenType.NONE;
+            }
 
             _cur.toParent();
         } else {
             int k = _cur.kind();
 
-            if (k < 0 && (k == -COMMENT || k == -PROCINST || k == -ATTR))
+            if (k == -COMMENT || k == -PROCINST || k == -ATTR) {
                 _cur.toParent();
-            else if (_cur.isContainer())
+            } else if (_cur.isContainer()) {
                 _cur.toLastAttr();
-            else if (wasText && _cur.isText())
+            } else if (wasText && _cur.isText()) {
                 return _toPrevToken();
+            }
         }
 
         return _currentTokenType();
@@ -438,7 +427,7 @@
 
     public Object _monitor() {
         // TODO - some of these methods need not be protected by a
-        // gatway.  This is one of them.  Inline this.
+        //  gatway.  This is one of them.  Inline this.
 
         return _cur._locale;
     }
@@ -446,8 +435,9 @@
     public boolean _toParent() {
         Cur c = _cur.tempCur();
 
-        if (!c.toParent())
+        if (!c.toParent()) {
             return false;
+        }
 
         _cur.moveToCur(c);
 
@@ -563,12 +553,8 @@
         if (file == null)
             throw new IllegalArgumentException("Null file specified");
 
-        OutputStream os = new FileOutputStream(file);
-
-        try {
+        try (OutputStream os = new FileOutputStream(file)) {
             _save(os, options);
-        } finally {
-            os.close();
         }
     }
 
@@ -604,21 +590,18 @@
             return;
         }
 
-        Reader r = _newReader(options);
-
-        try {
+        try (Reader r = _newReader(options)) {
             char[] chars = new char[8192];
 
-            for (; ;) {
+            for (;;) {
                 int n = r.read(chars);
 
-                if (n < 0)
+                if (n < 0) {
                     break;
+                }
 
                 w.write(chars, 0, n);
             }
-        } finally {
-            r.close();
         }
     }
 
@@ -637,19 +620,19 @@
 
         try {
             LOOP: for (; ;) {
-                SWITCH: switch (token) {
+                switch (token) {
                     case TokenType.INT_START:
                         if (seenElement)
                             return true;
                         seenElement = true;
                         token = c.toEndToken().intValue();
-                        break SWITCH;
+                        break;
 
                     case TokenType.INT_TEXT:
                         if (!Locale.isWhiteSpace(c.getChars()))
                             return true;
                         token = c.toNextToken().intValue();
-                        break SWITCH;
+                        break;
 
                     case TokenType.INT_NONE:
                     case TokenType.INT_ENDDOC:
@@ -663,7 +646,7 @@
                     case TokenType.INT_COMMENT:
                     case TokenType.INT_PROCINST:
                         token = c.toNextToken().intValue();
-                        break SWITCH;
+                        break;
 
                     case TokenType.INT_STARTDOC:
                         assert false;
@@ -677,179 +660,9 @@
         return !seenElement;
     }
 
-    private static final class DomSaver extends Saver {
-        DomSaver(Cur c, boolean isFrag, XmlOptions options) {
-            super(c, options);
-
-            if (c.isUserNode())
-                _type = c.getUser().get_schema_type();
-
-            _stl = c._locale._schemaTypeLoader;
-            _options = options;
-            _isFrag = isFrag;
-        }
-
-        Node saveDom() {
-            Locale l = Locale.getLocale(_stl, _options);
-
-            l.enter();
-
-            try {
-                _nodeCur = l.getCur();  // Not weak or temp
-
-                // Build the tree
-                
-                while (process())
-                    ;
-
-                // Set the type
-
-                while (!_nodeCur.isRoot())
-                    _nodeCur.toParent();
-
-                if (_type != null)
-                    _nodeCur.setType(_type);
-
-                Node node = (Node) _nodeCur.getDom();
-
-                _nodeCur.release();
-
-                _nodeCur = null;
-
-                return node;
-            } finally {
-                l.exit();
-            }
-        }
-
-        protected boolean emitElement(SaveCur c, ArrayList attrNames, ArrayList attrValues) {
-            // If there was text or comments before the frag element, I will loose them -- oh well
-            // Also, I will lose any attributes and namesapces on the fragment -- DOM can
-            // have attrs in fragments
-            
-            if (Locale.isFragmentQName(c.getName()))
-                _nodeCur.moveTo(null, Cur.NO_POS);
-
-            ensureDoc();
-
-            _nodeCur.createElement(getQualifiedName(c, c.getName()));
-            _nodeCur.next();
-
-            for (iterateMappings(); hasMapping(); nextMapping()) {
-                _nodeCur.createAttr(_nodeCur._locale.createXmlns(mappingPrefix()));
-                _nodeCur.next();
-                _nodeCur.insertString(mappingUri());
-                _nodeCur.toParent();
-                _nodeCur.skipWithAttrs();
-            }
-
-            for (int i = 0; i < attrNames.size(); i++) {
-                _nodeCur.createAttr(getQualifiedName(c, (QName) attrNames.get(i)));
-                _nodeCur.next();
-                _nodeCur.insertString((String) attrValues.get(i));
-                _nodeCur.toParent();
-                _nodeCur.skipWithAttrs();
-            }
-
-            return false;
-        }
-
-        protected void emitFinish(SaveCur c) {
-            if (!Locale.isFragmentQName(c.getName())) {
-                assert _nodeCur.isEnd();
-                _nodeCur.next();
-            }
-        }
-
-        protected void emitText(SaveCur c) {
-            ensureDoc();
-
-            Object src = c.getChars();
-
-            if (c._cchSrc > 0) {
-                _nodeCur.insertChars(src, c._offSrc, c._cchSrc);
-                _nodeCur.next();
-            }
-        }
-
-        protected void emitComment(SaveCur c) {
-            ensureDoc();
-
-            _nodeCur.createComment();
-            emitTextValue(c);
-            _nodeCur.skip();
-        }
-
-        protected void emitProcinst(SaveCur c) {
-            ensureDoc();
-
-            _nodeCur.createProcinst(c.getName().getLocalPart());
-            emitTextValue(c);
-            _nodeCur.skip();
-        }
-
-        protected void emitDocType(String docTypeName, String publicId, String systemId) {
-            ensureDoc();
-
-            XmlDocumentProperties props = Locale.getDocProps(_nodeCur, true);
-            props.setDoctypeName(docTypeName);
-            props.setDoctypePublicId(publicId);
-            props.setDoctypeSystemId(systemId);
-        }
-
-        protected void emitStartDoc(SaveCur c) {
-            ensureDoc();
-        }
-
-        protected void emitEndDoc ( SaveCur c )
-        {
-        }
-        
-        private QName getQualifiedName(SaveCur c, QName name) {
-            String uri = name.getNamespaceURI();
-
-            String prefix = uri.length() > 0 ? getUriMapping(uri) : "";
-
-            if (prefix.equals(name.getPrefix()))
-                return name;
-
-            return _nodeCur._locale.makeQName(uri, name.getLocalPart(), prefix);
-        }
-
-        private void emitTextValue(SaveCur c) {
-            c.push();
-            c.next();
-
-            if (c.isText()) {
-                _nodeCur.next();
-                _nodeCur.insertChars(c.getChars(), c._offSrc, c._cchSrc);
-                _nodeCur.toParent();
-            }
-
-            c.pop();
-        }
-
-        private void ensureDoc() {
-            if (!_nodeCur.isPositioned()) {
-                if (_isFrag)
-                    _nodeCur.createDomDocFragRoot();
-                else
-                    _nodeCur.createDomDocumentRoot();
-
-                _nodeCur.next();
-            }
-        }
-
-        private Cur _nodeCur;
-        private SchemaType _type;
-        private SchemaTypeLoader _stl;
-        private XmlOptions _options;
-        private boolean _isFrag;
-    }
-
     public Node _newDomNode(XmlOptions options) {
         // Must ignore inner options for compat with v1.
-        
+
         if (XmlOptions.hasOption(options, XmlOptions.SAVE_INNER)) {
             options = new XmlOptions(options);
             options.remove(XmlOptions.SAVE_INNER);
@@ -1143,20 +956,23 @@
         if (attrName == null)
             throw new IllegalArgumentException("Attr name is null");
 
-        if (!_cur.isContainer())
+        if (!_cur.isContainer()) {
             return null;
+        }
 
         return _cur.getAttrValue(attrName);
     }
 
     public boolean _setAttributeText(QName attrName, String value) {
-        if (attrName == null)
+        if (attrName == null) {
             throw new IllegalArgumentException("Attr name is null");
+        }
 
         validateLocalName(attrName.getLocalPart());
 
-        if (!_cur.isContainer())
+        if (!_cur.isContainer()) {
             return false;
+        }
 
         _cur.setAttrValue(attrName, value);
 
@@ -1164,18 +980,21 @@
     }
 
     public boolean _removeAttribute(QName attrName) {
-        if (attrName == null)
+        if (attrName == null) {
             throw new IllegalArgumentException("Attr name is null");
+        }
 
-        if (!_cur.isContainer())
+        if (!_cur.isContainer()) {
             return false;
+        }
 
         return _cur.removeAttr(attrName);
     }
 
     public String _getTextValue() {
-        if (_cur.isText())
+        if (_cur.isText()) {
             return _getChars();
+        }
 
         if (!_cur.isNode()) {
             throw new IllegalStateException("Can't get text value, current token can have no text value");
@@ -1185,23 +1004,29 @@
     }
 
     public int _getTextValue(char[] chars, int offset, int max) {
-        if (_cur.isText())
+        if (_cur.isText()) {
             return _getChars(chars, offset, max);
+        }
 
-        if (chars == null)
+        if (chars == null) {
             throw new IllegalArgumentException("char buffer is null");
+        }
 
-        if (offset < 0)
+        if (offset < 0) {
             throw new IllegalArgumentException("offset < 0");
+        }
 
-        if (offset >= chars.length)
+        if (offset >= chars.length) {
             throw new IllegalArgumentException("offset off end");
+        }
 
-        if (max < 0)
+        if (max < 0) {
             max = Integer.MAX_VALUE;
+        }
 
-        if (offset + max > chars.length)
+        if (offset + max > chars.length) {
             max = chars.length - offset;
+        }
 
         if (!_cur.isNode()) {
             throw new IllegalStateException("Can't get text value, current token can have no text value");
@@ -1209,18 +1034,21 @@
 
         // If there are no children (hopefully the common case), I can get the text faster.
 
-        if (_cur.hasChildren())
+        if (_cur.hasChildren()) {
             return Locale.getTextValue(_cur, Locale.WS_PRESERVE, chars, offset, max);
+        }
 
         // Fast way
-            
+
         Object src = _cur.getFirstChars();
 
-        if (_cur._cchSrc > max)
+        if (_cur._cchSrc > max) {
             _cur._cchSrc = max;
+        }
 
-        if (_cur._cchSrc <= 0)
+        if (_cur._cchSrc <= 0) {
             return 0;
+        }
 
         CharUtil.getChars(chars, offset, src, _cur._offSrc, _cur._cchSrc);
 
@@ -1239,30 +1067,35 @@
     }
 
     public void _setTextValue(String text) {
-        if (text == null)
+        if (text == null) {
             text = "";
+        }
 
         setTextValue(text, 0, text.length());
     }
 
     public void _setTextValue(char[] sourceChars, int offset, int length) {
-        if (length < 0)
+        if (length < 0) {
             throw new IndexOutOfBoundsException("setTextValue: length < 0");
+        }
 
         if (sourceChars == null) {
-            if (length > 0)
+            if (length > 0) {
                 throw new IllegalArgumentException("setTextValue: sourceChars == null");
+            }
 
             setTextValue(null, 0, 0);
 
             return;
         }
 
-        if (offset < 0 || offset >= sourceChars.length)
+        if (offset < 0 || offset >= sourceChars.length) {
             throw new IndexOutOfBoundsException("setTextValue: offset out of bounds");
+        }
 
-        if (offset + length > sourceChars.length)
+        if (offset + length > sourceChars.length) {
             length = sourceChars.length - offset;
+        }
 
         CharUtil cu = _cur._locale.getCharUtil();
 
@@ -1270,20 +1103,23 @@
     }
 
     public String _getChars() {
-        return _cur.getCharsAsString(-1);
+        return _cur.getCharsAsString();
     }
 
     public int _getChars(char[] buf, int off, int cch) {
         int cchRight = _cur.cchRight();
 
-        if (cch < 0 || cch > cchRight)
+        if (cch < 0 || cch > cchRight) {
             cch = cchRight;
+        }
 
-        if (buf == null || off >= buf.length)
+        if (buf == null || off >= buf.length) {
             return 0;
+        }
 
-        if (buf.length - off < cch)
+        if (buf.length - off < cch) {
             cch = buf.length - off;
+        }
 
         Object src = _cur.getChars(cch);
 
@@ -1293,22 +1129,20 @@
     }
 
     public void _toStartDoc() {
-//        while (_cur.toParent())
-//            ;
-          _cur.toRoot();
+        _cur.toRoot();
     }
 
     public void _toEndDoc() {
         _toStartDoc();
-
         _cur.toEnd();
     }
 
     public int _comparePosition(Cursor other) {
         int s = _cur.comparePosition(other._cur);
 
-        if (s == 2)
+        if (s == 2) {
             throw new IllegalArgumentException("Cursors not in same document");
+        }
 
         assert s >= -1 && s <= 1;
 
@@ -1332,20 +1166,21 @@
     }
 
     public XmlCursor _execQuery(String query, XmlOptions options) {
-            checkThisCursor();
-            return Query.cursorExecQuery(_cur,query,options);
-
+        checkThisCursor();
+        return Query.cursorExecQuery(_cur,query,options);
     }
 
 
     public boolean _toBookmark(XmlBookmark bookmark) {
-        if (bookmark == null || !(bookmark._currentMark instanceof Xobj.Bookmark))
+        if (bookmark == null || !(bookmark._currentMark instanceof Bookmark)) {
             return false;
+        }
 
-        Xobj.Bookmark m = (Xobj.Bookmark) bookmark._currentMark;
+        Bookmark m = (Bookmark) bookmark._currentMark;
 
-        if (m._xobj == null || m._xobj._locale != _cur._locale)
+        if (m._xobj == null || m._xobj._locale != _cur._locale) {
             return false;
+        }
 
         _cur.moveTo(m._xobj, m._pos);
 
@@ -1353,8 +1188,9 @@
     }
 
     public XmlBookmark _toNextBookmark(Object key) {
-        if (key == null)
+        if (key == null) {
             return null;
+        }
 
         int cch;
 
@@ -1362,7 +1198,7 @@
 
         for (; ;) {
             // Move a minimal amount.  If at text, move to a potential bookmark in the text.
-            
+
             if ((cch = _cur.cchRight()) > 1) {
                 _cur.nextChars(1);
                 _cur.nextChars((cch = _cur.firstBookmarkInChars(key, cch - 1)) >= 0 ? cch : -1);
@@ -1395,7 +1231,7 @@
 
         for (; ;) {
             // Move a minimal amount.  If at text, move to a potential bookmark in the text.
-            
+
             if ((cch = _cur.cchLeft()) > 1) {
                 _cur.prevChars(1);
 
@@ -1404,7 +1240,7 @@
                 // _toPrevToken will not skip to the beginning of the text, it will go further
                 // so that the token to the right is not text.  I need to simply skip to
                 // the beginning of the text ...
-                
+
                 _cur.prevChars(1);
             } else if (_toPrevToken().isNone()) {
                 _cur.pop();
@@ -1427,9 +1263,10 @@
 
     public void _setBookmark(XmlBookmark bookmark) {
         if (bookmark != null) {
-            if (bookmark.getKey() == null)
+            if (bookmark.getKey() == null) {
                 throw new IllegalArgumentException("Annotation key is null");
-            
+            }
+
             // TODO - I Don't do weak bookmarks yet ... perhaps I'll never do them ....
 
             bookmark._currentMark = _cur.setBookmark(bookmark.getKey(), bookmark);
@@ -1439,12 +1276,13 @@
     static XmlBookmark getBookmark(Object key, Cur c) {
         // TODO - I Don't do weak bookmarks yet ...
 
-        if (key == null)
+        if (key == null) {
             return null;
+        }
 
         Object bm = c.getBookmark(key);
 
-        return bm != null && bm instanceof XmlBookmark ? (XmlBookmark) bm : null;
+        return bm instanceof XmlBookmark ? (XmlBookmark) bm : null;
     }
 
     public XmlBookmark _getBookmark(Object key) {
@@ -1452,24 +1290,29 @@
     }
 
     public void _clearBookmark(Object key) {
-        if (key != null)
+        if (key != null) {
             _cur.setBookmark(key, null);
+        }
     }
 
     public void _getAllBookmarkRefs(Collection listToFill) {
         if (listToFill != null) {
-            for (Xobj.Bookmark b = _cur._xobj._bookmarks; b != null; b = b._next)
-                if (b._value instanceof XmlBookmark)
+            for (Bookmark b = _cur._xobj._bookmarks; b != null; b = b._next) {
+                if (b._value instanceof XmlBookmark) {
                     listToFill.add(b._value);
+                }
+            }
         }
     }
 
     public boolean _removeXml() {
-        if (_cur.isRoot())
+        if (_cur.isRoot()) {
             throw new IllegalStateException("Can't remove a whole document.");
+        }
 
-        if (_cur.isFinish())
+        if (_cur.isFinish()) {
             return false;
+        }
 
         assert _cur.isText() || _cur.isNode();
 
@@ -1485,14 +1328,15 @@
         to.checkInsertionValidity(_cur);
 
         // Check for a no-op
-        
+
         if (_cur.isText()) {
             int cchRight = _cur.cchRight();
 
             assert cchRight > 0;
 
-            if (_cur.inChars(to._cur, cchRight, true))
+            if (_cur.inChars(to._cur, cchRight, true)) {
                 return false;
+            }
 
             _cur.moveChars(to._cur, cchRight);
 
@@ -1501,11 +1345,12 @@
             return true;
         }
 
-        if (_cur.contains(to._cur))
+        if (_cur.contains(to._cur)) {
             return false;
+        }
 
         // Make a cur which will float to the right of the insertion
-        
+
         Cur c = to.tempCur();
 
         _cur.moveNode(to._cur);
@@ -1524,10 +1369,11 @@
 
         Cur c = to.tempCur();
 
-        if (_cur.isText())
+        if (_cur.isText()) {
             to._cur.insertChars(_cur.getChars(-1), _cur._offSrc, _cur._cchSrc);
-        else
+        } else {
             _cur.copyNode(to._cur);
+        }
 
         to._cur.moveToCur(c);
 
@@ -1537,8 +1383,9 @@
     }
 
     public boolean _removeXmlContents() {
-        if (!_cur.isContainer())
+        if (!_cur.isContainer()) {
             return false;
+        }
 
         _cur.moveNodeContents(null, false);
 
@@ -1568,11 +1415,13 @@
     }
 
     public boolean _moveXmlContents(Cursor to) {
-        if (!_cur.isContainer() || _cur.contains(to._cur))
+        if (!_cur.isContainer() || _cur.contains(to._cur)) {
             return false;
+        }
 
-        if (!checkContentInsertionValidity(to))
+        if (!checkContentInsertionValidity(to)) {
             return false;
+        }
 
         Cur c = to.tempCur();
 
@@ -1586,11 +1435,13 @@
     }
 
     public boolean _copyXmlContents(Cursor to) {
-        if (!_cur.isContainer() || _cur.contains(to._cur))
+        if (!_cur.isContainer() || _cur.contains(to._cur)) {
             return false;
+        }
 
-        if (!checkContentInsertionValidity(to))
+        if (!checkContentInsertionValidity(to)) {
             return false;
+        }
 
         // I don't have a primitive to copy contents, make a copy of the node and them move the
         // contents
@@ -1615,11 +1466,13 @@
     public int _removeChars(int cch) {
         int cchRight = _cur.cchRight();
 
-        if (cchRight == 0 || cch == 0)
+        if (cchRight == 0 || cch == 0) {
             return 0;
+        }
 
-        if (cch < 0 || cch > cchRight)
+        if (cch < 0 || cch > cchRight) {
             cch = cchRight;
+        }
 
         _cur.moveChars(null, cch);
 
@@ -1679,7 +1532,7 @@
     //
     // Inserting elements
     //
-    
+
     public void _beginElement(String localName) {
         _insertElementWithText(localName, null, null);
         _toPrevToken();
@@ -1732,7 +1585,7 @@
     //
     //
     //
-    
+
     public void _insertAttribute(String localName) {
         _insertAttributeWithValue(localName, null);
     }
@@ -1770,7 +1623,7 @@
     //
     //
     //
-    
+
     public void _insertNamespace(String prefix, String namespace) {
         _insertAttributeWithValue(_cur._locale.createXmlns(prefix), namespace);
     }
@@ -1833,7 +1686,7 @@
 
         return other;
     }
-    
+
     //
     // The following operations have two cursors, and can be in different documents
     //
@@ -1852,13 +1705,7 @@
         Locale otherLocale = other._cur._locale;
 
         if (locale == otherLocale) {
-            if (locale.noSync())
-                return twoLocaleOp(other, op, arg);
-            else {
-                synchronized (locale) {
-                    return twoLocaleOp(other, op, arg);
-                }
-            }
+            return syncWrapNoEnter(() -> twoLocaleOp(other, op, arg));
         }
 
         if (locale.noSync()) {
@@ -1950,6 +1797,7 @@
         return twoLocaleOp(xTo, COPY_CHARS, cch);
     }
 
+
     //
     // Special methods involving multiple cursors which can be in different locales, but do not
     // require sync on both locales.
@@ -1957,33 +1805,15 @@
 
     public boolean toCursor(XmlCursor xOther) {
         // One may only move cursors within the same locale
-        
+
         Cursor other = checkCursors(xOther);
 
-        if (_cur._locale != other._cur._locale)
-            return false;
-
-        if (_cur._locale.noSync()) {
-            _cur._locale.enter();
-            try {
-                return _toCursor(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else {
-            synchronized (_cur._locale) {
-                _cur._locale.enter();
-                try {
-                    return _toCursor(other);
-                } finally {
-                    _cur._locale.exit();
-                }
-            }
-        }
+        return _cur._locale == other._cur._locale &&
+               syncWrap(() -> _toCursor(other));
     }
 
     public boolean isInSameDocument(XmlCursor xOther) {
-        return xOther == null ? false : _cur.isInSameTree(checkCursors(xOther)._cur);
+        return xOther != null && _cur.isInSameTree(checkCursors(xOther)._cur);
     }
 
     //
@@ -1993,92 +1823,37 @@
     private Cursor preCheck(XmlCursor xOther) {
         Cursor other = checkCursors(xOther);
 
-        if (_cur._locale != other._cur._locale)
+        if (_cur._locale != other._cur._locale) {
             throw new IllegalArgumentException("Cursors not in same document");
+        }
 
         return other;
     }
 
     public int comparePosition(XmlCursor xOther) {
         Cursor other = preCheck(xOther);
-        if (_cur._locale.noSync()) {
-            _cur._locale.enter();
-            try {
-                return _comparePosition(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _comparePosition(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _comparePosition(other));
     }
 
     public boolean isLeftOf(XmlCursor xOther) {
         Cursor other = preCheck(xOther);
-        if (_cur._locale.noSync()) {
-            _cur._locale.enter();
-            try {
-                return _isLeftOf(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _isLeftOf(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _isLeftOf(other));
     }
 
     public boolean isAtSamePositionAs(XmlCursor xOther) {
         Cursor other = preCheck(xOther);
-        if (_cur._locale.noSync()) {
-            _cur._locale.enter();
-            try {
-                return _isAtSamePositionAs(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _isAtSamePositionAs(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _isAtSamePositionAs(other));
     }
 
     public boolean isRightOf(XmlCursor xOther) {
         Cursor other = preCheck(xOther);
-        if (_cur._locale.noSync()) {
-            _cur._locale.enter();
-            try {
-                return _isRightOf(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _isRightOf(other);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _isRightOf(other));
     }
-    
+
     //
     // Create a cursor from an Xobj -- used for XmlBookmark.createCursor
     //
-    
+
     public static XmlCursor newCursor(Xobj x, int p) {
         Locale l = x._locale;
         if (l.noSync()) {
@@ -2097,7 +1872,7 @@
             }
         }
     }
-    
+
     //
     // The following operations involve only one cursor
     //
@@ -2109,1199 +1884,274 @@
 
     public void dispose() {
         if (_cur != null) {
-            Locale l = _cur._locale;
-            if (preCheck()) {
-                l.enter();
-                try {
-                    _dispose();
-                } finally {
-                    l.exit();
-                }
-            } else synchronized (l) {
-                l.enter();
-                try {
-                    _dispose();
-                } finally {
-                    l.exit();
-                }
-            }
+            syncWrap(this::_dispose);
         }
     }
 
     public Object monitor() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _monitor();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _monitor();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_monitor);
     }
 
     public XmlDocumentProperties documentProperties() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _documentProperties();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _documentProperties();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_documentProperties);
     }
 
     public XmlCursor newCursor() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newCursor();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newCursor();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_newCursor);
     }
 
     public XMLStreamReader newXMLStreamReader() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newXMLStreamReader();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newXMLStreamReader();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap((Supplier<XMLStreamReader>)this::_newXMLStreamReader);
     }
 
     public XMLStreamReader newXMLStreamReader(XmlOptions options) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newXMLStreamReader(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newXMLStreamReader(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _newXMLStreamReader(options));
     }
 
     /**
      * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
      */
     public XMLInputStream newXMLInputStream() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newXMLInputStream();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newXMLInputStream();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap((Supplier<XMLInputStream>)this::_newXMLInputStream);
     }
 
     public String xmlText() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _xmlText();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _xmlText();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap((Supplier<String>)this::_xmlText);
     }
 
     public InputStream newInputStream() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newInputStream();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newInputStream();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap((Supplier<InputStream>)this::_newInputStream);
     }
 
     public Reader newReader() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newReader();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newReader();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap((Supplier<Reader>)this::_newReader);
     }
 
     public Node newDomNode() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newDomNode();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newDomNode();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap((Supplier<Node>)this::_newDomNode);
     }
 
     public Node getDomNode() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getDomNode();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getDomNode();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_getDomNode);
     }
 
     public void save(ContentHandler ch, LexicalHandler lh) throws SAXException {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _save(ch, lh);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _save(ch, lh);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrapSAXEx(() -> _save(ch, lh));
     }
 
     public void save(File file) throws IOException {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _save(file);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _save(file);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrapIOEx(() -> _save(file));
     }
 
     public void save(OutputStream os) throws IOException {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _save(os);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _save(os);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrapIOEx(() -> _save(os));
     }
 
     public void save(Writer w) throws IOException {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _save(w);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _save(w);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrapIOEx(() -> _save(w));
     }
 
     /**
      * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
      */
     public XMLInputStream newXMLInputStream(XmlOptions options) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newXMLInputStream(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newXMLInputStream(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _newXMLInputStream(options));
     }
 
     public String xmlText(XmlOptions options) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _xmlText(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _xmlText(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _xmlText(options));
     }
 
     public InputStream newInputStream(XmlOptions options) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newInputStream(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newInputStream(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _newInputStream(options));
     }
 
     public Reader newReader(XmlOptions options) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newReader(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newReader(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _newReader(options));
     }
 
     public Node newDomNode(XmlOptions options) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _newDomNode(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _newDomNode(options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _newDomNode(options));
     }
 
     public void save(ContentHandler ch, LexicalHandler lh, XmlOptions options) throws SAXException {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _save(ch, lh, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _save(ch, lh, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrapSAXEx(() -> _save(ch, lh, options));
     }
 
     public void save(File file, XmlOptions options) throws IOException {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _save(file, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _save(file, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrapIOEx(() -> _save(file, options));
     }
 
     public void save(OutputStream os, XmlOptions options) throws IOException {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _save(os, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _save(os, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrapIOEx(() -> _save(os, options));
     }
 
     public void save(Writer w, XmlOptions options) throws IOException {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _save(w, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _save(w, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrapIOEx(() -> _save(w, options));
     }
 
     public void push() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _push();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _push();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(this::_push);
     }
 
     public boolean pop() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _pop();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _pop();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_pop);
     }
 
     public void selectPath(String path) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _selectPath(path);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _selectPath(path);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _selectPath(path));
     }
 
     public void selectPath(String path, XmlOptions options) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _selectPath(path, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _selectPath(path, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _selectPath(path, options));
     }
 
     public boolean hasNextSelection() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _hasNextSelection();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _hasNextSelection();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_hasNextSelection);
     }
 
     public boolean toNextSelection() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toNextSelection();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toNextSelection();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toNextSelection);
     }
 
     public boolean toSelection(int i) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toSelection(i);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toSelection(i);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toSelection(i));
     }
 
     public int getSelectionCount() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getSelectionCount();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getSelectionCount();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_getSelectionCount);
     }
 
     public void addToSelection() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _addToSelection();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _addToSelection();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(this::_addToSelection);
     }
 
     public void clearSelections() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _clearSelections();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _clearSelections();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(this::_clearSelections);
     }
 
     public boolean toBookmark(XmlBookmark bookmark) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toBookmark(bookmark);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toBookmark(bookmark);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toBookmark(bookmark));
     }
 
     public XmlBookmark toNextBookmark(Object key) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toNextBookmark(key);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toNextBookmark(key);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toNextBookmark(key));
     }
 
     public XmlBookmark toPrevBookmark(Object key) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toPrevBookmark(key);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toPrevBookmark(key);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toPrevBookmark(key));
     }
 
     public QName getName() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getName();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getName();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_getName);
     }
 
     public void setName(QName name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _setName(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _setName(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _setName(name));
     }
 
     public String namespaceForPrefix(String prefix) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _namespaceForPrefix(prefix);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _namespaceForPrefix(prefix);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _namespaceForPrefix(prefix));
     }
 
     public String prefixForNamespace(String namespaceURI) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _prefixForNamespace(namespaceURI);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _prefixForNamespace(namespaceURI);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _prefixForNamespace(namespaceURI));
     }
 
     public void getAllNamespaces(Map addToThis) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _getAllNamespaces(addToThis);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _getAllNamespaces(addToThis);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _getAllNamespaces(addToThis));
     }
 
     public XmlObject getObject() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getObject();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getObject();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_getObject);
     }
 
     public TokenType currentTokenType() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _currentTokenType();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _currentTokenType();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_currentTokenType);
     }
 
     public boolean isStartdoc() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isStartdoc();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isStartdoc();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isStartdoc);
     }
 
     public boolean isEnddoc() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isEnddoc();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isEnddoc();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isEnddoc);
     }
 
     public boolean isStart() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isStart();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isStart();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isStart);
     }
 
     public boolean isEnd() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isEnd();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isEnd();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isEnd);
     }
 
     public boolean isText() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isText();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isText();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isText);
     }
 
     public boolean isAttr() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isAttr();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isAttr();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isAttr);
     }
 
     public boolean isNamespace() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isNamespace();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isNamespace();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isNamespace);
     }
 
     public boolean isComment() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isComment();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isComment();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isComment);
     }
 
     public boolean isProcinst() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isProcinst();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isProcinst();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isProcinst);
     }
 
     public boolean isContainer() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isContainer();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isContainer();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isContainer);
     }
 
     public boolean isFinish() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isFinish();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isFinish();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isFinish);
     }
 
     public boolean isAnyAttr() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _isAnyAttr();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _isAnyAttr();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_isAnyAttr);
     }
 
     public TokenType prevTokenType() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _prevTokenType();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _prevTokenType();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_prevTokenType);
     }
 
     public boolean hasNextToken() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _hasNextToken();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _hasNextToken();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_hasNextToken);
     }
 
     public boolean hasPrevToken() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _hasPrevToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _hasPrevToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_hasPrevToken);
     }
 
     public TokenType toNextToken() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toNextToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toNextToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toNextToken);
     }
 
     public TokenType toPrevToken() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toPrevToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toPrevToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toPrevToken);
     }
 
     public TokenType toFirstContentToken() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toFirstContentToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toFirstContentToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toFirstContentToken);
     }
 
     public TokenType toEndToken() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toEndToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toEndToken();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toEndToken);
     }
 
     public int toNextChar(int cch) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toNextChar(cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toNextChar(cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toNextChar(cch));
     }
 
     public int toPrevChar(int cch) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toPrevChar(cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toPrevChar(cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toPrevChar(cch));
     }
 
 //    public boolean _toNextSibling()
@@ -3309,18 +2159,16 @@
 //        return Locale.toNextSiblingElement(_cur);
 //    }
 
-    public boolean ___toNextSibling()
-    {
-        if (!_cur.hasParent())
+    public boolean ___toNextSibling() {
+        if (!_cur.hasParent()) {
             return false;
+        }
 
         Xobj parent = _cur.getParentNoRoot();
 
-        if (parent==null)
-        {
+        if (parent==null) {
             _cur._locale.enter();
-            try
-            {
+            try {
                 parent = _cur.getParent();
             } finally {
                 _cur._locale.exit();
@@ -3330,1048 +2178,358 @@
         return Locale.toNextSiblingElement(_cur, parent);
     }
 
-    public boolean toNextSibling()
-    {
-        if (preCheck()) {
-            return ___toNextSibling();
-        } else synchronized (_cur._locale) {
-            return ___toNextSibling();
-        }
+    public boolean toNextSibling() {
+        return syncWrapNoEnter(this::___toNextSibling);
     }
 
     public boolean toPrevSibling() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toPrevSibling();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toPrevSibling();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toPrevSibling);
     }
 
     public boolean toParent() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toParent();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toParent();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toParent);
     }
 
     public boolean toFirstChild() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _toFirstChild();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _toFirstChild();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_toFirstChild);
     }
 
     public boolean toLastChild() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toLastChild();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toLastChild();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toLastChild);
     }
 
     public boolean toChild(String name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toChild(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toChild(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toChild(name));
     }
 
     public boolean toChild(String namespace, String name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toChild(namespace, name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toChild(namespace, name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toChild(namespace, name));
     }
 
     public boolean toChild(QName name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toChild(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toChild(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toChild(name));
     }
 
     public boolean toChild(int index) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toChild(index);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toChild(index);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toChild(index));
     }
 
     public boolean toChild(QName name, int index) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toChild(name, index);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toChild(name, index);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toChild(name, index));
     }
 
     public boolean toNextSibling(String name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toNextSibling(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toNextSibling(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toNextSibling(name));
     }
 
     public boolean toNextSibling(String namespace, String name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toNextSibling(namespace, name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toNextSibling(namespace, name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toNextSibling(namespace, name));
     }
 
     public boolean toNextSibling(QName name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toNextSibling(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toNextSibling(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _toNextSibling(name));
     }
 
     public boolean toFirstAttribute() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                return _toFirstAttribute();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                return _toFirstAttribute();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        return syncWrapNoEnter(this::_toFirstAttribute);
     }
 
     public boolean toLastAttribute() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toLastAttribute();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toLastAttribute();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toLastAttribute);
     }
 
     public boolean toNextAttribute() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toNextAttribute();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toNextAttribute();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toNextAttribute);
     }
 
     public boolean toPrevAttribute() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _toPrevAttribute();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _toPrevAttribute();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_toPrevAttribute);
     }
 
     public String getAttributeText(QName attrName) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getAttributeText(attrName);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getAttributeText(attrName);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _getAttributeText(attrName));
     }
 
     public boolean setAttributeText(QName attrName, String value) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _setAttributeText(attrName, value);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _setAttributeText(attrName, value);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _setAttributeText(attrName, value));
     }
 
     public boolean removeAttribute(QName attrName) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _removeAttribute(attrName);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _removeAttribute(attrName);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _removeAttribute(attrName));
     }
 
     public String getTextValue() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getTextValue();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getTextValue();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap((Supplier<String>)this::_getTextValue);
     }
 
     public int getTextValue(char[] chars, int offset, int cch) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getTextValue(chars, offset, cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getTextValue(chars, offset, cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _getTextValue(chars, offset, cch));
     }
 
     public void setTextValue(String text) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _setTextValue(text);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _setTextValue(text);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _setTextValue(text));
     }
 
     public void setTextValue(char[] sourceChars, int offset, int length) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _setTextValue(sourceChars, offset, length);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _setTextValue(sourceChars, offset, length);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _setTextValue(sourceChars, offset, length));
     }
 
     public String getChars() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getChars();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getChars();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap((Supplier<String>)this::_getChars);
     }
 
     public int getChars(char[] chars, int offset, int cch) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getChars(chars, offset, cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getChars(chars, offset, cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _getChars(chars, offset, cch));
     }
 
     public void toStartDoc() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                _toStartDoc();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                _toStartDoc();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        syncWrapNoEnter(this::_toStartDoc);
     }
 
     public void toEndDoc() {
-        if (preCheck()) {
-//            _cur._locale.enter();
-//            try {
-                _toEndDoc();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        } else synchronized (_cur._locale) {
-//            _cur._locale.enter();
-//            try {
-                _toEndDoc();
-//            } finally {
-//                _cur._locale.exit();
-//            }
-        }
+        syncWrapNoEnter(this::_toEndDoc);
     }
 
     public XmlCursor execQuery(String query) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _execQuery(query);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _execQuery(query);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _execQuery(query));
     }
 
     public XmlCursor execQuery(String query, XmlOptions options) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _execQuery(query, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _execQuery(query, options);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _execQuery(query, options));
     }
 
     public ChangeStamp getDocChangeStamp() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getDocChangeStamp();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getDocChangeStamp();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_getDocChangeStamp);
     }
 
     public void setBookmark(XmlBookmark bookmark) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _setBookmark(bookmark);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _setBookmark(bookmark);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _setBookmark(bookmark));
     }
 
     public XmlBookmark getBookmark(Object key) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _getBookmark(key);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _getBookmark(key);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _getBookmark(key));
     }
 
     public void clearBookmark(Object key) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _clearBookmark(key);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _clearBookmark(key);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _clearBookmark(key));
     }
 
     public void getAllBookmarkRefs(Collection listToFill) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _getAllBookmarkRefs(listToFill);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _getAllBookmarkRefs(listToFill);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _getAllBookmarkRefs(listToFill));
     }
 
     public boolean removeXml() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _removeXml();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _removeXml();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_removeXml);
     }
 
     public boolean removeXmlContents() {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _removeXmlContents();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _removeXmlContents();
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(this::_removeXmlContents);
     }
 
     public int removeChars(int cch) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                return _removeChars(cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                return _removeChars(cch);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        return syncWrap(() -> _removeChars(cch));
     }
 
     public void insertChars(String text) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertChars(text);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertChars(text);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertChars(text));
     }
 
     public void insertElement(QName name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertElement(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertElement(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertElement(name));
     }
 
     public void insertElement(String localName) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertElement(localName);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertElement(localName);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertElement(localName));
     }
 
     public void insertElement(String localName, String uri) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertElement(localName, uri);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertElement(localName, uri);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertElement(localName, uri));
     }
 
     public void beginElement(QName name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _beginElement(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _beginElement(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _beginElement(name));
     }
 
     public void beginElement(String localName) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _beginElement(localName);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _beginElement(localName);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _beginElement(localName));
     }
 
     public void beginElement(String localName, String uri) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _beginElement(localName, uri);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _beginElement(localName, uri);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _beginElement(localName, uri));
     }
 
     public void insertElementWithText(QName name, String text) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertElementWithText(name, text);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertElementWithText(name, text);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertElementWithText(name, text));
     }
 
     public void insertElementWithText(String localName, String text) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertElementWithText(localName, text);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertElementWithText(localName, text);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertElementWithText(localName, text));
     }
 
     public void insertElementWithText(String localName, String uri, String text) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertElementWithText(localName, uri, text);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertElementWithText(localName, uri, text);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertElementWithText(localName, uri, text));
     }
 
     public void insertAttribute(String localName) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertAttribute(localName);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertAttribute(localName);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertAttribute(localName));
     }
 
     public void insertAttribute(String localName, String uri) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertAttribute(localName, uri);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertAttribute(localName, uri);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertAttribute(localName, uri));
     }
 
     public void insertAttribute(QName name) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertAttribute(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertAttribute(name);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertAttribute(name));
     }
 
-    public void insertAttributeWithValue(String Name, String value) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertAttributeWithValue(Name, value);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertAttributeWithValue(Name, value);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+    public void insertAttributeWithValue(String name, String value) {
+        syncWrap(() -> _insertAttributeWithValue(name, value));
     }
 
     public void insertAttributeWithValue(String name, String uri, String value) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertAttributeWithValue(name, uri, value);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertAttributeWithValue(name, uri, value);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertAttributeWithValue(name, uri, value));
     }
 
     public void insertAttributeWithValue(QName name, String value) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertAttributeWithValue(name, value);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertAttributeWithValue(name, value);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertAttributeWithValue(name, value));
     }
 
     public void insertNamespace(String prefix, String namespace) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertNamespace(prefix, namespace);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertNamespace(prefix, namespace);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertNamespace(prefix, namespace));
     }
 
     public void insertComment(String text) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertComment(text);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertComment(text);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertComment(text));
     }
 
     public void insertProcInst(String target, String text) {
-        if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _insertProcInst(target, text);
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _insertProcInst(target, text);
-            } finally {
-                _cur._locale.exit();
-            }
-        }
+        syncWrap(() -> _insertProcInst(target, text));
     }
 
     public void dump() {
+        syncWrap(this::_dump);
+    }
+
+    private interface WrapSAXEx {
+        void run() throws SAXException;
+    }
+
+    private interface WrapIOEx {
+        void run() throws IOException;
+    }
+
+
+    @SuppressWarnings("SynchronizeOnNonFinalField")
+    private void syncWrap(Runnable inner) {
         if (preCheck()) {
-            _cur._locale.enter();
-            try {
-                _dump();
-            } finally {
-                _cur._locale.exit();
-            }
-        } else synchronized (_cur._locale) {
-            _cur._locale.enter();
-            try {
-                _dump();
-            } finally {
-                _cur._locale.exit();
+            syncWrapHelper(inner, true);
+        } else {
+            synchronized (_cur._locale) {
+                syncWrapHelper(inner, true);
             }
         }
     }
-    
-    //
-    //
-    //
 
-    private Cur _cur;
-    private PathEngine _pathEngine;
-    private int _currentSelection;
+    @SuppressWarnings("SynchronizeOnNonFinalField")
+    private <T> T syncWrap(Supplier<T> inner) {
+        if (preCheck()) {
+            return syncWrapHelper(inner, true);
+        } else {
+            synchronized (_cur._locale) {
+                return syncWrapHelper(inner, true);
+            }
+        }
+    }
 
-    private ChangeListener _nextChangeListener;
+    @SuppressWarnings("SynchronizeOnNonFinalField")
+    private <T> T syncWrapNoEnter(Supplier<T> inner) {
+        if (preCheck()) {
+            return syncWrapHelper(inner, false);
+        } else {
+            synchronized (_cur._locale) {
+                return syncWrapHelper(inner, false);
+            }
+        }
+    }
+
+    @SuppressWarnings("SynchronizeOnNonFinalField")
+    private void syncWrapNoEnter(Runnable inner) {
+        if (preCheck()) {
+            syncWrapHelper(inner, false);
+        } else {
+            synchronized (_cur._locale) {
+                syncWrapHelper(inner, false);
+            }
+        }
+    }
+
+    @SuppressWarnings("SynchronizeOnNonFinalField")
+    private void syncWrapSAXEx(WrapSAXEx inner) throws SAXException {
+        if (preCheck()) {
+            syncWrapHelper(inner);
+        } else {
+            synchronized (_cur._locale) {
+                syncWrapHelper(inner);
+            }
+        }
+    }
+
+    @SuppressWarnings("SynchronizeOnNonFinalField")
+    private void syncWrapIOEx(WrapIOEx inner) throws IOException {
+        if (preCheck()) {
+            syncWrapHelper(inner);
+        } else {
+            synchronized (_cur._locale) {
+                syncWrapHelper(inner);
+            }
+        }
+    }
+
+    private void syncWrapHelper(Runnable inner, final boolean enterLocale) {
+        final Locale l = _cur._locale;
+        if (enterLocale) {
+            l.enter();
+        }
+        try {
+            inner.run();
+        } finally {
+            if (enterLocale) {
+                l.exit();
+            }
+        }
+    }
+
+    private <T> T syncWrapHelper(Supplier<T> inner, final boolean enterLocale) {
+        final Locale l = _cur._locale;
+        if (enterLocale) {
+            l.enter();
+        }
+        try {
+            return inner.get();
+        } finally {
+            if (enterLocale) {
+                l.exit();
+            }
+        }
+    }
+
+    private void syncWrapHelper(WrapSAXEx inner) throws SAXException {
+        final Locale l = _cur._locale;
+        l.enter();
+        try {
+            inner.run();
+        } finally {
+            l.exit();
+        }
+    }
+
+    private void syncWrapHelper(WrapIOEx inner) throws IOException {
+        final Locale l = _cur._locale;
+        l.enter();
+        try {
+            inner.run();
+        } finally {
+            l.exit();
+        }
+    }
 }
diff --git a/src/store/org/apache/xmlbeans/impl/store/DetailEntryXobj.java b/src/store/org/apache/xmlbeans/impl/store/DetailEntryXobj.java
new file mode 100644
index 0000000..9aacf20
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/DetailEntryXobj.java
@@ -0,0 +1,30 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.DetailEntry;
+
+import javax.xml.namespace.QName;
+
+class DetailEntryXobj extends SoapElementXobj implements DetailEntry {
+    Xobj newNode(Locale l) {
+        return new DetailEntryXobj(l, _name);
+    }
+
+    DetailEntryXobj(Locale l, QName name) {
+        super(l, name);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/DetailXobj.java b/src/store/org/apache/xmlbeans/impl/store/DetailXobj.java
new file mode 100644
index 0000000..4756a3b
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/DetailXobj.java
@@ -0,0 +1,41 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.Detail;
+import org.apache.xmlbeans.impl.soap.DetailEntry;
+import org.apache.xmlbeans.impl.soap.Name;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+class DetailXobj extends SoapFaultElementXobj implements Detail {
+    DetailXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new DetailXobj(l, _name);
+    }
+
+    public DetailEntry addDetailEntry(Name name) {
+        return DomImpl.detail_addDetailEntry(this, name);
+    }
+
+    public Iterator getDetailEntries() {
+        return DomImpl.detail_getDetailEntries(this);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/DocumentFragXobj.java b/src/store/org/apache/xmlbeans/impl/store/DocumentFragXobj.java
new file mode 100644
index 0000000..b7267f1
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/DocumentFragXobj.java
@@ -0,0 +1,29 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.DocumentFragment;
+
+class DocumentFragXobj extends NodeXobj implements DocumentFragment {
+    DocumentFragXobj(Locale l) {
+        super(l, ROOT, DomImpl.DOCFRAG);
+    }
+
+    Xobj newNode(Locale l) {
+        return new DocumentFragXobj(l);
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/DocumentXobj.java b/src/store/org/apache/xmlbeans/impl/store/DocumentXobj.java
new file mode 100644
index 0000000..f100127
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/DocumentXobj.java
@@ -0,0 +1,176 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.*;
+
+class DocumentXobj extends NodeXobj implements Document {
+    DocumentXobj(Locale l) {
+        super(l, ROOT, DomImpl.DOCUMENT);
+    }
+
+    Xobj newNode(Locale l) {
+        return new DocumentXobj(l);
+    }
+
+    //
+    //
+    //
+
+    public Attr createAttribute(String name) {
+        return DomImpl._document_createAttribute(this, name);
+    }
+
+    public Attr createAttributeNS(String namespaceURI, String qualifiedName) {
+        return DomImpl._document_createAttributeNS(this, namespaceURI, qualifiedName);
+    }
+
+    public CDATASection createCDATASection(String data) {
+        return DomImpl._document_createCDATASection(this, data);
+    }
+
+    public Comment createComment(String data) {
+        return DomImpl._document_createComment(this, data);
+    }
+
+    public DocumentFragment createDocumentFragment() {
+        return DomImpl._document_createDocumentFragment(this);
+    }
+
+    public Element createElement(String tagName) {
+        return DomImpl._document_createElement(this, tagName);
+    }
+
+    public Element createElementNS(String namespaceURI, String qualifiedName) {
+        return DomImpl._document_createElementNS(this, namespaceURI, qualifiedName);
+    }
+
+    public EntityReference createEntityReference(String name) {
+        return DomImpl._document_createEntityReference(this, name);
+    }
+
+    public ProcessingInstruction createProcessingInstruction(String target, String data) {
+        return DomImpl._document_createProcessingInstruction(this, target, data);
+    }
+
+    public Text createTextNode(String data) {
+        return DomImpl._document_createTextNode(this, data);
+    }
+
+    public DocumentType getDoctype() {
+        return DomImpl._document_getDoctype(this);
+    }
+
+    public Element getDocumentElement() {
+        return DomImpl._document_getDocumentElement(this);
+    }
+
+    public Element getElementById(String elementId) {
+        if (_idToElement == null) return null;
+        Xobj o = (Xobj) _idToElement.get(elementId);
+        if (o == null) return null;
+        if (!isInSameTree(o)) {
+            _idToElement.remove(elementId);
+        }
+        return (Element) o;
+    }
+
+    public NodeList getElementsByTagName(String tagname) {
+        return DomImpl._document_getElementsByTagName(this, tagname);
+    }
+
+    public NodeList getElementsByTagNameNS(String namespaceURI, String localName) {
+        return DomImpl._document_getElementsByTagNameNS(this, namespaceURI, localName);
+    }
+
+    public DOMImplementation getImplementation() {
+        return DomImpl._document_getImplementation(this);
+    }
+
+    public Node importNode(Node importedNode, boolean deep) {
+        return DomImpl._document_importNode(this, importedNode, deep);
+    }
+
+    // DOM Level 3
+    public Node adoptNode(Node source) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public String getDocumentURI() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public DOMConfiguration getDomConfig() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public String getInputEncoding() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public boolean getStrictErrorChecking() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public String getXmlEncoding() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public boolean getXmlStandalone() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public String getXmlVersion() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void normalizeDocument() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public Node renameNode(Node n, String namespaceURI, String qualifiedName) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setDocumentURI(String documentURI) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setStrictErrorChecking(boolean strictErrorChecking) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setXmlStandalone(boolean xmlStandalone) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setXmlVersion(String xmlVersion) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    protected void addIdElement(String idVal, DomImpl.Dom e) {
+        if (_idToElement == null)
+            _idToElement = new java.util.Hashtable();
+        _idToElement.put(idVal, e);
+    }
+
+    void removeIdElement(String idVal) {
+        if (_idToElement != null)
+            _idToElement.remove(idVal);
+    }
+
+    private java.util.Hashtable _idToElement;
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/DomImpl.java b/src/store/org/apache/xmlbeans/impl/store/DomImpl.java
index a15b72c..8102667 100755
--- a/src/store/org/apache/xmlbeans/impl/store/DomImpl.java
+++ b/src/store/org/apache/xmlbeans/impl/store/DomImpl.java
@@ -15,58 +15,23 @@
 
 package org.apache.xmlbeans.impl.store;
 
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Comment;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.DOMImplementation;
-import org.w3c.dom.Element;
-import org.w3c.dom.EntityReference;
-import org.w3c.dom.NamedNodeMap;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlRuntimeException;
+import org.apache.xmlbeans.impl.common.XMLChar;
+import org.apache.xmlbeans.impl.soap.*;
 import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.ProcessingInstruction;
 import org.w3c.dom.Text;
-import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.*;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.Source;
+import java.io.PrintStream;
+import java.util.*;
 
 // DOM Level 3
-import org.w3c.dom.UserDataHandler;
-
-
-import org.apache.xmlbeans.impl.common.XMLChar;
-import org.apache.xmlbeans.impl.soap.Detail;
-import org.apache.xmlbeans.impl.soap.DetailEntry;
-import org.apache.xmlbeans.impl.soap.MimeHeaders;
-import org.apache.xmlbeans.impl.soap.Name;
-import org.apache.xmlbeans.impl.soap.SOAPBody;
-import org.apache.xmlbeans.impl.soap.SOAPBodyElement;
-import org.apache.xmlbeans.impl.soap.SOAPElement;
-import org.apache.xmlbeans.impl.soap.SOAPEnvelope;
-import org.apache.xmlbeans.impl.soap.SOAPException;
-import org.apache.xmlbeans.impl.soap.SOAPFactory;
-import org.apache.xmlbeans.impl.soap.SOAPFault;
-import org.apache.xmlbeans.impl.soap.SOAPHeader;
-import org.apache.xmlbeans.impl.soap.SOAPHeaderElement;
-import org.apache.xmlbeans.impl.soap.SOAPPart;
-
-import javax.xml.stream.XMLStreamReader;
-
-import java.io.PrintStream;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import javax.xml.transform.Source;
-import javax.xml.namespace.QName;
-
-import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.XmlRuntimeException;
-import org.apache.xmlbeans.XmlCursor;
-import org.apache.xmlbeans.XmlObject;
 
 final class DomImpl
 {
@@ -95,7 +60,7 @@
         void   dump ( PrintStream o );
         void   dump ( PrintStream o, Object ref );
     };
-    
+
     static Dom parent      ( Dom d ) { return node_getParentNode ( d ); }
     static Dom firstChild  ( Dom d ) { return node_getFirstChild ( d ); }
     static Dom nextSibling ( Dom d ) { return node_getNextSibling( d ); }
@@ -131,13 +96,13 @@
         HierarchyRequestErr ( ) { this( "This node isn't allowed there" ); }
         HierarchyRequestErr ( String message ) { super( HIERARCHY_REQUEST_ERR, message ); }
     }
-    
+
     static class WrongDocumentErr extends DOMException
     {
         WrongDocumentErr ( ) { this( "Nodes do not belong to the same document" ); }
         WrongDocumentErr ( String message ) { super( WRONG_DOCUMENT_ERR, message ); }
     }
-    
+
     static class NotFoundErr extends DOMException
     {
         NotFoundErr ( ) { this( "Node not found" ); }
@@ -155,13 +120,13 @@
         NoModificationAllowedErr ( ) { this( "No modification allowed error" ); }
         NoModificationAllowedErr ( String message ) { super( NO_MODIFICATION_ALLOWED_ERR, message ); }
     }
-    
+
     static class InuseAttributeError extends DOMException
     {
         InuseAttributeError ( ) { this( "Attribute currently in use error" ); }
         InuseAttributeError ( String message ) { super( INUSE_ATTRIBUTE_ERR, message ); }
     }
-    
+
     static class IndexSizeError extends DOMException
     {
         IndexSizeError ( ) { this( "Index Size Error" ); }
@@ -183,7 +148,7 @@
     //
     // Helper fcns
     //
-    
+
     private static final class EmptyNodeList implements NodeList
     {
         public int getLength ( ) { return 0; }
@@ -191,7 +156,7 @@
     }
 
     public static NodeList _emptyNodeList = new EmptyNodeList();
-    
+
     static String nodeKindName ( int t )
     {
         switch ( t )
@@ -208,7 +173,7 @@
         case NOTATION  : return "notation";
         case PROCINST  : return "processing instruction";
         case TEXT      : return "text";
-                                           
+
         default : throw new RuntimeException( "Unknown node type" );
         }
     }
@@ -235,7 +200,7 @@
             {
                 if (document_getDoctype( parent ) != null)
                     return "Documents may only have a maximum of one document type node";
-                
+
                 return null;
             }
             case PROCINST :
@@ -256,7 +221,7 @@
 
             break;
         }
-            
+
         case DOCFRAG   :
         case ELEMENT   :
         case ENTITY    :
@@ -304,7 +269,7 @@
         {
             // TODO - use read only state on a node to know if it is under an
             // entity ref
-            
+
             if (child.nodeType() == ENTITYREF)
                 throw new NoModificationAllowedErr( "Entity reference trees may not be modified" );
 
@@ -317,7 +282,7 @@
         String prefix, String uri, String local, boolean isAttr )
     {
         validateNcName( prefix );
-        
+
         if (prefix == null)
             prefix = "";
 
@@ -354,36 +319,36 @@
 
         return prefix;
     }
-    
+
     private static void validateName ( String name )
     {
         if (name == null)
             throw new IllegalArgumentException( "Name is null" );
-            
+
         if (name.length() == 0)
             throw new IllegalArgumentException( "Name is empty" );
-            
+
         if (!XMLChar.isValidName( name ))
             throw new InvalidCharacterError( "Name has an invalid character" );
     }
-     
+
     private static void validateNcName ( String name )
     {
         if (name != null && name.length() > 0 && !XMLChar.isValidNCName( name ))
             throw new InvalidCharacterError();
     }
-    
+
     private static void validateQualifiedName ( String name, String uri, boolean isAttr )
     {
         assert name != null;
 
         if (uri == null)
             uri = "";
-        
+
         int i = name.indexOf( ':' );
 
         String local;
-        
+
         if (i < 0)
         {
             validateNcName( local = name );
@@ -401,23 +366,23 @@
                 throw new NamespaceErr( "Invalid qualified name, no prefix specified" );
 
             String prefix = name.substring( 0, i );
-            
+
             validateNcName( prefix );
 
             if (uri.length() == 0)
                 throw new NamespaceErr( "Attempt to give a prefix for no namespace" );
-            
+
             local = name.substring( i + 1 );
-            
+
             if (local.indexOf( ':' ) >= 0)
                 throw new NamespaceErr( "Invalid qualified name, more than one colon" );
-            
+
             validateNcName( local );
 
             if (prefix.equals( "xml" ) && !uri.equals( Locale._xml1998Uri ))
                 throw new NamespaceErr( "Invalid prefix - begins with 'xml'" );
         }
-        
+
         if (local.length() == 0)
             throw new NamespaceErr( "Invalid qualified name, no local part specified" );
     }
@@ -425,7 +390,7 @@
     private static void removeNode ( Dom n )
     {
         assert n.nodeType() != TEXT && n.nodeType() != CDATA;
-        
+
         Cur cFrom = n.tempCur();
 
         cFrom.toEnd();
@@ -433,7 +398,7 @@
         // Move any char nodes which ater after the node to remove to be before it.  The call to
         // Next here does two things, it tells me if I can get after the move to remove (all nodes
         // but the root) and it positions me at the place where there are char nodes after.
-        
+
         if (cFrom.next())
         {
             CharNode fromNodes = cFrom.getCharNodes();
@@ -469,14 +434,14 @@
 
             return _elements.size();
         }
-        
+
         public Node item ( int i )
         {
             ensureElements();
 
             return i < 0 || i >= _elements.size() ? (Node) null : (Node) _elements.get( i );
         }
-        
+
         private void ensureElements ( )
         {
             if (_version == _locale.version())
@@ -530,7 +495,7 @@
 
         private String _name;
     }
-    
+
     private static class ElementsByTagNameNSNodeList extends ElementsNodeList
     {
         ElementsByTagNameNSNodeList ( Dom root, String uri, String local )
@@ -552,7 +517,7 @@
         private String _uri;
         private String _local;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -570,13 +535,13 @@
         Locale l, String namespaceURI, String qualifiedName, DocumentType doctype )
     {
         validateQualifiedName( qualifiedName, namespaceURI, false );
-        
+
         Cur c = l.tempCur();
 
         c.createDomDocumentRoot();
 
         Document doc = (Document) c.getDom();
-        
+
         c.next();
 
         c.createElement( l.makeQualifiedQName( namespaceURI, qualifiedName ) );
@@ -596,10 +561,10 @@
         }
 
         c.release();
-        
+
         return doc;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -608,7 +573,7 @@
     {
         if (feature == null)
             return false;
-        
+
         if (version != null && version.length() > 0 &&
               !version.equals( "1.0" ) && !version.equals( "2.0" ))
         {
@@ -617,7 +582,7 @@
 
         if (feature.equalsIgnoreCase( "core" ))
             return true;
-        
+
         if (feature.equalsIgnoreCase( "xml" ))
             return true;
 
@@ -627,7 +592,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
-    
+
     public static Element _document_getDocumentElement ( Dom d )
     {
         Locale l = d.locale();
@@ -666,7 +631,7 @@
 
         return (DocumentFragment) f;
     }
-    
+
     public static Dom document_createDocumentFragment ( Dom d )
     {
         Cur c = d.locale().tempCur();
@@ -674,7 +639,7 @@
         c.createDomDocFragRoot();
 
         Dom f = c.getDom();
-        
+
         c.release();
 
         return f;
@@ -699,7 +664,7 @@
     public static Dom document_createElement ( Dom d, String name )
     {
         validateName( name );
-        
+
         Locale l = d.locale();
 
         Cur c = l.tempCur();
@@ -709,7 +674,7 @@
         Dom e = c.getDom();
 
         c.release();
-        ((Xobj.ElementXobj)e)._canHavePrefixUri = false;
+        ((ElementXobj)e)._canHavePrefixUri = false;
         return e;
     }
 
@@ -732,11 +697,11 @@
     public static Dom document_createElementNS ( Dom d, String uri, String qname )
     {
         validateQualifiedName( qname, uri, false );
-        
+
         Locale l = d.locale();
-        
+
         Cur c = l.tempCur();
-        
+
         c.createElement( l.makeQualifiedQName( uri, qname ) );
 
         Dom e = c.getDom();
@@ -745,7 +710,7 @@
 
         return e;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -775,7 +740,7 @@
         Dom e = c.getDom();
 
         c.release();
-        ((Xobj.AttrXobj)e)._canHavePrefixUri = false;
+        ((AttrXobj)e)._canHavePrefixUri = false;
         return e;
     }
 
@@ -794,7 +759,7 @@
 
         return (Attr) a;
     }
-    
+
     public static Dom document_createAttributeNS ( Dom d, String uri, String qname )
     {
         validateQualifiedName( qname, uri, true );
@@ -827,7 +792,7 @@
 
         return (Comment) c;
     }
-    
+
     public static Dom document_createComment ( Dom d, String data )
     {
         Locale l = d.locale();
@@ -864,21 +829,21 @@
 
         return (ProcessingInstruction) pi;
     }
-    
+
     public static Dom document_createProcessingInstruction ( Dom d, String target, String data )
     {
         if (target == null)
             throw new IllegalArgumentException( "Target is null" );
-            
+
         if (target.length() == 0)
             throw new IllegalArgumentException( "Target is empty" );
-            
+
         if (!XMLChar.isValidName( target ))
             throw new InvalidCharacterError( "Target has an invalid character" );
-        
+
         if (Locale.beginsWithXml( target ) && target.length() == 3)
             throw new InvalidCharacterError( "Invalid target - is 'xml'" );
-        
+
         Locale l = d.locale();
 
         Cur c = l.tempCur();
@@ -906,7 +871,7 @@
     {
         return (CDATASection) document_createCDATASection( d, data );
     }
-    
+
     public static Dom document_createCDATASection ( Dom d, String data )
     {
         TextNode t = d.locale().createCdataNode();
@@ -915,7 +880,7 @@
             data = "";
 
         t.setChars( data, 0, data.length() );
-        
+
         return t;
     }
 
@@ -969,7 +934,7 @@
         if (l.noSync())         { l.enter(); try { return document_getElementsByTagName( d, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return document_getElementsByTagName( d, name ); } finally { l.exit(); } }
     }
-    
+
     public static NodeList document_getElementsByTagName ( Dom d, String name )
     {
         return new ElementsByTagNameNodeList( d, name );
@@ -986,7 +951,7 @@
         if (l.noSync())         { l.enter(); try { return document_getElementsByTagNameNS( d, uri, local ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return document_getElementsByTagNameNS( d, uri, local ); } finally { l.exit(); } }
     }
-    
+
     public static NodeList document_getElementsByTagNameNS ( Dom d, String uri, String local )
     {
         return new ElementsByTagNameNSNodeList( d, uri, local );
@@ -1027,11 +992,11 @@
     {
         if (n == null)
             return null;
-        
+
         Dom i;
 
         boolean copyChildren = false;
-        
+
         switch ( n.getNodeType() )
         {
         case DOCUMENT :
@@ -1064,7 +1029,7 @@
                 attributes_setNamedItem( i, document_importNode( d, attrs.item( a ), true ) );
 
             copyChildren = deep;
-            
+
             break;
         }
 
@@ -1087,43 +1052,43 @@
             }
 
             copyChildren = true;
-            
+
             break;
         }
-        
+
         case DOCFRAG :
         {
             i = document_createDocumentFragment( d );
-            
+
             copyChildren = deep;
 
             break;
         }
-        
+
         case PROCINST :
         {
             i = document_createProcessingInstruction( d, n.getNodeName(), n.getNodeValue() );
             break;
         }
-        
+
         case COMMENT :
         {
             i = document_createComment( d, n.getNodeValue() );
             break;
         }
-        
+
         case TEXT :
         {
             i = document_createTextNode( d, n.getNodeValue() );
             break;
         }
-        
+
         case CDATA :
         {
             i = document_createCDATASection( d, n.getNodeValue() );
             break;
         }
-            
+
         case ENTITYREF :
         case ENTITY :
         case NOTATION :
@@ -1135,7 +1100,7 @@
         if (copyChildren)
         {
             NodeList children = n.getChildNodes();
-            
+
             for ( int c = 0 ; c < children.getLength() ; c++ )
                 node_insertBefore( i, document_importNode( d, children.item( c ), true ), null);
         }
@@ -1179,12 +1144,12 @@
 
         return (Document) d;
     }
-    
+
     public static Dom node_getOwnerDocument ( Dom n )
     {
         if (n.nodeType() == DOCUMENT)
             return null;
-        
+
         Locale l = n.locale();
 
         if (l._ownerDoc == null)
@@ -1207,7 +1172,7 @@
         Locale l = n.locale();
 
         Dom p;
-        
+
         if (l.noSync())         { l.enter(); try { p = node_getParentNode( n ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { p = node_getParentNode( n ); } finally { l.exit(); } }
 
@@ -1224,7 +1189,7 @@
         case DOCFRAG :
         case ATTR :
             break;
-            
+
         case PROCINST :
         case COMMENT :
         case ELEMENT :
@@ -1246,25 +1211,25 @@
 
             break;
         }
-            
+
         case ENTITYREF :
             throw new RuntimeException( "Not impl" );
-            
+
         case ENTITY :
         case DOCTYPE :
         case NOTATION :
             throw new RuntimeException( "Not impl" );
-            
+
         default : throw new RuntimeException( "Unknown kind" );
         }
 
         if (c == null)
             return null;
-        
+
         Dom d = c.getDom();
-        
+
         c.release();
-        
+
         return d;
     }
 
@@ -1272,8 +1237,7 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static Node _node_getFirstChild ( Dom n )
-    {
+    public static Node _node_getFirstChild ( Dom n ) {
         Locale l = n.locale();
 
         Dom fc;
@@ -1286,7 +1250,7 @@
             Xobj lastAttr = node.lastAttr();
             if (lastAttr != null &&
                 lastAttr.isNextSiblingPtrDomUsable())
-                return (Xobj.NodeXobj) lastAttr._nextSibling;
+                return (NodeXobj) lastAttr._nextSibling;
             if (node.isExistingCharNodesValueUsable())
                 return node._charNodesValue;
         }
@@ -1307,15 +1271,15 @@
         case PROCINST :
         case COMMENT :
             break;
-            
+
         case ENTITYREF :
             throw new RuntimeException( "Not impl" );
-            
+
         case ENTITY :
         case DOCTYPE :
         case NOTATION :
             throw new RuntimeException( "Not impl" );
-            
+
         case ELEMENT :
         case DOCUMENT :
         case DOCFRAG :
@@ -1325,12 +1289,12 @@
             Xobj node = (Xobj) n;
             node.ensureOccupancy();
             if (node.isFirstChildPtrDomUsable())
-                return (Xobj.NodeXobj) node._firstChild;
+                return (NodeXobj) node._firstChild;
             Xobj lastAttr = node.lastAttr();
             if (lastAttr != null)
             {
                 if (lastAttr.isNextSiblingPtrDomUsable())
-                    return (Xobj.NodeXobj) lastAttr._nextSibling;
+                    return (NodeXobj) lastAttr._nextSibling;
                 else if (lastAttr.isCharNodesAfterUsable())
                     return (CharNode) lastAttr._charNodesAfter;
             }
@@ -1346,7 +1310,7 @@
 
         return fc;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1362,7 +1326,7 @@
 
         return (Node) lc;
     }
-    
+
     public static Dom node_getLastChild ( Dom n )
     {
         switch ( n.nodeType() )
@@ -1387,7 +1351,7 @@
             case ATTR :
                 break;
         }
-        
+
         Dom lc = null;
         CharNode nodes;
 
@@ -1396,7 +1360,7 @@
         if (c.toLastChild())
         {
             lc = c.getDom();
-            
+
             c.skip();
 
             if ((nodes = c.getCharNodes()) != null)
@@ -1449,7 +1413,7 @@
         case DOCFRAG :
         case ATTR :
             break;
-            
+
         case TEXT :
         case CDATA :
         {
@@ -1460,9 +1424,9 @@
             // b) this node is value && src._fc = null; ret null
 
 
-            if (! (cn._src instanceof Xobj) )
+            if (! (cn.getObject() instanceof Xobj) )
                 return null;
-            Xobj src = (Xobj) cn._src;
+            Xobj src = (Xobj) cn.getObject();
             //if src is attr this node is always value and
             // next is always the next ptr of the attr
             src._charNodesAfter =
@@ -1479,9 +1443,9 @@
             boolean isThisNodeAfterText = cn.isNodeAftertext();
 
             if (isThisNodeAfterText)
-                ns = (Xobj.NodeXobj) src._nextSibling;
+                ns = (NodeXobj) src._nextSibling;
             else     //srcValue or attribute source
-                ns = (Xobj.NodeXobj) src._firstChild;
+                ns = (NodeXobj) src._firstChild;
             break;
 
         }
@@ -1495,7 +1459,7 @@
             node.ensureOccupancy();
             if (node.isNextSiblingPtrDomUsable())
                 return
-                    (Xobj.NodeXobj) node._nextSibling;
+                    (NodeXobj) node._nextSibling;
             if (node.isCharNodesAfterUsable())
                 return node._charNodesAfter;
             break;
@@ -1528,21 +1492,18 @@
 
         return (Node) ps;
     }
-    
+
     public static Dom node_getPreviousSibling ( Dom n )
     {
-        Dom prev = null;
-        Dom temp;
-        switch (n.nodeType())
-        {
-        case TEXT:
-        case CDATA:
-            {
+        Dom prev;
+        switch (n.nodeType()) {
+            case TEXT:
+            case CDATA: {
                 assert n instanceof CharNode: "Text/CData should be a CharNode";
                 CharNode node = (CharNode) n;
-                if (!(node._src instanceof Xobj))
+                if (!(node.getObject() instanceof Xobj))
                     return null;
-                Xobj src = (Xobj) node._src;
+                Xobj src = (Xobj) node.getObject();
                 src.ensureOccupancy();
                 boolean isThisNodeAfterText = node.isNodeAftertext();
                 prev = node._prev;
@@ -1551,19 +1512,20 @@
                         src._charNodesValue;
                 break;
             }
-        default:
-            {
+            default: {
                 assert n instanceof Xobj;
                 Xobj node = (Xobj) n;
                 prev = (Dom) node._prevSibling;
-                if (prev == null && node._parent != null)
-                    prev = (Dom) node_getFirstChild((Dom) node._parent);
+                if ((prev == null || !(node instanceof AttrXobj) && prev instanceof AttrXobj) &&
+                    node._parent != null) {
+                    prev = node_getFirstChild((Dom) node._parent);
+                }
             }
         }
-        temp = (Dom) prev;
-        while (temp != null &&
-            (temp = node_getNextSibling(temp)) != n)
+        Dom temp = prev;
+        while (temp != null && (temp = node_getNextSibling(temp)) != n) {
             prev = temp;
+        }
         return prev;
     }
 
@@ -1578,15 +1540,15 @@
         if (l.noSync())         { l.enter(); try { return node_hasAttributes( n ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return node_hasAttributes( n ); } finally { l.exit(); } }
     }
-    
+
     public static boolean node_hasAttributes ( Dom n )
     {
         boolean hasAttrs = false;
-        
+
         if (n.nodeType() == ELEMENT)
         {
             Cur c = n.tempCur();
-            
+
             hasAttrs = c.hasAttrs();
 
             c.release();
@@ -1615,7 +1577,7 @@
         if (l.noSync())         { l.enter(); try { node_normalize( n ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { node_normalize( n ); } finally { l.exit(); } }
     }
-    
+
     public static void node_normalize ( Dom n )
     {
         switch ( n.nodeType() )
@@ -1678,7 +1640,7 @@
         while ( ! c.isAtEndOfLastPush() );
 
         c.release();
-        
+
         n.locale().invalidateDomCaches(n);
     }
 
@@ -1686,10 +1648,9 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static boolean _node_hasChildNodes ( Dom n )
-    {
+    public static boolean _node_hasChildNodes ( Dom n ) {
         // TODO - make this faster
-        return _node_getFirstChild( n ) != null;
+        return n instanceof Xobj &&  _node_getFirstChild( n ) != null;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1732,14 +1693,14 @@
 
         return (Node) d;
     }
-    
+
     public static Dom node_replaceChild ( Dom p, Dom newChild, Dom oldChild )
     {
         // Remove the old child firest to avoid a dom exception raised
         // when inserting two document elements
-        
+
         Dom nextNode = node_getNextSibling( oldChild );
-        
+
         node_removeChild( p, oldChild );
 
         try
@@ -1768,7 +1729,7 @@
             throw new IllegalArgumentException( "Child to add is null" );
 
         Dom nc;
-        
+
         if (!(newChild instanceof Dom) || (nc = (Dom) newChild).locale() != l)
             throw new WrongDocumentErr( "Child to add is from another document" );
 
@@ -1817,10 +1778,10 @@
                     append( c, p );
                 else
                     insert( c, rc );
-                
+
                 c = n;
             }
-            
+
             return nc;
         }
 
@@ -1835,7 +1796,7 @@
         //
 
         remove( nc );
-        
+
         int pk = p.nodeType();
 
         // Only these nodes can be modifiable parents
@@ -1861,9 +1822,9 @@
                 if (rck == TEXT || rck == CDATA)
                 {
                     // Quick and dirty impl....
-                    
+
                     ArrayList charNodes = new ArrayList();
-                    
+
                     while ( rc != null && (rc.nodeType() == TEXT || rc.nodeType() == CDATA ) )
                     {
                         Dom next = nextSibling( rc );
@@ -1903,7 +1864,7 @@
 
             break;
         }
-        
+
         case TEXT :
         case CDATA :
         {
@@ -1913,13 +1874,13 @@
 
             CharNode refCharNode = null;
             Cur c = p.tempCur();
-            
+
             if (rc == null)
                 c.toEnd();
             else
             {
                 int rck = rc.nodeType();
-                
+
                 if (rck == TEXT || rck == CDATA)
                     c.moveToCharNode( refCharNode = (CharNode) rc );
                 else if (rck == ENTITYREF)
@@ -1932,7 +1893,7 @@
 
             nodes = CharNode.insertNode( nodes, n, refCharNode );
 
-            c.insertChars( n._src, n._off, n._cch );
+            c.insertChars( n.getObject(), n._off, n._cch );
 
             c.setCharNodes( nodes );
 
@@ -1945,22 +1906,22 @@
         {
             throw new RuntimeException( "Not implemented" );
         }
-            
+
         case DOCTYPE :
         {
             // TODO - don't actually insert this here, associate it with the
             // doc??  Hmm .. Perhaps I should disallow insertion into the tree
             // at all.
-            
+
             throw new RuntimeException( "Not implemented" );
         }
-            
+
         default : throw new RuntimeException( "Unexpected child node type" );
         }
-        
+
         return nc;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -1973,7 +1934,7 @@
             throw new NotFoundErr( "Child to remove is null" );
 
         Dom c;
-        
+
         if (!(child instanceof Dom) || (c = (Dom) child).locale() != l)
             throw new WrongDocumentErr( "Child to remove is from another document" );
 
@@ -1989,14 +1950,14 @@
     {
         if (parent( child ) != parent)
             throw new NotFoundErr( "Child to remove is not a child of given parent" );
-        
+
         switch ( child.nodeType() )
         {
         case DOCUMENT :
         case DOCFRAG :
         case ATTR :
             throw new IllegalStateException();
-            
+
         case ELEMENT :
         case PROCINST :
         case COMMENT :
@@ -2007,30 +1968,30 @@
         case CDATA :
         {
             Cur c = child.tempCur();
-            
+
             CharNode nodes = c.getCharNodes();
 
             CharNode cn = (CharNode) child;
 
-            assert cn._src instanceof Dom;
+            assert(cn.getDom() != null);
 
             cn.setChars( c.moveChars( null, cn._cch ), c._offSrc, c._cchSrc );
-            
+
             c.setCharNodes( CharNode.remove( nodes, cn ) );
 
             c.release();
 
             break;
         }
-            
+
         case ENTITYREF :
             throw new RuntimeException( "Not impl" );
-            
+
         case ENTITY :
         case DOCTYPE :
         case NOTATION :
             throw new RuntimeException( "Not impl" );
-            
+
         default : throw new RuntimeException( "Unknown kind" );
         }
 
@@ -2052,29 +2013,29 @@
 
         return (Node) c;
     }
-    
+
     public static Dom node_cloneNode ( Dom n, boolean deep )
     {
         Locale l = n.locale();
-        
+
         Dom clone = null;
-        
+
         if (!deep)
         {
             Cur shallow = null;
-            
+
             switch ( n.nodeType() )
             {
             case DOCUMENT :
                 shallow = l.tempCur();
                 shallow.createDomDocumentRoot();
                 break;
-                
+
             case DOCFRAG :
                 shallow = l.tempCur();
                 shallow.createDomDocFragRoot();
                 break;
-                
+
             case ELEMENT :
             {
                 shallow = l.tempCur();
@@ -2082,13 +2043,13 @@
 
                 Element elem = (Element) shallow.getDom();
                 NamedNodeMap attrs = ((Element) n).getAttributes();
-                
+
                 for ( int i = 0 ; i < attrs.getLength() ; i++ )
                     elem.setAttributeNodeNS( (Attr) attrs.item( i ).cloneNode( true ) );
-                
+
                 break;
             }
-                
+
             case ATTR :
                 shallow = l.tempCur();
                 shallow.createAttr( n.getQName() );
@@ -2198,7 +2159,7 @@
         if (l.noSync())         { l.enter(); try { node_setPrefix( n, prefix ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { node_setPrefix( n, prefix ); } finally { l.exit(); } }
     }
-    
+
     public static void node_setPrefix ( Dom n, String prefix )
     {
         // TODO - make it possible to set the prefix of an xmlns
@@ -2216,9 +2177,9 @@
             String local = name.getLocalPart();
 
             prefix = validatePrefix( prefix, uri, local, n.nodeType() == ATTR );
-                                  
+
             c.setName( n.locale().makeQName( uri, local, prefix ) );
-            
+
             c.release();
         }
         else
@@ -2251,7 +2212,7 @@
         case DOCUMENT  : return "#document";
         case PROCINST  : return n.getQName().getLocalPart();
         case TEXT      : return "#text";
-                         
+
         case ATTR      :
         case ELEMENT   :
         {
@@ -2265,7 +2226,7 @@
         case ENTITYREF :
         case NOTATION  :
             throw new RuntimeException( "Not impl" );
-                                           
+
         default : throw new RuntimeException( "Unknown node type" );
         }
     }
@@ -2290,12 +2251,12 @@
         if (l.noSync())         { l.enter(); try { node_setNodeValue( n, nodeValue ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { node_setNodeValue( n, nodeValue ); } finally { l.exit(); } }
     }
-    
+
     public static void node_setNodeValue ( Dom n, String nodeValue )
     {
         if (nodeValue == null)
             nodeValue = "";
-        
+
         switch ( n.nodeType() )
         {
             case TEXT :
@@ -2317,16 +2278,16 @@
 
                 break;
             }
-                
+
             case ATTR :
             {
                 // Try to set an exisiting text node to contain the new value
-                
+
                 NodeList children = ((Node) n).getChildNodes();
 
                 while ( children.getLength() > 1 )
                     node_removeChild( n, (Dom) children.item( 1 ) );
-                
+
                 if (children.getLength() == 0)
                 {
                     TextNode tn = n.locale().createTextNode();
@@ -2338,31 +2299,31 @@
                     assert children.getLength() == 1;
                     children.item( 0 ).setNodeValue( nodeValue );
                 }
-                if (((Xobj.AttrXobj) n).isId())
+                if (((AttrXobj) n).isId())
                 {
                     Dom d = DomImpl.node_getOwnerDocument(n);
                     String val = node_getNodeValue(n);
-                    if (d instanceof Xobj.DocumentXobj)
+                    if (d instanceof DocumentXobj)
                     {
-                        ((Xobj.DocumentXobj) d).removeIdElement(val);
-                        ((Xobj.DocumentXobj) d).addIdElement(nodeValue,
+                        ((DocumentXobj) d).removeIdElement(val);
+                        ((DocumentXobj) d).addIdElement(nodeValue,
                             attr_getOwnerElement(n));
                     }
                 }
 
                 break;
             }
-            
+
             case PROCINST :
             case COMMENT :
             {
                 Cur c = n.tempCur();
                 c.next();
-                
+
                 c.getChars( -1 );
                 c.moveChars( null, c._cchSrc );
                 c.insertString( nodeValue );
-                
+
                 c.release();
 
                 break;
@@ -2401,10 +2362,10 @@
         {
             assert n instanceof CharNode: "Text/CData should be a CharNode";
             CharNode node = (CharNode) n;
-            if (! (node._src instanceof Xobj) )
-                s = CharUtil.getString( node._src, node._off, node._cch );
-            else{
-                Xobj src = (Xobj) node._src;
+            if (! (node.getObject() instanceof Xobj) ) {
+                s = CharUtil.getString(node.getObject(), node._off, node._cch);
+            }else{
+                Xobj src = (Xobj) node.getObject();
                 src.ensureOccupancy();
                 boolean isThisNodeAfterText = node.isNodeAftertext();
                 if( isThisNodeAfterText ){
@@ -2430,108 +2391,152 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static Object _node_getUserData ( Dom n, String key )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static Object _node_getUserData ( Dom n, String key ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static Object _node_setUserData ( Dom n, String key, Object data, UserDataHandler handler )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static Object _node_setUserData ( Dom n, String key, Object data, UserDataHandler handler ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static Object _node_getFeature ( Dom n, String feature, String version )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static Object _node_getFeature ( Dom n, String feature, String version ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static boolean _node_isEqualNode ( Dom n, Node arg )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static boolean _node_isEqualNode ( Dom n, Node arg ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static boolean _node_isSameNode ( Dom n, Node arg )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static boolean _node_isSameNode ( Dom n, Node arg ) {
+        // TODO: check if relying on object identity is ok
+        boolean ret;
+        if (n instanceof CharNode) {
+//            ret = ((CharNode)n).getDom().equals(arg);
+            ret = n.equals(arg);
+        } else if (n instanceof NodeXobj) {
+            ret = ((NodeXobj)n).getDom().equals(arg);
+        } else {
+            throw new DomLevel3NotImplemented();
+        }
+        return ret;
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static String _node_lookupNamespaceURI ( Dom n, String prefix )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static String _node_lookupNamespaceURI ( Dom n, String prefix ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static boolean _node_isDefaultNamespace ( Dom n, String namespaceURI )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
-    }
-    
-    //////////////////////////////////////////////////////////////////////////////////////
-    //////////////////////////////////////////////////////////////////////////////////////
-    //////////////////////////////////////////////////////////////////////////////////////
-
-    public static String _node_lookupPrefix ( Dom n, String namespaceURI )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static boolean _node_isDefaultNamespace ( Dom n, String namespaceURI ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static void _node_setTextContent ( Dom n, String textContent )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static String _node_lookupPrefix ( Dom n, String namespaceURI ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static String _node_getTextContent ( Dom n )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static void _node_setTextContent ( Dom n, String textContent ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static short _node_compareDocumentPosition ( Dom n, Node other )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static String _node_getTextContent ( Dom n ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    public static String _node_getBaseURI ( Dom n )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
+    public static short _node_compareDocumentPosition ( Dom n, Node other ) {
+        // TODO: find a faster way to compare, may be based on the locale / cursor elements inside the nodes
+        if (!(n instanceof Node)) {
+            return Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC;
+        }
+        Iterator<Node> nAncIter = ancestorAndSelf((Node)n).iterator();
+        Iterator<Node> oAncIter = ancestorAndSelf(other).iterator();
+
+        Node nAnc, oAnc;
+        boolean isFirst = true, isEqual;
+        do {
+            nAnc = nAncIter.next();
+            oAnc = oAncIter.next();
+            isEqual = Objects.equals(nAnc,oAnc);
+            if (isFirst && !isEqual) {
+                // if root node differ, the elements are from different documents
+                return Node.DOCUMENT_POSITION_DISCONNECTED;
+            }
+            isFirst = false;
+        } while (isEqual && nAncIter.hasNext() && oAncIter.hasNext());
+
+        if (isEqual) {
+            return nAncIter.hasNext()
+                ? Node.DOCUMENT_POSITION_CONTAINS | Node.DOCUMENT_POSITION_PRECEDING
+                : (oAncIter.hasNext()
+                ? Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING
+                : Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
+                );
+        } else {
+            Node prevSib = nAnc;
+            while ((prevSib = prevSib.getPreviousSibling()) != null) {
+                if (Objects.equals(prevSib, oAnc)) {
+                    return Node.DOCUMENT_POSITION_PRECEDING;
+                }
+            }
+            return Node.DOCUMENT_POSITION_FOLLOWING;
+        }
+    }
+
+    private static List<Node> ancestorAndSelf(Node node) {
+        LinkedList<Node> nodes = new LinkedList<>();
+        Node n = node;
+        do {
+            nodes.addFirst(n);
+            n = n.getParentNode();
+        } while (n != null);
+        return nodes;
+    }
+
+
+    //////////////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+
+    public static String _node_getBaseURI ( Dom n ) {
+        throw new DomLevel3NotImplemented();
     }
 
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2549,12 +2554,12 @@
 
         return (Node) d;
     }
-    
+
     public static Dom childNodes_item ( Dom n, int i )
     {
         if (i < 0)
             return null;
-        
+
         switch ( n.nodeType() )
         {
             case TEXT :
@@ -2598,7 +2603,7 @@
         if (l.noSync())         {  return childNodes_getLength( n );  }
         else synchronized ( l ) {  return childNodes_getLength( n );  }
     }
-    
+
     public static int childNodes_getLength ( Dom n )
     {
         switch ( n.nodeType() )
@@ -2668,7 +2673,7 @@
     {
         return (Attr) _attributes_setNamedItem( e, newAttr );
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2754,7 +2759,7 @@
     {
         if (oldAttr == null)
             throw new NotFoundErr( "Attribute to remove is null" );
-        
+
         if (oldAttr.getOwnerElement() != e)
             throw new NotFoundErr( "Attribute to remove does not belong to this element" );
 
@@ -2775,7 +2780,7 @@
         if (l.noSync())         { l.enter(); try { element_setAttribute( e, name, value ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { element_setAttribute( e, name, value ); } finally { l.exit(); } }
     }
-    
+
     public static void element_setAttribute ( Dom e, String name, String value )
     {
         Dom a = attributes_getNamedItem( e, name );
@@ -2785,7 +2790,7 @@
             a = document_createAttribute( node_getOwnerDocument( e ), name );
             attributes_setNamedItem( e, a );
         }
-        
+
         node_setNodeValue( a, value );
     }
 
@@ -2800,11 +2805,11 @@
         if (l.noSync())         { l.enter(); try { element_setAttributeNS( e, uri, qname, value ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { element_setAttributeNS( e, uri, qname, value ); } finally { l.exit(); } }
     }
-    
+
     public static void element_setAttributeNS ( Dom e, String uri, String qname, String value )
     {
         validateQualifiedName( qname, uri, true );
-        
+
         QName name = e.locale().makeQualifiedQName( uri, qname );
         String local = name.getLocalPart();
         String prefix = validatePrefix( name.getPrefix(), uri, local, true );
@@ -2849,12 +2854,12 @@
         if (l.noSync())         { l.enter(); try { return element_getElementsByTagNameNS( e, uri, local ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return element_getElementsByTagNameNS( e, uri, local ); } finally { l.exit(); } }
     }
-    
+
     public static NodeList element_getElementsByTagNameNS ( Dom e, String uri, String local )
     {
         return new ElementsByTagNameNSNodeList( e, uri, local );
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -2866,7 +2871,7 @@
         if (l.noSync())         { l.enter(); try { return attributes_getLength( e ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return attributes_getLength( e ); } finally { l.exit(); } }
     }
-    
+
     public static int attributes_getLength ( Dom e )
     {
         int n = 0;
@@ -2893,10 +2898,10 @@
             throw new IllegalArgumentException( "Attr to set is null" );
 
         Dom a;
-        
+
         if (!(attr instanceof Dom) || (a = (Dom) attr).locale() != l)
             throw new WrongDocumentErr( "Attr to set is from another document" );
-        
+
         Dom oldA;
 
         if (l.noSync())         { l.enter(); try { oldA = attributes_setNamedItem( e, a ); } finally { l.exit(); } }
@@ -2904,7 +2909,7 @@
 
         return (Node) oldA;
     }
-    
+
     public static Dom attributes_setNamedItem ( Dom e, Dom a )
     {
         if (attr_getOwnerElement( a ) != null)
@@ -2948,7 +2953,7 @@
         }
 
         c.release();
-        
+
         return oldAttr;
     }
 
@@ -2967,7 +2972,7 @@
 
         return (Node) n;
     }
-    
+
     public static Dom attributes_getNamedItem ( Dom e, String name )
     {
         Dom a = null;
@@ -2989,7 +2994,7 @@
 
         return a;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3005,12 +3010,12 @@
 
         return (Node) n;
     }
-    
+
     public static Dom attributes_getNamedItemNS ( Dom e, String uri, String local )
     {
         if (uri == null)
             uri = "";
-        
+
         Dom a = null;
 
         Cur c = e.tempCur();
@@ -3032,7 +3037,7 @@
 
         return a;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3048,7 +3053,7 @@
 
         return (Node) n;
     }
-    
+
     public static Dom attributes_removeNamedItem ( Dom e, String name )
     {
         Dom oldAttr = null;
@@ -3064,18 +3069,18 @@
                 if (oldAttr == null)
                     oldAttr = aa;
 
-                if (((Xobj.AttrXobj) aa).isId())
+                if (((AttrXobj) aa).isId())
                 {
                     Dom d = DomImpl.node_getOwnerDocument(aa);
                     String val = node_getNodeValue( aa );
-                    if (d instanceof Xobj.DocumentXobj)
-                        ((Xobj.DocumentXobj) d).removeIdElement(val);
+                    if (d instanceof DocumentXobj)
+                        ((DocumentXobj) d).removeIdElement(val);
                 }
                 removeNode(aa);
                 c.toPrevAttr();
             }
         }
-        
+
         c.release();
 
         if (oldAttr == null)
@@ -3083,7 +3088,7 @@
 
         return oldAttr;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3099,12 +3104,12 @@
 
         return (Node) n;
     }
-    
+
     public static Dom attributes_removeNamedItemNS ( Dom e, String uri, String local )
     {
         if (uri == null)
             uri = "";
-        
+
         Dom oldAttr = null;
 
         Cur c = e.tempCur();
@@ -3119,15 +3124,15 @@
             {
                 if (oldAttr == null)
                     oldAttr = aa;
-                 if (((Xobj.AttrXobj) aa).isId())
+                 if (((AttrXobj) aa).isId())
                  {
                      Dom d = DomImpl.node_getOwnerDocument(aa);
                      String val = node_getNodeValue( aa );
-                     if (d instanceof Xobj.DocumentXobj)
-                         ((Xobj.DocumentXobj) d).removeIdElement(val);
+                     if (d instanceof DocumentXobj)
+                         ((DocumentXobj) d).removeIdElement(val);
                  }
                 removeNode( aa );
-                
+
                 c.toPrevAttr();
             }
         }
@@ -3139,7 +3144,7 @@
 
         return oldAttr;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3163,14 +3168,14 @@
 
         return (Node) oldA;
     }
-    
+
     public static Dom attributes_setNamedItemNS ( Dom e, Dom a )
     {
         Dom owner = attr_getOwnerElement( a );
 
         if (owner == e)
             return a;
-        
+
         if (owner != null)
             throw new InuseAttributeError();
 
@@ -3225,18 +3230,18 @@
         Locale l = e.locale();
 
         Dom a;
-        
+
         if (l.noSync())         { l.enter(); try { a = attributes_item( e, index ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { a = attributes_item( e, index ); } finally { l.exit(); } }
 
         return (Node) a;
     }
-    
+
     public static Dom attributes_item ( Dom e, int index )
     {
         if (index < 0)
             return null;
-        
+
         Cur c = e.tempCur();
 
         Dom a = null;
@@ -3381,7 +3386,7 @@
     public static void _characterData_insertData ( Dom c, int offset, String arg )
     {
         String s = _characterData_getData( c );
-        
+
         if (offset < 0 || offset > s.length())
             throw new IndexSizeError();
 
@@ -3444,7 +3449,7 @@
     public static Text _text_splitText ( Dom t, int offset )
     {
         assert t.nodeType() == TEXT;
-        
+
         String s = _characterData_getData( t );
 
         if (offset < 0 || offset > s.length())
@@ -3453,7 +3458,7 @@
         _characterData_deleteData( t, offset, s.length() - offset );
 
         // Don't need to pass a doc here, any node will do..
-        
+
         Dom t2 = (Dom) _document_createTextNode( t, s.substring( offset ) );
 
         Dom p = (Dom) _node_getParentNode( t );
@@ -3463,41 +3468,38 @@
             _node_insertBefore( p, (Text) t2, _node_getNextSibling( t ) );
             t.locale().invalidateDomCaches(p);
         }
-        
+
         return (Text) t2;
     }
-    
-    //////////////////////////////////////////////////////////////////////////////////////
-    //////////////////////////////////////////////////////////////////////////////////////
-    //////////////////////////////////////////////////////////////////////////////////////
-    
-    public static String _text_getWholeText ( Dom t )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
-    }
-    
-    //////////////////////////////////////////////////////////////////////////////////////
-    //////////////////////////////////////////////////////////////////////////////////////
-    //////////////////////////////////////////////////////////////////////////////////////
-    
-    public static boolean _text_isElementContentWhitespace ( Dom t )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
-    }
-    
-    //////////////////////////////////////////////////////////////////////////////////////
-    //////////////////////////////////////////////////////////////////////////////////////
-    //////////////////////////////////////////////////////////////////////////////////////
-    
-    public static Text _text_replaceWholeText ( Dom t, String content )
-    {
-        throw new RuntimeException( "DOM Level 3 Not implemented" );
-    }
 
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
-    
+
+    public static String _text_getWholeText ( Dom t ) {
+        throw new DomLevel3NotImplemented();
+    }
+
+    //////////////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+
+    public static boolean _text_isElementContentWhitespace ( Dom t ) {
+        throw new DomLevel3NotImplemented();
+    }
+
+    //////////////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+
+    public static Text _text_replaceWholeText ( Dom t, String content ) {
+        throw new DomLevel3NotImplemented();
+    }
+
+    //////////////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////////////////////////////////////////////////////////////
+
     public static XMLStreamReader _getXmlStreamReader ( Dom n )
     {
         Locale l = n.locale();
@@ -3505,11 +3507,11 @@
         if (l.noSync())         { l.enter(); try { return getXmlStreamReader( n ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return getXmlStreamReader( n ); } finally { l.exit(); } }
     }
-    
+
     public static XMLStreamReader getXmlStreamReader ( Dom n )
     {
         XMLStreamReader xs;
-        
+
         switch ( n.nodeType() )
         {
         case DOCUMENT :
@@ -3524,7 +3526,7 @@
             c.release();
             break;
         }
-            
+
         case TEXT :
         case CDATA :
         {
@@ -3535,34 +3537,34 @@
             if ((c = cn.tempCur()) == null)
             {
                 c = n.locale().tempCur();
-                
-                xs = Jsr173.newXmlStreamReader( c, cn._src, cn._off, cn._cch );
+
+                xs = Jsr173.newXmlStreamReader( c, cn.getObject(), cn._off, cn._cch );
             }
             else
             {
                 xs =
                     Jsr173.newXmlStreamReader(
                         c , c.getChars( cn._cch ), c._offSrc, c._cchSrc );
-                
+
             }
 
             c.release();
-            
+
             break;
         }
-            
+
         case ENTITYREF :
         case ENTITY :
         case DOCTYPE :
         case NOTATION :
             throw new RuntimeException( "Not impl" );
-            
+
         default : throw new RuntimeException( "Unknown kind" );
         }
 
         return xs;
     }
-    
+
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
@@ -3613,355 +3615,6 @@
     //////////////////////////////////////////////////////////////////////////////////////
     //////////////////////////////////////////////////////////////////////////////////////
 
-    static abstract class CharNode implements Dom, Node, CharacterData
-    {
-        public CharNode ( Locale l )
-        {
-            assert l != null;
-            
-            _locale = l;
-        }
-        
-        public QName getQName ( )
-        {
-            return null;
-        }
-
-        public Locale locale ( )
-        {
-            assert isValid();
-            
-            return _locale == null ? ((Dom) _src).locale() : _locale;
-        }
-
-        public void setChars ( Object src, int off, int cch )
-        {
-            assert CharUtil.isValid( src, off, cch );
-            assert _locale != null || _src instanceof Dom;
-
-            if (_locale == null)
-                _locale = ((Dom) _src).locale();
-
-            _src = src;
-            _off = off;
-            _cch = cch;
-        }
-
-        public Dom getDom ( )
-        {
-            assert isValid();
-            
-            if (_src instanceof Dom)
-                return (Dom) _src;
-
-            return null;
-        }
-
-        public void setDom ( Dom d )
-        {
-            assert d != null;
-            
-            _src = d;
-            _locale = null;
-        }
-
-        public Cur tempCur ( )
-        {
-            assert isValid();
-
-            if (!(_src instanceof Dom))
-                return null;
-            
-            Cur c = locale().tempCur();
-            c.moveToCharNode( this );
-            
-            return c;
-        }
-
-        private boolean isValid ( )
-        {
-            if (_src instanceof Dom)
-                return _locale == null;
-
-            if (_locale == null)
-                return false;
-
-            return true;
-        }
-
-        public static boolean isOnList ( CharNode nodes, CharNode node )
-        {
-            assert node != null;
-            
-            for ( CharNode cn = nodes ; cn != null ; cn = cn._next )
-                if (cn == node)
-                    return true;
-
-            return false;
-        }
-
-        public static CharNode remove ( CharNode nodes, CharNode node )
-        {
-            assert isOnList( nodes, node );
-            
-            if (nodes == node)
-                nodes = node._next;
-            else
-                node._prev._next = node._next;
-
-            if (node._next != null)
-                node._next._prev = node._prev;
-
-            node._prev = node._next = null;
-
-            return nodes;
-        }
-
-        public static CharNode insertNode ( CharNode nodes, CharNode newNode, CharNode before )
-        {
-            assert !isOnList( nodes, newNode );
-            assert before == null || isOnList( nodes, before );
-            assert newNode != null;
-            assert newNode._prev == null && newNode._next == null;
-
-            if (nodes == null)
-            {
-                assert before == null;
-                nodes = newNode;
-            }
-            else if (nodes == before)
-            {
-                nodes._prev = newNode;
-                newNode._next = nodes;
-                nodes = newNode;
-            }
-            else
-            {
-                CharNode n = nodes;
-
-                while ( n._next != before )
-                    n = n._next;
-
-                if ((newNode._next = n._next) != null)
-                    n._next._prev = newNode;
-
-                newNode._prev = n;
-                n._next = newNode;
-            }
-
-            return nodes;
-        }
-
-        public static CharNode appendNode ( CharNode nodes, CharNode newNode )
-        {
-            return insertNode( nodes, newNode, null );
-        }
-
-        public static CharNode appendNodes ( CharNode nodes, CharNode newNodes )
-        {
-            assert newNodes != null;
-            assert newNodes._prev == null;
-
-            if (nodes == null)
-                return newNodes;
-
-            CharNode n = nodes;
-
-            while ( n._next != null )
-                n = n._next;
-
-            n._next = newNodes;
-            newNodes._prev = n;
-
-            return nodes;
-        }
-
-        public static CharNode copyNodes ( CharNode nodes, Object newSrc )
-        {
-            CharNode newNodes = null;
-
-            for ( CharNode n = null ; nodes != null ; nodes = nodes._next )
-            {
-                CharNode newNode;
-
-                if (nodes instanceof TextNode)
-                    newNode = nodes.locale().createTextNode();
-                else
-                    newNode = nodes.locale().createCdataNode();
-
-                // How to deal with entity refs??
-
-                newNode.setChars( newSrc, nodes._off, nodes._cch );
-
-                if (newNodes == null)
-                    newNodes = newNode;
-
-                if (n != null)
-                {
-                    n._next = newNode;
-                    newNode._prev = n;
-                }
-
-                n = newNode;
-            }
-
-            return newNodes;
-        }
-
-        public boolean nodeCanHavePrefixUri()
-        {
-            return false;
-        }
-
-        public boolean isNodeAftertext()
-        {
-            assert _src instanceof Xobj :
-                "this method is to only be used for nodes backed up by Xobjs";
-            Xobj src =(Xobj) _src;
-            return src._charNodesValue == null ? true :
-                src._charNodesAfter == null ? false :
-                CharNode.isOnList(src._charNodesAfter, this);
-        }
-        public void dump ( PrintStream o, Object ref )
-        {
-            if (_src instanceof Dom)
-                ((Dom) _src).dump( o, ref );
-            else
-                o.println( "Lonely CharNode: \"" + CharUtil.getString( _src, _off, _cch ) + "\"" );
-        }
-        
-        public void dump ( PrintStream o )
-        {
-            dump( o, (Object) this );
-        }
-
-        public void dump ( )
-        {
-            dump( System.out );
-        }
-
-        public Node appendChild ( Node newChild ) { return DomImpl._node_appendChild( this, newChild ); }
-        public Node cloneNode ( boolean deep ) { return DomImpl._node_cloneNode( this, deep ); }
-        public NamedNodeMap getAttributes ( ) { return null; }
-        public NodeList getChildNodes ( ) { return DomImpl._emptyNodeList; }
-        public Node getParentNode ( ) { return DomImpl._node_getParentNode( this ); }
-        public Node removeChild ( Node oldChild ) { return DomImpl._node_removeChild( this, oldChild ); }
-        public Node getFirstChild ( ) { return null; }
-        public Node getLastChild ( ) { return null; }
-        public String getLocalName ( ) { return DomImpl._node_getLocalName( this ); }
-        public String getNamespaceURI ( ) { return DomImpl._node_getNamespaceURI( this ); }
-        public Node getNextSibling ( ) { return DomImpl._node_getNextSibling( this ); }
-        public String getNodeName ( ) { return DomImpl._node_getNodeName( this ); }
-        public short getNodeType ( ) { return DomImpl._node_getNodeType( this ); }
-        public String getNodeValue ( ) { return DomImpl._node_getNodeValue( this ); }
-        public Document getOwnerDocument ( ) { return DomImpl._node_getOwnerDocument( this ); }
-        public String getPrefix ( ) { return DomImpl._node_getPrefix( this ); }
-        public Node getPreviousSibling ( ) { return DomImpl._node_getPreviousSibling( this ); }
-        public boolean hasAttributes ( ) { return false; }
-        public boolean hasChildNodes ( ) { return false; }
-        public Node insertBefore ( Node newChild, Node refChild ) { return DomImpl._node_insertBefore( this, newChild, refChild ); }
-        public boolean isSupported ( String feature, String version ) { return DomImpl._node_isSupported( this, feature, version ); }
-        public void normalize ( ) { DomImpl._node_normalize( this ); }
-        public Node replaceChild ( Node newChild, Node oldChild ) { return DomImpl._node_replaceChild( this, newChild, oldChild ); }
-        public void setNodeValue ( String nodeValue ) { DomImpl._node_setNodeValue( this, nodeValue ); }
-        public void setPrefix ( String prefix ) { DomImpl._node_setPrefix( this, prefix ); }
-
-        // DOM Level 3
-        public Object getUserData ( String key ) { return DomImpl._node_getUserData( this, key ); }
-        public Object setUserData ( String key, Object data, UserDataHandler handler ) { return DomImpl._node_setUserData( this, key, data, handler ); }
-        public Object getFeature ( String feature, String version ) { return DomImpl._node_getFeature( this, feature, version ); }
-        public boolean isEqualNode ( Node arg ) { return DomImpl._node_isEqualNode( this, arg ); }
-        public boolean isSameNode ( Node arg ) { return DomImpl._node_isSameNode( this, arg ); }
-        public String lookupNamespaceURI ( String prefix ) { return DomImpl._node_lookupNamespaceURI( this, prefix ); }
-        public String lookupPrefix ( String namespaceURI ) { return DomImpl._node_lookupPrefix( this, namespaceURI ); }
-        public boolean isDefaultNamespace ( String namespaceURI ) { return DomImpl._node_isDefaultNamespace( this, namespaceURI ); }
-        public void setTextContent ( String textContent ) { DomImpl._node_setTextContent( this, textContent ); }
-        public String getTextContent ( ) { return DomImpl._node_getTextContent( this ); }
-        public short compareDocumentPosition ( Node other ) { return DomImpl._node_compareDocumentPosition( this, other ); }
-        public String getBaseURI ( ) { return DomImpl._node_getBaseURI( this ); }
-
-        public void appendData ( String arg ) { DomImpl._characterData_appendData( this, arg ); }
-        public void deleteData ( int offset, int count ) { DomImpl._characterData_deleteData( this, offset, count ); }
-        public String getData ( ) { return DomImpl._characterData_getData( this ); }
-        public int getLength ( ) { return DomImpl._characterData_getLength( this ); }
-        public void insertData ( int offset, String arg ) { DomImpl._characterData_insertData( this, offset, arg ); }
-        public void replaceData ( int offset, int count, String arg ) { DomImpl._characterData_replaceData( this, offset, count, arg ); }
-        public void setData ( String data ) { DomImpl._characterData_setData( this, data ); }
-        public String substringData ( int offset, int count ) { return DomImpl._characterData_substringData( this, offset, count ); }
-
-        private Locale _locale;
-
-        CharNode _next;
-        CharNode _prev;
-
-        private Object _src;
-        
-        int _off;
-        int _cch;
-    }
-    
-    static class TextNode extends CharNode implements Text
-    {
-        TextNode ( Locale l )
-        {
-            super( l );
-        }
-
-        public int nodeType ( ) { return DomImpl.TEXT; }
-
-        public String name ( ) { return "#text"; }
-
-        public Text splitText ( int offset ) { return DomImpl._text_splitText ( this, offset ); }
-        public String getWholeText ( ) { return DomImpl._text_getWholeText( this ); }
-        public boolean isElementContentWhitespace ( ) { return DomImpl._text_isElementContentWhitespace( this ); }
-        public Text replaceWholeText ( String content ) { return DomImpl._text_replaceWholeText( this, content ); }
-    }
-
-    static class CdataNode extends TextNode implements CDATASection
-    {
-        CdataNode ( Locale l )
-        {
-            super( l );
-        }
-
-        public int nodeType ( ) { return DomImpl.CDATA; }
-
-        public String name ( ) { return "#cdata-section"; }
-    }
-    
-    static class SaajTextNode extends TextNode implements org.apache.xmlbeans.impl.soap.Text
-    {
-        SaajTextNode ( Locale l )
-        {
-            super( l );
-        }
-
-        public boolean isComment ( ) { return DomImpl._soapText_isComment( this ); }
-        
-        public void detachNode ( ) { DomImpl._soapNode_detachNode( this ); }
-        public void recycleNode ( ) { DomImpl._soapNode_recycleNode( this ); }
-        public String getValue ( ) { return DomImpl._soapNode_getValue( this ); }
-        public void setValue ( String value ) { DomImpl._soapNode_setValue( this, value ); }
-        public SOAPElement getParentElement ( ) { return DomImpl._soapNode_getParentElement( this ); }
-        public void setParentElement ( SOAPElement p ) { DomImpl._soapNode_setParentElement( this, p ); }
-    }
-    
-    static class SaajCdataNode extends CdataNode implements org.apache.xmlbeans.impl.soap.Text
-    {
-        public SaajCdataNode ( Locale l )
-        {
-            super( l );
-        }
-
-        public boolean isComment ( ) { return DomImpl._soapText_isComment( this ); }
-        
-        public void detachNode ( ) { DomImpl._soapNode_detachNode( this ); }
-        public void recycleNode ( ) { DomImpl._soapNode_recycleNode( this ); }
-        public String getValue ( ) { return DomImpl._soapNode_getValue( this ); }
-        public void setValue ( String value ) { DomImpl._soapNode_setValue( this, value ); }
-        public SOAPElement getParentElement ( ) { return DomImpl._soapNode_getParentElement( this ); }
-        public void setParentElement ( SOAPElement p ) { DomImpl._soapNode_setParentElement( this, p ); }
-    }
 
     //
     // Soap Text Node
@@ -3976,11 +3629,11 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapText_isComment( text ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapText_isComment( text ); } finally { l.exit(); } }
     }
-    
+
     //
     // Soap Node
     //
-    
+
     public static void _soapNode_detachNode ( Dom n )
     {
         Locale l = n.locale();
@@ -3990,7 +3643,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapNode_detachNode( node ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapNode_detachNode( node ); } finally { l.exit(); } }
     }
-    
+
     public static void _soapNode_recycleNode ( Dom n )
     {
         Locale l = n.locale();
@@ -4000,7 +3653,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapNode_recycleNode( node ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapNode_recycleNode( node ); } finally { l.exit(); } }
     }
-    
+
     public static String _soapNode_getValue ( Dom n )
     {
         Locale l = n.locale();
@@ -4054,7 +3707,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapElement_removeContents( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapElement_removeContents( se ); } finally { l.exit(); } }
     }
-    
+
     public static String _soapElement_getEncodingStyle ( Dom d )
     {
         Locale l = d.locale();
@@ -4064,7 +3717,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getEncodingStyle( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getEncodingStyle( se ); } finally { l.exit(); } }
     }
-    
+
     public static void _soapElement_setEncodingStyle ( Dom d, String encodingStyle )
     {
         Locale l = d.locale();
@@ -4074,7 +3727,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapElement_setEncodingStyle( se, encodingStyle ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapElement_setEncodingStyle( se, encodingStyle ); } finally { l.exit(); } }
     }
-    
+
     public static boolean _soapElement_removeNamespaceDeclaration ( Dom d, String prefix )
     {
         Locale l = d.locale();
@@ -4084,7 +3737,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_removeNamespaceDeclaration( se, prefix ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_removeNamespaceDeclaration( se, prefix ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator _soapElement_getAllAttributes ( Dom d )
     {
         Locale l = d.locale();
@@ -4094,7 +3747,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getAllAttributes( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getAllAttributes( se ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator _soapElement_getChildElements ( Dom d )
     {
         Locale l = d.locale();
@@ -4104,7 +3757,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getChildElements( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getChildElements( se ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator _soapElement_getNamespacePrefixes ( Dom d )
     {
         Locale l = d.locale();
@@ -4114,7 +3767,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getNamespacePrefixes( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getNamespacePrefixes( se ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPElement _soapElement_addAttribute ( Dom d, Name name, String value ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4124,7 +3777,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_addAttribute( se, name, value ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_addAttribute( se, name, value ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPElement _soapElement_addChildElement ( Dom d, SOAPElement oldChild ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4134,7 +3787,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_addChildElement( se, oldChild ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_addChildElement( se, oldChild ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPElement _soapElement_addChildElement ( Dom d, Name name ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4144,7 +3797,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_addChildElement( se, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_addChildElement( se, name ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPElement _soapElement_addChildElement ( Dom d, String localName ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4154,7 +3807,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_addChildElement( se, localName ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_addChildElement( se, localName ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPElement _soapElement_addChildElement ( Dom d, String localName, String prefix ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4164,7 +3817,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_addChildElement( se, localName, prefix ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_addChildElement( se, localName, prefix ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPElement _soapElement_addChildElement ( Dom d, String localName, String prefix, String uri ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4174,7 +3827,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_addChildElement( se, localName, prefix, uri ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_addChildElement( se, localName, prefix, uri ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPElement _soapElement_addNamespaceDeclaration ( Dom d, String prefix, String uri )
     {
         Locale l = d.locale();
@@ -4184,7 +3837,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_addNamespaceDeclaration( se, prefix, uri ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_addNamespaceDeclaration( se, prefix, uri ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPElement _soapElement_addTextNode ( Dom d, String data )
     {
         Locale l = d.locale();
@@ -4194,7 +3847,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_addTextNode( se, data ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_addTextNode( se, data ); } finally { l.exit(); } }
     }
-    
+
     public static String _soapElement_getAttributeValue ( Dom d, Name name )
     {
         Locale l = d.locale();
@@ -4204,7 +3857,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getAttributeValue( se, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getAttributeValue( se, name ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator _soapElement_getChildElements ( Dom d, Name name )
     {
         Locale l = d.locale();
@@ -4214,7 +3867,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getChildElements( se, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getChildElements( se, name ); } finally { l.exit(); } }
     }
-    
+
     public static Name _soapElement_getElementName ( Dom d )
     {
         Locale l = d.locale();
@@ -4224,7 +3877,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getElementName( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getElementName( se ); } finally { l.exit(); } }
     }
-    
+
     public static String _soapElement_getNamespaceURI ( Dom d, String prefix )
     {
         Locale l = d.locale();
@@ -4234,7 +3887,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getNamespaceURI( se, prefix ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getNamespaceURI( se, prefix ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator _soapElement_getVisibleNamespacePrefixes ( Dom d )
     {
         Locale l = d.locale();
@@ -4244,7 +3897,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapElement_getVisibleNamespacePrefixes( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapElement_getVisibleNamespacePrefixes( se ); } finally { l.exit(); } }
     }
-    
+
     public static boolean _soapElement_removeAttribute ( Dom d, Name name )
     {
         Locale l = d.locale();
@@ -4268,7 +3921,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapEnvelope_addBody( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapEnvelope_addBody( se ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPBody _soapEnvelope_getBody ( Dom d ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4278,7 +3931,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapEnvelope_getBody( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapEnvelope_getBody( se ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPHeader _soapEnvelope_getHeader ( Dom d ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4288,7 +3941,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapEnvelope_getHeader( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapEnvelope_getHeader( se ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPHeader _soapEnvelope_addHeader ( Dom d ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4298,7 +3951,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapEnvelope_addHeader( se ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapEnvelope_addHeader( se ); } finally { l.exit(); } }
     }
-    
+
     public static Name _soapEnvelope_createName ( Dom d, String localName )
     {
         Locale l = d.locale();
@@ -4308,7 +3961,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapEnvelope_createName( se, localName ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapEnvelope_createName( se, localName ); } finally { l.exit(); } }
     }
-    
+
     public static Name _soapEnvelope_createName ( Dom d, String localName, String prefix, String namespaceURI )
     {
         Locale l = d.locale();
@@ -4382,7 +4035,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapHeader_addHeaderElement( sh, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapHeader_addHeaderElement( sh, name ); } finally { l.exit(); } }
     }
-    
+
     //
     // Soap Body
     //
@@ -4396,7 +4049,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapBody_hasFault( sb ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapBody_hasFault( sb ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPFault soapBody_addFault ( Dom d ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4406,7 +4059,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapBody_addFault( sb ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapBody_addFault( sb ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPFault soapBody_getFault ( Dom d )
     {
         Locale l = d.locale();
@@ -4416,7 +4069,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapBody_getFault( sb ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapBody_getFault( sb ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPBodyElement soapBody_addBodyElement ( Dom d, Name name )
     {
         Locale l = d.locale();
@@ -4426,7 +4079,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapBody_addBodyElement( sb, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapBody_addBodyElement( sb, name ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPBodyElement soapBody_addDocument ( Dom d, Document document )
     {
         Locale l = d.locale();
@@ -4436,7 +4089,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapBody_addDocument( sb, document ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapBody_addDocument( sb, document ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPFault soapBody_addFault ( Dom d, Name name, String s ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4446,7 +4099,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapBody_addFault( sb, name, s ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapBody_addFault( sb, name, s ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPFault soapBody_addFault ( Dom d, Name faultCode, String faultString, java.util.Locale locale ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4456,7 +4109,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapBody_addFault( sb, faultCode, faultString, locale ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapBody_addFault( sb, faultCode, faultString, locale ); } finally { l.exit(); } }
     }
-    
+
     //
     // Soap Fault
     //
@@ -4470,7 +4123,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapFault_setFaultString( sf, faultString ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapFault_setFaultString( sf, faultString ); } finally { l.exit(); } }
     }
-    
+
     public static void soapFault_setFaultString ( Dom d, String faultString, java.util.Locale locale )
     {
         Locale l = d.locale();
@@ -4480,7 +4133,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapFault_setFaultString( sf, faultString, locale ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapFault_setFaultString( sf, faultString, locale ); } finally { l.exit(); } }
     }
-    
+
     public static void soapFault_setFaultCode ( Dom d, Name faultCodeName ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4490,7 +4143,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapFault_setFaultCode( sf, faultCodeName ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapFault_setFaultCode( sf, faultCodeName ); } finally { l.exit(); } }
     }
-    
+
     public static void soapFault_setFaultActor ( Dom d, String faultActorString )
     {
         Locale l = d.locale();
@@ -4500,7 +4153,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapFault_setFaultActor( sf, faultActorString ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapFault_setFaultActor( sf, faultActorString ); } finally { l.exit(); } }
     }
-    
+
     public static String soapFault_getFaultActor ( Dom d )
     {
         Locale l = d.locale();
@@ -4510,7 +4163,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapFault_getFaultActor( sf ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapFault_getFaultActor( sf ); } finally { l.exit(); } }
     }
-    
+
     public static String soapFault_getFaultCode ( Dom d )
     {
         Locale l = d.locale();
@@ -4520,7 +4173,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapFault_getFaultCode( sf ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapFault_getFaultCode( sf ); } finally { l.exit(); } }
     }
-    
+
     public static void soapFault_setFaultCode ( Dom d, String faultCode ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4530,7 +4183,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapFault_setFaultCode( sf, faultCode ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapFault_setFaultCode( sf, faultCode ); } finally { l.exit(); } }
     }
-    
+
     public static java.util.Locale soapFault_getFaultStringLocale ( Dom d )
     {
         Locale l = d.locale();
@@ -4540,7 +4193,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapFault_getFaultStringLocale( sf ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapFault_getFaultStringLocale( sf ); } finally { l.exit(); } }
     }
-    
+
     public static Name soapFault_getFaultCodeAsName ( Dom d )
     {
         Locale l = d.locale();
@@ -4550,7 +4203,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapFault_getFaultCodeAsName( sf ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapFault_getFaultCodeAsName( sf ); } finally { l.exit(); } }
     }
-    
+
     public static String soapFault_getFaultString ( Dom d )
     {
         Locale l = d.locale();
@@ -4560,7 +4213,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapFault_getFaultString( sf ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapFault_getFaultString( sf ); } finally { l.exit(); } }
     }
-    
+
     public static Detail soapFault_addDetail ( Dom d ) throws SOAPException
     {
         Locale l = d.locale();
@@ -4570,7 +4223,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapFault_addDetail( sf ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapFault_addDetail( sf ); } finally { l.exit(); } }
     }
-    
+
     public static Detail soapFault_getDetail ( Dom d )
     {
         Locale l = d.locale();
@@ -4580,7 +4233,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapFault_getDetail( sf ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapFault_getDetail( sf ); } finally { l.exit(); } }
     }
-    
+
     //
     // Soap Header Element
     //
@@ -4594,7 +4247,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapHeaderElement_setMustUnderstand( she, mustUnderstand ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapHeaderElement_setMustUnderstand( she, mustUnderstand ); } finally { l.exit(); } }
     }
-    
+
     public static boolean soapHeaderElement_getMustUnderstand ( Dom d )
     {
         Locale l = d.locale();
@@ -4604,7 +4257,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapHeaderElement_getMustUnderstand( she ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapHeaderElement_getMustUnderstand( she ); } finally { l.exit(); } }
     }
-    
+
     public static void soapHeaderElement_setActor ( Dom d, String actor )
     {
         Locale l = d.locale();
@@ -4614,7 +4267,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapHeaderElement_setActor( she, actor ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapHeaderElement_setActor( she, actor ); } finally { l.exit(); } }
     }
-    
+
     public static String soapHeaderElement_getActor ( Dom d )
     {
         Locale l = d.locale();
@@ -4624,7 +4277,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapHeaderElement_getActor( she ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapHeaderElement_getActor( she ); } finally { l.exit(); } }
     }
-    
+
     //
     // Soap Header Element
     //
@@ -4638,7 +4291,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.detail_addDetailEntry( detail, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.detail_addDetailEntry( detail, name ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator detail_getDetailEntries ( Dom d )
     {
         Locale l = d.locale();
@@ -4648,7 +4301,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.detail_getDetailEntries( detail ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.detail_getDetailEntries( detail ); } finally { l.exit(); } }
     }
-    
+
     //
     // Soap Header Element
     //
@@ -4662,7 +4315,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapPart_removeAllMimeHeaders( sp ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapPart_removeAllMimeHeaders( sp ); } finally { l.exit(); } }
     }
-    
+
     public static void _soapPart_removeMimeHeader ( Dom d, String name )
     {
         Locale l = d.locale();
@@ -4672,7 +4325,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapPart_removeMimeHeader( sp, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapPart_removeMimeHeader( sp, name ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator _soapPart_getAllMimeHeaders ( Dom d )
     {
         Locale l = d.locale();
@@ -4682,7 +4335,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapPart_getAllMimeHeaders( sp ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapPart_getAllMimeHeaders( sp ); } finally { l.exit(); } }
     }
-    
+
     public static SOAPEnvelope _soapPart_getEnvelope ( Dom d )
     {
         Locale l = d.locale();
@@ -4692,7 +4345,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapPart_getEnvelope( sp ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapPart_getEnvelope( sp ); } finally { l.exit(); } }
     }
-    
+
     public static Source _soapPart_getContent ( Dom d )
     {
         Locale l = d.locale();
@@ -4702,7 +4355,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapPart_getContent( sp ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapPart_getContent( sp ); } finally { l.exit(); } }
     }
-    
+
     public static void _soapPart_setContent ( Dom d, Source source )
     {
         Locale l = d.locale();
@@ -4712,7 +4365,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapPart_setContent( sp, source ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapPart_setContent( sp, source ); } finally { l.exit(); } }
     }
-    
+
     public static String[] _soapPart_getMimeHeader ( Dom d, String name )
     {
         Locale l = d.locale();
@@ -4722,7 +4375,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapPart_getMimeHeader( sp, name ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapPart_getMimeHeader( sp, name ); } finally { l.exit(); } }
     }
-    
+
     public static void _soapPart_addMimeHeader ( Dom d, String name, String value )
     {
         Locale l = d.locale();
@@ -4732,7 +4385,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapPart_addMimeHeader( sp, name, value ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapPart_addMimeHeader( sp, name, value ); } finally { l.exit(); } }
     }
-    
+
     public static void _soapPart_setMimeHeader ( Dom d, String name, String value )
     {
         Locale l = d.locale();
@@ -4742,7 +4395,7 @@
         if (l.noSync())         { l.enter(); try { l._saaj.soapPart_setMimeHeader( sp, name, value ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { l._saaj.soapPart_setMimeHeader( sp, name, value ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator _soapPart_getMatchingMimeHeaders ( Dom d, String[] names )
     {
         Locale l = d.locale();
@@ -4752,7 +4405,7 @@
         if (l.noSync())         { l.enter(); try { return l._saaj.soapPart_getMatchingMimeHeaders( sp, names ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return l._saaj.soapPart_getMatchingMimeHeaders( sp, names ); } finally { l.exit(); } }
     }
-    
+
     public static Iterator _soapPart_getNonMatchingMimeHeaders ( Dom d, String[] names )
     {
         Locale l = d.locale();
@@ -4766,7 +4419,7 @@
     //
     // Saaj callback
     //
-    
+
     private static class SaajData
     {
         Object _obj;
@@ -4779,7 +4432,7 @@
         if (l.noSync())         { l.enter(); try { impl_saajCallback_setSaajData( d, o ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { impl_saajCallback_setSaajData( d, o ); } finally { l.exit(); } }
     }
-    
+
     public static void impl_saajCallback_setSaajData ( Dom d, Object o )
     {
         Locale l = d.locale();
@@ -4799,7 +4452,7 @@
 
             sd._obj = o;
         }
-        
+
         c.setBookmark( SaajData.class, sd );
 
         c.release();
@@ -4812,7 +4465,7 @@
         if (l.noSync())         { l.enter(); try { return impl_saajCallback_getSaajData( d ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return impl_saajCallback_getSaajData( d ); } finally { l.exit(); } }
     }
-    
+
     public static Object impl_saajCallback_getSaajData ( Dom d )
     {
         Locale l = d.locale();
@@ -4841,20 +4494,20 @@
 
         return (Element) e;
     }
-    
+
     public static Dom impl_saajCallback_createSoapElement ( Dom d, QName name, QName parentName )
     {
         Cur c = d.locale().tempCur();
-        
+
         c.createElement( name, parentName );
-        
+
         Dom e = c.getDom();
-        
+
         c.release();
-        
+
         return e;
     }
-        
+
     public static Element saajCallback_importSoapElement (
         Dom d, Element elem, boolean deep, QName parentName )
     {
@@ -4867,18 +4520,18 @@
 
         return (Element) e;
     }
-    
+
     public static Dom impl_saajCallback_importSoapElement (
         Dom d, Element elem, boolean deep, QName parentName )
     {
         // TODO -- need to rewrite DomImpl.document_importNode to use an Xcur
         // to create the new tree.  Then, I can pass the parentName to the new
         // fcn and use it to create the correct root parent
-        
+
         throw new RuntimeException( "Not impl" );
     }
 
-    
+
     public static Text saajCallback_ensureSoapTextNode ( Dom d )
     {
         Locale l = d.locale();
@@ -4886,7 +4539,7 @@
         if (l.noSync())         { l.enter(); try { return impl_saajCallback_ensureSoapTextNode( d ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return impl_saajCallback_ensureSoapTextNode( d ); } finally { l.exit(); } }
     }
-    
+
     public static Text impl_saajCallback_ensureSoapTextNode ( Dom d )
     {
 //        if (!(d instanceof Text))
@@ -4897,11 +4550,16 @@
 //
 //            x.release();
 //        }
-//        
+//
 //        return (Text) d;
 
         return null;
     }
-    
+
+    public static class DomLevel3NotImplemented extends RuntimeException {
+        DomLevel3NotImplemented() {
+            super("DOM Level 3 Not implemented");
+        }
+    }
 }
- 
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/DomSaver.java b/src/store/org/apache/xmlbeans/impl/store/DomSaver.java
new file mode 100644
index 0000000..b3fd666
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/DomSaver.java
@@ -0,0 +1,203 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.SchemaType;
+import org.apache.xmlbeans.SchemaTypeLoader;
+import org.apache.xmlbeans.XmlDocumentProperties;
+import org.apache.xmlbeans.XmlOptions;
+import org.w3c.dom.Node;
+
+import javax.xml.namespace.QName;
+import java.util.ArrayList;
+
+final class DomSaver extends Saver {
+    private Cur _nodeCur;
+    private SchemaType _type;
+    private final SchemaTypeLoader _stl;
+    private final XmlOptions _options;
+    private final boolean _isFrag;
+
+
+    DomSaver(Cur c, boolean isFrag, XmlOptions options) {
+        super(c, options);
+
+        if (c.isUserNode()) {
+            _type = c.getUser().get_schema_type();
+        }
+
+        _stl = c._locale._schemaTypeLoader;
+        _options = options;
+        _isFrag = isFrag;
+    }
+
+    Node saveDom() {
+        Locale l = Locale.getLocale(_stl, _options);
+
+        l.enter();
+
+        try {
+            _nodeCur = l.getCur();  // Not weak or temp
+
+            // Build the tree
+
+            //noinspection StatementWithEmptyBody
+            while (process());
+
+            // Set the type
+
+            while (!_nodeCur.isRoot()) {
+                _nodeCur.toParent();
+            }
+
+            if (_type != null) {
+                _nodeCur.setType(_type);
+            }
+
+            Node node = (Node) _nodeCur.getDom();
+
+            _nodeCur.release();
+
+            _nodeCur = null;
+
+            return node;
+        } finally {
+            l.exit();
+        }
+    }
+
+    protected boolean emitElement(SaveCur c, ArrayList attrNames, ArrayList attrValues) {
+        // If there was text or comments before the frag element, I will loose them -- oh well
+        // Also, I will lose any attributes and namesapces on the fragment -- DOM can
+        // have attrs in fragments
+
+        if (Locale.isFragmentQName(c.getName())) {
+            _nodeCur.moveTo(null, Cur.NO_POS);
+        }
+
+        ensureDoc();
+
+        _nodeCur.createElement(getQualifiedName(c, c.getName()));
+        _nodeCur.next();
+
+        for (iterateMappings(); hasMapping(); nextMapping()) {
+            _nodeCur.createAttr(_nodeCur._locale.createXmlns(mappingPrefix()));
+            _nodeCur.next();
+            _nodeCur.insertString(mappingUri());
+            _nodeCur.toParent();
+            _nodeCur.skipWithAttrs();
+        }
+
+        for (int i = 0; i < attrNames.size(); i++) {
+            _nodeCur.createAttr(getQualifiedName(c, (QName) attrNames.get(i)));
+            _nodeCur.next();
+            _nodeCur.insertString((String) attrValues.get(i));
+            _nodeCur.toParent();
+            _nodeCur.skipWithAttrs();
+        }
+
+        return false;
+    }
+
+    protected void emitFinish(SaveCur c) {
+        if (!Locale.isFragmentQName(c.getName())) {
+            assert _nodeCur.isEnd();
+            _nodeCur.next();
+        }
+    }
+
+    protected void emitText(SaveCur c) {
+        ensureDoc();
+
+        Object src = c.getChars();
+
+        if (c._cchSrc > 0) {
+            _nodeCur.insertChars(src, c._offSrc, c._cchSrc);
+            _nodeCur.next();
+        }
+    }
+
+    protected void emitComment(SaveCur c) {
+        ensureDoc();
+
+        _nodeCur.createComment();
+        emitTextValue(c);
+        _nodeCur.skip();
+    }
+
+    protected void emitProcinst(SaveCur c) {
+        ensureDoc();
+
+        _nodeCur.createProcinst(c.getName().getLocalPart());
+        emitTextValue(c);
+        _nodeCur.skip();
+    }
+
+    protected void emitDocType(String docTypeName, String publicId, String systemId) {
+        ensureDoc();
+
+        XmlDocumentProperties props = Locale.getDocProps(_nodeCur, true);
+        props.setDoctypeName(docTypeName);
+        props.setDoctypePublicId(publicId);
+        props.setDoctypeSystemId(systemId);
+    }
+
+    protected void emitStartDoc(SaveCur c) {
+        ensureDoc();
+    }
+
+    protected void emitEndDoc(SaveCur c) {
+    }
+
+    private QName getQualifiedName(SaveCur c, QName name) {
+        String uri = name.getNamespaceURI();
+
+        String prefix = uri.length() > 0 ? getUriMapping(uri) : "";
+
+        if (prefix.equals(name.getPrefix())) {
+            return name;
+        }
+
+        return _nodeCur._locale.makeQName(uri, name.getLocalPart(), prefix);
+    }
+
+    private void emitTextValue(SaveCur c) {
+        c.push();
+        c.next();
+
+        if (c.isText()) {
+            _nodeCur.next();
+            _nodeCur.insertChars(c.getChars(), c._offSrc, c._cchSrc);
+            _nodeCur.toParent();
+        }
+
+        c.pop();
+    }
+
+    private void ensureDoc() {
+        if (!_nodeCur.isPositioned()) {
+            if (_isFrag) {
+                _nodeCur.createDomDocFragRoot();
+            } else {
+                _nodeCur.createDomDocumentRoot();
+            }
+
+            _nodeCur.next();
+        }
+    }
+
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/ElementAttributes.java b/src/store/org/apache/xmlbeans/impl/store/ElementAttributes.java
new file mode 100644
index 0000000..f5ce35f
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/ElementAttributes.java
@@ -0,0 +1,60 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+final class ElementAttributes implements NamedNodeMap {
+    ElementAttributes(ElementXobj elementXobj) {
+        _elementXobj = elementXobj;
+    }
+
+    public int getLength() {
+        return DomImpl._attributes_getLength(_elementXobj);
+    }
+
+    public Node getNamedItem(String name) {
+        return DomImpl._attributes_getNamedItem(_elementXobj, name);
+    }
+
+    public Node getNamedItemNS(String namespaceURI, String localName) {
+        return DomImpl._attributes_getNamedItemNS(_elementXobj, namespaceURI, localName);
+    }
+
+    public Node item(int index) {
+        return DomImpl._attributes_item(_elementXobj, index);
+    }
+
+    public Node removeNamedItem(String name) {
+        return DomImpl._attributes_removeNamedItem(_elementXobj, name);
+    }
+
+    public Node removeNamedItemNS(String namespaceURI, String localName) {
+        return DomImpl._attributes_removeNamedItemNS(_elementXobj, namespaceURI, localName);
+    }
+
+    public Node setNamedItem(Node arg) {
+        return DomImpl._attributes_setNamedItem(_elementXobj, arg);
+    }
+
+    public Node setNamedItemNS(Node arg) {
+        return DomImpl._attributes_setNamedItemNS(_elementXobj, arg);
+    }
+
+    private ElementXobj _elementXobj;
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/ElementXobj.java b/src/store/org/apache/xmlbeans/impl/store/ElementXobj.java
new file mode 100644
index 0000000..5eb7300
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/ElementXobj.java
@@ -0,0 +1,126 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.*;
+
+import javax.xml.namespace.QName;
+
+class ElementXobj extends NamedNodeXobj implements Element {
+    ElementXobj(Locale l, QName name) {
+        super(l, ELEM, DomImpl.ELEMENT);
+        _name = name;
+    }
+
+    Xobj newNode(Locale l) {
+        return new ElementXobj(l, _name);
+    }
+
+    //
+    //
+    //
+
+    public NamedNodeMap getAttributes() {
+        if (_attributes == null)
+            _attributes = new ElementAttributes(this);
+
+        return _attributes;
+    }
+
+    public String getAttribute(String name) {
+        return DomImpl._element_getAttribute(this, name);
+    }
+
+    public Attr getAttributeNode(String name) {
+        return DomImpl._element_getAttributeNode(this, name);
+    }
+
+    public Attr getAttributeNodeNS(String namespaceURI, String localName) {
+        return DomImpl._element_getAttributeNodeNS(this, namespaceURI, localName);
+    }
+
+    public String getAttributeNS(String namespaceURI, String localName) {
+        return DomImpl._element_getAttributeNS(this, namespaceURI, localName);
+    }
+
+    public NodeList getElementsByTagName(String name) {
+        return DomImpl._element_getElementsByTagName(this, name);
+    }
+
+    public NodeList getElementsByTagNameNS(String namespaceURI, String localName) {
+        return DomImpl._element_getElementsByTagNameNS(this, namespaceURI, localName);
+    }
+
+    public String getTagName() {
+        return DomImpl._element_getTagName(this);
+    }
+
+    public boolean hasAttribute(String name) {
+        return DomImpl._element_hasAttribute(this, name);
+    }
+
+    public boolean hasAttributeNS(String namespaceURI, String localName) {
+        return DomImpl._element_hasAttributeNS(this, namespaceURI, localName);
+    }
+
+    public void removeAttribute(String name) {
+        DomImpl._element_removeAttribute(this, name);
+    }
+
+    public Attr removeAttributeNode(Attr oldAttr) {
+        return DomImpl._element_removeAttributeNode(this, oldAttr);
+    }
+
+    public void removeAttributeNS(String namespaceURI, String localName) {
+        DomImpl._element_removeAttributeNS(this, namespaceURI, localName);
+    }
+
+    public void setAttribute(String name, String value) {
+        DomImpl._element_setAttribute(this, name, value);
+    }
+
+    public Attr setAttributeNode(Attr newAttr) {
+        return DomImpl._element_setAttributeNode(this, newAttr);
+    }
+
+    public Attr setAttributeNodeNS(Attr newAttr) {
+        return DomImpl._element_setAttributeNodeNS(this, newAttr);
+    }
+
+    public void setAttributeNS(String namespaceURI, String qualifiedName, String value) {
+        DomImpl._element_setAttributeNS(this, namespaceURI, qualifiedName, value);
+    }
+
+    // DOM Level 3
+    public TypeInfo getSchemaTypeInfo() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setIdAttribute(String name, boolean isId) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setIdAttributeNS(String namespaceURI, String localName, boolean isId) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setIdAttributeNode(Attr idAttr, boolean isId) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    private ElementAttributes _attributes;
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/Jsr173.java b/src/store/org/apache/xmlbeans/impl/store/Jsr173.java
index 7bff79d..049b733 100755
--- a/src/store/org/apache/xmlbeans/impl/store/Jsr173.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Jsr173.java
@@ -44,12 +44,12 @@
         Jsr173GateWay gw = (Jsr173GateWay) xs;
 
         Locale l = gw._l;
-                  
+
         if (l.noSync())         { l.enter(); try { return nodeFromStreamImpl( gw ); } finally { l.exit(); } }
         else synchronized ( l ) { l.enter(); try { return nodeFromStreamImpl( gw ); } finally { l.exit(); } }
-        
+
     }
-    
+
     public static Node nodeFromStreamImpl ( Jsr173GateWay gw )
     {
         Cur c = gw._xs.getStreamCur();
@@ -60,25 +60,25 @@
     public static XMLStreamReader newXmlStreamReader ( Cur c, Object src, int off, int cch )
     {
         XMLStreamReaderBase xs = new XMLStreamReaderForString( c, src, off, cch );
-        
+
         if (c._locale.noSync())
             return new UnsyncedJsr173( c._locale, xs );
         else
             return new SyncedJsr173( c._locale, xs );
     }
-    
+
     public static XMLStreamReader newXmlStreamReader ( Cur c, XmlOptions options )
     {
         options = XmlOptions.maskNull( options );
-        
-        boolean inner = 
+
+        boolean inner =
             options.hasOption( XmlOptions.SAVE_INNER ) &&
                 !options.hasOption( XmlOptions.SAVE_OUTER );
 
         XMLStreamReaderBase xs;
 
         int k = c.kind();
-        
+
         if (k == Cur.TEXT || k < 0)
         {
             xs = new XMLStreamReaderForString( c, c.getChars( -1 ), c._offSrc, c._cchSrc );
@@ -95,23 +95,23 @@
         }
         else
             xs = new XMLStreamReaderForNode( c, false );
-        
+
         if (c._locale.noSync())
             return new UnsyncedJsr173( c._locale, xs );
         else
             return new SyncedJsr173( c._locale, xs );
     }
-    
+
     //
     //
     //
-    
+
     private static final class XMLStreamReaderForNode extends XMLStreamReaderBase
     {
         public XMLStreamReaderForNode ( Cur c, boolean inner )
         {
             super( c );
-            
+
             assert c.isContainer() || c.isComment() || c.isProcinst() || c.isAttr();
 
             // Iterate over everything *between* _cur and _end.  Do
@@ -120,12 +120,12 @@
             if (inner)
             {
                 assert c.isContainer();
-                
+
                 _cur = c.weakCur( this );
 
                 if (!_cur.toFirstAttr())
                     _cur.next();
-            
+
                 _end = c.weakCur( this );
                 _end.toEnd();
             }
@@ -155,9 +155,9 @@
             if (!_wholeDoc)
             {
                 // Set the _done bit properly
-                
+
                 _cur.push();
-                
+
                 try
                 {
                     next();
@@ -166,7 +166,7 @@
                 {
                     throw new RuntimeException( e.getMessage(), e );
                 }
-                    
+
                 _cur.pop();
             }
 
@@ -240,7 +240,7 @@
                     _cur.next();
 
                 assert _wholeDoc || _end != null;
-                
+
                 _done = _wholeDoc ? _cur.kind() == -Cur.ROOT : _cur.isSamePos( _end );
             }
 
@@ -260,7 +260,7 @@
                 return _cur.getValueAsString();
 
             if (k == Cur.TEXT)
-                return _cur.getCharsAsString( -1 );
+                return _cur.getCharsAsString();
 
             throw new IllegalStateException();
         }
@@ -287,7 +287,7 @@
             if (!isStartElement())
                 throw new IllegalStateException();
 
-            StringBuffer sb = new StringBuffer();
+            StringBuilder sb = new StringBuilder();
 
             for ( ; ; )
             {
@@ -373,7 +373,7 @@
 
             return ca;
         }
-        
+
         public String getAttributeValue ( String uri, String local )
         {
             Cur ca = toAttr( _cur, uri, local );
@@ -429,11 +429,11 @@
         public int getAttributeCount ( )
         {
             int n = 0;
-            
+
             if (_cur.isElem())
             {
                 Cur ca = _cur.tempCur();
-                
+
                 if (ca.toFirstAttr())
                 {
                     do
@@ -503,7 +503,7 @@
             // Go to attr to force index check
             Cur ca = toAttr( _cur, index );
             ca.release();
-            
+
             return false;
         }
 
@@ -550,7 +550,7 @@
             {
                 if (c.kind() == -Cur.ELEM)
                     ca.toParent();
-                
+
                 if (ca.toFirstAttr())
                 {
                     do
@@ -613,7 +613,7 @@
                     throw new IllegalStateException();
 
                 Object src = cText.getChars( -1 );
-                
+
                 ensureCharBufLen( cText._cchSrc );
 
                 CharUtil.getChars(
@@ -625,7 +625,7 @@
                 _textFetched = true;
             }
         }
-        
+
         private void ensureCharBufLen ( int cch )
         {
             if (_chars == null || _chars.length < cch)
@@ -634,7 +634,7 @@
 
                 while ( l < cch )
                     l *= 2;
-                
+
                 _chars = new char [ l ];
             }
         }
@@ -694,14 +694,14 @@
                     cText = _cur;
                 else
                     throw new IllegalStateException();
-            
+
                 _src = cText.getChars( -1 );
                 _offSrc = cText._offSrc;
                 _cchSrc = cText._cchSrc;
-                         
+
                 if (cText != _cur)
                     cText.release();
-                
+
                 _srcFetched = true;
             }
 
@@ -712,14 +712,14 @@
                 length = _cchSrc - sourceStart;
 
             CharUtil.getChars( target, targetStart, _src, _offSrc, length );
-            
+
             return length;
         }
 
         public boolean hasText ( )
         {
             int k = _cur.kind();
-            
+
             return k == Cur.COMMENT || k == Cur.TEXT;
         }
 
@@ -768,7 +768,7 @@
 
         private boolean _wholeDoc;
         private boolean _done;
-                
+
         private Cur _cur;
         private Cur _end;
 
@@ -776,13 +776,13 @@
         private Object  _src;
         private int     _offSrc;
         private int     _cchSrc;
-        
+
         private boolean _textFetched;
         private char[]  _chars;
         private int     _offChars;
         private int     _cchChars;
     }
-    
+
     //
     //
     //
@@ -857,7 +857,7 @@
                 throw new IllegalArgumentException( "Property name is null" );
 
             // BUGBUG - I should implement some perperties here
-            
+
             return null;
         }
 
@@ -924,7 +924,7 @@
         public int    getColumnNumber    ( ) { return _column; }
         public int    getLineNumber      ( ) { return _line;   }
         public String getLocationURI     ( ) { return _uri;    }
-        
+
         public String getPublicId ( ) { return null; }
         public String getSystemId ( ) { return null; }
 
@@ -943,7 +943,7 @@
 
             if (!c.isContainer())
                 c.toParent();
-            
+
             String ns = c.namespaceForPrefix( prefix, true );
 
             c.pop();
@@ -961,9 +961,9 @@
 
             if (!c.isContainer())
                 c.toParent();
-            
+
             String prefix = c.prefixForNamespace( namespaceURI, null, false );
-            
+
             c.pop();
 
             return prefix;
@@ -994,14 +994,14 @@
 
         private Locale _locale;
         private long   _version;
-        
+
         String _uri;
-        
+
         int _line   = -1;
         int _column = -1;
         int _offset = -1;
     }
-    
+
     //
     //
     //
@@ -1034,7 +1034,7 @@
 
             return CharUtil.getString( _src, _off, _cch );
         }
-        
+
         public char[] getTextCharacters ( )
         {
             checkChanged();
@@ -1057,20 +1057,20 @@
 
             return _cch;
         }
-        
+
         public int getTextCharacters ( int sourceStart, char[] target, int targetStart, int length )
         {
             checkChanged();
 
             if (length < 0)
                 throw new IndexOutOfBoundsException();
-            
+
             if (sourceStart > _cch)
                 throw new IndexOutOfBoundsException();
 
             if (sourceStart + length > _cch)
                 length = _cch - sourceStart;
-            
+
             CharUtil.getChars( target, targetStart, _src, _off + sourceStart, length );
 
             return length;
@@ -1125,7 +1125,7 @@
     private static abstract class Jsr173GateWay
     {
         public Jsr173GateWay ( Locale l, XMLStreamReaderBase xs ) { _l = l; _xs = xs; }
-        
+
         Locale              _l;
         XMLStreamReaderBase _xs;
     }
@@ -1133,7 +1133,7 @@
     private static final class SyncedJsr173 extends Jsr173GateWay implements XMLStreamReader, Location, NamespaceContext
     {
         public SyncedJsr173 ( Locale l, XMLStreamReaderBase xs ) { super( l, xs ); }
-        
+
         public Object getProperty ( java.lang.String name ) { synchronized ( _l ) { _l.enter(); try { return _xs.getProperty( name ); } finally { _l.exit(); } } }
         public int next ( ) throws XMLStreamException { synchronized ( _l ) { _l.enter(); try { return _xs.next(); } finally { _l.exit(); } } }
         public void require ( int type, String namespaceURI, String localName ) throws XMLStreamException { synchronized ( _l ) { _l.enter(); try { _xs.require( type, namespaceURI, localName ); } finally { _l.exit(); } } }
@@ -1192,7 +1192,7 @@
     private static final class UnsyncedJsr173 extends Jsr173GateWay implements XMLStreamReader, Location, NamespaceContext
     {
         public UnsyncedJsr173 ( Locale l, XMLStreamReaderBase xs ) { super( l, xs ); }
-        
+
         public Object getProperty ( java.lang.String name ) { try { _l.enter(); return _xs.getProperty( name ); } finally { _l.exit(); } }
         public int next ( ) throws XMLStreamException { try { _l.enter(); return _xs.next(); } finally { _l.exit(); } }
         public void require ( int type, String namespaceURI, String localName ) throws XMLStreamException { try { _l.enter(); _xs.require( type, namespaceURI, localName ); } finally { _l.exit(); } }
@@ -1249,4 +1249,3 @@
     }
 }
 
- 
\ No newline at end of file
diff --git a/src/store/org/apache/xmlbeans/impl/store/Locale.java b/src/store/org/apache/xmlbeans/impl/store/Locale.java
index 8bc1705..de04bd0 100755
--- a/src/store/org/apache/xmlbeans/impl/store/Locale.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Locale.java
@@ -15,98 +15,39 @@
 
 package org.apache.xmlbeans.impl.store;
 
-import org.xml.sax.Locator;
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.ext.LexicalHandler;
+import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.XmlCursor.XmlBookmark;
+import org.apache.xmlbeans.impl.common.*;
+import org.apache.xmlbeans.impl.store.Cur.Locations;
+import org.apache.xmlbeans.impl.store.DomImpl.Dom;
+import org.apache.xmlbeans.impl.store.Saaj.SaajCallback;
+import org.apache.xmlbeans.impl.values.TypeStore;
+import org.apache.xmlbeans.xml.stream.CharacterData;
+import org.apache.xmlbeans.xml.stream.ProcessingInstruction;
+import org.apache.xmlbeans.xml.stream.*;
+import org.w3c.dom.*;
+import org.xml.sax.*;
 import org.xml.sax.ext.DeclHandler;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.SAXException;
-import org.xml.sax.DTDHandler;
+import org.xml.sax.ext.LexicalHandler;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.Reference;
-import java.lang.ref.PhantomReference;
-import java.lang.ref.SoftReference;
-
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
 import java.io.StringReader;
-import java.io.IOException;
-
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.stream.XMLStreamException;
-
-import org.apache.xmlbeans.xml.stream.Attribute;
-import org.apache.xmlbeans.xml.stream.AttributeIterator;
-import org.apache.xmlbeans.xml.stream.CharacterData;
-import org.apache.xmlbeans.xml.stream.ProcessingInstruction;
-import org.apache.xmlbeans.xml.stream.Space;
-import org.apache.xmlbeans.xml.stream.StartDocument;
-import org.apache.xmlbeans.xml.stream.StartElement;
-import org.apache.xmlbeans.xml.stream.XMLEvent;
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-import org.apache.xmlbeans.xml.stream.XMLName;
-
-import org.apache.xmlbeans.impl.common.SAXHelper;
-import org.apache.xmlbeans.impl.common.XMLNameHelper;
-import org.apache.xmlbeans.impl.common.QNameHelper;
-import org.apache.xmlbeans.impl.common.XmlLocale;
-import org.apache.xmlbeans.impl.common.ResolverUtil;
-import org.apache.xmlbeans.impl.common.SystemCache;
-
-import org.apache.xmlbeans.impl.store.Saaj.SaajCallback;
-
-import org.apache.xmlbeans.impl.store.DomImpl.Dom;
-import org.apache.xmlbeans.impl.store.DomImpl.TextNode;
-import org.apache.xmlbeans.impl.store.DomImpl.CdataNode;
-import org.apache.xmlbeans.impl.store.DomImpl.SaajTextNode;
-import org.apache.xmlbeans.impl.store.DomImpl.SaajCdataNode;
-
-import org.apache.xmlbeans.impl.store.Cur.Locations;
-
-import org.apache.xmlbeans.CDataBookmark;
-import org.apache.xmlbeans.XmlBeans;
-import org.apache.xmlbeans.XmlLineNumber;
-import org.apache.xmlbeans.XmlCursor;
-import org.apache.xmlbeans.XmlCursor.XmlBookmark;
-import org.apache.xmlbeans.XmlErrorCodes;
-import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.XmlOptionsBean;
-import org.apache.xmlbeans.XmlSaxHandler;
-import org.apache.xmlbeans.SchemaType;
-import org.apache.xmlbeans.SchemaTypeLoader;
-import org.apache.xmlbeans.XmlTokenSource;
-import org.apache.xmlbeans.QNameSet;
-import org.apache.xmlbeans.QNameCache;
-import org.apache.xmlbeans.XmlError;
-import org.apache.xmlbeans.XmlRuntimeException;
-import org.apache.xmlbeans.XmlDocumentProperties;
-
-import org.apache.xmlbeans.impl.values.TypeStore;
-import org.apache.xmlbeans.impl.values.TypeStoreUser;
-import org.apache.xmlbeans.impl.values.TypeStoreUserFactory;
-
-import org.w3c.dom.DOMImplementation;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.Node;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Element;
+import java.lang.ref.PhantomReference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.SoftReference;
+import java.util.HashMap;
+import java.util.Map;
 
 public final class Locale
     implements DOMImplementation, SaajCallback, XmlLocale
 {
+    private static final XBLogger logger = XBLogFactory.getLogger(Locale.class);
+
     static final int ROOT = Cur.ROOT;
     static final int ELEM = Cur.ELEM;
     static final int ATTR = Cur.ATTR;
@@ -146,7 +87,7 @@
         //
         // Also - have a thread local setting for thread safety?  .. Perhaps something
         // in the type loader which defines whether ot not sync is on????
-        
+
         _noSync = options.hasOption(XmlOptions.UNSYNCHRONIZED);
 
         _tempFrames = new Cur[_numTempFramesLeft = 8];
@@ -154,10 +95,10 @@
         // BUGBUG - this cannot be thread local ....
         // BUGBUG - this cannot be thread local ....
         // BUGBUG - this cannot be thread local .... uhh what, again?
-        // 
+        //
         // Lazy create this (loading up a locale should use the thread locale one)
         // same goes for the qname factory .. use thread local for hte most part when loading
-        
+
         _qnameFactory = new DefaultQNameFactory(); //new LocalDocumentQNameFactory();
 
         _locations = new Locations(this);
@@ -165,11 +106,11 @@
         _schemaTypeLoader = stl;
 
         _validateOnSet = options.hasOption(XmlOptions.VALIDATE_ON_SET);
-        
+
         //
         // Check for Saaj implementation request
         //
-        
+
         Object saajObj = options.get(Saaj.SAAJ_IMPL);
 
         if (saajObj != null)
@@ -242,7 +183,7 @@
     //
     //
     //
-    
+
     static void associateSourceName(Cur c, XmlOptions options)
     {
         String sourceName = (String) XmlOptions.safeGet(options,
@@ -255,7 +196,7 @@
     //
     //
     //
-    
+
     static void autoTypeDocument(Cur c, SchemaType requestedType,
         XmlOptions options)
         throws XmlException
@@ -294,7 +235,7 @@
         }
 
         // Look for a document element to establish type
-        
+
         if (type == null &&
             (requestedType == null || requestedType.isDocumentType()))
         {
@@ -550,7 +491,7 @@
             if (k == ATTR)
                 break;
 
-            if (k == TEXT && !isWhiteSpace(start.getCharsAsString(-1)))
+            if (k == TEXT && !isWhiteSpace(start.getCharsAsString()))
             {
                 isFrag = true;
                 break;
@@ -577,11 +518,11 @@
 
         return isFrag || numDocElems != 1;
     }
-    
+
     //
     //
     //
-    
+
     public static XmlObject newInstance(SchemaTypeLoader stl, SchemaType type,
         XmlOptions options)
     {
@@ -630,7 +571,7 @@
         else
              c.createRoot();
         c.setType(sType);
-        
+
         XmlObject x = (XmlObject) c.getUser();
 
         c.release();
@@ -2466,18 +2407,18 @@
     //
     //
     //
-    
+
     Dom findDomNthChild ( Dom parent, int n )
     {
         assert n >= 0;
-        
+
         if (parent == null)
             return null;
-        
+
         int da = _domNthCache_A.distance(parent, n);
         int db = _domNthCache_B.distance(parent, n);
-        
-       
+
+
         // the "better" cache should never walk more than 1/2 len
         Dom x = null;
         boolean bInvalidate = (db - _domNthCache_B._len / 2 > 0) &&
@@ -2506,33 +2447,33 @@
             _domNthCache_A = _domNthCache_B;
             _domNthCache_B = temp;
         }
-        
+
         return x;
     }
-    
+
     int domLength ( Dom parent )
     {
         if (parent == null)
             return 0;
-        
+
         int da = _domNthCache_A.distance( parent, 0 );
         int db = _domNthCache_B.distance( parent, 0 );
-        
+
         int len =
             da <= db
             ? _domNthCache_A.length( parent )
             : _domNthCache_B.length( parent );
-        
+
         if (da == db)
         {
             domNthCache temp = _domNthCache_A;
             _domNthCache_A = _domNthCache_B;
             _domNthCache_B = temp;
         }
-        
+
         return len;
     }
-    
+
     void invalidateDomCaches ( Dom d )
     {
         if (_domNthCache_A._parent == d)
@@ -2540,28 +2481,28 @@
         if (_domNthCache_B._parent == d)
             _domNthCache_B._version = -1;
     }
-    
+
     boolean isDomCached ( Dom d )
     {
         return _domNthCache_A._parent == d || _domNthCache_B._parent == d;
     }
-    
+
     class domNthCache
     {
-        
+
         int distance ( Dom parent, int n )
         {
             assert n >= 0;
-            
+
             if (_version != Locale.this.version())
                 return Integer.MAX_VALUE - 1;
-            
+
             if (parent != _parent)
                 return Integer.MAX_VALUE;
-            
+
             return n > _n ? n - _n : _n - n;
         }
-        
+
         int length ( Dom parent )
         {
             if (_version != Locale.this.version() || _parent != parent)
@@ -2572,11 +2513,11 @@
                 _n = -1;
                 _len = -1;
             }
-            
+
             if (_len == -1)
             {
                 Dom x = null;
-                
+
                 if (_child != null && _n != -1)
                 {
                     x = _child;
@@ -2586,26 +2527,26 @@
                 {
                     x = DomImpl.firstChild(_parent);
                     _len = 0;
-                    
+
                     // cache the 0th child
                     _child = x;
                     _n = 0;
                 }
-                
+
                 for (; x != null; x = DomImpl.nextSibling(x) )
                 {
                     _len++;
                 }
             }
-            
-            
+
+
             return _len;
         }
-        
+
         Dom fetch ( Dom parent, int n )
         {
             assert n >= 0;
-            
+
             if (_version != Locale.this.version() || _parent != parent)
             {
                 _parent = parent;
@@ -2613,7 +2554,7 @@
                 _child = null;
                 _n = -1;
                 _len = -1;
-                
+
                 for (Dom x = DomImpl.firstChild(_parent); x != null; x = DomImpl.nextSibling(x) )
                 {
                     _n++;
@@ -2623,13 +2564,13 @@
                         break;
                     }
                 }
-                
+
                 return _child;
             }
-            
+
             if (_n < 0)
                 return null;
-            
+
             if (n > _n)
             {
                 while ( n > _n )
@@ -2638,10 +2579,10 @@
                     {
                         if (x == null)
                             return null;
-                        
+
                         _child = x;
                         _n++;
-                        
+
                         break;
                     }
                 }
@@ -2654,18 +2595,18 @@
                     {
                         if (x == null)
                             return null;
-                        
+
                         _child = x;
                         _n--;
-                        
+
                         break;
                     }
                 }
             }
-            
+
             return _child;
         }
-        
+
         public static final int BLITZ_BOUNDARY = 40; //walk small lists
 	 private long  _version;
         private Dom   _parent;
@@ -2673,9 +2614,9 @@
         private int   _n;
         private int   _len;
     }
-    
+
     //
-    // 
+    //
     //
 
     CharUtil getCharUtil()
@@ -3066,7 +3007,7 @@
                 xr = SAXHelper.newXMLReader(new XmlOptionsBean(options));
             } catch(Exception e) {
                 throw new XmlException("Problem creating XMLReader", e);
-            } 
+            }
         }
 
         SaxLoader sl = new XmlReaderSaxLoader(xr);
@@ -3388,14 +3329,19 @@
                 _xr.setProperty(
                     "http://xml.org/sax/properties/lexical-handler", this);
                 _xr.setContentHandler(this);
-                _xr.setProperty("http://xml.org/sax/properties/declaration-handler", this);
                 _xr.setDTDHandler(this);
                 _xr.setErrorHandler(this);
             }
-            catch (Throwable e)
-            {
+            catch (Throwable e) {
                 throw new RuntimeException(e.getMessage(), e);
             }
+            try
+            {
+                _xr.setProperty("http://xml.org/sax/properties/declaration-handler", this);
+            }
+            catch (Throwable e) {
+                logger.log(XBLogger.WARN, "SAX Declaration Handler is not supported", e);
+            }
         }
 
         void setEntityResolver(EntityResolver er)
diff --git a/src/store/org/apache/xmlbeans/impl/store/NamedNodeXobj.java b/src/store/org/apache/xmlbeans/impl/store/NamedNodeXobj.java
new file mode 100644
index 0000000..01e2b99
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/NamedNodeXobj.java
@@ -0,0 +1,30 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+abstract class NamedNodeXobj extends NodeXobj {
+    NamedNodeXobj(Locale l, int kind, int domType) {
+        super(l, kind, domType);
+        _canHavePrefixUri = true;
+    }
+
+    public boolean nodeCanHavePrefixUri() {
+        return _canHavePrefixUri;
+    }
+
+    boolean _canHavePrefixUri;
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/NodeXobj.java b/src/store/org/apache/xmlbeans/impl/store/NodeXobj.java
new file mode 100644
index 0000000..e24d38c
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/NodeXobj.java
@@ -0,0 +1,194 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.*;
+
+abstract class NodeXobj extends Xobj implements DomImpl.Dom, Node, NodeList {
+    NodeXobj(Locale l, int kind, int domType) {
+        super(l, kind, domType);
+    }
+
+    DomImpl.Dom getDom() {
+        return this;
+    }
+
+    //
+    //
+    //
+
+    public int getLength() {
+        return DomImpl._childNodes_getLength(this);
+    }
+
+    public Node item(int i) {
+        return DomImpl._childNodes_item(this, i);
+    }
+
+    public Node appendChild(Node newChild) {
+        return DomImpl._node_appendChild(this, newChild);
+    }
+
+    public Node cloneNode(boolean deep) {
+        return DomImpl._node_cloneNode(this, deep);
+    }
+
+    public NamedNodeMap getAttributes() {
+        return null;
+    }
+
+    public NodeList getChildNodes() {
+        return this;
+    }
+
+    public Node getParentNode() {
+        return DomImpl._node_getParentNode(this);
+    }
+
+    public Node removeChild(Node oldChild) {
+        return DomImpl._node_removeChild(this, oldChild);
+    }
+
+    public Node getFirstChild() {
+        return DomImpl._node_getFirstChild(this);
+    }
+
+    public Node getLastChild() {
+        return DomImpl._node_getLastChild(this);
+    }
+
+    public String getLocalName() {
+        return DomImpl._node_getLocalName(this);
+    }
+
+    public String getNamespaceURI() {
+        return DomImpl._node_getNamespaceURI(this);
+    }
+
+    public Node getNextSibling() {
+        return DomImpl._node_getNextSibling(this);
+    }
+
+    public String getNodeName() {
+        return DomImpl._node_getNodeName(this);
+    }
+
+    public short getNodeType() {
+        return DomImpl._node_getNodeType(this);
+    }
+
+    public String getNodeValue() {
+        return DomImpl._node_getNodeValue(this);
+    }
+
+    public Document getOwnerDocument() {
+        return DomImpl._node_getOwnerDocument(this);
+    }
+
+    public String getPrefix() {
+        return DomImpl._node_getPrefix(this);
+    }
+
+    public Node getPreviousSibling() {
+        return DomImpl._node_getPreviousSibling(this);
+    }
+
+    public boolean hasAttributes() {
+        return DomImpl._node_hasAttributes(this);
+    }
+
+    public boolean hasChildNodes() {
+        return DomImpl._node_hasChildNodes(this);
+    }
+
+    public Node insertBefore(Node newChild, Node refChild) {
+        return DomImpl._node_insertBefore(this, newChild, refChild);
+    }
+
+    public boolean isSupported(String feature, String version) {
+        return DomImpl._node_isSupported(this, feature, version);
+    }
+
+    public void normalize() {
+        DomImpl._node_normalize(this);
+    }
+
+    public Node replaceChild(Node newChild, Node oldChild) {
+        return DomImpl._node_replaceChild(this, newChild, oldChild);
+    }
+
+    public void setNodeValue(String nodeValue) {
+        DomImpl._node_setNodeValue(this, nodeValue);
+    }
+
+    public void setPrefix(String prefix) {
+        DomImpl._node_setPrefix(this, prefix);
+    }
+
+    public boolean nodeCanHavePrefixUri() {
+        return false;
+    }
+
+    // DOM Level 3
+    public Object getUserData(String key) {
+        return DomImpl._node_getUserData(this, key);
+    }
+
+    public Object setUserData(String key, Object data, UserDataHandler handler) {
+        return DomImpl._node_setUserData(this, key, data, handler);
+    }
+
+    public Object getFeature(String feature, String version) {
+        return DomImpl._node_getFeature(this, feature, version);
+    }
+
+    public boolean isEqualNode(Node arg) {
+        return DomImpl._node_isEqualNode(this, arg);
+    }
+
+    public boolean isSameNode(Node arg) {
+        return DomImpl._node_isSameNode(this, arg);
+    }
+
+    public String lookupNamespaceURI(String prefix) {
+        return DomImpl._node_lookupNamespaceURI(this, prefix);
+    }
+
+    public String lookupPrefix(String namespaceURI) {
+        return DomImpl._node_lookupPrefix(this, namespaceURI);
+    }
+
+    public boolean isDefaultNamespace(String namespaceURI) {
+        return DomImpl._node_isDefaultNamespace(this, namespaceURI);
+    }
+
+    public void setTextContent(String textContent) {
+        DomImpl._node_setTextContent(this, textContent);
+    }
+
+    public String getTextContent() {
+        return DomImpl._node_getTextContent(this);
+    }
+
+    public short compareDocumentPosition(Node other) {
+        return DomImpl._node_compareDocumentPosition(this, other);
+    }
+
+    public String getBaseURI() {
+        return DomImpl._node_getBaseURI(this);
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/Path.java b/src/store/org/apache/xmlbeans/impl/store/Path.java
index 099ad7a..53863f5 100755
--- a/src/store/org/apache/xmlbeans/impl/store/Path.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Path.java
@@ -202,7 +202,7 @@
         }
         if (path == null)
         {
-            StringBuffer errMessage = new StringBuffer();
+            StringBuilder errMessage = new StringBuilder();
             if ((force & USE_XBEAN) != 0)
                 errMessage.append(" Trying XBeans path engine...");
             if ((force & USE_XQRL) != 0)
diff --git a/src/store/org/apache/xmlbeans/impl/store/ProcInstXobj.java b/src/store/org/apache/xmlbeans/impl/store/ProcInstXobj.java
new file mode 100644
index 0000000..e19a859
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/ProcInstXobj.java
@@ -0,0 +1,51 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+
+class ProcInstXobj extends NodeXobj implements ProcessingInstruction {
+    ProcInstXobj(Locale l, String target) {
+        super(l, PROCINST, DomImpl.PROCINST);
+        _name = _locale.makeQName(null, target);
+    }
+
+    Xobj newNode(Locale l) {
+        return new ProcInstXobj(l, _name.getLocalPart());
+    }
+
+    public int getLength() {
+        return 0;
+    }
+
+    public Node getFirstChild() {
+        return null;
+    }
+
+    public String getData() {
+        return DomImpl._processingInstruction_getData(this);
+    }
+
+    public String getTarget() {
+        return DomImpl._processingInstruction_getTarget(this);
+    }
+
+    public void setData(String data) {
+        DomImpl._processingInstruction_setData(this, data);
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/SaajCdataNode.java b/src/store/org/apache/xmlbeans/impl/store/SaajCdataNode.java
new file mode 100644
index 0000000..e0067fa
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SaajCdataNode.java
@@ -0,0 +1,53 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.SOAPElement;
+
+class SaajCdataNode extends CdataNode implements org.apache.xmlbeans.impl.soap.Text {
+    public SaajCdataNode(Locale l) {
+        super(l);
+    }
+
+    public boolean isComment() {
+        return DomImpl._soapText_isComment(this);
+    }
+
+    public void detachNode() {
+        DomImpl._soapNode_detachNode(this);
+    }
+
+    public void recycleNode() {
+        DomImpl._soapNode_recycleNode(this);
+    }
+
+    public String getValue() {
+        return DomImpl._soapNode_getValue(this);
+    }
+
+    public void setValue(String value) {
+        DomImpl._soapNode_setValue(this, value);
+    }
+
+    public SOAPElement getParentElement() {
+        return DomImpl._soapNode_getParentElement(this);
+    }
+
+    public void setParentElement(SOAPElement p) {
+        DomImpl._soapNode_setParentElement(this, p);
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/SaajTextNode.java b/src/store/org/apache/xmlbeans/impl/store/SaajTextNode.java
new file mode 100644
index 0000000..4dcece7
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SaajTextNode.java
@@ -0,0 +1,53 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.SOAPElement;
+
+class SaajTextNode extends TextNode implements org.apache.xmlbeans.impl.soap.Text {
+    SaajTextNode(Locale l) {
+        super(l);
+    }
+
+    public boolean isComment() {
+        return DomImpl._soapText_isComment(this);
+    }
+
+    public void detachNode() {
+        DomImpl._soapNode_detachNode(this);
+    }
+
+    public void recycleNode() {
+        DomImpl._soapNode_recycleNode(this);
+    }
+
+    public String getValue() {
+        return DomImpl._soapNode_getValue(this);
+    }
+
+    public void setValue(String value) {
+        DomImpl._soapNode_setValue(this, value);
+    }
+
+    public SOAPElement getParentElement() {
+        return DomImpl._soapNode_getParentElement(this);
+    }
+
+    public void setParentElement(SOAPElement p) {
+        DomImpl._soapNode_setParentElement(this, p);
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/Saver.java b/src/store/org/apache/xmlbeans/impl/store/Saver.java
index c7832aa..49f7498 100755
--- a/src/store/org/apache/xmlbeans/impl/store/Saver.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Saver.java
@@ -47,33 +47,39 @@
 import java.util.LinkedHashMap;
 import java.util.ConcurrentModificationException;
 
-abstract class Saver
-{
-    static final int ROOT     = Cur.ROOT;
-    static final int ELEM     = Cur.ELEM;
-    static final int ATTR     = Cur.ATTR;
-    static final int COMMENT  = Cur.COMMENT;
+abstract class Saver {
+    static final int ROOT = Cur.ROOT;
+    static final int ELEM = Cur.ELEM;
+    static final int ATTR = Cur.ATTR;
+    static final int COMMENT = Cur.COMMENT;
     static final int PROCINST = Cur.PROCINST;
-    static final int TEXT     = Cur.TEXT;
+    static final int TEXT = Cur.TEXT;
 
-    protected abstract boolean emitElement ( SaveCur c, ArrayList attrNames, ArrayList attrValues );
-    protected abstract void emitFinish     ( SaveCur c );
-    protected abstract void emitText       ( SaveCur c );
-    protected abstract void emitComment    ( SaveCur c );
-    protected abstract void emitProcinst   ( SaveCur c );
-    protected abstract void emitDocType    ( String docTypeName, String publicId, String systemId );
-    protected abstract void emitStartDoc   ( SaveCur c );
-    protected abstract void emitEndDoc     ( SaveCur c );
+    protected abstract boolean emitElement(SaveCur c, ArrayList attrNames, ArrayList attrValues);
 
-    protected void syntheticNamespace ( String prefix, String uri, boolean considerDefault ) { }
+    protected abstract void emitFinish(SaveCur c);
 
-    Saver ( Cur c, XmlOptions options )
-    {
+    protected abstract void emitText(SaveCur c);
+
+    protected abstract void emitComment(SaveCur c);
+
+    protected abstract void emitProcinst(SaveCur c);
+
+    protected abstract void emitDocType(String docTypeName, String publicId, String systemId);
+
+    protected abstract void emitStartDoc(SaveCur c);
+
+    protected abstract void emitEndDoc(SaveCur c);
+
+    protected void syntheticNamespace(String prefix, String uri, boolean considerDefault) {
+    }
+
+    Saver(Cur c, XmlOptions options) {
         assert c._locale.entered();
 
-        options = XmlOptions.maskNull( options );
+        options = XmlOptions.maskNull(options);
 
-        _cur = createSaveCur( c, options );
+        _cur = createSaveCur(c, options);
 
         _locale = c._locale;
         _version = _locale.version();
@@ -83,44 +89,39 @@
         _prefixMap = new HashMap();
 
         _attrNames = new ArrayList();
-        _attrValues = new ArrayList ();
+        _attrValues = new ArrayList();
 
         // Define implicit xml prefixed namespace
 
-        addMapping( "xml", Locale._xml1998Uri );
+        addMapping("xml", Locale._xml1998Uri);
 
-        if (options.hasOption( XmlOptions.SAVE_IMPLICIT_NAMESPACES ))
-        {
-            Map m = (Map) options.get( XmlOptions.SAVE_IMPLICIT_NAMESPACES );
+        if (options.hasOption(XmlOptions.SAVE_IMPLICIT_NAMESPACES)) {
+            Map m = (Map) options.get(XmlOptions.SAVE_IMPLICIT_NAMESPACES);
 
-            for ( Iterator i = m.keySet().iterator() ; i.hasNext() ; )
-            {
+            for (Iterator i = m.keySet().iterator(); i.hasNext(); ) {
                 String prefix = (String) i.next();
-                addMapping( prefix, (String) m.get( prefix ) );
+                addMapping(prefix, (String) m.get(prefix));
             }
         }
 
         // define character map for escaped replacements
-        if (options.hasOption( XmlOptions.SAVE_SUBSTITUTE_CHARACTERS ))
-        {
+        if (options.hasOption(XmlOptions.SAVE_SUBSTITUTE_CHARACTERS)) {
             _replaceChar = (XmlOptionCharEscapeMap)
-                options.get( XmlOptions.SAVE_SUBSTITUTE_CHARACTERS);
+                    options.get(XmlOptions.SAVE_SUBSTITUTE_CHARACTERS);
         }
 
         // If the default prefix has not been mapped, do so now
 
-        if (getNamespaceForPrefix( "" ) == null)
-        {
-            _initialDefaultUri = new String( "" );
-            addMapping( "", _initialDefaultUri );
+        if (getNamespaceForPrefix("") == null) {
+            _initialDefaultUri = new String("");
+            addMapping("", _initialDefaultUri);
         }
 
-        if (options.hasOption( XmlOptions.SAVE_AGGRESSIVE_NAMESPACES ) &&
-                !(this instanceof SynthNamespaceSaver))
-        {
-            SynthNamespaceSaver saver = new SynthNamespaceSaver( c, options );
+        if (options.hasOption(XmlOptions.SAVE_AGGRESSIVE_NAMESPACES) &&
+                !(this instanceof SynthNamespaceSaver)) {
+            SynthNamespaceSaver saver = new SynthNamespaceSaver(c, options);
 
-            while ( saver.process() )
+            while (saver.process())
                 ;
 
             if (!saver._synthNamespaces.isEmpty())
@@ -128,134 +129,114 @@
         }
 
         _useDefaultNamespace =
-            options.hasOption( XmlOptions.SAVE_USE_DEFAULT_NAMESPACE );
+                options.hasOption(XmlOptions.SAVE_USE_DEFAULT_NAMESPACE);
 
-        _saveNamespacesFirst = options.hasOption( XmlOptions.SAVE_NAMESPACES_FIRST );
+        _saveNamespacesFirst = options.hasOption(XmlOptions.SAVE_NAMESPACES_FIRST);
 
-        if (options.hasOption( XmlOptions.SAVE_SUGGESTED_PREFIXES ))
-            _suggestedPrefixes = (Map) options.get( XmlOptions.SAVE_SUGGESTED_PREFIXES);
+        if (options.hasOption(XmlOptions.SAVE_SUGGESTED_PREFIXES))
+            _suggestedPrefixes = (Map) options.get(XmlOptions.SAVE_SUGGESTED_PREFIXES);
 
         _ancestorNamespaces = _cur.getAncestorNamespaces();
     }
 
-    private static SaveCur createSaveCur ( Cur c, XmlOptions options )
-    {
-        QName synthName = (QName) options.get( XmlOptions.SAVE_SYNTHETIC_DOCUMENT_ELEMENT );
+    private static SaveCur createSaveCur(Cur c, XmlOptions options) {
+        QName synthName = (QName) options.get(XmlOptions.SAVE_SYNTHETIC_DOCUMENT_ELEMENT);
 
         QName fragName = synthName;
 
-        if (fragName == null)
-        {
+        if (fragName == null) {
             fragName =
-                options.hasOption( XmlOptions.SAVE_USE_OPEN_FRAGMENT )
-                    ? Locale._openuriFragment
-                    : Locale._xmlFragment;
+                    options.hasOption(XmlOptions.SAVE_USE_OPEN_FRAGMENT)
+                            ? Locale._openuriFragment
+                            : Locale._xmlFragment;
         }
 
         boolean saveInner =
-            options.hasOption( XmlOptions.SAVE_INNER ) &&
-                !options.hasOption( XmlOptions.SAVE_OUTER );
+                options.hasOption(XmlOptions.SAVE_INNER) &&
+                        !options.hasOption(XmlOptions.SAVE_OUTER);
 
         Cur start = c.tempCur();
-        Cur end   = c.tempCur();
+        Cur end = c.tempCur();
 
         SaveCur cur = null;
 
         int k = c.kind();
 
-        switch ( k )
-        {
-        case ROOT :
-        {
-            positionToInner( c, start, end );
+        switch (k) {
+            case ROOT: {
+                positionToInner(c, start, end);
 
-            if (Locale.isFragment( start, end ))
-                cur = new FragSaveCur( start, end, fragName );
-            else if (synthName != null)
-                cur = new FragSaveCur( start, end, synthName );
-            else
-                cur = new DocSaveCur( c );
+                if (Locale.isFragment(start, end))
+                    cur = new FragSaveCur(start, end, fragName);
+                else if (synthName != null)
+                    cur = new FragSaveCur(start, end, synthName);
+                else
+                    cur = new DocSaveCur(c);
 
-            break;
-        }
-
-        case ELEM :
-        {
-            if (saveInner)
-            {
-                positionToInner( c, start, end );
-
-                cur =
-                    new FragSaveCur(
-                        start, end, Locale.isFragment( start, end ) ? fragName : synthName );
-            }
-            else if (synthName != null)
-            {
-                positionToInner( c, start, end );
-
-                cur = new FragSaveCur( start, end, synthName );
-            }
-            else
-            {
-                start.moveToCur( c );
-                end.moveToCur( c );
-                end.skip();
-
-                cur = new FragSaveCur( start, end, null );
+                break;
             }
 
-            break;
-        }
+            case ELEM: {
+                if (saveInner) {
+                    positionToInner(c, start, end);
+
+                    cur =
+                            new FragSaveCur(
+                                    start, end, Locale.isFragment(start, end) ? fragName : synthName);
+                } else if (synthName != null) {
+                    positionToInner(c, start, end);
+
+                    cur = new FragSaveCur(start, end, synthName);
+                } else {
+                    start.moveToCur(c);
+                    end.moveToCur(c);
+                    end.skip();
+
+                    cur = new FragSaveCur(start, end, null);
+                }
+
+                break;
+            }
         }
 
-        if (cur == null)
-        {
+        if (cur == null) {
             assert k < 0 || k == ATTR || k == COMMENT || k == PROCINST || k == TEXT;
 
-            if (k < 0)
-            {
+            if (k < 0) {
                 // Save out ""
-                start.moveToCur( c );
-                end.moveToCur( c );
-            }
-            else if (k == TEXT)
-            {
-                start.moveToCur( c );
-                end.moveToCur( c );
+                start.moveToCur(c);
+                end.moveToCur(c);
+            } else if (k == TEXT) {
+                start.moveToCur(c);
+                end.moveToCur(c);
                 end.next();
-            }
-            else if (saveInner)
-            {
-                start.moveToCur( c );
+            } else if (saveInner) {
+                start.moveToCur(c);
                 start.next();
 
-                end.moveToCur( c );
+                end.moveToCur(c);
                 end.toEnd();
-            }
-            else if (k == ATTR)
-            {
-                start.moveToCur( c );
-                end.moveToCur( c );
-            }
-            else
-            {
+            } else if (k == ATTR) {
+                start.moveToCur(c);
+                end.moveToCur(c);
+            } else {
                 assert k == COMMENT || k == PROCINST;
 
-                start.moveToCur( c );
-                end.moveToCur( c );
+                start.moveToCur(c);
+                end.moveToCur(c);
                 end.skip();
             }
 
-            cur = new FragSaveCur( start, end, fragName );
+            cur = new FragSaveCur(start, end, fragName);
         }
 
-        String filterPI = (String) options.get( XmlOptions.SAVE_FILTER_PROCINST );
+        String filterPI = (String) options.get(XmlOptions.SAVE_FILTER_PROCINST);
 
         if (filterPI != null)
-            cur = new FilterPiSaveCur( cur, filterPI );
+            cur = new FilterPiSaveCur(cur, filterPI);
 
-        if (options.hasOption( XmlOptions.SAVE_PRETTY_PRINT ))
-            cur = new PrettySaveCur( cur, options );
+        if (options.hasOption(XmlOptions.SAVE_PRETTY_PRINT))
+            cur = new PrettySaveCur(cur, options);
 
         start.release();
         end.release();
@@ -263,72 +244,84 @@
         return cur;
     }
 
-    private static void positionToInner ( Cur c, Cur start, Cur end )
-    {
+    private static void positionToInner(Cur c, Cur start, Cur end) {
         assert c.isContainer();
 
-        start.moveToCur( c );
+        start.moveToCur(c);
 
         if (!start.toFirstAttr())
             start.next();
 
-        end.moveToCur( c );
+        end.moveToCur(c);
         end.toEnd();
     }
-    
+
     /**
      * Test if a character is valid in xml character content. See
      * http://www.w3.org/TR/REC-xml#NT-Char
      */
-    static boolean isBadChar ( char ch )
-    {
-        return ! (
-            Character.isHighSurrogate(ch) ||
-            Character.isLowSurrogate(ch) ||
-            (ch >= 0x20 && ch <= 0xD7FF ) ||
-            (ch >= 0xE000 && ch <= 0xFFFD) ||
-            (ch >= 0x10000 && ch <= 0x10FFFF) ||
-            (ch == 0x9) || (ch == 0xA) || (ch == 0xD)
+    static boolean isBadChar(char ch) {
+        return !(
+                Character.isHighSurrogate(ch) ||
+                        Character.isLowSurrogate(ch) ||
+                        (ch >= 0x20 && ch <= 0xD7FF) ||
+                        (ch >= 0xE000 && ch <= 0xFFFD) ||
+                        (ch >= 0x10000 && ch <= 0x10FFFF) ||
+                        (ch == 0x9) || (ch == 0xA) || (ch == 0xD)
         );
     }
-        
-    protected boolean saveNamespacesFirst ( )
-    {
+
+    protected boolean saveNamespacesFirst() {
         return _saveNamespacesFirst;
     }
 
-    protected void enterLocale()
-    {
+    protected void enterLocale() {
         _locale.enter();
     }
 
-    protected void exitLocale()
-    {
+    protected void exitLocale() {
         _locale.exit();
     }
 
-    protected final boolean process ( )
-    {
+    protected final boolean process() {
         assert _locale.entered();
 
         if (_cur == null)
             return false;
 
         if (_version != _locale.version())
-            throw new ConcurrentModificationException( "Document changed during save" );
+            throw new ConcurrentModificationException("Document changed during save");
 
-        switch ( _cur.kind() )
-        {
-            case   ROOT     : { processRoot();                        break; }
-            case   ELEM     : { processElement();                     break; }
-            case - ELEM     : { processFinish ();                     break; }
-            case   TEXT     : { emitText      ( _cur );               break; }
+        switch (_cur.kind()) {
+            case ROOT: {
+                processRoot();
+                break;
+            }
+            case ELEM: {
+                processElement();
+                break;
+            }
+            case -ELEM: {
+                processFinish();
+                break;
+            }
+            case TEXT: {
+                emitText(_cur);
+                break;
+            }
 
-            case   COMMENT  : { emitComment   ( _cur ); _cur.toEnd(); break; }
-            case   PROCINST : { emitProcinst  ( _cur ); _cur.toEnd(); break; }
+            case COMMENT: {
+                emitComment(_cur);
+                _cur.toEnd();
+                break;
+            }
+            case PROCINST: {
+                emitProcinst(_cur);
+                _cur.toEnd();
+                break;
+            }
 
-            case - ROOT :
-            {
+            case -ROOT: {
                 emitEndDoc(_cur);
                 _cur.release();
                 _cur = null;
@@ -336,7 +329,8 @@
                 return true;
             }
 
-            default : throw new RuntimeException( "Unexpected kind" );
+            default:
+                throw new RuntimeException("Unexpected kind");
         }
 
         _cur.next();
@@ -344,29 +338,24 @@
         return true;
     }
 
-    private final void processFinish ( )
-    {
-        emitFinish( _cur );
+    private final void processFinish() {
+        emitFinish(_cur);
         popMappings();
     }
 
-    private final void processRoot ( )
-    {
+    private final void processRoot() {
         assert _cur.isRoot();
 
         XmlDocumentProperties props = _cur.getDocProps();
         String systemId = null;
         String docTypeName = null;
-        if (props != null)
-        {
+        if (props != null) {
             systemId = props.getDoctypeSystemId();
             docTypeName = props.getDoctypeName();
         }
 
-        if (systemId != null || docTypeName != null)
-        {
-            if (docTypeName == null)
-            {
+        if (systemId != null || docTypeName != null) {
+            if (docTypeName == null) {
                 _cur.push();
                 while (!_cur.isElem() && _cur.next())
                     ;
@@ -377,17 +366,13 @@
 
             String publicId = props.getDoctypePublicId();
 
-            if (docTypeName != null)
-            {
+            if (docTypeName != null) {
                 QName rootElemName = _cur.getName();
 
-                if ( rootElemName == null )
-                {
+                if (rootElemName == null) {
                     _cur.push();
-                    while ( !_cur.isFinish() )
-                    {
-                        if (_cur.isElem())
-                        {
+                    while (!_cur.isFinish()) {
+                        if (_cur.isElem()) {
                             rootElemName = _cur.getName();
                             break;
                         }
@@ -396,9 +381,8 @@
                     _cur.pop();
                 }
 
-                if ( rootElemName!=null && docTypeName.equals(rootElemName.getLocalPart()) )
-                {
-                    emitDocType( docTypeName, publicId, systemId );
+                if (rootElemName != null && docTypeName.equals(rootElemName.getLocalPart())) {
+                    emitDocType(docTypeName, publicId, systemId);
                     return;
                 }
             }
@@ -407,8 +391,7 @@
         emitStartDoc(_cur);
     }
 
-    private final void processElement ( )
-    {
+    private final void processElement() {
         assert _cur.isElem() && _cur.getName() != null;
 
         QName name = _cur.getName();
@@ -419,7 +402,7 @@
 
         boolean ensureDefaultEmpty = name.getNamespaceURI().length() == 0;
 
-        pushMappings( _cur, ensureDefaultEmpty );
+        pushMappings(_cur, ensureDefaultEmpty);
 
         //
         // There are four things which use mappings:
@@ -432,7 +415,7 @@
 
         // 1) The element name (not for starts)
 
-        ensureMapping( name.getNamespaceURI(), name.getPrefix(), !ensureDefaultEmpty, false );
+        ensureMapping(name.getNamespaceURI(), name.getPrefix(), !ensureDefaultEmpty, false);
 
         //
         //
@@ -444,26 +427,22 @@
         _cur.push();
 
         attrs:
-        for ( boolean A = _cur.toFirstAttr() ; A ; A = _cur.toNextAttr() )
-        {
-            if (_cur.isNormalAttr())
-            {
+        for (boolean A = _cur.toFirstAttr(); A; A = _cur.toNextAttr()) {
+            if (_cur.isNormalAttr()) {
                 QName attrName = _cur.getName();
 
-                _attrNames.add( attrName );
+                _attrNames.add(attrName);
 
-                for ( int i = _attrNames.size() - 2 ; i >= 0 ; i-- )
-                {
-                    if (_attrNames.get( i ).equals( attrName ))
-                    {
-                        _attrNames.remove( _attrNames.size() - 1 );
+                for (int i = _attrNames.size() - 2; i >= 0; i--) {
+                    if (_attrNames.get(i).equals(attrName)) {
+                        _attrNames.remove(_attrNames.size() - 1);
                         continue attrs;
                     }
                 }
 
-                _attrValues.add( _cur.getAttrValue() );
+                _attrValues.add(_cur.getAttrValue());
 
-                ensureMapping( attrName.getNamespaceURI(), attrName.getPrefix(), false, true );
+                ensureMapping(attrName.getNamespaceURI(), attrName.getPrefix(), false, true);
             }
         }
 
@@ -474,23 +453,20 @@
         // we've computed.  Basically, I'm making sure the pre-computed
         // namespaces are mapped on the first container which has a name.
 
-        if (_preComputedNamespaces != null)
-        {
-            for ( Iterator i = _preComputedNamespaces.keySet().iterator() ; i.hasNext() ; )
-            {
+        if (_preComputedNamespaces != null) {
+            for (Iterator i = _preComputedNamespaces.keySet().iterator(); i.hasNext(); ) {
                 String uri = (String) i.next();
-                String prefix = (String) _preComputedNamespaces.get( uri );
+                String prefix = (String) _preComputedNamespaces.get(uri);
                 boolean considerDefault = prefix.length() == 0 && !ensureDefaultEmpty;
 
-                ensureMapping( uri, prefix, considerDefault, false );
+                ensureMapping(uri, prefix, considerDefault, false);
             }
 
             // Set to null so we do this once at the top
             _preComputedNamespaces = null;
         }
 
-        if (emitElement( _cur, _attrNames, _attrValues ))
-        {
+        if (emitElement(_cur, _attrNames, _attrValues)) {
             popMappings();
             _cur.toEnd();
         }
@@ -505,96 +481,84 @@
     //    Mapping
     //
 
-    boolean hasMappings ( )
-    {
+    boolean hasMappings() {
         int i = _namespaceStack.size();
 
-        return i > 0 && _namespaceStack.get( i - 1 ) != null;
+        return i > 0 && _namespaceStack.get(i - 1) != null;
     }
 
-    void iterateMappings ( )
-    {
+    void iterateMappings() {
         _currentMapping = _namespaceStack.size();
 
-        while ( _currentMapping > 0 && _namespaceStack.get( _currentMapping - 1 ) != null )
+        while (_currentMapping > 0 && _namespaceStack.get(_currentMapping - 1) != null)
             _currentMapping -= 8;
     }
 
-    boolean hasMapping ( )
-    {
+    boolean hasMapping() {
         return _currentMapping < _namespaceStack.size();
     }
 
-    void nextMapping ( )
-    {
+    void nextMapping() {
         _currentMapping += 8;
     }
 
-    String mappingPrefix ( )
-    {
+    String mappingPrefix() {
         assert hasMapping();
-        return (String) _namespaceStack.get( _currentMapping + 6 );
+        return (String) _namespaceStack.get(_currentMapping + 6);
     }
 
-    String mappingUri ( )
-    {
+    String mappingUri() {
         assert hasMapping();
-        return (String) _namespaceStack.get( _currentMapping + 7 );
+        return (String) _namespaceStack.get(_currentMapping + 7);
     }
 
-    private final void pushMappings ( SaveCur c, boolean ensureDefaultEmpty )
-    {
+    private final void pushMappings(SaveCur c, boolean ensureDefaultEmpty) {
         assert c.isContainer();
 
-        _namespaceStack.add( null );
+        _namespaceStack.add(null);
 
         c.push();
 
         namespaces:
-        for ( boolean A = c.toFirstAttr() ; A ; A = c.toNextAttr() )
+        for (boolean A = c.toFirstAttr(); A; A = c.toNextAttr())
             if (c.isXmlns())
-                addNewFrameMapping( c.getXmlnsPrefix(), c.getXmlnsUri(), ensureDefaultEmpty );
+                addNewFrameMapping(c.getXmlnsPrefix(), c.getXmlnsUri(), ensureDefaultEmpty);
 
         c.pop();
 
-        if (_ancestorNamespaces != null)
-        {
-            for ( int i = 0 ; i < _ancestorNamespaces.size() ; i += 2 )
-            {
-                String prefix = (String) _ancestorNamespaces.get( i );
-                String uri    = (String) _ancestorNamespaces.get( i + 1 );
+        if (_ancestorNamespaces != null) {
+            for (int i = 0; i < _ancestorNamespaces.size(); i += 2) {
+                String prefix = (String) _ancestorNamespaces.get(i);
+                String uri = (String) _ancestorNamespaces.get(i + 1);
 
-                addNewFrameMapping( prefix, uri, ensureDefaultEmpty );
+                addNewFrameMapping(prefix, uri, ensureDefaultEmpty);
             }
 
             _ancestorNamespaces = null;
         }
 
-        if (ensureDefaultEmpty)
-        {
-            String defaultUri = (String) _prefixMap.get( "" );
+        if (ensureDefaultEmpty) {
+            String defaultUri = (String) _prefixMap.get("");
 
             // I map the default to "" at the very beginning
             assert defaultUri != null;
 
             if (defaultUri.length() > 0)
-                addMapping( "", "" );
+                addMapping("", "");
         }
     }
 
-    private final void addNewFrameMapping ( String prefix, String uri, boolean ensureDefaultEmpty )
-    {
+    private final void addNewFrameMapping(String prefix, String uri, boolean ensureDefaultEmpty) {
         // If the prefix maps to "", this don't include this mapping 'cause it's not well formed.
         // Also, if we want to make sure that the default namespace is always "", then check that
         // here as well.
 
         if ((prefix.length() == 0 || uri.length() > 0) &&
-                (!ensureDefaultEmpty || prefix.length() > 0 || uri.length() == 0))
-        {
+                (!ensureDefaultEmpty || prefix.length() > 0 || uri.length() == 0)) {
             // Make sure the prefix is not already mapped in this frame
 
-            for ( iterateMappings() ; hasMapping() ; nextMapping() )
-                if (mappingPrefix().equals( prefix ))
+            for (iterateMappings(); hasMapping(); nextMapping())
+                if (mappingPrefix().equals(prefix))
                     return;
 
             // Also make sure that the prefix declaration is not redundant
@@ -604,12 +568,11 @@
             if (uri.equals(getNamespaceForPrefix(prefix)))
                 return;
 
-            addMapping( prefix, uri );
+            addMapping(prefix, uri);
         }
     }
 
-    private final void addMapping ( String prefix, String uri )
-    {
+    private final void addMapping(String prefix, String uri) {
         assert uri != null;
         assert prefix != null;
 
@@ -617,33 +580,28 @@
         // that uri will either go out of scope or be mapped to another
         // prefix.
 
-        String renameUri = (String) _prefixMap.get( prefix );
+        String renameUri = (String) _prefixMap.get(prefix);
         String renamePrefix = null;
 
-        if (renameUri != null)
-        {
+        if (renameUri != null) {
             // See if this prefix is already mapped to this uri.  If
             // so, then add to the stack, but there is nothing to rename
 
-            if (renameUri.equals( uri ))
+            if (renameUri.equals(uri))
                 renameUri = null;
-            else
-            {
+            else {
                 int i = _namespaceStack.size();
 
-                while ( i > 0 )
-                {
-                    if (_namespaceStack.get( i - 1 ) == null)
-                    {
+                while (i > 0) {
+                    if (_namespaceStack.get(i - 1) == null) {
                         i--;
                         continue;
                     }
 
-                    if (_namespaceStack.get( i - 7 ).equals( renameUri ))
-                    {
-                        renamePrefix = (String) _namespaceStack.get( i - 8 );
+                    if (_namespaceStack.get(i - 7).equals(renameUri)) {
+                        renamePrefix = (String) _namespaceStack.get(i - 8);
 
-                        if (renamePrefix == null || !renamePrefix.equals( prefix ))
+                        if (renamePrefix == null || !renamePrefix.equals(prefix))
                             break;
                     }
 
@@ -654,114 +612,105 @@
             }
         }
 
-        _namespaceStack.add( _uriMap.get( uri ) );
-        _namespaceStack.add( uri );
+        _namespaceStack.add(_uriMap.get(uri));
+        _namespaceStack.add(uri);
 
-        if (renameUri != null)
-        {
-            _namespaceStack.add( _uriMap.get( renameUri ) );
-            _namespaceStack.add( renameUri );
-        }
-        else
-        {
-            _namespaceStack.add( null );
-            _namespaceStack.add( null );
+        if (renameUri != null) {
+            _namespaceStack.add(_uriMap.get(renameUri));
+            _namespaceStack.add(renameUri);
+        } else {
+            _namespaceStack.add(null);
+            _namespaceStack.add(null);
         }
 
-        _namespaceStack.add( prefix );
-        _namespaceStack.add( _prefixMap.get( prefix ) );
+        _namespaceStack.add(prefix);
+        _namespaceStack.add(_prefixMap.get(prefix));
 
-        _namespaceStack.add( prefix );
-        _namespaceStack.add( uri );
+        _namespaceStack.add(prefix);
+        _namespaceStack.add(uri);
 
-        _uriMap.put( uri, prefix );
-        _prefixMap.put( prefix, uri );
+        _uriMap.put(uri, prefix);
+        _prefixMap.put(prefix, uri);
 
         if (renameUri != null)
-            _uriMap.put( renameUri, renamePrefix );
+            _uriMap.put(renameUri, renamePrefix);
     }
 
-    private final void popMappings ( )
-    {
-        for ( ; ; )
-        {
+    private final void popMappings() {
+        for (; ; ) {
             int i = _namespaceStack.size();
 
             if (i == 0)
                 break;
 
-            if (_namespaceStack.get( i - 1 ) == null)
-            {
-                _namespaceStack.remove( i - 1 );
+            if (_namespaceStack.get(i - 1) == null) {
+                _namespaceStack.remove(i - 1);
                 break;
             }
 
-            Object oldUri = _namespaceStack.get( i - 7 );
-            Object oldPrefix = _namespaceStack.get( i - 8 );
+            Object oldUri = _namespaceStack.get(i - 7);
+            Object oldPrefix = _namespaceStack.get(i - 8);
 
             if (oldPrefix == null)
-                _uriMap.remove( oldUri );
+                _uriMap.remove(oldUri);
             else
-                _uriMap.put( oldUri, oldPrefix );
+                _uriMap.put(oldUri, oldPrefix);
 
-            oldPrefix = _namespaceStack.get( i - 4 );
-            oldUri = _namespaceStack.get( i - 3 );
+            oldPrefix = _namespaceStack.get(i - 4);
+            oldUri = _namespaceStack.get(i - 3);
 
             if (oldUri == null)
-                _prefixMap.remove( oldPrefix );
+                _prefixMap.remove(oldPrefix);
             else
-                _prefixMap.put( oldPrefix, oldUri );
+                _prefixMap.put(oldPrefix, oldUri);
 
-            String uri = (String) _namespaceStack.get( i - 5 );
+            String uri = (String) _namespaceStack.get(i - 5);
 
             if (uri != null)
-                _uriMap.put( uri, _namespaceStack.get( i - 6 ) );
+                _uriMap.put(uri, _namespaceStack.get(i - 6));
 
             // Hahahahahaha -- :-(
-            _namespaceStack.remove( i - 1 );
-            _namespaceStack.remove( i - 2 );
-            _namespaceStack.remove( i - 3 );
-            _namespaceStack.remove( i - 4 );
-            _namespaceStack.remove( i - 5 );
-            _namespaceStack.remove( i - 6 );
-            _namespaceStack.remove( i - 7 );
-            _namespaceStack.remove( i - 8 );
+            _namespaceStack.remove(i - 1);
+            _namespaceStack.remove(i - 2);
+            _namespaceStack.remove(i - 3);
+            _namespaceStack.remove(i - 4);
+            _namespaceStack.remove(i - 5);
+            _namespaceStack.remove(i - 6);
+            _namespaceStack.remove(i - 7);
+            _namespaceStack.remove(i - 8);
         }
     }
 
-    private final void dumpMappings ( )
-    {
-        for ( int i = _namespaceStack.size() ; i > 0 ; )
-        {
-            if (_namespaceStack.get( i - 1 ) == null)
-            {
-                System.out.println( "----------------" );
+    private final void dumpMappings() {
+        for (int i = _namespaceStack.size(); i > 0; ) {
+            if (_namespaceStack.get(i - 1) == null) {
+                System.out.println("----------------");
                 i--;
                 continue;
             }
 
-            System.out.print( "Mapping: " );
-            System.out.print( _namespaceStack.get( i - 2 ) );
-            System.out.print( " -> " );
-            System.out.print( _namespaceStack.get( i - 1 ) );
+            System.out.print("Mapping: ");
+            System.out.print(_namespaceStack.get(i - 2));
+            System.out.print(" -> ");
+            System.out.print(_namespaceStack.get(i - 1));
             System.out.println();
 
-            System.out.print( "Prefix Undo: " );
-            System.out.print( _namespaceStack.get( i - 4 ) );
-            System.out.print( " -> " );
-            System.out.print( _namespaceStack.get( i - 3 ) );
+            System.out.print("Prefix Undo: ");
+            System.out.print(_namespaceStack.get(i - 4));
+            System.out.print(" -> ");
+            System.out.print(_namespaceStack.get(i - 3));
             System.out.println();
 
-            System.out.print( "Uri Rename: " );
-            System.out.print( _namespaceStack.get( i - 5 ) );
-            System.out.print( " -> " );
-            System.out.print( _namespaceStack.get( i - 6 ) );
+            System.out.print("Uri Rename: ");
+            System.out.print(_namespaceStack.get(i - 5));
+            System.out.print(" -> ");
+            System.out.print(_namespaceStack.get(i - 6));
             System.out.println();
 
-            System.out.print( "UriUndo: " );
-            System.out.print( _namespaceStack.get( i - 7 ) );
-            System.out.print( " -> " );
-            System.out.print( _namespaceStack.get( i - 8 ) );
+            System.out.print("UriUndo: ");
+            System.out.print(_namespaceStack.get(i - 7));
+            System.out.print(" -> ");
+            System.out.print(_namespaceStack.get(i - 8));
             System.out.println();
 
             System.out.println();
@@ -770,10 +719,9 @@
         }
     }
 
-    private final String ensureMapping (
-        String uri, String candidatePrefix,
-        boolean considerCreatingDefault, boolean mustHavePrefix )
-    {
+    private final String ensureMapping(
+            String uri, String candidatePrefix,
+            boolean considerCreatingDefault, boolean mustHavePrefix) {
         assert uri != null;
 
         // Can be called for no-namespaced things
@@ -781,7 +729,7 @@
         if (uri.length() == 0)
             return null;
 
-        String prefix = (String) _uriMap.get( uri );
+        String prefix = (String) _uriMap.get(uri);
 
         if (prefix != null && (prefix.length() > 0 || !mustHavePrefix))
             return prefix;
@@ -798,24 +746,19 @@
         if (candidatePrefix != null && candidatePrefix.length() == 0)
             candidatePrefix = null;
 
-        if (candidatePrefix == null || !tryPrefix( candidatePrefix ))
-        {
+        if (candidatePrefix == null || !tryPrefix(candidatePrefix)) {
             if (_suggestedPrefixes != null &&
-                    _suggestedPrefixes.containsKey( uri ) &&
-                        tryPrefix( (String) _suggestedPrefixes.get( uri ) ))
-            {
-                candidatePrefix = (String) _suggestedPrefixes.get( uri );
-            }
-            else if (considerCreatingDefault && _useDefaultNamespace && tryPrefix( "" ))
+                    _suggestedPrefixes.containsKey(uri) &&
+                    tryPrefix((String) _suggestedPrefixes.get(uri))) {
+                candidatePrefix = (String) _suggestedPrefixes.get(uri);
+            } else if (considerCreatingDefault && _useDefaultNamespace && tryPrefix(""))
                 candidatePrefix = "";
-            else
-            {
-                String basePrefix = QNameHelper.suggestPrefix( uri );
+            else {
+                String basePrefix = QNameHelper.suggestPrefix(uri);
                 candidatePrefix = basePrefix;
 
-                for ( int i = 1 ; ; i++ )
-                {
-                    if (tryPrefix( candidatePrefix ))
+                for (int i = 1; ; i++) {
+                    if (tryPrefix(candidatePrefix))
                         break;
 
                     candidatePrefix = basePrefix + i;
@@ -825,31 +768,28 @@
 
         assert candidatePrefix != null;
 
-        syntheticNamespace( candidatePrefix, uri, considerCreatingDefault );
+        syntheticNamespace(candidatePrefix, uri, considerCreatingDefault);
 
-        addMapping( candidatePrefix, uri );
+        addMapping(candidatePrefix, uri);
 
         return candidatePrefix;
     }
 
-    protected final String getUriMapping ( String uri )
-    {
-        assert _uriMap.get( uri ) != null;
-        return (String) _uriMap.get( uri );
+    protected final String getUriMapping(String uri) {
+        assert _uriMap.get(uri) != null;
+        return (String) _uriMap.get(uri);
     }
 
-    String getNonDefaultUriMapping ( String uri )
-    {
-        String prefix = (String) _uriMap.get( uri );
+    String getNonDefaultUriMapping(String uri) {
+        String prefix = (String) _uriMap.get(uri);
 
         if (prefix != null && prefix.length() > 0)
             return prefix;
 
-        for ( Iterator keys = _prefixMap.keySet().iterator() ; keys.hasNext() ; )
-        {
+        for (Iterator keys = _prefixMap.keySet().iterator(); keys.hasNext(); ) {
             prefix = (String) keys.next();
 
-            if (prefix.length() > 0 && _prefixMap.get( prefix ).equals( uri ))
+            if (prefix.length() > 0 && _prefixMap.get(prefix).equals(uri))
                 return prefix;
         }
 
@@ -858,12 +798,11 @@
         return null;
     }
 
-    private final boolean tryPrefix ( String prefix )
-    {
-        if (prefix == null || Locale.beginsWithXml( prefix ))
+    private final boolean tryPrefix(String prefix) {
+        if (prefix == null || Locale.beginsWithXml(prefix))
             return false;
 
-        String existingUri = (String) _prefixMap.get( prefix );
+        String existingUri = (String) _prefixMap.get(prefix);
 
         // If the prefix is currently mapped, then try another prefix.  A
         // special case is that of trying to map the default prefix ("").
@@ -878,15 +817,13 @@
         return true;
     }
 
-    public final String getNamespaceForPrefix ( String prefix )
-    {
-        assert !prefix.equals( "xml" ) || _prefixMap.get( prefix ).equals( Locale._xml1998Uri );
+    public final String getNamespaceForPrefix(String prefix) {
+        assert !prefix.equals("xml") || _prefixMap.get(prefix).equals(Locale._xml1998Uri);
 
-        return (String) _prefixMap.get( prefix );
+        return (String) _prefixMap.get(prefix);
     }
 
-    protected Map getPrefixMap()
-    {
+    protected Map getPrefixMap() {
         return _prefixMap;
     }
 
@@ -894,283 +831,273 @@
     //
     //
 
-    static final class SynthNamespaceSaver extends Saver
-    {
+    static final class SynthNamespaceSaver extends Saver {
         LinkedHashMap _synthNamespaces = new LinkedHashMap();
 
-        SynthNamespaceSaver ( Cur c, XmlOptions options )
-        {
-            super( c, options );
+        SynthNamespaceSaver(Cur c, XmlOptions options) {
+            super(c, options);
         }
 
-        protected void syntheticNamespace (
-            String prefix, String uri, boolean considerCreatingDefault )
-        {
-            _synthNamespaces.put( uri, considerCreatingDefault ? "" : prefix );
+        protected void syntheticNamespace(
+                String prefix, String uri, boolean considerCreatingDefault) {
+            _synthNamespaces.put(uri, considerCreatingDefault ? "" : prefix);
         }
 
-        protected boolean emitElement (
-            SaveCur c, ArrayList attrNames, ArrayList attrValues ) { return false; }
+        protected boolean emitElement(
+                SaveCur c, ArrayList attrNames, ArrayList attrValues) {
+            return false;
+        }
 
-        protected void emitFinish    ( SaveCur c ) { }
-        protected void emitText      ( SaveCur c ) { }
-        protected void emitComment   ( SaveCur c ) { }
-        protected void emitProcinst  ( SaveCur c ) { }
-        protected void emitDocType   ( String docTypeName, String publicId, String systemId ) { }
-        protected void emitStartDoc  ( SaveCur c ) { }
-        protected void emitEndDoc    ( SaveCur c ) { }
+        protected void emitFinish(SaveCur c) {
+        }
+
+        protected void emitText(SaveCur c) {
+        }
+
+        protected void emitComment(SaveCur c) {
+        }
+
+        protected void emitProcinst(SaveCur c) {
+        }
+
+        protected void emitDocType(String docTypeName, String publicId, String systemId) {
+        }
+
+        protected void emitStartDoc(SaveCur c) {
+        }
+
+        protected void emitEndDoc(SaveCur c) {
+        }
     }
 
     //
     //
     //
 
-    static final class TextSaver extends Saver
-    {
-        TextSaver ( Cur c, XmlOptions options, String encoding )
-        {
-            super( c, options );
+    static final class TextSaver extends Saver {
+        TextSaver(Cur c, XmlOptions options, String encoding) {
+            super(c, options);
 
             boolean noSaveDecl =
-                options != null && options.hasOption( XmlOptions.SAVE_NO_XML_DECL );
+                    options != null && options.hasOption(XmlOptions.SAVE_NO_XML_DECL);
 
             if (options != null && options.hasOption(XmlOptions.SAVE_CDATA_LENGTH_THRESHOLD))
-                _cdataLengthThreshold = ((Integer)options.get(XmlOptions.SAVE_CDATA_LENGTH_THRESHOLD)).intValue();
+                _cdataLengthThreshold = ((Integer) options.get(XmlOptions.SAVE_CDATA_LENGTH_THRESHOLD)).intValue();
 
             if (options != null && options.hasOption(XmlOptions.SAVE_CDATA_ENTITY_COUNT_THRESHOLD))
-                _cdataEntityCountThreshold = ((Integer)options.get(XmlOptions.SAVE_CDATA_ENTITY_COUNT_THRESHOLD)).intValue();
+                _cdataEntityCountThreshold = ((Integer) options.get(XmlOptions.SAVE_CDATA_ENTITY_COUNT_THRESHOLD)).intValue();
 
-            if (options != null && options.hasOption(XmlOptions.LOAD_SAVE_CDATA_BOOKMARKS) )
+            if (options != null && options.hasOption(XmlOptions.LOAD_SAVE_CDATA_BOOKMARKS))
                 _useCDataBookmarks = true;
 
-            if (options != null && options.hasOption(XmlOptions.SAVE_PRETTY_PRINT) )
+            if (options != null && options.hasOption(XmlOptions.SAVE_PRETTY_PRINT))
                 _isPrettyPrint = true;
 
             _in = _out = 0;
             _free = 0;
 
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
-            if (encoding != null && !noSaveDecl)
-            {
-                XmlDocumentProperties props = Locale.getDocProps( c, false );
+            if (encoding != null && !noSaveDecl) {
+                XmlDocumentProperties props = Locale.getDocProps(c, false);
 
                 String version = props == null ? null : props.getVersion();
 
                 if (version == null)
                     version = "1.0";
 
-                emit( "<?xml version=\"" );
-                emit( version );
-                emit( "\" encoding=\"" + encoding + "\"?>" + _newLine );
+                Boolean standalone = null;
+                if (props != null && props.get(XmlDocumentProperties.STANDALONE) != null)
+                    standalone = props.getStandalone();
+
+                emit("<?xml version=\"");
+                emit(version);
+                emit( "\" encoding=\"" + encoding + "\"");
+                if (standalone != null)
+                    emit( " standalone=\"" + (standalone.booleanValue() ? "yes" : "no") + "\"");
+                emit( "?>" + _newLine );
             }
         }
 
-        protected boolean emitElement ( SaveCur c, ArrayList attrNames, ArrayList attrValues )
-        {
+        protected boolean emitElement(SaveCur c, ArrayList attrNames, ArrayList attrValues) {
             assert c.isElem();
 
-            emit( '<' );
-            emitName( c.getName(), false );
+            emit('<');
+            emitName(c.getName(), false);
 
             if (saveNamespacesFirst())
                 emitNamespacesHelper();
 
-            for ( int i = 0 ; i < attrNames.size() ; i++ )
-                emitAttrHelper( (QName) attrNames.get( i ), (String) attrValues.get( i ) );
+            for (int i = 0; i < attrNames.size(); i++)
+                emitAttrHelper((QName) attrNames.get(i), (String) attrValues.get(i));
 
             if (!saveNamespacesFirst())
                 emitNamespacesHelper();
 
-            if (!c.hasChildren() && !c.hasText())
-            {
-                emit( '/', '>' );
+            if (!c.hasChildren() && !c.hasText()) {
+                emit('/', '>');
                 return true;
-            }
-            else
-            {
-                emit( '>' );
+            } else {
+                emit('>');
                 return false;
             }
         }
 
-        protected void emitFinish ( SaveCur c )
-        {
-            emit( '<', '/' );
-            emitName( c.getName(), false );
-            emit( '>' );
+        protected void emitFinish(SaveCur c) {
+            emit('<', '/');
+            emitName(c.getName(), false);
+            emit('>');
         }
 
-        protected void emitXmlns ( String prefix, String uri )
-        {
+        protected void emitXmlns(String prefix, String uri) {
             assert prefix != null;
             assert uri != null;
 
-            emit( "xmlns" );
+            emit("xmlns");
 
-            if (prefix.length() > 0)
-            {
-                emit( ':' );
-                emit( prefix );
+            if (prefix.length() > 0) {
+                emit(':');
+                emit(prefix);
             }
 
-            emit( '=', '\"' );
+            emit('=', '\"');
 
             // TODO - must encode uri properly
 
-            emit( uri );
+            emit(uri);
             entitizeAttrValue(false);
 
-            emit( '"' );
+            emit('"');
         }
 
-        private void emitNamespacesHelper ( )
-        {
-            for ( iterateMappings() ; hasMapping() ; nextMapping() )
-            {
-                emit( ' ' );
-                emitXmlns( mappingPrefix(), mappingUri() );
+        private void emitNamespacesHelper() {
+            for (iterateMappings(); hasMapping(); nextMapping()) {
+                emit(' ');
+                emitXmlns(mappingPrefix(), mappingUri());
             }
         }
 
-        private void emitAttrHelper ( QName attrName, String attrValue )
-        {
-            emit( ' ' );
-            emitName( attrName, true );
-            emit( '=', '\"' );
-            emit( attrValue );
+        private void emitAttrHelper(QName attrName, String attrValue) {
+            emit(' ');
+            emitName(attrName, true);
+            emit('=', '\"');
+            emit(attrValue);
             entitizeAttrValue(true);
-            emit( '"' );
+            emit('"');
         }
 
-        protected void emitText ( SaveCur c )
-        {
+        protected void emitText(SaveCur c) {
             assert c.isText();
 
             // c.isTextCData() is expensive do it only if useCDataBookmarks option is enabled
             boolean forceCData = _useCDataBookmarks && c.isTextCData();
 
-            emit( c );
+            emit(c);
 
-            entitizeContent( forceCData );
+            entitizeContent(forceCData);
         }
 
-        protected void emitComment ( SaveCur c )
-        {
+        protected void emitComment(SaveCur c) {
             assert c.isComment();
 
-            emit( "<!--" );
+            emit("<!--");
 
             c.push();
             c.next();
 
-            emit( c );
+            emit(c);
 
             c.pop();
 
             entitizeComment();
-            emit( "-->" );
+            emit("-->");
         }
 
-        protected void emitProcinst ( SaveCur c )
-        {
+        protected void emitProcinst(SaveCur c) {
             assert c.isProcinst();
 
-            emit( "<?" );
+            emit("<?");
 
             // TODO - encoding issues here?
-            emit( c.getName().getLocalPart() );
+            emit(c.getName().getLocalPart());
 
             c.push();
 
             c.next();
 
-            if (c.isText())
-            {
-                emit( " " );
-                emit( c );
+            if (c.isText()) {
+                emit(" ");
+                emit(c);
                 entitizeProcinst();
             }
 
             c.pop();
 
-            emit( "?>" );
+            emit("?>");
         }
 
-        private void emitLiteral ( String literal )
-        {
+        private void emitLiteral(String literal) {
             // TODO: systemId production http://www.w3.org/TR/REC-xml/#NT-SystemLiteral
             // TODO: publicId production http://www.w3.org/TR/REC-xml/#NT-PubidLiteral
-            if (literal.indexOf( "\"" ) < 0)
-            {
-                emit( '\"' );
-                emit( literal );
-                emit( '\"' );
-            }
-            else
-            {
-                emit( '\'' );
-                emit( literal );
-                emit( '\'' );
+            if (literal.indexOf("\"") < 0) {
+                emit('\"');
+                emit(literal);
+                emit('\"');
+            } else {
+                emit('\'');
+                emit(literal);
+                emit('\'');
             }
         }
 
-        protected void emitDocType ( String docTypeName, String publicId, String systemId )
-        {
+        protected void emitDocType(String docTypeName, String publicId, String systemId) {
             assert docTypeName != null;
 
-            emit( "<!DOCTYPE " );
-            emit( docTypeName );
+            emit("<!DOCTYPE ");
+            emit(docTypeName);
 
-            if (publicId == null && systemId != null)
-            {
-                emit( " SYSTEM " );
-                emitLiteral( systemId );
-            }
-            else if (publicId != null)
-            {
-                emit( " PUBLIC " );
-                emitLiteral( publicId );
-                emit( " " );
-                emitLiteral( systemId );
+            if (publicId == null && systemId != null) {
+                emit(" SYSTEM ");
+                emitLiteral(systemId);
+            } else if (publicId != null) {
+                emit(" PUBLIC ");
+                emitLiteral(publicId);
+                emit(" ");
+                emitLiteral(systemId);
             }
 
-            emit( ">" );
-            emit( _newLine );
+            emit(">");
+            emit(_newLine);
         }
 
-        protected void emitStartDoc ( SaveCur c )
-        {
+        protected void emitStartDoc(SaveCur c) {
         }
 
-        protected void emitEndDoc ( SaveCur c )
-        {
+        protected void emitEndDoc(SaveCur c) {
         }
 
         //
         //
         //
 
-        private void emitName ( QName name, boolean needsPrefix )
-        {
+        private void emitName(QName name, boolean needsPrefix) {
             assert name != null;
 
             String uri = name.getNamespaceURI();
 
             assert uri != null;
 
-            if (uri.length() != 0)
-            {
+            if (uri.length() != 0) {
                 String prefix = name.getPrefix();
-                String mappedUri = getNamespaceForPrefix( prefix );
+                String mappedUri = getNamespaceForPrefix(prefix);
 
-                if (mappedUri == null || !mappedUri.equals( uri ))
-                    prefix = getUriMapping( uri );
+                if (mappedUri == null || !mappedUri.equals(uri))
+                    prefix = getUriMapping(uri);
 
                 // Attrs need a prefix.  If I have not found one, then there must be a default
                 // prefix obscuring the prefix needed for this attr.  Find it manually.
@@ -1180,135 +1107,121 @@
                 // here
 
                 if (needsPrefix && prefix.length() == 0)
-                    prefix = getNonDefaultUriMapping( uri );
+                    prefix = getNonDefaultUriMapping(uri);
 
-                if (prefix.length() > 0)
-                {
-                    emit( prefix );
-                    emit( ':' );
+                if (prefix.length() > 0) {
+                    emit(prefix);
+                    emit(':');
                 }
             }
 
             assert name.getLocalPart().length() > 0;
 
-            emit( name.getLocalPart() );
+            emit(name.getLocalPart());
         }
 
-        private void emit ( char ch )
-        {
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+        private void emit(char ch) {
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
-            preEmit( 1 );
+            preEmit(1);
 
-            _buf[ _in ] = ch;
+            _buf[_in] = ch;
 
             _in = (_in + 1) % _buf.length;
 
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
         }
 
-        private void emit ( char ch1, char ch2 )
-        {
-            if( preEmit( 2 ) )
+        private void emit(char ch1, char ch2) {
+            if (preEmit(2))
                 return;
 
-            _buf[ _in ] = ch1;
+            _buf[_in] = ch1;
             _in = (_in + 1) % _buf.length;
 
-            _buf[ _in ] = ch2;
+            _buf[_in] = ch2;
             _in = (_in + 1) % _buf.length;
 
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;            
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
         }
 
-        private void emit ( String s )
-        {
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+        private void emit(String s) {
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             int cch = s == null ? 0 : s.length();
 
-            if (preEmit( cch ))
+            if (preEmit(cch))
                 return;
 
             int chunk;
 
-            if (_in <= _out || cch < (chunk = _buf.length - _in))
-            {
-                s.getChars( 0, cch, _buf, _in );
+            if (_in <= _out || cch < (chunk = _buf.length - _in)) {
+                s.getChars(0, cch, _buf, _in);
                 _in += cch;
-            }
-            else
-            {
-                s.getChars( 0, chunk, _buf, _in );
-                s.getChars( chunk, cch, _buf, 0 );
+            } else {
+                s.getChars(0, chunk, _buf, _in);
+                s.getChars(chunk, cch, _buf, 0);
                 _in = (_in + cch) % _buf.length;
             }
 
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
         }
 
-        private void emit ( SaveCur c )
-        {
-            if (c.isText())
-            {
+        private void emit(SaveCur c) {
+            if (c.isText()) {
                 Object src = c.getChars();
                 int cch = c._cchSrc;
 
-                if (preEmit( cch ))
+                if (preEmit(cch))
                     return;
 
                 int chunk;
 
-                if (_in <= _out || cch < (chunk = _buf.length - _in))
-                {
-                    CharUtil.getChars( _buf, _in, src, c._offSrc, cch );
+                if (_in <= _out || cch < (chunk = _buf.length - _in)) {
+                    CharUtil.getChars(_buf, _in, src, c._offSrc, cch);
                     _in += cch;
-                }
-                else
-                {
-                    CharUtil.getChars( _buf, _in, src, c._offSrc, chunk );
-                    CharUtil.getChars( _buf, 0, src, c._offSrc + chunk, cch - chunk );
+                } else {
+                    CharUtil.getChars(_buf, _in, src, c._offSrc, chunk);
+                    CharUtil.getChars(_buf, 0, src, c._offSrc + chunk, cch - chunk);
                     _in = (_in + cch) % _buf.length;
                 }
-            }
-            else
-                preEmit( 0 );
+            } else
+                preEmit(0);
         }
 
-        private boolean preEmit ( int cch )
-        {
+        private boolean preEmit(int cch) {
             assert cch >= 0;
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             _lastEmitCch = cch;
 
@@ -1316,7 +1229,7 @@
                 return true;
 
             if (_free <= cch)
-                resize( cch, -1 );
+                resize(cch, -1);
 
             assert cch <= _free;
 
@@ -1326,8 +1239,7 @@
             // the buffer to be at the beginning so as to not grow it anymore
             // than needed.
 
-            if (used == 0)
-            {
+            if (used == 0) {
                 assert _in == _out;
                 assert _free == _buf.length;
                 _in = _out = 0;
@@ -1338,21 +1250,20 @@
             _free -= cch;
 
             assert _free >= 0;
-            assert _buf==null || _free == (_in>=_out ? _buf.length - (_in - _out) : _out - _in ) - cch : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) - cch) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in - cch ) ||                  // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length - cch) ||                 // no data, all buffer free
-                (_out==_in && _free == 0)                                    // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null || _free == (_in >= _out ? _buf.length - (_in - _out) : _out - _in) - cch : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out) - cch) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in - cch) ||                  // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length - cch) ||                 // no data, all buffer free
+                    (_out == _in && _free == 0)                                    // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             return false;
         }
 
-        private void entitizeContent ( boolean forceCData )
-        {
-            assert _free >=0;
-            
+        private void entitizeContent(boolean forceCData) {
+            assert _free >= 0;
+
             if (_lastEmitCch == 0)
                 return;
 
@@ -1364,15 +1275,14 @@
             int count = 0;
             char prevChar = 0;
             char prevPrevChar = 0;
-            for ( int cch = _lastEmitCch ; cch > 0 ; cch-- )
-            {
-                char ch = _buf[ i ];
+            for (int cch = _lastEmitCch; cch > 0; cch--) {
+                char ch = _buf[i];
 
                 if (ch == '<' || ch == '&')
                     count++;
-                else if (prevPrevChar == ']' && prevChar == ']' && ch == '>' )
+                else if (prevPrevChar == ']' && prevChar == ']' && ch == '>')
                     hasCharToBeReplaced = true;
-                else if (isBadChar( ch ) || isEscapedChar( ch ) || (!_isPrettyPrint && ch == '\r') )
+                else if (isBadChar(ch) || isEscapedChar(ch) || (!_isPrettyPrint && ch == '\r'))
                     hasCharToBeReplaced = true;
 
                 if (++i == n)
@@ -1382,7 +1292,7 @@
                 prevChar = ch;
             }
 
-            if (!forceCData && count == 0 && !hasCharToBeReplaced && count<_cdataEntityCountThreshold)
+            if (!forceCData && count == 0 && !hasCharToBeReplaced && count < _cdataEntityCountThreshold)
                 return;
 
             i = _lastEmitIn;
@@ -1390,27 +1300,25 @@
             //
             // Heuristic for knowing when to save out stuff as a CDATA.
             //
-            if (forceCData || (_lastEmitCch > _cdataLengthThreshold && count > _cdataEntityCountThreshold) )
-            {
-                boolean lastWasBracket = _buf[ i ] == ']';
+            if (forceCData || (_lastEmitCch > _cdataLengthThreshold && count > _cdataEntityCountThreshold)) {
+                boolean lastWasBracket = _buf[i] == ']';
 
-                i = replace( i, "<![CDATA[" + _buf[ i ] );
+                i = replace(i, "<![CDATA[" + _buf[i]);
 
                 boolean secondToLastWasBracket = lastWasBracket;
 
-                lastWasBracket = _buf[ i ] == ']';
+                lastWasBracket = _buf[i] == ']';
 
                 if (++i == _buf.length)
                     i = 0;
 
-                for ( int cch = _lastEmitCch - 2 ; cch > 0 ; cch-- )
-                {
-                    char ch = _buf[ i ];
+                for (int cch = _lastEmitCch - 2; cch > 0; cch--) {
+                    char ch = _buf[i];
 
                     if (ch == '>' && secondToLastWasBracket && lastWasBracket)
-                        i = replace( i, "]]>><![CDATA[" );
-                    else if (isBadChar( ch ))
-                        i = replace( i, "?" );
+                        i = replace(i, "]]>><![CDATA[");
+                    else if (isBadChar(ch))
+                        i = replace(i, "?");
                     else
                         i++;
 
@@ -1421,29 +1329,26 @@
                         i = 0;
                 }
 
-                emit( "]]>" );
-            }
-            else
-            {
+                emit("]]>");
+            } else {
                 char ch = 0, ch_1 = 0, ch_2;
-                for ( int cch = _lastEmitCch ; cch > 0 ; cch-- )
-                {
+                for (int cch = _lastEmitCch; cch > 0; cch--) {
                     ch_2 = ch_1;
                     ch_1 = ch;
-                    ch = _buf[ i ];
+                    ch = _buf[i];
 
                     if (ch == '<')
-                        i = replace( i, "&lt;" );
+                        i = replace(i, "&lt;");
                     else if (ch == '&')
-                        i = replace( i, "&amp;" );
+                        i = replace(i, "&amp;");
                     else if (ch == '>' && ch_1 == ']' && ch_2 == ']')
-                        i = replace( i, "&gt;" );
-                    else if (isBadChar( ch ))
-                        i = replace( i, "?" );
+                        i = replace(i, "&gt;");
+                    else if (isBadChar(ch))
+                        i = replace(i, "?");
                     else if (!_isPrettyPrint && ch == '\r')
-                        i = replace( i, "&#13;" );
-                    else if (isEscapedChar( ch ))
-                        i = replace( i, _replaceChar.getEscapedString( ch ) );
+                        i = replace(i, "&#13;");
+                    else if (isEscapedChar(ch))
+                        i = replace(i, _replaceChar.getEscapedString(ch));
                     else
                         i++;
 
@@ -1453,29 +1358,25 @@
             }
         }
 
-        private void entitizeAttrValue ( boolean replaceEscapedChar )
-        {
+        private void entitizeAttrValue(boolean replaceEscapedChar) {
             if (_lastEmitCch == 0)
                 return;
 
             int i = _lastEmitIn;
 
-            for ( int cch = _lastEmitCch ; cch > 0 ; cch-- )
-            {
-                char ch = _buf[ i ];
+            for (int cch = _lastEmitCch; cch > 0; cch--) {
+                char ch = _buf[i];
 
                 if (ch == '<')
-                    i = replace( i, "&lt;" );
+                    i = replace(i, "&lt;");
                 else if (ch == '&')
-                    i = replace( i, "&amp;" );
+                    i = replace(i, "&amp;");
                 else if (ch == '"')
-                    i = replace( i, "&quot;" );
-                else if (isEscapedChar( ch ))
-                {
+                    i = replace(i, "&quot;");
+                else if (isEscapedChar(ch)) {
                     if (replaceEscapedChar)
-                        i = replace( i, _replaceChar.getEscapedString( ch ) );
-                }
-                else
+                        i = replace(i, _replaceChar.getEscapedString(ch));
+                } else
                     i++;
 
                 if (i == _buf.length)
@@ -1483,8 +1384,7 @@
             }
         }
 
-        private void entitizeComment ( )
-        {
+        private void entitizeComment() {
             if (_lastEmitCch == 0)
                 return;
 
@@ -1492,28 +1392,21 @@
 
             boolean lastWasDash = false;
 
-            for ( int cch = _lastEmitCch ; cch > 0 ; cch-- )
-            {
-                char ch = _buf[ i ];
+            for (int cch = _lastEmitCch; cch > 0; cch--) {
+                char ch = _buf[i];
 
-                if (isBadChar( ch ))
-                    i = replace( i, "?" );
-                else if (ch == '-')
-                {
-                    if (lastWasDash)
-                    {
+                if (isBadChar(ch))
+                    i = replace(i, "?");
+                else if (ch == '-') {
+                    if (lastWasDash) {
                         // Replace "--" with "- " to make well formed
-                        i = replace( i, " " );
+                        i = replace(i, " ");
                         lastWasDash = false;
-                    }
-                    else
-                    {
+                    } else {
                         lastWasDash = true;
                         i++;
                     }
-                }
-                else
-                {
+                } else {
                     lastWasDash = false;
                     i++;
                 }
@@ -1526,12 +1419,11 @@
             // _lastEmitIn will still be ok
 
             int offset = (_lastEmitIn + _lastEmitCch - 1) % _buf.length;
-            if (_buf[ offset ] == '-')
-                i = replace( offset, " " );
+            if (_buf[offset] == '-')
+                i = replace(offset, " ");
         }
 
-        private void entitizeProcinst ( )
-        {
+        private void entitizeProcinst() {
             if (_lastEmitCch == 0)
                 return;
 
@@ -1539,25 +1431,21 @@
 
             boolean lastWasQuestion = false;
 
-            for ( int cch = _lastEmitCch ; cch > 0 ; cch-- )
-            {
-                char ch = _buf[ i ];
+            for (int cch = _lastEmitCch; cch > 0; cch--) {
+                char ch = _buf[i];
 
-                if (isBadChar( ch ))
-                    i = replace( i, "?" );
+                if (isBadChar(ch))
+                    i = replace(i, "?");
 
-                if (ch == '>')
-                {
-    // TODO - Had to convert to a space here ... imples not well formed XML
+                if (ch == '>') {
+                    // TODO - Had to convert to a space here ... imples not well formed XML
                     if (lastWasQuestion)
-                        i = replace( i, " " );
+                        i = replace(i, " ");
                     else
                         i++;
 
                     lastWasQuestion = false;
-                }
-                else
-                {
+                } else {
                     lastWasQuestion = ch == '?';
                     i++;
                 }
@@ -1570,27 +1458,24 @@
         /**
          * Test if a character is to be replaced with an escaped value
          */
-        private boolean isEscapedChar ( char ch )
-        {
-            return ( null != _replaceChar && _replaceChar.containsChar( ch ) );
+        private boolean isEscapedChar(char ch) {
+            return (null != _replaceChar && _replaceChar.containsChar(ch));
         }
 
-        private int replace ( int i, String replacement )
-        {
+        private int replace(int i, String replacement) {
             assert replacement.length() > 0;
 
             int dCch = replacement.length() - 1;
 
-            if (dCch == 0)
-            {
-                _buf[ i ] = replacement.charAt( 0 );
+            if (dCch == 0) {
+                _buf[i] = replacement.charAt(0);
                 return i + 1;
             }
 
             assert _free >= 0;
 
             if (dCch > _free)
-                i = resize( dCch, i );
+                i = resize(dCch, i);
 
             assert _free >= 0;
 
@@ -1599,52 +1484,44 @@
 
             int charsToCopy = dCch + 1;
 
-            if (_out > _in && i >= _out)
-            {
-                System.arraycopy( _buf, _out, _buf, _out - dCch, i - _out );
+            if (_out > _in && i >= _out) {
+                System.arraycopy(_buf, _out, _buf, _out - dCch, i - _out);
                 _out -= dCch;
                 i -= dCch;
-            }
-            else
-            {
+            } else {
                 assert i < _in;
                 int availableEndChunk = _buf.length - _in;
-                if ( dCch <= availableEndChunk )
-                {
-                    System.arraycopy( _buf, i, _buf, i + dCch, _in - i );
-                    _in = ( _in + dCch) % _buf.length;
-                }
-                else if ( dCch <= availableEndChunk + _in - i - 1 )
-                {
+                if (dCch <= availableEndChunk) {
+                    System.arraycopy(_buf, i, _buf, i + dCch, _in - i);
+                    _in = (_in + dCch) % _buf.length;
+                } else if (dCch <= availableEndChunk + _in - i - 1) {
                     int numToCopyToStart = dCch - availableEndChunk;
-                    System.arraycopy( _buf, _in-numToCopyToStart, _buf, 0, numToCopyToStart );
-                    System.arraycopy( _buf, i+1, _buf, i+1+dCch, _in-i-1-numToCopyToStart);
+                    System.arraycopy(_buf, _in - numToCopyToStart, _buf, 0, numToCopyToStart);
+                    System.arraycopy(_buf, i + 1, _buf, i + 1 + dCch, _in - i - 1 - numToCopyToStart);
 
                     _in = numToCopyToStart;
-                }
-                else
-                {
+                } else {
                     int numToCopyToStart = _in - i - 1;
                     charsToCopy = availableEndChunk + _in - i;
 
-                    System.arraycopy( _buf, _in-numToCopyToStart, _buf, dCch-charsToCopy+1, numToCopyToStart );
-                    replacement.getChars( charsToCopy, dCch + 1, _buf, 0);
+                    System.arraycopy(_buf, _in - numToCopyToStart, _buf, dCch - charsToCopy + 1, numToCopyToStart);
+                    replacement.getChars(charsToCopy, dCch + 1, _buf, 0);
 
                     _in = numToCopyToStart + dCch - charsToCopy + 1;
                 }
             }
 
-            replacement.getChars( 0, charsToCopy, _buf, i );
+            replacement.getChars(0, charsToCopy, _buf, i);
 
             _free -= dCch;
 
             assert _free >= 0;
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             return (i + dCch + 1) % _buf.length;
         }
@@ -1652,8 +1529,7 @@
         //
         //
 
-        private int ensure ( int cch )
-        {
+        private int ensure(int cch) {
             // Even if we're asked to ensure nothing, still try to ensure
             // atleast one character so we can determine if we're at the
             // end of the stream.
@@ -1663,7 +1539,7 @@
 
             int available = getAvailable();
 
-            for ( ; available < cch ; available = getAvailable() )
+            for (; available < cch; available = getAvailable())
                 if (!process())
                     break;
 
@@ -1675,53 +1551,45 @@
             return available;
         }
 
-        int getAvailable ( )
-        {
+        int getAvailable() {
             return _buf == null ? 0 : _buf.length - _free;
         }
 
-        private int resize ( int cch, int i )
-        {
+        private int resize(int cch, int i) {
             assert _free >= 0;
             assert cch > 0;
             assert cch >= _free;
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             int newLen = _buf == null ? _initialBufSize : _buf.length * 2;
             int used = getAvailable();
 
-            while ( newLen - used < cch )
+            while (newLen - used < cch)
                 newLen *= 2;
 
-            char[] newBuf = new char [ newLen ];
+            char[] newBuf = new char[newLen];
 
-            if (used > 0)
-            {
-                if (_in > _out)
-                {
+            if (used > 0) {
+                if (_in > _out) {
                     assert i == -1 || (i >= _out && i < _in);
-                    System.arraycopy( _buf, _out, newBuf, 0, used );
+                    System.arraycopy(_buf, _out, newBuf, 0, used);
                     i -= _out;
-                }
-                else
-                {
+                } else {
                     assert i == -1 || (i >= _out || i < _in);
-                    System.arraycopy( _buf, _out, newBuf, 0, used - _in );
-                    System.arraycopy( _buf, 0, newBuf, used - _in, _in );
+                    System.arraycopy(_buf, _out, newBuf, 0, used - _in);
+                    System.arraycopy(_buf, 0, newBuf, used - _in, _in);
                     i = i >= _out ? i - _out : i + _out;
                 }
 
                 _out = 0;
                 _in = used;
                 _free += newBuf.length - _buf.length;
-            }
-            else
-            {
+            } else {
                 _free = newBuf.length;
                 assert _in == 0 && _out == 0;
                 assert i == -1;
@@ -1730,47 +1598,45 @@
             _buf = newBuf;
 
             assert _free >= 0;
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             return i;
         }
 
-        public int read ( )
-        {
-            if (ensure( 1 ) == 0)
+        public int read() {
+            if (ensure(1) == 0)
                 return -1;
 
             assert getAvailable() > 0;
 
-            int ch = _buf[ _out ];
+            int ch = _buf[_out];
 
             _out = (_out + 1) % _buf.length;
             _free++;
 
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             return ch;
         }
 
-        public int read ( char[] cbuf, int off, int len )
-        {
+        public int read(char[] cbuf, int off, int len) {
             // Check for end of stream even if there is no way to return
             // characters because the Reader doc says to return -1 at end of
             // stream.
 
             int n;
 
-            if ((n = ensure( len )) == 0)
+            if ((n = ensure(len)) == 0)
                 return -1;
 
             if (cbuf == null || len <= 0)
@@ -1779,65 +1645,55 @@
             if (n < len)
                 len = n;
 
-            if (_out < _in)
-            {
-                System.arraycopy( _buf, _out, cbuf, off, len );
-            }
-            else
-            {
+            if (_out < _in) {
+                System.arraycopy(_buf, _out, cbuf, off, len);
+            } else {
                 int chunk = _buf.length - _out;
 
                 if (chunk >= len)
-                    System.arraycopy( _buf, _out, cbuf, off, len );
-                else
-                {
-                    System.arraycopy( _buf, _out, cbuf, off, chunk );
-                    System.arraycopy( _buf, 0, cbuf, off + chunk, len - chunk );
+                    System.arraycopy(_buf, _out, cbuf, off, len);
+                else {
+                    System.arraycopy(_buf, _out, cbuf, off, chunk);
+                    System.arraycopy(_buf, 0, cbuf, off + chunk, len - chunk);
                 }
             }
 
             _out = (_out + len) % _buf.length;
             _free += len;
 
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             assert _free >= 0;
 
             return len;
         }
 
-        public int write ( Writer writer, int cchMin )
-        {
-            while ( getAvailable() < cchMin)
-            {
+        public int write(Writer writer, int cchMin) {
+            while (getAvailable() < cchMin) {
                 if (!process())
                     break;
             }
 
             int charsAvailable = getAvailable();
 
-            if (charsAvailable > 0)
-            {
+            if (charsAvailable > 0) {
                 // I don't want to deal with the circular cases
 
                 assert _out == 0;
                 assert _in >= _out : "_in:" + _in + " < _out:" + _out;
                 assert _free == _buf.length - _in;
 
-                try
-                {
+                try {
 //System.out.println("-------------\nWriting in corverter: TextSaver.write():1703  " + charsAvailable + " chars\n" + new String(_buf, 0, charsAvailable));
-                    writer.write( _buf, 0, charsAvailable );
+                    writer.write(_buf, 0, charsAvailable);
                     writer.flush();
-                }
-                catch ( IOException e )
-                {
-                    throw new RuntimeException( e );
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
                 }
 
                 _free += charsAvailable;
@@ -1846,30 +1702,29 @@
 
                 _in = 0;
             }
-            assert _buf==null ||
-                (_out<_in && _free == _buf.length - ( _in - _out ) ) || // data in the middle, free on the edges
-                (_out>_in && _free == _out - _in ) ||                   // data on the edges, free in the middle
-                (_out==_in && _free == _buf.length) ||                  // no data, all buffer free
-                (_out==_in && _free == 0)                               // buffer full
-                : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
+            assert _buf == null ||
+                    (_out < _in && _free == _buf.length - (_in - _out)) || // data in the middle, free on the edges
+                    (_out > _in && _free == _out - _in) ||                   // data on the edges, free in the middle
+                    (_out == _in && _free == _buf.length) ||                  // no data, all buffer free
+                    (_out == _in && _free == 0)                               // buffer full
+                    : "_buf.length:" + _buf.length + " _in:" + _in + " _out:" + _out + " _free:" + _free;
 
             return charsAvailable;
         }
 
-        public String saveToString ( )
-        {
+        public String saveToString() {
             // We're gonna build a string.  Instead of using StringBuffer, may
             // as well use my buffer here.  Fill the whole sucker up and
             // create a String!
 
-            while ( process() )
+            while (process())
                 ;
 
             assert _out == 0;
 
             int available = getAvailable();
 
-            return available == 0 ? "" : new String( _buf, _out, available );
+            return available == 0 ? "" : new String(_buf, _out, available);
         }
 
         //
@@ -1885,9 +1740,9 @@
         private int _lastEmitIn;
         private int _lastEmitCch;
 
-        private int    _free;
-        private int    _in;
-        private int    _out;
+        private int _free;
+        private int _in;
+        private int _out;
         private char[] _buf;
         /*
         _buf is a circular buffer, useful data is before _in up to _out, there are 2 posible configurations:
@@ -1898,257 +1753,212 @@
     }
 
     static final class OptimizedForSpeedSaver
-        extends Saver
-    {
+            extends Saver {
         Writer _w;
         private char[] _buf = new char[1024];
 
 
         static private class SaverIOException
-            extends RuntimeException
-        {
-            SaverIOException(IOException e)
-            {
+                extends RuntimeException {
+            SaverIOException(IOException e) {
                 super(e);
             }
         }
 
 
-        OptimizedForSpeedSaver(Cur cur, Writer writer)
-        {
+        OptimizedForSpeedSaver(Cur cur, Writer writer) {
             super(cur, XmlOptions.maskNull(null));
             _w = writer;
         }
 
         static void save(Cur cur, Writer writer)
-            throws IOException
-        {
-            try
-            {
+                throws IOException {
+            try {
                 Saver saver = new OptimizedForSpeedSaver(cur, writer);
-                while(saver.process())
-                {}
-            }
-            catch (SaverIOException e)
-            {
-                throw (IOException)e.getCause();
+                while (saver.process()) {
+                }
+            } catch (SaverIOException e) {
+                throw (IOException) e.getCause();
             }
         }
 
-        private void emit(String s)
-        {
-            try
-            {
+        private void emit(String s) {
+            try {
                 _w.write(s);
-            }
-            catch (IOException e)
-            {
+            } catch (IOException e) {
                 throw new SaverIOException(e);
             }
         }
 
-        private void emit(char c)
-        {
-            try
-            {
+        private void emit(char c) {
+            try {
                 _buf[0] = c;
                 _w.write(_buf, 0, 1);
-            }
-            catch (IOException e)
-            {
+            } catch (IOException e) {
                 throw new SaverIOException(e);
             }
         }
 
-        private void emit(char c1, char c2)
-        {
-            try
-            {
+        private void emit(char c1, char c2) {
+            try {
                 _buf[0] = c1;
                 _buf[1] = c2;
-                _w.write(_buf, 0 , 2);
-            }
-            catch (IOException e)
-            {
+                _w.write(_buf, 0, 2);
+            } catch (IOException e) {
                 throw new SaverIOException(e);
             }
         }
 
-        private void emit(char[] buf, int start, int len)
-        {
-            try
-            {
+        private void emit(char[] buf, int start, int len) {
+            try {
                 _w.write(buf, start, len);
-            }
-            catch (IOException e)
-            {
+            } catch (IOException e) {
                 throw new SaverIOException(e);
             }
         }
 
-        protected boolean emitElement ( SaveCur c, ArrayList attrNames, ArrayList attrValues )
-        {
+        protected boolean emitElement(SaveCur c, ArrayList attrNames, ArrayList attrValues) {
             assert c.isElem();
 
-            emit( '<' );
-            emitName( c.getName(), false );
+            emit('<');
+            emitName(c.getName(), false);
 
-            for ( int i = 0 ; i < attrNames.size() ; i++ )
-                emitAttrHelper( (QName) attrNames.get( i ), (String) attrValues.get( i ) );
+            for (int i = 0; i < attrNames.size(); i++)
+                emitAttrHelper((QName) attrNames.get(i), (String) attrValues.get(i));
 
             if (!saveNamespacesFirst())
                 emitNamespacesHelper();
 
-            if (!c.hasChildren() && !c.hasText())
-            {
-                emit( '/', '>' );
+            if (!c.hasChildren() && !c.hasText()) {
+                emit('/', '>');
                 return true;
-            }
-            else
-            {
-                emit( '>' );
+            } else {
+                emit('>');
                 return false;
             }
         }
 
-        protected void emitFinish ( SaveCur c )
-        {
-            emit( '<', '/' );
-            emitName( c.getName(), false );
-            emit( '>' );
+        protected void emitFinish(SaveCur c) {
+            emit('<', '/');
+            emitName(c.getName(), false);
+            emit('>');
         }
 
-        protected void emitXmlns ( String prefix, String uri )
-        {
+        protected void emitXmlns(String prefix, String uri) {
             assert prefix != null;
             assert uri != null;
 
-            emit( "xmlns" );
+            emit("xmlns");
 
-            if (prefix.length() > 0)
-            {
-                emit( ':' );
-                emit( prefix );
+            if (prefix.length() > 0) {
+                emit(':');
+                emit(prefix);
             }
 
-            emit( '=', '\"' );
+            emit('=', '\"');
 
             // TODO - must encode uri properly
             emitAttrValue(uri);
 
-            emit( '"' );
+            emit('"');
         }
 
-        private void emitNamespacesHelper ( )
-        {
-            for ( iterateMappings() ; hasMapping() ; nextMapping() )
-            {
-                emit( ' ' );
-                emitXmlns( mappingPrefix(), mappingUri() );
+        private void emitNamespacesHelper() {
+            for (iterateMappings(); hasMapping(); nextMapping()) {
+                emit(' ');
+                emitXmlns(mappingPrefix(), mappingUri());
             }
         }
 
-        private void emitAttrHelper ( QName attrName, String attrValue )
-        {
-            emit( ' ' );
-            emitName( attrName, true );
-            emit( '=', '\"' );
+        private void emitAttrHelper(QName attrName, String attrValue) {
+            emit(' ');
+            emitName(attrName, true);
+            emit('=', '\"');
             emitAttrValue(attrValue);
 
-            emit( '"' );
+            emit('"');
         }
 
-        protected void emitComment ( SaveCur c )
-        {
+        protected void emitComment(SaveCur c) {
             assert c.isComment();
 
-            emit( "<!--" );
+            emit("<!--");
 
             c.push();
             c.next();
 
-            emitCommentText( c );
+            emitCommentText(c);
 
             c.pop();
 
-            emit( "-->" );
+            emit("-->");
         }
 
-        protected void emitProcinst ( SaveCur c )
-        {
+        protected void emitProcinst(SaveCur c) {
             assert c.isProcinst();
 
-            emit( "<?" );
+            emit("<?");
 
             // TODO - encoding issues here?
-            emit( c.getName().getLocalPart() );
+            emit(c.getName().getLocalPart());
 
             c.push();
 
             c.next();
 
-            if (c.isText())
-            {
-                emit( ' ' );
-                emitPiText( c );
+            if (c.isText()) {
+                emit(' ');
+                emitPiText(c);
             }
 
             c.pop();
 
-            emit( "?>" );
+            emit("?>");
         }
 
-        protected void emitDocType ( String docTypeName, String publicId, String systemId )
-        {
+        protected void emitDocType(String docTypeName, String publicId, String systemId) {
             assert docTypeName != null;
 
-            emit( "<!DOCTYPE " );
-            emit( docTypeName );
+            emit("<!DOCTYPE ");
+            emit(docTypeName);
 
-            if (publicId == null && systemId != null)
-            {
-                emit( " SYSTEM " );
-                emitLiteral( systemId );
-            }
-            else if (publicId != null)
-            {
-                emit( " PUBLIC " );
-                emitLiteral( publicId );
+            if (publicId == null && systemId != null) {
+                emit(" SYSTEM ");
+                emitLiteral(systemId);
+            } else if (publicId != null) {
+                emit(" PUBLIC ");
+                emitLiteral(publicId);
                 emit(' ');
-                emitLiteral( systemId );
+                emitLiteral(systemId);
             }
 
-            emit( '>' );
-            emit( _newLine );
+            emit('>');
+            emit(_newLine);
         }
 
-        protected void emitStartDoc ( SaveCur c )
-        {
+        protected void emitStartDoc(SaveCur c) {
         }
 
-        protected void emitEndDoc ( SaveCur c )
-        {
+        protected void emitEndDoc(SaveCur c) {
         }
 
         //
         //
         //
 
-        private void emitName ( QName name, boolean needsPrefix )
-        {
+        private void emitName(QName name, boolean needsPrefix) {
             assert name != null;
 
             String uri = name.getNamespaceURI();
 
             assert uri != null;
 
-            if (uri.length() != 0)
-            {
+            if (uri.length() != 0) {
                 String prefix = name.getPrefix();
-                String mappedUri = getNamespaceForPrefix( prefix );
+                String mappedUri = getNamespaceForPrefix(prefix);
 
-                if (mappedUri == null || !mappedUri.equals( uri ))
-                    prefix = getUriMapping( uri );
+                if (mappedUri == null || !mappedUri.equals(uri))
+                    prefix = getUriMapping(uri);
 
                 // Attrs need a prefix.  If I have not found one, then there must be a default
                 // prefix obscuring the prefix needed for this attr.  Find it manually.
@@ -2158,59 +1968,51 @@
                 // here
 
                 if (needsPrefix && prefix.length() == 0)
-                    prefix = getNonDefaultUriMapping( uri );
+                    prefix = getNonDefaultUriMapping(uri);
 
-                if (prefix.length() > 0)
-                {
-                    emit( prefix );
-                    emit( ':' );
+                if (prefix.length() > 0) {
+                    emit(prefix);
+                    emit(':');
                 }
             }
 
             assert name.getLocalPart().length() > 0;
 
-            emit( name.getLocalPart() );
+            emit(name.getLocalPart());
         }
 
-        private void emitAttrValue ( CharSequence attVal)
-        {
+        private void emitAttrValue(CharSequence attVal) {
             int len = attVal.length();
 
-            for ( int i = 0; i<len ; i++ )
-            {
+            for (int i = 0; i < len; i++) {
                 char ch = attVal.charAt(i);
 
                 if (ch == '<')
-                    emit( "&lt;" );
+                    emit("&lt;");
                 else if (ch == '&')
-                    emit( "&amp;" );
+                    emit("&amp;");
                 else if (ch == '"')
-                    emit( "&quot;" );
+                    emit("&quot;");
                 else
                     emit(ch);
             }
         }
 
-        private void emitLiteral ( String literal )
-        {
+        private void emitLiteral(String literal) {
             // TODO: systemId production http://www.w3.org/TR/REC-xml/#NT-SystemLiteral
             // TODO: publicId production http://www.w3.org/TR/REC-xml/#NT-PubidLiteral
-            if (literal.indexOf( "\"" ) < 0)
-            {
-                emit( '\"' );
-                emit( literal );
-                emit( '\"' );
-            }
-            else
-            {
-                emit( '\'' );
-                emit( literal );
-                emit( '\'' );
+            if (literal.indexOf("\"") < 0) {
+                emit('\"');
+                emit(literal);
+                emit('\"');
+            } else {
+                emit('\'');
+                emit(literal);
+                emit('\'');
             }
         }
 
-        protected void emitText ( SaveCur c )
-        {
+        protected void emitText(SaveCur c) {
             assert c.isText();
 
             Object src = c.getChars();
@@ -2218,17 +2020,15 @@
             int off = c._offSrc;
             int index = 0;
             int indexLimit = 0;
-            while( index<cch )
-            {
+            while (index < cch) {
                 indexLimit = index + 512 > cch ? cch : index + 512;
-                CharUtil.getChars( _buf, 0, src, off+index, indexLimit-index );
-                entitizeAndWriteText(indexLimit-index);
+                CharUtil.getChars(_buf, 0, src, off + index, indexLimit - index);
+                entitizeAndWriteText(indexLimit - index);
                 index = indexLimit;
             }
         }
 
-        protected void emitPiText ( SaveCur c )
-        {
+        protected void emitPiText(SaveCur c) {
             assert c.isText();
 
             Object src = c.getChars();
@@ -2236,17 +2036,15 @@
             int off = c._offSrc;
             int index = 0;
             int indexLimit = 0;
-            while( index<cch )
-            {
+            while (index < cch) {
                 indexLimit = index + 512 > cch ? cch : 512;
-                CharUtil.getChars( _buf, 0, src, off+index, indexLimit );
-                entitizeAndWritePIText(indexLimit-index);
+                CharUtil.getChars(_buf, 0, src, off + index, indexLimit);
+                entitizeAndWritePIText(indexLimit - index);
                 index = indexLimit;
             }
         }
 
-        protected void emitCommentText ( SaveCur c )
-        {
+        protected void emitCommentText(SaveCur c) {
             assert c.isText();
 
             Object src = c.getChars();
@@ -2254,63 +2052,51 @@
             int off = c._offSrc;
             int index = 0;
             int indexLimit = 0;
-            while( index<cch )
-            {
+            while (index < cch) {
                 indexLimit = index + 512 > cch ? cch : 512;
-                CharUtil.getChars( _buf, 0, src, off+index, indexLimit );
-                entitizeAndWriteCommentText(indexLimit-index);
+                CharUtil.getChars(_buf, 0, src, off + index, indexLimit);
+                entitizeAndWriteCommentText(indexLimit - index);
                 index = indexLimit;
             }
         }
 
-        private void entitizeAndWriteText(int bufLimit)
-        {
+        private void entitizeAndWriteText(int bufLimit) {
             int index = 0;
-            for (int i = 0; i < bufLimit; i++)
-            {
+            for (int i = 0; i < bufLimit; i++) {
                 char c = _buf[i];
-                switch(c)
-                {
-                case '<':
-                    emit(_buf, index, i-index);
-                    emit("&lt;");
-                    index = i+1;
-                    break;
-                case '&':
-                    emit(_buf, index, i-index);
-                    emit("&amp;");
-                    index = i+1;
-                    break;
+                switch (c) {
+                    case '<':
+                        emit(_buf, index, i - index);
+                        emit("&lt;");
+                        index = i + 1;
+                        break;
+                    case '&':
+                        emit(_buf, index, i - index);
+                        emit("&amp;");
+                        index = i + 1;
+                        break;
                 }
             }
-            emit(_buf, index, bufLimit-index);
+            emit(_buf, index, bufLimit - index);
         }
 
-        private void entitizeAndWriteCommentText ( int bufLimit )
-        {
+        private void entitizeAndWriteCommentText(int bufLimit) {
             boolean lastWasDash = false;
 
-            for ( int i=0 ; i<bufLimit ; i++ )
-            {
-                char ch = _buf[ i ];
+            for (int i = 0; i < bufLimit; i++) {
+                char ch = _buf[i];
 
-                if (isBadChar( ch ))
+                if (isBadChar(ch))
                     _buf[i] = '?';
-                else if (ch == '-')
-                {
-                    if (lastWasDash)
-                    {
+                else if (ch == '-') {
+                    if (lastWasDash) {
                         // Replace "--" with "- " to make well formed
                         _buf[i] = ' ';
                         lastWasDash = false;
-                    }
-                    else
-                    {
+                    } else {
                         lastWasDash = true;
                     }
-                }
-                else
-                {
+                } else {
                     lastWasDash = false;
                 }
 
@@ -2318,36 +2104,30 @@
                     i = 0;
             }
 
-            if (_buf[ bufLimit-1 ] == '-')
-                _buf[ bufLimit-1 ] = ' ';
+            if (_buf[bufLimit - 1] == '-')
+                _buf[bufLimit - 1] = ' ';
 
             emit(_buf, 0, bufLimit);
         }
 
-        private void entitizeAndWritePIText(int bufLimit)
-        {
+        private void entitizeAndWritePIText(int bufLimit) {
             boolean lastWasQuestion = false;
 
-            for ( int i=0 ; i<bufLimit ; i++ )
-            {
-                char ch = _buf[ i ];
+            for (int i = 0; i < bufLimit; i++) {
+                char ch = _buf[i];
 
-                if (isBadChar( ch ))
-                {
+                if (isBadChar(ch)) {
                     _buf[i] = '?';
                     ch = '?';
                 }
 
-                if (ch == '>')
-                {
+                if (ch == '>') {
                     // Had to convert to a space here ... imples not well formed XML
                     if (lastWasQuestion)
                         _buf[i] = ' ';
 
                     lastWasQuestion = false;
-                }
-                else
-                {
+                } else {
                     lastWasQuestion = ch == '?';
                 }
             }
@@ -2355,144 +2135,196 @@
         }
     }
 
-    static final class TextReader extends Reader
-    {
-        TextReader ( Cur c, XmlOptions options )
-        {
-            _textSaver = new TextSaver( c, options, null );
+    static final class TextReader extends Reader {
+        TextReader(Cur c, XmlOptions options) {
+            _textSaver = new TextSaver(c, options, null);
             _locale = c._locale;
             _closed = false;
         }
 
-        public void close ( ) throws IOException { _closed = true; }
-
-        public boolean ready ( ) throws IOException { return !_closed; }
-
-        public int read ( ) throws IOException
-        {
-            checkClosed();
-
-            if (_locale.noSync())         { _locale.enter(); try { return _textSaver.read(); } finally { _locale.exit(); } }
-            else synchronized ( _locale ) { _locale.enter(); try { return _textSaver.read(); } finally { _locale.exit(); } }
+        public void close() throws IOException {
+            _closed = true;
         }
 
-        public int read ( char[] cbuf ) throws IOException
-        {
-            checkClosed();
-
-            if (_locale.noSync())         { _locale.enter(); try { return _textSaver.read( cbuf, 0, cbuf == null ? 0 : cbuf.length ); } finally { _locale.exit(); } }
-            else synchronized ( _locale ) { _locale.enter(); try { return _textSaver.read( cbuf, 0, cbuf == null ? 0 : cbuf.length ); } finally { _locale.exit(); } }
+        public boolean ready() throws IOException {
+            return !_closed;
         }
 
-        public int read ( char[] cbuf, int off, int len ) throws IOException
-        {
+        public int read() throws IOException {
             checkClosed();
 
-            if (_locale.noSync())         { _locale.enter(); try { return _textSaver.read( cbuf, off, len ); } finally { _locale.exit(); } }
-            else synchronized ( _locale ) { _locale.enter(); try { return _textSaver.read( cbuf, off, len ); } finally { _locale.exit(); } }
+            if (_locale.noSync()) {
+                _locale.enter();
+                try {
+                    return _textSaver.read();
+                } finally {
+                    _locale.exit();
+                }
+            } else synchronized (_locale) {
+                _locale.enter();
+                try {
+                    return _textSaver.read();
+                } finally {
+                    _locale.exit();
+                }
+            }
         }
 
-        private void checkClosed ( ) throws IOException
-        {
+        public int read(char[] cbuf) throws IOException {
+            checkClosed();
+
+            if (_locale.noSync()) {
+                _locale.enter();
+                try {
+                    return _textSaver.read(cbuf, 0, cbuf == null ? 0 : cbuf.length);
+                } finally {
+                    _locale.exit();
+                }
+            } else synchronized (_locale) {
+                _locale.enter();
+                try {
+                    return _textSaver.read(cbuf, 0, cbuf == null ? 0 : cbuf.length);
+                } finally {
+                    _locale.exit();
+                }
+            }
+        }
+
+        public int read(char[] cbuf, int off, int len) throws IOException {
+            checkClosed();
+
+            if (_locale.noSync()) {
+                _locale.enter();
+                try {
+                    return _textSaver.read(cbuf, off, len);
+                } finally {
+                    _locale.exit();
+                }
+            } else synchronized (_locale) {
+                _locale.enter();
+                try {
+                    return _textSaver.read(cbuf, off, len);
+                } finally {
+                    _locale.exit();
+                }
+            }
+        }
+
+        private void checkClosed() throws IOException {
             if (_closed)
-                throw new IOException( "Reader has been closed" );
+                throw new IOException("Reader has been closed");
         }
 
-        private Locale    _locale;
+        private Locale _locale;
         private TextSaver _textSaver;
-        private boolean   _closed;
+        private boolean _closed;
     }
 
-    static final class InputStreamSaver extends InputStream
-    {
-        InputStreamSaver ( Cur c, XmlOptions options )
-        {
+    static final class InputStreamSaver extends InputStream {
+        InputStreamSaver(Cur c, XmlOptions options) {
             _locale = c._locale;
 
             _closed = false;
 
             assert _locale.entered();
 
-            options = XmlOptions.maskNull( options );
+            options = XmlOptions.maskNull(options);
 
             _outStreamImpl = new OutputStreamImpl();
 
             String encoding = null;
 
-            XmlDocumentProperties props = Locale.getDocProps( c, false );
+            XmlDocumentProperties props = Locale.getDocProps(c, false);
 
             if (props != null && props.getEncoding() != null)
-                encoding = EncodingMap.getIANA2JavaMapping( props.getEncoding() );
+                encoding = EncodingMap.getIANA2JavaMapping(props.getEncoding());
 
-            if (options.hasOption( XmlOptions.CHARACTER_ENCODING ))
-                encoding = (String) options.get( XmlOptions.CHARACTER_ENCODING );
+            if (options.hasOption(XmlOptions.CHARACTER_ENCODING))
+                encoding = (String) options.get(XmlOptions.CHARACTER_ENCODING);
 
-            if (encoding != null)
-            {
-                String ianaEncoding = EncodingMap.getJava2IANAMapping( encoding );
+            if (encoding != null) {
+                String ianaEncoding = EncodingMap.getJava2IANAMapping(encoding);
 
                 if (ianaEncoding != null)
                     encoding = ianaEncoding;
             }
 
             if (encoding == null)
-                encoding = EncodingMap.getJava2IANAMapping( "UTF8" );
+                encoding = EncodingMap.getJava2IANAMapping("UTF8");
 
-            String javaEncoding = EncodingMap.getIANA2JavaMapping( encoding );
+            String javaEncoding = EncodingMap.getIANA2JavaMapping(encoding);
 
             if (javaEncoding == null)
-                throw new IllegalStateException( "Unknown encoding: " + encoding );
+                throw new IllegalStateException("Unknown encoding: " + encoding);
 
-            try
-            {
-                _converter = new OutputStreamWriter( _outStreamImpl, javaEncoding );
-            }
-            catch ( UnsupportedEncodingException e )
-            {
-                throw new RuntimeException( e );
+            try {
+                _converter = new OutputStreamWriter(_outStreamImpl, javaEncoding);
+            } catch (UnsupportedEncodingException e) {
+                throw new RuntimeException(e);
             }
 
-            _textSaver = new TextSaver( c, options, encoding );
+            _textSaver = new TextSaver(c, options, encoding);
         }
 
-        public void close ( ) throws IOException
-        {
+        public void close() throws IOException {
             _closed = true;
         }
 
-        private void checkClosed ( ) throws IOException
-        {
+        private void checkClosed() throws IOException {
             if (_closed)
-                throw new IOException( "Stream closed" );
+                throw new IOException("Stream closed");
         }
 
         // Having the gateway here is kinda slow for the single character case.  It may be possible
         // to only enter the gate when there are no chars in the buffer.
 
-        public int read ( ) throws IOException
-        {
+        public int read() throws IOException {
             checkClosed();
 
-            if (_locale.noSync())         { _locale.enter(); try { return _outStreamImpl.read(); } finally { _locale.exit(); } }
-            else synchronized ( _locale ) { _locale.enter(); try { return _outStreamImpl.read(); } finally { _locale.exit(); } }
+            if (_locale.noSync()) {
+                _locale.enter();
+                try {
+                    return _outStreamImpl.read();
+                } finally {
+                    _locale.exit();
+                }
+            } else synchronized (_locale) {
+                _locale.enter();
+                try {
+                    return _outStreamImpl.read();
+                } finally {
+                    _locale.exit();
+                }
+            }
         }
 
-        public int read ( byte[] bbuf, int off, int len ) throws IOException
-        {
+        public int read(byte[] bbuf, int off, int len) throws IOException {
             checkClosed();
 
             if (bbuf == null)
-                throw new NullPointerException( "buf to read into is null" );
+                throw new NullPointerException("buf to read into is null");
 
             if (off < 0 || off > bbuf.length)
-                throw new IndexOutOfBoundsException( "Offset is not within buf" );
+                throw new IndexOutOfBoundsException("Offset is not within buf");
 
-            if (_locale.noSync())         { _locale.enter(); try { return _outStreamImpl.read( bbuf, off, len ); } finally { _locale.exit(); } }
-            else synchronized ( _locale ) { _locale.enter(); try { return _outStreamImpl.read( bbuf, off, len ); } finally { _locale.exit(); } }
+            if (_locale.noSync()) {
+                _locale.enter();
+                try {
+                    return _outStreamImpl.read(bbuf, off, len);
+                } finally {
+                    _locale.exit();
+                }
+            } else synchronized (_locale) {
+                _locale.enter();
+                try {
+                    return _outStreamImpl.read(bbuf, off, len);
+                } finally {
+                    _locale.exit();
+                }
+            }
         }
 
-        private int ensure ( int cbyte )
-        {
+        private int ensure(int cbyte) {
             // Even if we're asked to ensure nothing, still try to ensure
             // atleast one byte so we can determine if we're at the
             // end of the stream.
@@ -2502,10 +2334,9 @@
 
             int bytesAvailable = _outStreamImpl.getAvailable();
 
-            for ( ; bytesAvailable < cbyte ;
-                  bytesAvailable = _outStreamImpl.getAvailable() )
-            {
-                if (_textSaver.write( _converter, 2048 ) < 2048)
+            for (; bytesAvailable < cbyte;
+                 bytesAvailable = _outStreamImpl.getAvailable()) {
+                if (_textSaver.write(_converter, 2048) < 2048)
                     break;
             }
 
@@ -2518,27 +2349,33 @@
         }
 
         public int available()
-            throws IOException
-        {
-            if (_locale.noSync())
-                { _locale.enter(); try {
+                throws IOException {
+            if (_locale.noSync()) {
+                _locale.enter();
+                try {
                     return ensure(1024);
-                } finally { _locale.exit(); } }
-            else
-                synchronized ( _locale )
-                { _locale.enter(); try { return ensure(1024); } finally { _locale.exit(); } }
+                } finally {
+                    _locale.exit();
+                }
+            } else
+                synchronized (_locale) {
+                    _locale.enter();
+                    try {
+                        return ensure(1024);
+                    } finally {
+                        _locale.exit();
+                    }
+                }
         }
 
-        private final class OutputStreamImpl extends OutputStream
-        {
-            int read ( )
-            {
-                if (InputStreamSaver.this.ensure( 1 ) == 0)
+        private final class OutputStreamImpl extends OutputStream {
+            int read() {
+                if (InputStreamSaver.this.ensure(1) == 0)
                     return -1;
 
                 assert getAvailable() > 0;
 
-                int bite = _buf[ _out ];
+                int bite = _buf[_out];
 
                 _out = (_out + 1) % _buf.length;
                 _free++;
@@ -2546,15 +2383,14 @@
                 return bite;
             }
 
-            int read ( byte[] bbuf, int off, int len )
-            {
+            int read(byte[] bbuf, int off, int len) {
                 // Check for end of stream even if there is no way to return
                 // characters because the Reader doc says to return -1 at end of
                 // stream.
 
                 int n;
 
-                if ((n = ensure( len )) == 0)
+                if ((n = ensure(len)) == 0)
                     return -1;
 
                 if (bbuf == null || len <= 0)
@@ -2563,22 +2399,18 @@
                 if (n < len)
                     len = n;
 
-                if (_out < _in)
-                {
-                    System.arraycopy( _buf, _out, bbuf, off, len );
-                }
-                else
-                {
+                if (_out < _in) {
+                    System.arraycopy(_buf, _out, bbuf, off, len);
+                } else {
                     int chunk = _buf.length - _out;
 
                     if (chunk >= len)
-                        System.arraycopy( _buf, _out, bbuf, off, len );
-                    else
-                    {
-                        System.arraycopy( _buf, _out, bbuf, off, chunk );
+                        System.arraycopy(_buf, _out, bbuf, off, len);
+                    else {
+                        System.arraycopy(_buf, _out, bbuf, off, chunk);
 
                         System.arraycopy(
-                            _buf, 0, bbuf, off + chunk, len - chunk );
+                                _buf, 0, bbuf, off + chunk, len - chunk);
                     }
                 }
                 _out = (_out + len) % _buf.length;
@@ -2588,36 +2420,32 @@
                 return len;
             }
 
-            int getAvailable ( )
-            {
+            int getAvailable() {
                 return _buf == null ? 0 : _buf.length - _free;
             }
 
-            public void write ( int bite )
-            {
+            public void write(int bite) {
                 if (_free == 0)
-                    resize( 1 );
+                    resize(1);
 
                 assert _free > 0;
 
-                _buf[ _in ] = (byte) bite;
+                _buf[_in] = (byte) bite;
 
                 _in = (_in + 1) % _buf.length;
                 _free--;
             }
 
-            public void write ( byte[] buf, int off, int cbyte )
-            {
+            public void write(byte[] buf, int off, int cbyte) {
                 assert cbyte >= 0;
 //System.out.println("---------\nAfter converter, write in queue: OutputStreamImpl.write():Saver:2469  " + cbyte + " bytes \n" + new String(buf, off, cbyte));
                 if (cbyte == 0)
                     return;
 
                 if (_free < cbyte)
-                    resize( cbyte );
+                    resize(cbyte);
 
-                if (_in == _out)
-                {
+                if (_in == _out) {
                     assert getAvailable() == 0;
                     assert _free == _buf.length - getAvailable();
                     _in = _out = 0;
@@ -2625,17 +2453,14 @@
 
                 int chunk = _buf.length - _in;
 
-                if (_in <= _out || cbyte < chunk)
-                {
-                    System.arraycopy( buf, off, _buf, _in, cbyte );
+                if (_in <= _out || cbyte < chunk) {
+                    System.arraycopy(buf, off, _buf, _in, cbyte);
                     _in += cbyte;
-                }
-                else
-                {
-                    System.arraycopy( buf, off, _buf, _in, chunk );
+                } else {
+                    System.arraycopy(buf, off, _buf, _in, chunk);
 
                     System.arraycopy(
-                        buf, off + chunk, _buf, 0, cbyte - chunk );
+                            buf, off + chunk, _buf, 0, cbyte - chunk);
 
                     _in = (_in + cbyte) % _buf.length;
                 }
@@ -2643,37 +2468,32 @@
                 _free -= cbyte;
             }
 
-            void resize ( int cbyte )
-            {
+            void resize(int cbyte) {
                 assert cbyte > _free : cbyte + " !> " + _free;
 
                 int newLen = _buf == null ? _initialBufSize : _buf.length * 2;
                 int used = getAvailable();
 
-                while ( newLen - used < cbyte )
+                while (newLen - used < cbyte)
                     newLen *= 2;
 
-                byte[] newBuf = new byte [ newLen ];
+                byte[] newBuf = new byte[newLen];
 
-                if (used > 0)
-                {
+                if (used > 0) {
                     if (_in > _out)
-                        System.arraycopy( _buf, _out, newBuf, 0, used );
-                    else
-                    {
+                        System.arraycopy(_buf, _out, newBuf, 0, used);
+                    else {
                         System.arraycopy(
-                            _buf, _out, newBuf, 0, used - _in );
+                                _buf, _out, newBuf, 0, used - _in);
 
                         System.arraycopy(
-                            _buf, 0, newBuf, used - _in, _in );
+                                _buf, 0, newBuf, used - _in, _in);
                     }
 
                     _out = 0;
                     _in = used;
                     _free += newBuf.length - _buf.length;
-                }
-                else
-                {
+                } else {
                     _free = newBuf.length;
                     assert _in == _out;
                 }
@@ -2683,44 +2503,39 @@
 
             private static final int _initialBufSize = 4096;
 
-            private int    _free;
-            private int    _in;
-            private int    _out;
+            private int _free;
+            private int _in;
+            private int _out;
             private byte[] _buf;
         }
 
-        private Locale             _locale;
-        private boolean            _closed;
-        private OutputStreamImpl   _outStreamImpl;
-        private TextSaver          _textSaver;
+        private Locale _locale;
+        private boolean _closed;
+        private OutputStreamImpl _outStreamImpl;
+        private TextSaver _textSaver;
         private OutputStreamWriter _converter;
     }
 
-    static final class XmlInputStreamSaver extends Saver
-    {
-        XmlInputStreamSaver ( Cur c, XmlOptions options )
-        {
-            super( c, options );
+    static final class XmlInputStreamSaver extends Saver {
+        XmlInputStreamSaver(Cur c, XmlOptions options) {
+            super(c, options);
         }
 
-        protected boolean emitElement(SaveCur c, ArrayList attrNames, ArrayList attrValues)
-        {
+        protected boolean emitElement(SaveCur c, ArrayList attrNames, ArrayList attrValues) {
             assert c.isElem();
 
-            for ( iterateMappings() ; hasMapping() ; nextMapping() )
-            {
-                enqueue( new StartPrefixMappingImpl( mappingPrefix(), mappingUri() ) );
+            for (iterateMappings(); hasMapping(); nextMapping()) {
+                enqueue(new StartPrefixMappingImpl(mappingPrefix(), mappingUri()));
             }
 
             StartElementImpl.AttributeImpl lastAttr = null;
             StartElementImpl.AttributeImpl attributes = null;
             StartElementImpl.AttributeImpl namespaces = null;
 
-            for ( int i=0; i<attrNames.size(); i++ )
-            {
-                XMLName attXMLName = computeName((QName)attrNames.get(i), this, true);
+            for (int i = 0; i < attrNames.size(); i++) {
+                XMLName attXMLName = computeName((QName) attrNames.get(i), this, true);
                 StartElementImpl.AttributeImpl attr =
-                    new StartElementImpl.NormalAttributeImpl(attXMLName, (String)attrValues.get(i) );
+                        new StartElementImpl.NormalAttributeImpl(attXMLName, (String) attrValues.get(i));
 
                 if (attributes == null)
                     attributes = attr;
@@ -2732,13 +2547,12 @@
 
             lastAttr = null;
 
-            for ( iterateMappings() ; hasMapping() ; nextMapping() )
-            {
+            for (iterateMappings(); hasMapping(); nextMapping()) {
                 String prefix = mappingPrefix();
                 String uri = mappingUri();
 
                 StartElementImpl.AttributeImpl attr =
-                    new StartElementImpl.XmlnsAttributeImpl(prefix, uri);
+                        new StartElementImpl.XmlnsAttributeImpl(prefix, uri);
 
                 if (namespaces == null)
                     namespaces = attr;
@@ -2750,77 +2564,64 @@
 
 
             QName name = c.getName();
-            enqueue( new StartElementImpl( computeName(name, this, false), attributes, namespaces, getPrefixMap() ) );
+            enqueue(new StartElementImpl(computeName(name, this, false), attributes, namespaces, getPrefixMap()));
 
             return false;  // still need to be called on end element
         }
 
-        protected void emitFinish(SaveCur c)
-        {
+        protected void emitFinish(SaveCur c) {
             if (c.isRoot())
-                enqueue( new EndDocumentImpl(  ) );
-            else
-            {
+                enqueue(new EndDocumentImpl());
+            else {
                 XMLName xmlName = computeName(c.getName(), this, false);
-                enqueue( new EndElementImpl( xmlName ) );
+                enqueue(new EndElementImpl(xmlName));
             }
 
             emitEndPrefixMappings();
         }
 
-        protected void emitText(SaveCur c)
-        {
+        protected void emitText(SaveCur c) {
             assert c.isText();
             Object src = c.getChars();
             int cch = c._cchSrc;
             int off = c._offSrc;
 
-            enqueue( new CharacterDataImpl( src, cch, off ) );
+            enqueue(new CharacterDataImpl(src, cch, off));
         }
 
-        protected void emitComment(SaveCur c)
-        {
-            enqueue( new CommentImpl( c.getChars(), c._cchSrc, c._offSrc ) );
+        protected void emitComment(SaveCur c) {
+            enqueue(new CommentImpl(c.getChars(), c._cchSrc, c._offSrc));
         }
 
-        protected void emitProcinst(SaveCur c)
-        {
+        protected void emitProcinst(SaveCur c) {
             String target = null;
             QName name = c.getName();
 
-            if (name!=null)
+            if (name != null)
                 target = name.getLocalPart();
 
-            enqueue( new ProcessingInstructionImpl( target, c.getChars(), c._cchSrc, c._offSrc ) );
+            enqueue(new ProcessingInstructionImpl(target, c.getChars(), c._cchSrc, c._offSrc));
         }
 
-        protected void emitDocType( String doctypeName, String publicID, String systemID )
-        {
-            enqueue( new StartDocumentImpl( systemID, null, true, null ) ); //todo
+        protected void emitDocType(String doctypeName, String publicID, String systemID) {
+            enqueue(new StartDocumentImpl(systemID, null, true, null)); //todo
         }
 
-        protected void emitStartDoc ( SaveCur c )
-        {
+        protected void emitStartDoc(SaveCur c) {
             emitDocType(null, null, null);
         }
 
-        protected void emitEndDoc ( SaveCur c )
-        {
-            enqueue( new EndDocumentImpl());
+        protected void emitEndDoc(SaveCur c) {
+            enqueue(new EndDocumentImpl());
         }
 
-        XMLEvent dequeue ( )
-        {
-            if (_out == null)
-            {
+        XMLEvent dequeue() {
+            if (_out == null) {
                 enterLocale();
-                try
-                {
-                    if(!process())
+                try {
+                    if (!process())
                         return null;
-                }
-                finally
-                {
+                } finally {
                     exitLocale();
                 }
             }
@@ -2836,17 +2637,13 @@
             return e;
         }
 
-        private void enqueue ( XmlEventImpl e )
-        {
+        private void enqueue(XmlEventImpl e) {
             assert e._next == null;
 
-            if (_in == null)
-            {
+            if (_in == null) {
                 assert _out == null;
                 _out = _in = e;
-            }
-            else
-            {
+            } else {
                 _in._next = e;
                 _in = e;
             }
@@ -2856,19 +2653,16 @@
         //
         //
 
-        protected void emitEndPrefixMappings ( )
-        {
-            for ( iterateMappings() ; hasMapping() ; nextMapping() )
-            {
+        protected void emitEndPrefixMappings() {
+            for (iterateMappings(); hasMapping(); nextMapping()) {
                 String prevPrefixUri = null; // todo mappingPrevPrefixUri();
                 String prefix = mappingPrefix();
                 String uri = mappingUri();
 
                 if (prevPrefixUri == null)
-                    enqueue( new EndPrefixMappingImpl( prefix ) );
-                else
-                {
-                    enqueue( new ChangePrefixMappingImpl( prefix, uri, prevPrefixUri ) );
+                    enqueue(new EndPrefixMappingImpl(prefix));
+                else {
+                    enqueue(new ChangePrefixMappingImpl(prefix, uri, prevPrefixUri));
                 }
             }
         }
@@ -2877,8 +2671,7 @@
         //
         //
 
-        private static XMLName computeName ( QName name, Saver saver, boolean needsPrefix )
-        {
+        private static XMLName computeName(QName name, Saver saver, boolean needsPrefix) {
             String uri = name.getNamespaceURI();
             String local = name.getLocalPart();
 
@@ -2887,13 +2680,12 @@
 
             String prefix = null;
 
-            if (uri!=null && uri.length() != 0)
-            {
+            if (uri != null && uri.length() != 0) {
                 prefix = name.getPrefix();
-                String mappedUri = saver.getNamespaceForPrefix( prefix );
+                String mappedUri = saver.getNamespaceForPrefix(prefix);
 
-                if (mappedUri == null || !mappedUri.equals( uri ))
-                    prefix = saver.getUriMapping( uri );
+                if (mappedUri == null || !mappedUri.equals(uri))
+                    prefix = saver.getUriMapping(uri);
 
                 // Attrs need a prefix.  If I have not found one, then there must be a default
                 // prefix obscuring the prefix needed for this attr.  Find it manually.
@@ -2903,37 +2695,31 @@
                 // here
 
                 if (needsPrefix && prefix.length() == 0)
-                    prefix = saver.getNonDefaultUriMapping( uri );
+                    prefix = saver.getNonDefaultUriMapping(uri);
 
             }
 
-            return new XmlNameImpl( uri, local, prefix );
+            return new XmlNameImpl(uri, local, prefix);
         }
 
-        private static abstract class XmlEventImpl extends XmlEventBase
-        {
-            XmlEventImpl ( int type )
-            {
-                super( type );
+        private static abstract class XmlEventImpl extends XmlEventBase {
+            XmlEventImpl(int type) {
+                super(type);
             }
 
-            public XMLName getName ( )
-            {
+            public XMLName getName() {
                 return null;
             }
 
-            public XMLName getSchemaType ( )
-            {
-                throw new RuntimeException( "NYI" );
+            public XMLName getSchemaType() {
+                throw new RuntimeException("NYI");
             }
 
-            public boolean hasName ( )
-            {
+            public boolean hasName() {
                 return false;
             }
 
-            public final Location getLocation ( )
-            {
+            public final Location getLocation() {
                 // (orig v1 comment)TODO - perhaps I can save a location goober sometimes?
                 return null;
             }
@@ -2942,34 +2728,28 @@
         }
 
         private static class StartDocumentImpl
-            extends XmlEventImpl implements StartDocument
-        {
-            StartDocumentImpl ( String systemID, String encoding, boolean isStandAlone, String version )
-            {
-                super( XMLEvent.START_DOCUMENT );
+                extends XmlEventImpl implements StartDocument {
+            StartDocumentImpl(String systemID, String encoding, boolean isStandAlone, String version) {
+                super(XMLEvent.START_DOCUMENT);
                 _systemID = systemID;
                 _encoding = encoding;
                 _standAlone = isStandAlone;
                 _version = version;
             }
 
-            public String getSystemId ( )
-            {
+            public String getSystemId() {
                 return _systemID;
             }
 
-            public String getCharacterEncodingScheme ( )
-            {
+            public String getCharacterEncodingScheme() {
                 return _encoding;
             }
 
-            public boolean isStandalone ( )
-            {
+            public boolean isStandalone() {
                 return _standAlone;
             }
 
-            public String getVersion ( )
-            {
+            public String getVersion() {
                 return _version;
             }
 
@@ -2980,11 +2760,9 @@
         }
 
         private static class StartElementImpl
-            extends XmlEventImpl implements StartElement
-        {
-            StartElementImpl ( XMLName name, AttributeImpl attributes, AttributeImpl namespaces, Map prefixMap )
-            {
-                super( XMLEvent.START_ELEMENT );
+                extends XmlEventImpl implements StartElement {
+            StartElementImpl(XMLName name, AttributeImpl attributes, AttributeImpl namespaces, Map prefixMap) {
+                super(XMLEvent.START_ELEMENT);
 
                 _name = name;
                 _attributes = attributes;
@@ -2992,81 +2770,64 @@
                 _prefixMap = prefixMap;
             }
 
-            public boolean hasName()
-            {
+            public boolean hasName() {
                 return true;
             }
 
-            public XMLName getName ( )
-            {
+            public XMLName getName() {
                 return _name;
             }
 
-            public AttributeIterator getAttributes ( )
-            {
-                return new AttributeIteratorImpl( _attributes, null );
+            public AttributeIterator getAttributes() {
+                return new AttributeIteratorImpl(_attributes, null);
             }
 
-            public AttributeIterator getNamespaces ( )
-            {
-                return new AttributeIteratorImpl( null, _namespaces );
+            public AttributeIterator getNamespaces() {
+                return new AttributeIteratorImpl(null, _namespaces);
             }
 
-            public AttributeIterator getAttributesAndNamespaces ( )
-            {
-                return  new AttributeIteratorImpl( _attributes, _namespaces );
+            public AttributeIterator getAttributesAndNamespaces() {
+                return new AttributeIteratorImpl(_attributes, _namespaces);
             }
 
-            public Attribute getAttributeByName ( XMLName xmlName )
-            {
-                for ( AttributeImpl a = _attributes ; a != null ; a = a._next )
-                {
-                    if (xmlName.equals( a.getName() ))
+            public Attribute getAttributeByName(XMLName xmlName) {
+                for (AttributeImpl a = _attributes; a != null; a = a._next) {
+                    if (xmlName.equals(a.getName()))
                         return a;
                 }
 
                 return null;
             }
 
-            public String getNamespaceUri ( String prefix )
-            {
-                return (String) _prefixMap.get( prefix == null ? "" : prefix );
+            public String getNamespaceUri(String prefix) {
+                return (String) _prefixMap.get(prefix == null ? "" : prefix);
             }
 
-            public Map getNamespaceMap ( )
-            {
+            public Map getNamespaceMap() {
                 return _prefixMap;
             }
 
             private static class AttributeIteratorImpl
-                implements AttributeIterator
-            {
-                AttributeIteratorImpl( AttributeImpl attributes, AttributeImpl namespaces )
-                {
+                    implements AttributeIterator {
+                AttributeIteratorImpl(AttributeImpl attributes, AttributeImpl namespaces) {
                     _attributes = attributes;
                     _namespaces = namespaces;
                 }
 
-                public Object monitor()
-                {
+                public Object monitor() {
                     return this;
                 }
 
-                public Attribute next ( )
-                {
-                    synchronized (monitor())
-                    {
+                public Attribute next() {
+                    synchronized (monitor()) {
                         checkVersion();
 
                         AttributeImpl attr = null;
 
-                        if (_attributes != null)
-                        {
+                        if (_attributes != null) {
                             attr = _attributes;
                             _attributes = attr._next;
-                        }
-                        else if (_namespaces != null)
-                        {
+                        } else if (_namespaces != null) {
                             attr = _namespaces;
                             _namespaces = attr._next;
                         }
@@ -3075,20 +2836,16 @@
                     }
                 }
 
-                public boolean hasNext ( )
-                {
-                    synchronized (monitor())
-                    {
+                public boolean hasNext() {
+                    synchronized (monitor()) {
                         checkVersion();
 
                         return _attributes != null || _namespaces != null;
                     }
                 }
 
-                public Attribute peek ( )
-                {
-                    synchronized (monitor())
-                    {
+                public Attribute peek() {
+                    synchronized (monitor()) {
                         checkVersion();
 
                         if (_attributes != null)
@@ -3100,10 +2857,8 @@
                     }
                 }
 
-                public void skip ( )
-                {
-                    synchronized (monitor())
-                    {
+                public void skip() {
+                    synchronized (monitor()) {
                         checkVersion();
 
                         if (_attributes != null)
@@ -3113,40 +2868,34 @@
                     }
                 }
 
-                private final void checkVersion ( )
-                {
+                private final void checkVersion() {
 //                    if (_version != _root.getVersion())
 //                        throw new IllegalStateException( "Document changed" );
                 }
 
-//                private long          _version;
+                //                private long          _version;
                 private AttributeImpl _attributes;
                 private AttributeImpl _namespaces;
             }
 
-            private static abstract class AttributeImpl implements Attribute
-            {
+            private static abstract class AttributeImpl implements Attribute {
                 /**
                  * Don't forget to set _name
                  */
-                AttributeImpl ()
-                {
+                AttributeImpl() {
                 }
 
-                public XMLName getName ( )
-                {
+                public XMLName getName() {
                     return _name;
                 }
 
-                public String getType ( )
-                {
+                public String getType() {
                     // (from v1 impl) TODO - Make sure throwing away this DTD info is ok.
                     // (from v1 impl) Is there schema info which can return more useful info?
                     return "CDATA";
                 }
 
-                public XMLName getSchemaType ( )
-                {
+                public XMLName getSchemaType() {
                     // (from v1 impl) TODO - Can I return something reasonable here?
                     return null;
                 }
@@ -3156,47 +2905,38 @@
                 protected XMLName _name;
             }
 
-            private static class XmlnsAttributeImpl extends AttributeImpl
-            {
-                XmlnsAttributeImpl ( String prefix, String uri )
-                {
+            private static class XmlnsAttributeImpl extends AttributeImpl {
+                XmlnsAttributeImpl(String prefix, String uri) {
                     super();
                     _uri = uri;
 
                     String local;
 
-                    if (prefix.length() == 0)
-                    {
+                    if (prefix.length() == 0) {
                         prefix = null;
                         local = "xmlns";
-                    }
-                    else
-                    {
+                    } else {
                         local = prefix;
                         prefix = "xmlns";
                     }
 
-                    _name = new XmlNameImpl( null, local, prefix );
+                    _name = new XmlNameImpl(null, local, prefix);
                 }
 
-                public String getValue ( )
-                {
+                public String getValue() {
                     return _uri;
                 }
 
                 private String _uri;
             }
 
-            private static class NormalAttributeImpl extends AttributeImpl
-            {
-                NormalAttributeImpl (XMLName name, String value)
-                {
+            private static class NormalAttributeImpl extends AttributeImpl {
+                NormalAttributeImpl(XMLName name, String value) {
                     _name = name;
                     _value = value;
                 }
 
-                public String getValue ( )
-                {
+                public String getValue() {
                     return _value;
                 }
 
@@ -3204,30 +2944,26 @@
             }
 
             private XMLName _name;
-            private Map     _prefixMap;
+            private Map _prefixMap;
 
             private AttributeImpl _attributes;
             private AttributeImpl _namespaces;
         }
 
         private static class StartPrefixMappingImpl
-            extends XmlEventImpl implements StartPrefixMapping
-        {
-            StartPrefixMappingImpl ( String prefix, String uri )
-            {
-                super( XMLEvent.START_PREFIX_MAPPING );
+                extends XmlEventImpl implements StartPrefixMapping {
+            StartPrefixMappingImpl(String prefix, String uri) {
+                super(XMLEvent.START_PREFIX_MAPPING);
 
                 _prefix = prefix;
                 _uri = uri;
             }
 
-            public String getNamespaceUri ( )
-            {
+            public String getNamespaceUri() {
                 return _uri;
             }
 
-            public String getPrefix ( )
-            {
+            public String getPrefix() {
                 return _prefix;
             }
 
@@ -3235,29 +2971,24 @@
         }
 
         private static class ChangePrefixMappingImpl
-            extends XmlEventImpl implements ChangePrefixMapping
-        {
-            ChangePrefixMappingImpl ( String prefix, String oldUri, String newUri )
-            {
-                super( XMLEvent.CHANGE_PREFIX_MAPPING );
+                extends XmlEventImpl implements ChangePrefixMapping {
+            ChangePrefixMappingImpl(String prefix, String oldUri, String newUri) {
+                super(XMLEvent.CHANGE_PREFIX_MAPPING);
 
                 _oldUri = oldUri;
                 _newUri = newUri;
                 _prefix = prefix;
             }
 
-            public String getOldNamespaceUri ( )
-            {
+            public String getOldNamespaceUri() {
                 return _oldUri;
             }
 
-            public String getNewNamespaceUri ( )
-            {
+            public String getNewNamespaceUri() {
                 return _newUri;
             }
 
-            public String getPrefix ( )
-            {
+            public String getPrefix() {
                 return _prefix;
             }
 
@@ -3265,16 +2996,13 @@
         }
 
         private static class EndPrefixMappingImpl
-            extends XmlEventImpl implements EndPrefixMapping
-        {
-            EndPrefixMappingImpl ( String prefix )
-            {
-                super( XMLEvent.END_PREFIX_MAPPING );
+                extends XmlEventImpl implements EndPrefixMapping {
+            EndPrefixMappingImpl(String prefix) {
+                super(XMLEvent.END_PREFIX_MAPPING);
                 _prefix = prefix;
             }
 
-            public String getPrefix ( )
-            {
+            public String getPrefix() {
                 return _prefix;
             }
 
@@ -3282,22 +3010,18 @@
         }
 
         private static class EndElementImpl
-            extends XmlEventImpl implements EndElement
-        {
-            EndElementImpl ( XMLName name )
-            {
-                super( XMLEvent.END_ELEMENT );
+                extends XmlEventImpl implements EndElement {
+            EndElementImpl(XMLName name) {
+                super(XMLEvent.END_ELEMENT);
 
                 _name = name;
             }
 
-            public boolean hasName ( )
-            {
+            public boolean hasName() {
                 return true;
             }
 
-            public XMLName getName ( )
-            {
+            public XMLName getName() {
                 return _name;
             }
 
@@ -3305,74 +3029,60 @@
         }
 
         private static class EndDocumentImpl
-            extends XmlEventImpl implements EndDocument
-        {
-            EndDocumentImpl ( )
-            {
-                super( XMLEvent.END_DOCUMENT );
+                extends XmlEventImpl implements EndDocument {
+            EndDocumentImpl() {
+                super(XMLEvent.END_DOCUMENT);
             }
         }
 
         private static class TripletEventImpl
-            extends XmlEventImpl implements CharacterData
-        {
-            TripletEventImpl ( int eventType, Object obj, int cch, int off )
-            {
+                extends XmlEventImpl implements CharacterData {
+            TripletEventImpl(int eventType, Object obj, int cch, int off) {
                 super(eventType);
                 _obj = obj;
                 _cch = cch;
                 _off = off;
             }
 
-            public String getContent ( )
-            {
+            public String getContent() {
                 return CharUtil.getString(_obj, _off, _cch);
             }
 
-            public boolean hasContent ( )
-            {
+            public boolean hasContent() {
                 return _cch > 0;
             }
 
             private Object _obj;
-            private int    _cch;
-            private int    _off;
+            private int _cch;
+            private int _off;
         }
 
         private static class CharacterDataImpl
-            extends TripletEventImpl implements CharacterData
-        {
-            CharacterDataImpl ( Object obj, int cch, int off )
-            {
+                extends TripletEventImpl implements CharacterData {
+            CharacterDataImpl(Object obj, int cch, int off) {
                 super(XMLEvent.CHARACTER_DATA, obj, cch, off);
             }
         }
 
         private static class CommentImpl
-            extends TripletEventImpl implements Comment
-        {
-            CommentImpl ( Object obj, int cch, int off )
-            {
-                super( XMLEvent.COMMENT, obj, cch, off);
+                extends TripletEventImpl implements Comment {
+            CommentImpl(Object obj, int cch, int off) {
+                super(XMLEvent.COMMENT, obj, cch, off);
             }
         }
 
         private static class ProcessingInstructionImpl
-            extends TripletEventImpl implements ProcessingInstruction
-        {
-            ProcessingInstructionImpl ( String target, Object obj, int cch, int off)
-            {
-                super( XMLEvent.PROCESSING_INSTRUCTION, obj, cch, off);
+                extends TripletEventImpl implements ProcessingInstruction {
+            ProcessingInstructionImpl(String target, Object obj, int cch, int off) {
+                super(XMLEvent.PROCESSING_INSTRUCTION, obj, cch, off);
                 _target = target;
             }
 
-            public String getTarget ( )
-            {
+            public String getTarget() {
                 return _target;
             }
 
-            public String getData ( )
-            {
+            public String getData() {
                 return getContent();
             }
 
@@ -3382,12 +3092,10 @@
         private XmlEventImpl _in, _out;
     }
 
-    static final class XmlInputStreamImpl extends GenericXmlInputStream
-    {
-        XmlInputStreamImpl ( Cur cur, XmlOptions options )
-        {
+    static final class XmlInputStreamImpl extends GenericXmlInputStream {
+        XmlInputStreamImpl(Cur cur, XmlOptions options) {
             _xmlInputStreamSaver =
-                new XmlInputStreamSaver( cur, options );
+                    new XmlInputStreamSaver(cur, options);
 
             // Make the saver grind away just a bit to throw any exceptions
             // related to the inability to create a stream on this xml
@@ -3395,61 +3103,52 @@
             _xmlInputStreamSaver.process();
         }
 
-        protected XMLEvent nextEvent ( ) throws XMLStreamException
-        {
+        protected XMLEvent nextEvent() throws XMLStreamException {
             return _xmlInputStreamSaver.dequeue();
         }
 
         private XmlInputStreamSaver _xmlInputStreamSaver;
     }
 
-    static final class SaxSaver extends Saver
-    {
-        SaxSaver ( Cur c, XmlOptions options, ContentHandler ch, LexicalHandler lh )
-            throws SAXException
-        {
-            super( c, options );
+    static final class SaxSaver extends Saver {
+        SaxSaver(Cur c, XmlOptions options, ContentHandler ch, LexicalHandler lh)
+                throws SAXException {
+            super(c, options);
 
             _contentHandler = ch;
             _lexicalHandler = lh;
 
             _attributes = new AttributesImpl();
-            _nsAsAttrs = !options.hasOption( XmlOptions.SAVE_SAX_NO_NSDECLS_IN_ATTRIBUTES );
+            _nsAsAttrs = !options.hasOption(XmlOptions.SAVE_SAX_NO_NSDECLS_IN_ATTRIBUTES);
 
             _contentHandler.startDocument();
 
-            try
-            {
-                while ( process() )
+            try {
+                while (process())
                     ;
-            }
-            catch ( SaverSAXException e )
-            {
+            } catch (SaverSAXException e) {
                 throw e._saxException;
             }
 
             _contentHandler.endDocument();
         }
 
-        private class SaverSAXException extends RuntimeException
-        {
-            SaverSAXException ( SAXException e )
-            {
+        private class SaverSAXException extends RuntimeException {
+            SaverSAXException(SAXException e) {
                 _saxException = e;
             }
 
             SAXException _saxException;
         }
 
-        private String getPrefixedName ( QName name )
-        {
+        private String getPrefixedName(QName name) {
             String uri = name.getNamespaceURI();
             String local = name.getLocalPart();
 
             if (uri.length() == 0)
                 return local;
 
-            String prefix = getUriMapping( uri );
+            String prefix = getUriMapping(uri);
 
             if (prefix.length() == 0)
                 return local;
@@ -3457,44 +3156,37 @@
             return prefix + ":" + local;
         }
 
-        private void emitNamespacesHelper ( )
-        {
-            for ( iterateMappings() ; hasMapping() ; nextMapping() )
-            {
+        private void emitNamespacesHelper() {
+            for (iterateMappings(); hasMapping(); nextMapping()) {
                 String prefix = mappingPrefix();
                 String uri = mappingUri();
 
-                try
-                {
-                    _contentHandler.startPrefixMapping( prefix, uri );
-                }
-                catch ( SAXException e )
-                {
-                    throw new SaverSAXException( e );
+                try {
+                    _contentHandler.startPrefixMapping(prefix, uri);
+                } catch (SAXException e) {
+                    throw new SaverSAXException(e);
                 }
 
                 if (_nsAsAttrs)
                     if (prefix == null || prefix.length() == 0)
-                        _attributes.addAttribute( "http://www.w3.org/2000/xmlns/", "xmlns", "xmlns", "CDATA", uri );
+                        _attributes.addAttribute("http://www.w3.org/2000/xmlns/", "xmlns", "xmlns", "CDATA", uri);
                     else
-                        _attributes.addAttribute( "http://www.w3.org/2000/xmlns/", prefix, "xmlns:" + prefix, "CDATA", uri );
+                        _attributes.addAttribute("http://www.w3.org/2000/xmlns/", prefix, "xmlns:" + prefix, "CDATA", uri);
             }
         }
 
-        protected boolean emitElement ( SaveCur c, ArrayList attrNames, ArrayList attrValues )
-        {
+        protected boolean emitElement(SaveCur c, ArrayList attrNames, ArrayList attrValues) {
             _attributes.clear();
 
             if (saveNamespacesFirst())
                 emitNamespacesHelper();
 
-            for ( int i = 0 ; i < attrNames.size() ; i++ )
-            {
-                QName name = (QName) attrNames.get( i );
+            for (int i = 0; i < attrNames.size(); i++) {
+                QName name = (QName) attrNames.get(i);
 
                 _attributes.addAttribute(
-                    name.getNamespaceURI(), name.getLocalPart(), getPrefixedName( name ),
-                    "CDATA", (String) attrValues.get( i ) );
+                        name.getNamespaceURI(), name.getLocalPart(), getPrefixedName(name),
+                        "CDATA", (String) attrValues.get(i));
             }
 
             if (!saveNamespacesFirst())
@@ -3502,160 +3194,125 @@
 
             QName elemName = c.getName();
 
-            try
-            {
+            try {
                 _contentHandler.startElement(
-                    elemName.getNamespaceURI(), elemName.getLocalPart(),
-                    getPrefixedName( elemName ), _attributes );
-            }
-            catch ( SAXException e )
-            {
-                throw new SaverSAXException( e );
+                        elemName.getNamespaceURI(), elemName.getLocalPart(),
+                        getPrefixedName(elemName), _attributes);
+            } catch (SAXException e) {
+                throw new SaverSAXException(e);
             }
 
             return false;
         }
 
-        protected void emitFinish ( SaveCur c )
-        {
+        protected void emitFinish(SaveCur c) {
             QName name = c.getName();
 
-            try
-            {
+            try {
                 _contentHandler.endElement(
-                    name.getNamespaceURI(), name.getLocalPart(), getPrefixedName( name ) );
+                        name.getNamespaceURI(), name.getLocalPart(), getPrefixedName(name));
 
-                for ( iterateMappings() ; hasMapping() ; nextMapping() )
-                    _contentHandler.endPrefixMapping( mappingPrefix() );
-            }
-            catch ( SAXException e )
-            {
-                throw new SaverSAXException( e );
+                for (iterateMappings(); hasMapping(); nextMapping())
+                    _contentHandler.endPrefixMapping(mappingPrefix());
+            } catch (SAXException e) {
+                throw new SaverSAXException(e);
             }
         }
 
-        protected void emitText ( SaveCur c )
-        {
+        protected void emitText(SaveCur c) {
             assert c.isText();
 
             Object src = c.getChars();
 
-            try
-            {
-                if (src instanceof char[])
-                {
+            try {
+                if (src instanceof char[]) {
                     // Pray the user does not modify the buffer ....
-                    _contentHandler.characters( (char[]) src, c._offSrc, c._cchSrc );
-                }
-                else
-                {
+                    _contentHandler.characters((char[]) src, c._offSrc, c._cchSrc);
+                } else {
                     if (_buf == null)
-                        _buf = new char [ 1024 ];
+                        _buf = new char[1024];
 
-                    while ( c._cchSrc > 0 )
-                    {
-                        int cch = java.lang.Math.min( _buf.length, c._cchSrc );
+                    while (c._cchSrc > 0) {
+                        int cch = java.lang.Math.min(_buf.length, c._cchSrc);
 
-                        CharUtil.getChars( _buf, 0, src, c._offSrc, cch );
+                        CharUtil.getChars(_buf, 0, src, c._offSrc, cch);
 
-                        _contentHandler.characters( _buf, 0, cch );
+                        _contentHandler.characters(_buf, 0, cch);
 
                         c._offSrc += cch;
                         c._cchSrc -= cch;
                     }
                 }
-            }
-            catch ( SAXException e )
-            {
-                throw new SaverSAXException( e );
+            } catch (SAXException e) {
+                throw new SaverSAXException(e);
             }
         }
 
-        protected void emitComment ( SaveCur c )
-        {
-            if (_lexicalHandler != null)
-            {
+        protected void emitComment(SaveCur c) {
+            if (_lexicalHandler != null) {
                 c.push();
 
                 c.next();
 
-                try
-                {
+                try {
                     if (!c.isText())
-                        _lexicalHandler.comment( null, 0, 0 );
-                    else
-                    {
+                        _lexicalHandler.comment(null, 0, 0);
+                    else {
                         Object src = c.getChars();
 
-                        if (src instanceof char[])
-                        {
+                        if (src instanceof char[]) {
                             // Pray the user does not modify the buffer ....
-                            _lexicalHandler.comment( (char[]) src, c._offSrc, c._cchSrc );
-                        }
-                        else
-                        {
+                            _lexicalHandler.comment((char[]) src, c._offSrc, c._cchSrc);
+                        } else {
                             if (_buf == null || _buf.length < c._cchSrc)
-                                _buf = new char [ java.lang.Math.max( 1024, c._cchSrc ) ];
+                                _buf = new char[java.lang.Math.max(1024, c._cchSrc)];
 
-                            CharUtil.getChars( _buf, 0, src, c._offSrc, c._cchSrc );
+                            CharUtil.getChars(_buf, 0, src, c._offSrc, c._cchSrc);
 
-                            _lexicalHandler.comment( _buf, 0, c._cchSrc );
+                            _lexicalHandler.comment(_buf, 0, c._cchSrc);
                         }
                     }
-                }
-                catch ( SAXException e )
-                {
-                    throw new SaverSAXException( e );
+                } catch (SAXException e) {
+                    throw new SaverSAXException(e);
                 }
 
                 c.pop();
             }
         }
 
-        protected void emitProcinst ( SaveCur c )
-        {
+        protected void emitProcinst(SaveCur c) {
             String target = c.getName().getLocalPart();
 
             c.push();
 
             c.next();
 
-            String value = CharUtil.getString( c.getChars(), c._offSrc, c._cchSrc );
+            String value = CharUtil.getString(c.getChars(), c._offSrc, c._cchSrc);
 
             c.pop();
 
-            try
-            {
-                _contentHandler.processingInstruction( c.getName().getLocalPart(), value );
-            }
-            catch ( SAXException e )
-            {
-                throw new SaverSAXException( e );
+            try {
+                _contentHandler.processingInstruction(c.getName().getLocalPart(), value);
+            } catch (SAXException e) {
+                throw new SaverSAXException(e);
             }
         }
 
-        protected void emitDocType ( String docTypeName, String publicId, String systemId )
-        {
-            if (_lexicalHandler != null)
-            {
-                try
-                {
-                    _lexicalHandler.startDTD( docTypeName, publicId, systemId );
+        protected void emitDocType(String docTypeName, String publicId, String systemId) {
+            if (_lexicalHandler != null) {
+                try {
+                    _lexicalHandler.startDTD(docTypeName, publicId, systemId);
                     _lexicalHandler.endDTD();
-                }
-                catch ( SAXException e )
-                {
-                    throw new SaverSAXException( e );
+                } catch (SAXException e) {
+                    throw new SaverSAXException(e);
                 }
             }
         }
 
-        protected void emitStartDoc ( SaveCur c )
-        {
+        protected void emitStartDoc(SaveCur c) {
         }
 
-        protected void emitEndDoc ( SaveCur c )
-        {
+        protected void emitEndDoc(SaveCur c) {
         }
 
         private ContentHandler _contentHandler;
@@ -3671,47 +3328,85 @@
     //
     //
 
-    static abstract class SaveCur
-    {
-        final boolean isRoot       ( ) { return kind() == ROOT;     }
-        final boolean isElem       ( ) { return kind() == ELEM;     }
-        final boolean isAttr       ( ) { return kind() == ATTR;     }
-        final boolean isText       ( ) { return kind() == TEXT;     }
-        final boolean isComment    ( ) { return kind() == COMMENT;  }
-        final boolean isProcinst   ( ) { return kind() == PROCINST; }
-        final boolean isFinish     ( ) { return Cur.kindIsFinish( kind() ); }
-        final boolean isContainer  ( ) { return Cur.kindIsContainer( kind() ); }
-        final boolean isNormalAttr ( ) { return kind() == ATTR && !isXmlns(); }
+    static abstract class SaveCur {
+        final boolean isRoot() {
+            return kind() == ROOT;
+        }
 
-        final boolean skip ( ) { toEnd(); return next(); }
+        final boolean isElem() {
+            return kind() == ELEM;
+        }
 
-        abstract void release ( );
+        final boolean isAttr() {
+            return kind() == ATTR;
+        }
 
-        abstract int kind ( );
+        final boolean isText() {
+            return kind() == TEXT;
+        }
 
-        abstract QName  getName ( );
-        abstract String getXmlnsPrefix ( );
-        abstract String getXmlnsUri ( );
+        final boolean isComment() {
+            return kind() == COMMENT;
+        }
 
-        abstract boolean isXmlns ( );
+        final boolean isProcinst() {
+            return kind() == PROCINST;
+        }
 
-        abstract boolean hasChildren  ( );
-        abstract boolean hasText      ( );
-        abstract boolean isTextCData  ( );
+        final boolean isFinish() {
+            return Cur.kindIsFinish(kind());
+        }
 
-        abstract boolean toFirstAttr ( );
-        abstract boolean toNextAttr ( );
-        abstract String  getAttrValue ( );
+        final boolean isContainer() {
+            return Cur.kindIsContainer(kind());
+        }
 
-        abstract boolean next  ( );
-        abstract void    toEnd ( );
+        final boolean isNormalAttr() {
+            return kind() == ATTR && !isXmlns();
+        }
 
-        abstract void push ( );
-        abstract void pop ( );
+        final boolean skip() {
+            toEnd();
+            return next();
+        }
 
-        abstract Object getChars ( );
-        abstract List  getAncestorNamespaces ( );
-        abstract XmlDocumentProperties getDocProps ( );
+        abstract void release();
+
+        abstract int kind();
+
+        abstract QName getName();
+
+        abstract String getXmlnsPrefix();
+
+        abstract String getXmlnsUri();
+
+        abstract boolean isXmlns();
+
+        abstract boolean hasChildren();
+
+        abstract boolean hasText();
+
+        abstract boolean isTextCData();
+
+        abstract boolean toFirstAttr();
+
+        abstract boolean toNextAttr();
+
+        abstract String getAttrValue();
+
+        abstract boolean next();
+
+        abstract void toEnd();
+
+        abstract void push();
+
+        abstract void pop();
+
+        abstract Object getChars();
+
+        abstract List getAncestorNamespaces();
+
+        abstract XmlDocumentProperties getDocProps();
 
         int _offSrc;
         int _cchSrc;
@@ -3720,47 +3415,84 @@
     // TODO - saving a fragment need to take namesapces from root and
     // reflect them on the document element
 
-    private static final class DocSaveCur extends SaveCur
-    {
-        DocSaveCur ( Cur c )
-        {
+    private static final class DocSaveCur extends SaveCur {
+        DocSaveCur(Cur c) {
             assert c.isRoot();
-            _cur = c.weakCur( this );
+            _cur = c.weakCur(this);
         }
 
-        void release ( )
-        {
+        void release() {
             _cur.release();
             _cur = null;
         }
 
-        int kind ( ) { return _cur.kind(); }
+        int kind() {
+            return _cur.kind();
+        }
 
-        QName  getName        ( ) { return _cur.getName(); }
-        String getXmlnsPrefix ( ) { return _cur.getXmlnsPrefix(); }
-        String getXmlnsUri    ( ) { return _cur.getXmlnsUri(); }
+        QName getName() {
+            return _cur.getName();
+        }
 
-        boolean isXmlns       ( ) { return _cur.isXmlns();     }
+        String getXmlnsPrefix() {
+            return _cur.getXmlnsPrefix();
+        }
 
-        boolean hasChildren   ( ) { return _cur.hasChildren(); }
-        boolean hasText       ( ) { return _cur.hasText();     }
-        boolean isTextCData   ( ) { return _cur.isTextCData(); }
+        String getXmlnsUri() {
+            return _cur.getXmlnsUri();
+        }
 
-        boolean toFirstAttr   ( ) { return _cur.toFirstAttr(); }
-        boolean toNextAttr    ( ) { return _cur.toNextAttr();  }
-        String  getAttrValue  ( ) { assert _cur.isAttr(); return _cur.getValueAsString(); }
+        boolean isXmlns() {
+            return _cur.isXmlns();
+        }
 
-        void    toEnd         ( ) { _cur.toEnd();              }
-        boolean next          ( ) { return _cur.next();        }
+        boolean hasChildren() {
+            return _cur.hasChildren();
+        }
 
-        void push ( )         { _cur.push(); }
-        void pop  ( )         { _cur.pop(); }
+        boolean hasText() {
+            return _cur.hasText();
+        }
 
-        List getAncestorNamespaces ( ) { return null; }
+        boolean isTextCData() {
+            return _cur.isTextCData();
+        }
 
-        Object getChars ( )
-        {
-            Object o = _cur.getChars( -1 );
+        boolean toFirstAttr() {
+            return _cur.toFirstAttr();
+        }
+
+        boolean toNextAttr() {
+            return _cur.toNextAttr();
+        }
+
+        String getAttrValue() {
+            assert _cur.isAttr();
+            return _cur.getValueAsString();
+        }
+
+        void toEnd() {
+            _cur.toEnd();
+        }
+
+        boolean next() {
+            return _cur.next();
+        }
+
+        void push() {
+            _cur.push();
+        }
+
+        void pop() {
+            _cur.pop();
+        }
+
+        List getAncestorNamespaces() {
+            return null;
+        }
+
+        Object getChars() {
+            Object o = _cur.getChars(-1);
 
             _offSrc = _cur._offSrc;
             _cchSrc = _cur._cchSrc;
@@ -3768,48 +3500,76 @@
             return o;
         }
 
-        XmlDocumentProperties getDocProps ( ) { return Locale.getDocProps(_cur, false); }
+        XmlDocumentProperties getDocProps() {
+            return Locale.getDocProps(_cur, false);
+        }
 
         private Cur _cur;
     }
 
-    private static abstract class FilterSaveCur extends SaveCur
-    {
-        FilterSaveCur ( SaveCur c )
-        {
+    private static abstract class FilterSaveCur extends SaveCur {
+        FilterSaveCur(SaveCur c) {
             assert c.isRoot();
             _cur = c;
         }
 
         // Can filter anything by root and attributes and text
-        protected abstract boolean filter ( );
+        protected abstract boolean filter();
 
-        void release ( )
-        {
+        void release() {
             _cur.release();
             _cur = null;
         }
 
-        int kind ( ) { return _cur.kind(); }
+        int kind() {
+            return _cur.kind();
+        }
 
-        QName  getName        ( ) { return _cur.getName();        }
-        String getXmlnsPrefix ( ) { return _cur.getXmlnsPrefix(); }
-        String getXmlnsUri    ( ) { return _cur.getXmlnsUri();    }
+        QName getName() {
+            return _cur.getName();
+        }
 
-        boolean isXmlns       ( ) { return _cur.isXmlns();      }
+        String getXmlnsPrefix() {
+            return _cur.getXmlnsPrefix();
+        }
 
-        boolean hasChildren   ( ) { return _cur.hasChildren();  }
-        boolean hasText       ( ) { return _cur.hasText();      }
-        boolean isTextCData   ( ) { return _cur.isTextCData(); }
+        String getXmlnsUri() {
+            return _cur.getXmlnsUri();
+        }
 
-        boolean toFirstAttr   ( ) { return _cur.toFirstAttr();  }
-        boolean toNextAttr    ( ) { return _cur.toNextAttr();   }
-        String  getAttrValue  ( ) { return _cur.getAttrValue(); }
+        boolean isXmlns() {
+            return _cur.isXmlns();
+        }
 
-        void toEnd ( ) { _cur.toEnd(); }
+        boolean hasChildren() {
+            return _cur.hasChildren();
+        }
 
-        boolean next ( )
-        {
+        boolean hasText() {
+            return _cur.hasText();
+        }
+
+        boolean isTextCData() {
+            return _cur.isTextCData();
+        }
+
+        boolean toFirstAttr() {
+            return _cur.toFirstAttr();
+        }
+
+        boolean toNextAttr() {
+            return _cur.toNextAttr();
+        }
+
+        String getAttrValue() {
+            return _cur.getAttrValue();
+        }
+
+        void toEnd() {
+            _cur.toEnd();
+        }
+
+        boolean next() {
             if (!_cur.next())
                 return false;
 
@@ -3823,13 +3583,19 @@
             return next();
         }
 
-        void push ( ) { _cur.push(); }
-        void pop  ( ) { _cur.pop(); }
+        void push() {
+            _cur.push();
+        }
 
-        List getAncestorNamespaces ( ) { return _cur.getAncestorNamespaces(); }
+        void pop() {
+            _cur.pop();
+        }
 
-        Object getChars ( )
-        {
+        List getAncestorNamespaces() {
+            return _cur.getAncestorNamespaces();
+        }
+
+        Object getChars() {
             Object o = _cur.getChars();
 
             _offSrc = _cur._offSrc;
@@ -3838,78 +3604,68 @@
             return o;
         }
 
-        XmlDocumentProperties getDocProps ( ) { return _cur.getDocProps(); }
+        XmlDocumentProperties getDocProps() {
+            return _cur.getDocProps();
+        }
 
         private SaveCur _cur;
     }
 
-    private static final class FilterPiSaveCur extends FilterSaveCur
-    {
-        FilterPiSaveCur ( SaveCur c, String target )
-        {
-            super( c );
+    private static final class FilterPiSaveCur extends FilterSaveCur {
+        FilterPiSaveCur(SaveCur c, String target) {
+            super(c);
 
             _piTarget = target;
         }
 
-        protected boolean filter ( )
-        {
-            return kind() == PROCINST && getName().getLocalPart().equals( _piTarget );
+        protected boolean filter() {
+            return kind() == PROCINST && getName().getLocalPart().equals(_piTarget);
         }
 
         private String _piTarget;
     }
 
-    private static final class FragSaveCur extends SaveCur
-    {
-        FragSaveCur ( Cur start, Cur end, QName synthElem )
-        {
-            _saveAttr = start.isAttr() && start.isSamePos( end );
+    private static final class FragSaveCur extends SaveCur {
+        FragSaveCur(Cur start, Cur end, QName synthElem) {
+            _saveAttr = start.isAttr() && start.isSamePos(end);
 
-            _cur = start.weakCur( this );
-            _end = end.weakCur( this );
+            _cur = start.weakCur(this);
+            _end = end.weakCur(this);
 
             _elem = synthElem;
 
             _state = ROOT_START;
 
-            _stateStack = new int [ 8 ];
+            _stateStack = new int[8];
 
             start.push();
-            computeAncestorNamespaces( start );
+            computeAncestorNamespaces(start);
             start.pop();
         }
 
-        List getAncestorNamespaces ( )
-        {
+        List getAncestorNamespaces() {
             return _ancestorNamespaces;
         }
 
-        private void computeAncestorNamespaces ( Cur c )
-        {
+        private void computeAncestorNamespaces(Cur c) {
             _ancestorNamespaces = new ArrayList();
 
-            while ( c.toParentRaw() )
-            {
-                if (c.toFirstAttr())
-                {
-                    do
-                    {
-                        if (c.isXmlns())
-                        {
+            while (c.toParentRaw()) {
+                if (c.toFirstAttr()) {
+                    do {
+                        if (c.isXmlns()) {
                             String prefix = c.getXmlnsPrefix();
                             String uri = c.getXmlnsUri();
 
                             // Don't let xmlns:foo="" get used
 
-                            if (uri.length() > 0 || prefix.length() == 0)
-                            {
-                                _ancestorNamespaces.add( c.getXmlnsPrefix() );
-                                _ancestorNamespaces.add( c.getXmlnsUri() );
+                            if (uri.length() > 0 || prefix.length() == 0) {
+                                _ancestorNamespaces.add(c.getXmlnsPrefix());
+                                _ancestorNamespaces.add(c.getXmlnsUri());
                             }
                         }
                     }
-                    while ( c.toNextAttr() );
+                    while (c.toNextAttr());
 
                     c.toParent();
                 }
@@ -3920,8 +3676,7 @@
         //
         //
 
-        void release ( )
-        {
+        void release() {
             _cur.release();
             _cur = null;
 
@@ -3929,14 +3684,16 @@
             _end = null;
         }
 
-        int kind ( )
-        {
-            switch ( _state )
-            {
-            case ROOT_START : return  ROOT;
-            case ELEM_START : return  ELEM;
-            case ELEM_END   : return -ELEM;
-            case ROOT_END   : return -ROOT;
+        int kind() {
+            switch (_state) {
+                case ROOT_START:
+                    return ROOT;
+                case ELEM_START:
+                    return ELEM;
+                case ELEM_END:
+                    return -ELEM;
+                case ROOT_END:
+                    return -ROOT;
             }
 
             assert _state == CUR;
@@ -3944,14 +3701,14 @@
             return _cur.kind();
         }
 
-        QName getName ( )
-        {
-            switch ( _state )
-            {
-            case ROOT_START :
-            case ROOT_END   : return null;
-            case ELEM_START :
-            case ELEM_END   : return _elem;
+        QName getName() {
+            switch (_state) {
+                case ROOT_START:
+                case ROOT_END:
+                    return null;
+                case ELEM_START:
+                case ELEM_END:
+                    return _elem;
             }
 
             assert _state == CUR;
@@ -3959,30 +3716,25 @@
             return _cur.getName();
         }
 
-        String getXmlnsPrefix ( )
-        {
+        String getXmlnsPrefix() {
             assert _state == CUR && _cur.isAttr();
             return _cur.getXmlnsPrefix();
         }
 
-        String getXmlnsUri ( )
-        {
+        String getXmlnsUri() {
             assert _state == CUR && _cur.isAttr();
             return _cur.getXmlnsUri();
         }
 
-        boolean isXmlns ( )
-        {
+        boolean isXmlns() {
             assert _state == CUR && _cur.isAttr();
             return _cur.isXmlns();
         }
 
-        boolean hasChildren ( )
-        {
+        boolean hasChildren() {
             boolean hasChildren = false;
 
-            if (isContainer())
-            {   // is there a faster way to do this?
+            if (isContainer()) {   // is there a faster way to do this?
                 push();
                 next();
 
@@ -3995,12 +3747,10 @@
             return hasChildren;
         }
 
-        boolean hasText ( )
-        {
+        boolean hasText() {
             boolean hasText = false;
 
-            if (isContainer())
-            {
+            if (isContainer()) {
                 push();
                 next();
 
@@ -4013,16 +3763,14 @@
             return hasText;
         }
 
-        boolean isTextCData ( )
-        {
+        boolean isTextCData() {
             return _cur.isTextCData();
         }
 
-        Object getChars ( )
-        {
+        Object getChars() {
             assert _state == CUR && _cur.isText();
 
-            Object src = _cur.getChars( -1 );
+            Object src = _cur.getChars(-1);
 
             _offSrc = _cur._offSrc;
             _cchSrc = _cur._cchSrc;
@@ -4030,69 +3778,64 @@
             return src;
         }
 
-        boolean next ( )
-        {
-            switch ( _state )
-            {
-            case ROOT_START :
-            {
-                _state = _elem == null ? CUR : ELEM_START;
-                break;
-            }
-
-            case ELEM_START :
-            {
-                if (_saveAttr)
-                    _state = ELEM_END;
-                else
-                {
-                    if (_cur.isAttr())
-                    {
-                        _cur.toParent();
-                        _cur.next();
-                    }
-
-                    if (_cur.isSamePos( _end ))
-                        _state = ELEM_END;
-                    else
-                        _state = CUR;
+        boolean next() {
+            switch (_state) {
+                case ROOT_START: {
+                    _state = _elem == null ? CUR : ELEM_START;
+                    break;
                 }
 
-                break;
-            }
+                case ELEM_START: {
+                    if (_saveAttr)
+                        _state = ELEM_END;
+                    else {
+                        if (_cur.isAttr()) {
+                            _cur.toParent();
+                            _cur.next();
+                        }
 
-            case CUR :
-            {
-                assert !_cur.isAttr();
+                        if (_cur.isSamePos(_end))
+                            _state = ELEM_END;
+                        else
+                            _state = CUR;
+                    }
 
-                _cur.next();
+                    break;
+                }
 
-                if (_cur.isSamePos( _end ))
-                    _state = _elem == null ? ROOT_END : ELEM_END;
+                case CUR: {
+                    assert !_cur.isAttr();
 
-                break;
-            }
+                    _cur.next();
 
-            case ELEM_END :
-            {
-                _state = ROOT_END;
-                break;
-            }
-            case ROOT_END :
-                return false;
+                    if (_cur.isSamePos(_end))
+                        _state = _elem == null ? ROOT_END : ELEM_END;
+
+                    break;
+                }
+
+                case ELEM_END: {
+                    _state = ROOT_END;
+                    break;
+                }
+                case ROOT_END:
+                    return false;
             }
 
             return true;
         }
 
-        void toEnd ( )
-        {
-            switch ( _state )
-            {
-            case ROOT_START : _state = ROOT_END; return;
-            case ELEM_START : _state = ELEM_END; return;
-            case ROOT_END   :
-            case ELEM_END   : return;
+        void toEnd() {
+            switch (_state) {
+                case ROOT_START:
+                    _state = ROOT_END;
+                    return;
+                case ELEM_START:
+                    _state = ELEM_END;
+                    return;
+                case ROOT_END:
+                case ELEM_END:
+                    return;
             }
 
             assert _state == CUR && !_cur.isAttr() && !_cur.isText();
@@ -4100,14 +3843,14 @@
             _cur.toEnd();
         }
 
-        boolean toFirstAttr ( )
-        {
-            switch ( _state )
-            {
-            case ROOT_END   :
-            case ELEM_END   :
-            case ROOT_START : return false;
-            case CUR        : return _cur.toFirstAttr();
+        boolean toFirstAttr() {
+            switch (_state) {
+                case ROOT_END:
+                case ELEM_END:
+                case ROOT_START:
+                    return false;
+                case CUR:
+                    return _cur.toFirstAttr();
             }
 
             assert _state == ELEM_START;
@@ -4120,38 +3863,35 @@
             return true;
         }
 
-        boolean toNextAttr ( )
-        {
+        boolean toNextAttr() {
             assert _state == CUR;
             return !_saveAttr && _cur.toNextAttr();
         }
 
-        String getAttrValue ( )
-        {
+        String getAttrValue() {
             assert _state == CUR && _cur.isAttr();
             return _cur.getValueAsString();
         }
 
-        void push ( )
-        {
-            if (_stateStackSize == _stateStack.length)
-            {
-                int[] newStateStack = new int [ _stateStackSize * 2 ];
-                System.arraycopy( _stateStack, 0, newStateStack, 0, _stateStackSize );
+        void push() {
+            if (_stateStackSize == _stateStack.length) {
+                int[] newStateStack = new int[_stateStackSize * 2];
+                System.arraycopy(_stateStack, 0, newStateStack, 0, _stateStackSize);
                 _stateStack = newStateStack;
             }
 
-            _stateStack [ _stateStackSize++ ] = _state;
+            _stateStack[_stateStackSize++] = _state;
             _cur.push();
         }
 
-        void pop ()
-        {
+        void pop() {
             _cur.pop();
-            _state = _stateStack [ --_stateStackSize ];
+            _state = _stateStack[--_stateStackSize];
         }
 
-        XmlDocumentProperties getDocProps ( ) { return Locale.getDocProps(_cur, false); }
+        XmlDocumentProperties getDocProps() {
+            return Locale.getDocProps(_cur, false);
+        }
 
         //
         //
@@ -4168,20 +3908,18 @@
 
         private static final int ROOT_START = 1;
         private static final int ELEM_START = 2;
-        private static final int ROOT_END   = 3;
-        private static final int ELEM_END   = 4;
-        private static final int CUR        = 5;
+        private static final int ROOT_END = 3;
+        private static final int ELEM_END = 4;
+        private static final int CUR = 5;
 
         private int _state;
 
         private int[] _stateStack;
-        private int   _stateStackSize;
+        private int _stateStackSize;
     }
 
-    private static final class PrettySaveCur extends SaveCur
-    {
-        PrettySaveCur ( SaveCur c, XmlOptions options )
-        {
+    private static final class PrettySaveCur extends SaveCur {
+        PrettySaveCur(SaveCur c, XmlOptions options) {
             _sb = new StringBuffer();
             _stack = new ArrayList();
 
@@ -4191,49 +3929,82 @@
 
             _prettyIndent = 2;
 
-            if (options.hasOption( XmlOptions.SAVE_PRETTY_PRINT_INDENT ))
-            {
+            if (options.hasOption(XmlOptions.SAVE_PRETTY_PRINT_INDENT)) {
                 _prettyIndent =
-                    ((Integer) options.get( XmlOptions.SAVE_PRETTY_PRINT_INDENT )).intValue();
+                        ((Integer) options.get(XmlOptions.SAVE_PRETTY_PRINT_INDENT)).intValue();
             }
 
-            if (options.hasOption( XmlOptions.SAVE_PRETTY_PRINT_OFFSET ))
-            {
+            if (options.hasOption(XmlOptions.SAVE_PRETTY_PRINT_OFFSET)) {
                 _prettyOffset =
-                    ((Integer) options.get( XmlOptions.SAVE_PRETTY_PRINT_OFFSET )).intValue();
+                        ((Integer) options.get(XmlOptions.SAVE_PRETTY_PRINT_OFFSET)).intValue();
             }
 
-            if (options.hasOption( XmlOptions.LOAD_SAVE_CDATA_BOOKMARKS ))
-            {
+            if (options.hasOption(XmlOptions.LOAD_SAVE_CDATA_BOOKMARKS)) {
                 _useCDataBookmarks = true;
             }
         }
 
-        List getAncestorNamespaces ( ) { return _cur.getAncestorNamespaces(); }
+        List getAncestorNamespaces() {
+            return _cur.getAncestorNamespaces();
+        }
 
-        void release ( ) { _cur.release(); }
+        void release() {
+            _cur.release();
+        }
 
-        int kind ( ) { return _txt == null ? _cur.kind() : TEXT; }
+        int kind() {
+            return _txt == null ? _cur.kind() : TEXT;
+        }
 
-        QName  getName        ( ) { assert _txt == null; return _cur.getName(); }
-        String getXmlnsPrefix ( ) { assert _txt == null; return _cur.getXmlnsPrefix(); }
-        String getXmlnsUri    ( ) { assert _txt == null; return _cur.getXmlnsUri(); }
+        QName getName() {
+            assert _txt == null;
+            return _cur.getName();
+        }
 
-        boolean isXmlns       ( ) { return _txt == null ? _cur.isXmlns()      : false; }
+        String getXmlnsPrefix() {
+            assert _txt == null;
+            return _cur.getXmlnsPrefix();
+        }
 
-        boolean hasChildren   ( ) { return _txt == null ? _cur.hasChildren() : false; }
-        boolean hasText       ( ) { return _txt == null ? _cur.hasText()     : false; }
+        String getXmlnsUri() {
+            assert _txt == null;
+            return _cur.getXmlnsUri();
+        }
+
+        boolean isXmlns() {
+            return _txt == null ? _cur.isXmlns() : false;
+        }
+
+        boolean hasChildren() {
+            return _txt == null ? _cur.hasChildren() : false;
+        }
+
+        boolean hasText() {
+            return _txt == null ? _cur.hasText() : false;
+        }
 
         // _cur.isTextCData() is expensive do it only if useCDataBookmarks option is enabled
-        boolean isTextCData   ( ) { return _txt == null ? (_useCDataBookmarks && _cur.isTextCData())
-                                                        : _isTextCData; }
+        boolean isTextCData() {
+            return _txt == null ? (_useCDataBookmarks && _cur.isTextCData())
+                    : _isTextCData;
+        }
 
-        boolean toFirstAttr   ( ) { assert _txt == null; return _cur.toFirstAttr(); }
-        boolean toNextAttr    ( ) { assert _txt == null; return _cur.toNextAttr(); }
-        String  getAttrValue  ( ) { assert _txt == null; return _cur.getAttrValue(); }
+        boolean toFirstAttr() {
+            assert _txt == null;
+            return _cur.toFirstAttr();
+        }
 
-        void toEnd ( )
-        {
+        boolean toNextAttr() {
+            assert _txt == null;
+            return _cur.toNextAttr();
+        }
+
+        String getAttrValue() {
+            assert _txt == null;
+            return _cur.getAttrValue();
+        }
+
+        void toEnd() {
             assert _txt == null;
             _cur.toEnd();
 
@@ -4241,37 +4012,35 @@
                 _depth--;
         }
 
-        boolean next ( )
-        {
+        boolean next() {
             int k;
 
-            if (_txt != null)
-            {
+            if (_txt != null) {
                 assert _txt.length() > 0;
                 assert !_cur.isText();
                 _txt = null;
                 _isTextCData = false;
                 k = _cur.kind();
-            }
-            else
-            {
+            } else {
                 int prevKind = k = _cur.kind();
 
                 if (!_cur.next())
                     return false;
 
-                _sb.delete( 0, _sb.length() );
+                _sb.delete(0, _sb.length());
 
                 assert _txt == null;
 
                 // place any text encountered in the buffer
-                if (_cur.isText())
-                {
+                if (_cur.isText()) {
                     // _cur.isTextCData() is expensive do it only if useCDataBookmarks option is enabled
                     _isTextCData = _useCDataBookmarks && _cur.isTextCData();
-                    CharUtil.getString( _sb, _cur.getChars(), _cur._offSrc, _cur._cchSrc );
+                    CharUtil.getString(_sb, _cur.getChars(), _cur._offSrc, _cur._cchSrc);
                     _cur.next();
-                    trim( _sb );
+                    k = _cur.kind();
+                    if (prevKind != ELEM || k != -ELEM) {
+                        trim(_sb);
+                    }
                 }
 
                 k = _cur.kind();
@@ -4279,27 +4048,22 @@
                 // Check for non leaf, _prettyIndent < 0 means that the save is all on one line
 
                 if (_prettyIndent >= 0 &&
-                      prevKind != COMMENT && prevKind != PROCINST && (prevKind != ELEM || k != -ELEM))
-//                if (prevKind != COMMENT && prevKind != PROCINST && (prevKind != ELEM || k != -ELEM))
-                {
-                    if (_sb.length() > 0)
-                    {
-                        _sb.insert( 0, _newLine );
-                        spaces( _sb, _newLine.length(), _prettyOffset + _prettyIndent * _depth );
+                        prevKind != COMMENT && prevKind != PROCINST && (prevKind != ELEM || k != -ELEM)) {
+                    if (_sb.length() > 0) {
+                        _sb.insert(0, _newLine);
+                        spaces(_sb, _newLine.length(), _prettyOffset + _prettyIndent * _depth);
                     }
 
-                    if (k != -ROOT)
-                    {
+                    if (k != -ROOT) {
                         if (prevKind != ROOT)
-                            _sb.append( _newLine );
+                            _sb.append(_newLine);
 
                         int d = k < 0 ? _depth - 1 : _depth;
-                        spaces( _sb, _sb.length(), _prettyOffset + _prettyIndent * d );
+                        spaces(_sb, _sb.length(), _prettyOffset + _prettyIndent * d);
                     }
                 }
 
-                if (_sb.length() > 0)
-                {
+                if (_sb.length() > 0) {
                     _txt = _sb.toString();
                     k = TEXT;
                 }
@@ -4313,26 +4077,22 @@
             return true;
         }
 
-        void push ( )
-        {
+        void push() {
             _cur.push();
-            _stack.add( _txt );
-            _stack.add( new Integer( _depth ) );
+            _stack.add(_txt);
+            _stack.add(new Integer(_depth));
             _isTextCData = false;
         }
 
-        void pop ( )
-        {
+        void pop() {
             _cur.pop();
-            _depth = ((Integer) _stack.remove( _stack.size() - 1 )).intValue();
-            _txt = (String) _stack.remove( _stack.size() - 1 );
+            _depth = ((Integer) _stack.remove(_stack.size() - 1)).intValue();
+            _txt = (String) _stack.remove(_stack.size() - 1);
             _isTextCData = false;
         }
 
-        Object getChars ( )
-        {
-            if (_txt != null)
-            {
+        Object getChars() {
+            if (_txt != null) {
                 _offSrc = 0;
                 _cchSrc = _txt.length();
                 return _txt;
@@ -4346,29 +4106,29 @@
             return o;
         }
 
-        XmlDocumentProperties getDocProps ( ) { return _cur.getDocProps(); }
-
-        static void spaces ( StringBuffer sb, int offset, int count )
-        {
-            while ( count-- > 0 )
-                sb.insert( offset, ' ' );
+        XmlDocumentProperties getDocProps() {
+            return _cur.getDocProps();
         }
 
-        static void trim ( StringBuffer sb )
-        {
+        static void spaces(StringBuffer sb, int offset, int count) {
+            while (count-- > 0)
+                sb.insert(offset, ' ');
+        }
+
+        static void trim(StringBuffer sb) {
             int i;
 
-            for ( i = 0 ; i < sb.length() ; i++ )
-                if (!CharUtil.isWhiteSpace( sb.charAt( i ) ))
+            for (i = 0; i < sb.length(); i++)
+                if (!CharUtil.isWhiteSpace(sb.charAt(i)))
                     break;
 
-            sb.delete( 0, i );
+            sb.delete(0, i);
 
-            for ( i = sb.length() ; i > 0 ; i-- )
-                if (!CharUtil.isWhiteSpace( sb.charAt( i - 1 ) ))
+            for (i = sb.length(); i > 0; i--)
+                if (!CharUtil.isWhiteSpace(sb.charAt(i - 1)))
                     break;
 
-            sb.delete( i, sb.length() );
+            sb.delete(i, sb.length());
         }
 
         private SaveCur _cur;
@@ -4376,14 +4136,14 @@
         private int _prettyIndent;
         private int _prettyOffset;
 
-        private String       _txt;
+        private String _txt;
         private StringBuffer _sb;
 
-        private int          _depth;
+        private int _depth;
 
-        private ArrayList    _stack;
-        private boolean      _isTextCData = false;
-        private boolean      _useCDataBookmarks = false;
+        private ArrayList _stack;
+        private boolean _isTextCData = false;
+        private boolean _useCDataBookmarks = false;
     }
 
 
@@ -4392,28 +4152,28 @@
     //
 
     private final Locale _locale;
-    private final long   _version;
+    private final long _version;
 
     private SaveCur _cur;
 
-    private List    _ancestorNamespaces;
-    private Map     _suggestedPrefixes;
+    private List _ancestorNamespaces;
+    private Map _suggestedPrefixes;
     protected XmlOptionCharEscapeMap _replaceChar;
     private boolean _useDefaultNamespace;
-    private Map     _preComputedNamespaces;
+    private Map _preComputedNamespaces;
     private boolean _saveNamespacesFirst;
 
     private ArrayList _attrNames;
     private ArrayList _attrValues;
 
     private ArrayList _namespaceStack;
-    private int       _currentMapping;
-    private HashMap   _uriMap;
-    private HashMap   _prefixMap;
-    private String    _initialDefaultUri;
+    private int _currentMapping;
+    private HashMap _uriMap;
+    private HashMap _prefixMap;
+    private String _initialDefaultUri;
 
     static final String _newLine =
-        SystemProperties.getProperty( "line.separator" ) == null
-            ? "\n"
-            : SystemProperties.getProperty( "line.separator" );
+            SystemProperties.getProperty("line.separator") == null
+                    ? "\n"
+                    : SystemProperties.getProperty("line.separator");
 }
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapBodyElementXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapBodyElementXobj.java
new file mode 100644
index 0000000..98f0627
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapBodyElementXobj.java
@@ -0,0 +1,30 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.SOAPBodyElement;
+
+import javax.xml.namespace.QName;
+
+class SoapBodyElementXobj extends SoapElementXobj implements SOAPBodyElement {
+    SoapBodyElementXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapBodyElementXobj(l, _name);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapBodyXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapBodyXobj.java
new file mode 100644
index 0000000..8eea3b5
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapBodyXobj.java
@@ -0,0 +1,59 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.*;
+import org.w3c.dom.Document;
+
+import javax.xml.namespace.QName;
+
+class SoapBodyXobj extends SoapElementXobj implements SOAPBody {
+    SoapBodyXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapBodyXobj(l, _name);
+    }
+
+    public boolean hasFault() {
+        return DomImpl.soapBody_hasFault(this);
+    }
+
+    public SOAPFault addFault() throws SOAPException {
+        return DomImpl.soapBody_addFault(this);
+    }
+
+    public SOAPFault getFault() {
+        return DomImpl.soapBody_getFault(this);
+    }
+
+    public SOAPBodyElement addBodyElement(Name name) {
+        return DomImpl.soapBody_addBodyElement(this, name);
+    }
+
+    public SOAPBodyElement addDocument(Document document) {
+        return DomImpl.soapBody_addDocument(this, document);
+    }
+
+    public SOAPFault addFault(Name name, String s) throws SOAPException {
+        return DomImpl.soapBody_addFault(this, name, s);
+    }
+
+    public SOAPFault addFault(Name faultCode, String faultString, java.util.Locale locale) throws SOAPException {
+        return DomImpl.soapBody_addFault(this, faultCode, faultString, locale);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapElementXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapElementXobj.java
new file mode 100644
index 0000000..e20a579
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapElementXobj.java
@@ -0,0 +1,142 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.Name;
+import org.apache.xmlbeans.impl.soap.SOAPElement;
+import org.apache.xmlbeans.impl.soap.SOAPException;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+class SoapElementXobj extends ElementXobj implements SOAPElement, org.apache.xmlbeans.impl.soap.Node {
+    SoapElementXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapElementXobj(l, _name);
+    }
+
+    public void detachNode() {
+        DomImpl._soapNode_detachNode(this);
+    }
+
+    public void recycleNode() {
+        DomImpl._soapNode_recycleNode(this);
+    }
+
+    public String getValue() {
+        return DomImpl._soapNode_getValue(this);
+    }
+
+    public void setValue(String value) {
+        DomImpl._soapNode_setValue(this, value);
+    }
+
+    public SOAPElement getParentElement() {
+        return DomImpl._soapNode_getParentElement(this);
+    }
+
+    public void setParentElement(SOAPElement p) {
+        DomImpl._soapNode_setParentElement(this, p);
+    }
+
+    public void removeContents() {
+        DomImpl._soapElement_removeContents(this);
+    }
+
+    public String getEncodingStyle() {
+        return DomImpl._soapElement_getEncodingStyle(this);
+    }
+
+    public void setEncodingStyle(String encodingStyle) {
+        DomImpl._soapElement_setEncodingStyle(this, encodingStyle);
+    }
+
+    public boolean removeNamespaceDeclaration(String prefix) {
+        return DomImpl._soapElement_removeNamespaceDeclaration(this, prefix);
+    }
+
+    public Iterator getAllAttributes() {
+        return DomImpl._soapElement_getAllAttributes(this);
+    }
+
+    public Iterator getChildElements() {
+        return DomImpl._soapElement_getChildElements(this);
+    }
+
+    public Iterator getNamespacePrefixes() {
+        return DomImpl._soapElement_getNamespacePrefixes(this);
+    }
+
+    public SOAPElement addAttribute(Name name, String value) throws SOAPException {
+        return DomImpl._soapElement_addAttribute(this, name, value);
+    }
+
+    public SOAPElement addChildElement(SOAPElement oldChild) throws SOAPException {
+        return DomImpl._soapElement_addChildElement(this, oldChild);
+    }
+
+    public SOAPElement addChildElement(Name name) throws SOAPException {
+        return DomImpl._soapElement_addChildElement(this, name);
+    }
+
+    public SOAPElement addChildElement(String localName) throws SOAPException {
+        return DomImpl._soapElement_addChildElement(this, localName);
+    }
+
+    public SOAPElement addChildElement(String localName, String prefix) throws SOAPException {
+        return DomImpl._soapElement_addChildElement(this, localName, prefix);
+    }
+
+    public SOAPElement addChildElement(String localName, String prefix, String uri) throws SOAPException {
+        return DomImpl._soapElement_addChildElement(this, localName, prefix, uri);
+    }
+
+    public SOAPElement addNamespaceDeclaration(String prefix, String uri) {
+        return DomImpl._soapElement_addNamespaceDeclaration(this, prefix, uri);
+    }
+
+    public SOAPElement addTextNode(String data) {
+        return DomImpl._soapElement_addTextNode(this, data);
+    }
+
+    public String getAttributeValue(Name name) {
+        return DomImpl._soapElement_getAttributeValue(this, name);
+    }
+
+    public Iterator getChildElements(Name name) {
+        return DomImpl._soapElement_getChildElements(this, name);
+    }
+
+    public Name getElementName() {
+        return DomImpl._soapElement_getElementName(this);
+    }
+
+    public String getNamespaceURI(String prefix) {
+        return DomImpl._soapElement_getNamespaceURI(this, prefix);
+    }
+
+    public Iterator getVisibleNamespacePrefixes() {
+        return DomImpl._soapElement_getVisibleNamespacePrefixes(this);
+    }
+
+    public boolean removeAttribute(Name name) {
+        return DomImpl._soapElement_removeAttribute(this, name);
+    }
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapEnvelopeXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapEnvelopeXobj.java
new file mode 100644
index 0000000..bacb2c0
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapEnvelopeXobj.java
@@ -0,0 +1,54 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.*;
+
+import javax.xml.namespace.QName;
+
+class SoapEnvelopeXobj extends SoapElementXobj implements SOAPEnvelope {
+    SoapEnvelopeXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapEnvelopeXobj(l, _name);
+    }
+
+    public SOAPBody addBody() throws SOAPException {
+        return DomImpl._soapEnvelope_addBody(this);
+    }
+
+    public SOAPBody getBody() throws SOAPException {
+        return DomImpl._soapEnvelope_getBody(this);
+    }
+
+    public SOAPHeader getHeader() throws SOAPException {
+        return DomImpl._soapEnvelope_getHeader(this);
+    }
+
+    public SOAPHeader addHeader() throws SOAPException {
+        return DomImpl._soapEnvelope_addHeader(this);
+    }
+
+    public Name createName(String localName) {
+        return DomImpl._soapEnvelope_createName(this, localName);
+    }
+
+    public Name createName(String localName, String prefix, String namespaceURI) {
+        return DomImpl._soapEnvelope_createName(this, localName, prefix, namespaceURI);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapFaultElementXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapFaultElementXobj.java
new file mode 100644
index 0000000..c4244e3
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapFaultElementXobj.java
@@ -0,0 +1,30 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.SOAPFaultElement;
+
+import javax.xml.namespace.QName;
+
+class SoapFaultElementXobj extends SoapElementXobj implements SOAPFaultElement {
+    SoapFaultElementXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapFaultElementXobj(l, _name);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapFaultXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapFaultXobj.java
new file mode 100644
index 0000000..787b997
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapFaultXobj.java
@@ -0,0 +1,81 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.Detail;
+import org.apache.xmlbeans.impl.soap.Name;
+import org.apache.xmlbeans.impl.soap.SOAPException;
+import org.apache.xmlbeans.impl.soap.SOAPFault;
+
+import javax.xml.namespace.QName;
+
+class SoapFaultXobj extends SoapBodyElementXobj implements SOAPFault {
+    SoapFaultXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapFaultXobj(l, _name);
+    }
+
+    public void setFaultString(String faultString) {
+        DomImpl.soapFault_setFaultString(this, faultString);
+    }
+
+    public void setFaultString(String faultString, java.util.Locale locale) {
+        DomImpl.soapFault_setFaultString(this, faultString, locale);
+    }
+
+    public void setFaultCode(Name faultCodeName) throws SOAPException {
+        DomImpl.soapFault_setFaultCode(this, faultCodeName);
+    }
+
+    public void setFaultActor(String faultActorString) {
+        DomImpl.soapFault_setFaultActor(this, faultActorString);
+    }
+
+    public String getFaultActor() {
+        return DomImpl.soapFault_getFaultActor(this);
+    }
+
+    public String getFaultCode() {
+        return DomImpl.soapFault_getFaultCode(this);
+    }
+
+    public void setFaultCode(String faultCode) throws SOAPException {
+        DomImpl.soapFault_setFaultCode(this, faultCode);
+    }
+
+    public java.util.Locale getFaultStringLocale() {
+        return DomImpl.soapFault_getFaultStringLocale(this);
+    }
+
+    public Name getFaultCodeAsName() {
+        return DomImpl.soapFault_getFaultCodeAsName(this);
+    }
+
+    public String getFaultString() {
+        return DomImpl.soapFault_getFaultString(this);
+    }
+
+    public Detail addDetail() throws SOAPException {
+        return DomImpl.soapFault_addDetail(this);
+    }
+
+    public Detail getDetail() {
+        return DomImpl.soapFault_getDetail(this);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapHeaderElementXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapHeaderElementXobj.java
new file mode 100644
index 0000000..7bbac9c
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapHeaderElementXobj.java
@@ -0,0 +1,46 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.SOAPHeaderElement;
+
+import javax.xml.namespace.QName;
+
+class SoapHeaderElementXobj extends SoapElementXobj implements SOAPHeaderElement {
+    SoapHeaderElementXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapHeaderElementXobj(l, _name);
+    }
+
+    public void setMustUnderstand(boolean mustUnderstand) {
+        DomImpl.soapHeaderElement_setMustUnderstand(this, mustUnderstand);
+    }
+
+    public boolean getMustUnderstand() {
+        return DomImpl.soapHeaderElement_getMustUnderstand(this);
+    }
+
+    public void setActor(String actor) {
+        DomImpl.soapHeaderElement_setActor(this, actor);
+    }
+
+    public String getActor() {
+        return DomImpl.soapHeaderElement_getActor(this);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapHeaderXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapHeaderXobj.java
new file mode 100644
index 0000000..0048ce3
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapHeaderXobj.java
@@ -0,0 +1,57 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.Name;
+import org.apache.xmlbeans.impl.soap.SOAPHeader;
+import org.apache.xmlbeans.impl.soap.SOAPHeaderElement;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+
+class SoapHeaderXobj extends SoapElementXobj implements SOAPHeader {
+    SoapHeaderXobj(Locale l, QName name) {
+        super(l, name);
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapHeaderXobj(l, _name);
+    }
+
+    public Iterator examineAllHeaderElements() {
+        return DomImpl.soapHeader_examineAllHeaderElements(this);
+    }
+
+    public Iterator extractAllHeaderElements() {
+        return DomImpl.soapHeader_extractAllHeaderElements(this);
+    }
+
+    public Iterator examineHeaderElements(String actor) {
+        return DomImpl.soapHeader_examineHeaderElements(this, actor);
+    }
+
+    public Iterator examineMustUnderstandHeaderElements(String mustUnderstandString) {
+        return DomImpl.soapHeader_examineMustUnderstandHeaderElements(this, mustUnderstandString);
+    }
+
+    public Iterator extractHeaderElements(String actor) {
+        return DomImpl.soapHeader_extractHeaderElements(this, actor);
+    }
+
+    public SOAPHeaderElement addHeaderElement(Name name) {
+        return DomImpl.soapHeader_addHeaderElement(this, name);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapPartDocXobj.java b/src/store/org/apache/xmlbeans/impl/store/SoapPartDocXobj.java
new file mode 100644
index 0000000..06facdf
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapPartDocXobj.java
@@ -0,0 +1,35 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+class SoapPartDocXobj extends DocumentXobj {
+    SoapPartDocXobj(Locale l) {
+        super(l);
+        //super( l, ROOT, DomImpl.DOCUMENT );
+        _soapPartDom = new SoapPartDom(this);
+    }
+
+    DomImpl.Dom getDom() {
+        return _soapPartDom;
+    }
+
+    Xobj newNode(Locale l) {
+        return new SoapPartDocXobj(l);
+    }
+
+    SoapPartDom _soapPartDom;
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/SoapPartDom.java b/src/store/org/apache/xmlbeans/impl/store/SoapPartDom.java
new file mode 100644
index 0000000..f773e81
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/SoapPartDom.java
@@ -0,0 +1,395 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.apache.xmlbeans.impl.soap.SOAPEnvelope;
+import org.apache.xmlbeans.impl.soap.SOAPPart;
+import org.w3c.dom.*;
+
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import java.io.PrintStream;
+import java.util.Iterator;
+
+class SoapPartDom extends SOAPPart implements DomImpl.Dom, Document, NodeList {
+    SoapPartDom(SoapPartDocXobj docXobj) {
+        _docXobj = docXobj;
+    }
+
+    public int nodeType() {
+        return DomImpl.DOCUMENT;
+    }
+
+    public Locale locale() {
+        return _docXobj._locale;
+    }
+
+    public Cur tempCur() {
+        return _docXobj.tempCur();
+    }
+
+    public QName getQName() {
+        return _docXobj._name;
+    }
+
+    public void dump() {
+        dump(System.out);
+    }
+
+    public void dump(PrintStream o) {
+        _docXobj.dump(o);
+    }
+
+    public void dump(PrintStream o, Object ref) {
+        _docXobj.dump(o, ref);
+    }
+
+    public String name() {
+        return "#document";
+    }
+
+    public Node appendChild(Node newChild) {
+        return DomImpl._node_appendChild(this, newChild);
+    }
+
+    public Node cloneNode(boolean deep) {
+        return DomImpl._node_cloneNode(this, deep);
+    }
+
+    public NamedNodeMap getAttributes() {
+        return null;
+    }
+
+    public NodeList getChildNodes() {
+        return this;
+    }
+
+    public Node getParentNode() {
+        return DomImpl._node_getParentNode(this);
+    }
+
+    public Node removeChild(Node oldChild) {
+        return DomImpl._node_removeChild(this, oldChild);
+    }
+
+    public Node getFirstChild() {
+        return DomImpl._node_getFirstChild(this);
+    }
+
+    public Node getLastChild() {
+        return DomImpl._node_getLastChild(this);
+    }
+
+    public String getLocalName() {
+        return DomImpl._node_getLocalName(this);
+    }
+
+    public String getNamespaceURI() {
+        return DomImpl._node_getNamespaceURI(this);
+    }
+
+    public Node getNextSibling() {
+        return DomImpl._node_getNextSibling(this);
+    }
+
+    public String getNodeName() {
+        return DomImpl._node_getNodeName(this);
+    }
+
+    public short getNodeType() {
+        return DomImpl._node_getNodeType(this);
+    }
+
+    public String getNodeValue() {
+        return DomImpl._node_getNodeValue(this);
+    }
+
+    public Document getOwnerDocument() {
+        return DomImpl._node_getOwnerDocument(this);
+    }
+
+    public String getPrefix() {
+        return DomImpl._node_getPrefix(this);
+    }
+
+    public Node getPreviousSibling() {
+        return DomImpl._node_getPreviousSibling(this);
+    }
+
+    public boolean hasAttributes() {
+        return DomImpl._node_hasAttributes(this);
+    }
+
+    public boolean hasChildNodes() {
+        return DomImpl._node_hasChildNodes(this);
+    }
+
+    public Node insertBefore(Node newChild, Node refChild) {
+        return DomImpl._node_insertBefore(this, newChild, refChild);
+    }
+
+    public boolean isSupported(String feature, String version) {
+        return DomImpl._node_isSupported(this, feature, version);
+    }
+
+    public void normalize() {
+        DomImpl._node_normalize(this);
+    }
+
+    public Node replaceChild(Node newChild, Node oldChild) {
+        return DomImpl._node_replaceChild(this, newChild, oldChild);
+    }
+
+    public void setNodeValue(String nodeValue) {
+        DomImpl._node_setNodeValue(this, nodeValue);
+    }
+
+    public void setPrefix(String prefix) {
+        DomImpl._node_setPrefix(this, prefix);
+    }
+
+    // DOM Level 3
+    public Object getUserData(String key) {
+        return DomImpl._node_getUserData(this, key);
+    }
+
+    public Object setUserData(String key, Object data, UserDataHandler handler) {
+        return DomImpl._node_setUserData(this, key, data, handler);
+    }
+
+    public Object getFeature(String feature, String version) {
+        return DomImpl._node_getFeature(this, feature, version);
+    }
+
+    public boolean isEqualNode(Node arg) {
+        return DomImpl._node_isEqualNode(this, arg);
+    }
+
+    public boolean isSameNode(Node arg) {
+        return DomImpl._node_isSameNode(this, arg);
+    }
+
+    public String lookupNamespaceURI(String prefix) {
+        return DomImpl._node_lookupNamespaceURI(this, prefix);
+    }
+
+    public String lookupPrefix(String namespaceURI) {
+        return DomImpl._node_lookupPrefix(this, namespaceURI);
+    }
+
+    public boolean isDefaultNamespace(String namespaceURI) {
+        return DomImpl._node_isDefaultNamespace(this, namespaceURI);
+    }
+
+    public void setTextContent(String textContent) {
+        DomImpl._node_setTextContent(this, textContent);
+    }
+
+    public String getTextContent() {
+        return DomImpl._node_getTextContent(this);
+    }
+
+    public short compareDocumentPosition(Node other) {
+        return DomImpl._node_compareDocumentPosition(this, other);
+    }
+
+    public String getBaseURI() {
+        return DomImpl._node_getBaseURI(this);
+    }
+
+    public Node adoptNode(Node source) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public String getDocumentURI() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public DOMConfiguration getDomConfig() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public String getInputEncoding() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public boolean getStrictErrorChecking() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public String getXmlEncoding() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public boolean getXmlStandalone() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public String getXmlVersion() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void normalizeDocument() {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public Node renameNode(Node n, String namespaceURI, String qualifiedName) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setDocumentURI(String documentURI) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setStrictErrorChecking(boolean strictErrorChecking) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setXmlStandalone(boolean xmlStandalone) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public void setXmlVersion(String xmlVersion) {
+        throw new RuntimeException("DOM Level 3 Not implemented");
+    }
+
+    public Attr createAttribute(String name) {
+        return DomImpl._document_createAttribute(this, name);
+    }
+
+    public Attr createAttributeNS(String namespaceURI, String qualifiedName) {
+        return DomImpl._document_createAttributeNS(this, namespaceURI, qualifiedName);
+    }
+
+    public CDATASection createCDATASection(String data) {
+        return DomImpl._document_createCDATASection(this, data);
+    }
+
+    public Comment createComment(String data) {
+        return DomImpl._document_createComment(this, data);
+    }
+
+    public DocumentFragment createDocumentFragment() {
+        return DomImpl._document_createDocumentFragment(this);
+    }
+
+    public Element createElement(String tagName) {
+        return DomImpl._document_createElement(this, tagName);
+    }
+
+    public Element createElementNS(String namespaceURI, String qualifiedName) {
+        return DomImpl._document_createElementNS(this, namespaceURI, qualifiedName);
+    }
+
+    public EntityReference createEntityReference(String name) {
+        return DomImpl._document_createEntityReference(this, name);
+    }
+
+    public ProcessingInstruction createProcessingInstruction(String target, String data) {
+        return DomImpl._document_createProcessingInstruction(this, target, data);
+    }
+
+    public Text createTextNode(String data) {
+        return DomImpl._document_createTextNode(this, data);
+    }
+
+    public DocumentType getDoctype() {
+        return DomImpl._document_getDoctype(this);
+    }
+
+    public Element getDocumentElement() {
+        return DomImpl._document_getDocumentElement(this);
+    }
+
+    public Element getElementById(String elementId) {
+        return DomImpl._document_getElementById(this, elementId);
+    }
+
+    public NodeList getElementsByTagName(String tagname) {
+        return DomImpl._document_getElementsByTagName(this, tagname);
+    }
+
+    public NodeList getElementsByTagNameNS(String namespaceURI, String localName) {
+        return DomImpl._document_getElementsByTagNameNS(this, namespaceURI, localName);
+    }
+
+    public DOMImplementation getImplementation() {
+        return DomImpl._document_getImplementation(this);
+    }
+
+    public Node importNode(Node importedNode, boolean deep) {
+        return DomImpl._document_importNode(this, importedNode, deep);
+    }
+
+    public int getLength() {
+        return DomImpl._childNodes_getLength(this);
+    }
+
+    public Node item(int i) {
+        return DomImpl._childNodes_item(this, i);
+    }
+
+    public void removeAllMimeHeaders() {
+        DomImpl._soapPart_removeAllMimeHeaders(this);
+    }
+
+    public void removeMimeHeader(String name) {
+        DomImpl._soapPart_removeMimeHeader(this, name);
+    }
+
+    public Iterator getAllMimeHeaders() {
+        return DomImpl._soapPart_getAllMimeHeaders(this);
+    }
+
+    public SOAPEnvelope getEnvelope() {
+        return DomImpl._soapPart_getEnvelope(this);
+    }
+
+    public Source getContent() {
+        return DomImpl._soapPart_getContent(this);
+    }
+
+    public void setContent(Source source) {
+        DomImpl._soapPart_setContent(this, source);
+    }
+
+    public String[] getMimeHeader(String name) {
+        return DomImpl._soapPart_getMimeHeader(this, name);
+    }
+
+    public void addMimeHeader(String name, String value) {
+        DomImpl._soapPart_addMimeHeader(this, name, value);
+    }
+
+    public void setMimeHeader(String name, String value) {
+        DomImpl._soapPart_setMimeHeader(this, name, value);
+    }
+
+    public Iterator getMatchingMimeHeaders(String[] names) {
+        return DomImpl._soapPart_getMatchingMimeHeaders(this, names);
+    }
+
+    public Iterator getNonMatchingMimeHeaders(String[] names) {
+        return DomImpl._soapPart_getNonMatchingMimeHeaders(this, names);
+    }
+
+    public boolean nodeCanHavePrefixUri() {
+        return true;
+    }
+
+    SoapPartDocXobj _docXobj;
+}
+
diff --git a/src/store/org/apache/xmlbeans/impl/store/TextNode.java b/src/store/org/apache/xmlbeans/impl/store/TextNode.java
new file mode 100644
index 0000000..c7f33ec
--- /dev/null
+++ b/src/store/org/apache/xmlbeans/impl/store/TextNode.java
@@ -0,0 +1,48 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import org.w3c.dom.Text;
+
+class TextNode extends CharNode implements Text {
+    TextNode(Locale l) {
+        super(l);
+    }
+
+    public int nodeType() {
+        return DomImpl.TEXT;
+    }
+
+    public String name() {
+        return "#text";
+    }
+
+    public Text splitText(int offset) {
+        return DomImpl._text_splitText(this, offset);
+    }
+
+    public String getWholeText() {
+        return DomImpl._text_getWholeText(this);
+    }
+
+    public boolean isElementContentWhitespace() {
+        return DomImpl._text_isElementContentWhitespace(this);
+    }
+
+    public Text replaceWholeText(String content) {
+        return DomImpl._text_replaceWholeText(this, content);
+    }
+}
diff --git a/src/store/org/apache/xmlbeans/impl/store/Validate.java b/src/store/org/apache/xmlbeans/impl/store/Validate.java
index fadfa2b..e866448 100644
--- a/src/store/org/apache/xmlbeans/impl/store/Validate.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Validate.java
@@ -42,9 +42,9 @@
         {
             _cur.pop();
             _cur = null;
-            
+
             _sink = null;
-            
+
             _textCur.release();
         }
     }
@@ -57,7 +57,7 @@
         {
             // If validating an attr, I'm really validating the contents of that attr.  So, go to
             // any text value and shove it thru the validator.
-            
+
             _cur.next();
 
             if (_cur.isText())
@@ -68,7 +68,7 @@
             assert _cur.isContainer();
 
             // Do the attrs of the top container
-            
+
             doAttrs();
 
             for ( _cur.next() ; ! _cur.isAtEndOfLastPush() ; _cur.next() )
@@ -79,15 +79,15 @@
                     emitEvent( ValidatorListener.BEGIN );
                     doAttrs();
                     break;
-                
+
                 case - Cur.ELEM :
                     emitEvent( ValidatorListener.END );
                     break;
-                
+
                 case Cur.TEXT :
                     emitText();
                     break;
-                    
+
                 case Cur.COMMENT  :
                 case Cur.PROCINST :
                     _cur.toEnd();
@@ -98,7 +98,7 @@
                 }
             }
         }
-        
+
         emitEvent( ValidatorListener.END );
     }
 
@@ -106,9 +106,9 @@
     {
         // When processing attrs, there can be no accumulated text because there would have been
         // a preceeding event which would have flushged the text.
-        
+
         assert !_hasText;
-        
+
         if (_cur.toFirstAttr())
         {
             do
@@ -120,7 +120,7 @@
 
             _cur.toParent();
         }
-        
+
         _sink.nextEvent( ValidatorListener.ENDATTRS, this );
     }
 
@@ -144,9 +144,9 @@
 
                 _oneChunk = false;
             }
-            
+
             assert _textSb != null && _textSb.length() > 0;
-                
+
             CharUtil.getString( _textSb, _cur.getChars( -1 ), _cur._offSrc, _cur._cchSrc );
         }
         else
@@ -181,7 +181,7 @@
         assert _oneChunk || (_textSb != null && _textSb.length() > 0);
         assert !_oneChunk || _textCur.isText();
 
-        return _oneChunk ? _textCur.getCharsAsString( -1 ) : _textSb.toString();
+        return _oneChunk ? _textCur.getCharsAsString() : _textSb.toString();
     }
 
     public String getText ( int wsr )
@@ -194,7 +194,7 @@
         assert !_oneChunk || _textCur.isText();
 
         if (_oneChunk)
-            return _textCur.getCharsAsString( -1, wsr );
+            return _textCur.getCharsAsString( wsr );
 
         return Locale.applyWhiteSpaceRule( _textSb.toString(), wsr );
     }
@@ -207,7 +207,7 @@
                 _cur._locale.getCharUtil().isWhiteSpace(
                     _cur.getFirstChars(), _cur._offSrc, _cur._cchSrc );
         }
-        
+
         assert _hasText;
 
         if (_oneChunk)
@@ -218,7 +218,7 @@
         }
 
         String s = _textSb.toString();
-        
+
         return _cur._locale.getCharUtil().isWhiteSpace( s, 0, s.length() );
     }
 
@@ -275,7 +275,7 @@
     // This way, when I turn the text into a String, I can cache the string.  If multiple chunks
     // of text exists for one event, then I accumulate all the text into a string buffer and I,
     // then, don't care about caching Strings.
-    
+
     private boolean _hasText;
     private boolean _oneChunk;
 
diff --git a/src/store/org/apache/xmlbeans/impl/store/Xobj.java b/src/store/org/apache/xmlbeans/impl/store/Xobj.java
index 6cbfa84..b9bb191 100644
--- a/src/store/org/apache/xmlbeans/impl/store/Xobj.java
+++ b/src/store/org/apache/xmlbeans/impl/store/Xobj.java
@@ -15,86 +15,23 @@
 
 package org.apache.xmlbeans.impl.store;
 
-import org.apache.xmlbeans.CDataBookmark;
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Comment;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.DOMImplementation;
-import org.w3c.dom.Element;
-import org.w3c.dom.EntityReference;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.ProcessingInstruction;
-import org.w3c.dom.Text;
-import org.w3c.dom.DOMImplementation;
-
-// DOM Level 3
-import org.w3c.dom.UserDataHandler;
-import org.w3c.dom.DOMConfiguration;
-import org.w3c.dom.TypeInfo;
-
-
-import javax.xml.transform.Source;
-
-import java.io.PrintStream;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-import org.apache.xmlbeans.impl.soap.Detail;
-import org.apache.xmlbeans.impl.soap.DetailEntry;
-import org.apache.xmlbeans.impl.soap.MimeHeaders;
-import org.apache.xmlbeans.impl.soap.Name;
-import org.apache.xmlbeans.impl.soap.SOAPBody;
-import org.apache.xmlbeans.impl.soap.SOAPBodyElement;
-import org.apache.xmlbeans.impl.soap.SOAPElement;
-import org.apache.xmlbeans.impl.soap.SOAPEnvelope;
-import org.apache.xmlbeans.impl.soap.SOAPException;
-import org.apache.xmlbeans.impl.soap.SOAPFactory;
-import org.apache.xmlbeans.impl.soap.SOAPFault;
-import org.apache.xmlbeans.impl.soap.SOAPFaultElement;
-import org.apache.xmlbeans.impl.soap.SOAPHeader;
-import org.apache.xmlbeans.impl.soap.SOAPHeaderElement;
-import org.apache.xmlbeans.impl.soap.SOAPPart;
-import org.apache.xmlbeans.impl.store.Locale.LoadContext;
-
-import org.apache.xmlbeans.impl.store.DomImpl.Dom;
-import org.apache.xmlbeans.impl.store.DomImpl.CharNode;
-import org.apache.xmlbeans.impl.store.DomImpl.TextNode;
-import org.apache.xmlbeans.impl.store.DomImpl.CdataNode;
-import org.apache.xmlbeans.impl.store.DomImpl.SaajTextNode;
-import org.apache.xmlbeans.impl.store.DomImpl.SaajCdataNode;
-
-import org.apache.xmlbeans.XmlBeans;
-import org.apache.xmlbeans.SchemaField;
-import org.apache.xmlbeans.SchemaType;
-import org.apache.xmlbeans.SchemaTypeLoader;
-import org.apache.xmlbeans.XmlCursor;
-import org.apache.xmlbeans.XmlCursor.XmlMark;
-import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlException;
-import org.apache.xmlbeans.QNameSet;
-
-import org.apache.xmlbeans.impl.values.TypeStore;
-import org.apache.xmlbeans.impl.values.TypeStoreUser;
-import org.apache.xmlbeans.impl.values.TypeStoreVisitor;
-import org.apache.xmlbeans.impl.values.TypeStoreUserFactory;
-
-import javax.xml.namespace.QName;
-
+import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.impl.common.QNameHelper;
 import org.apache.xmlbeans.impl.common.ValidatorListener;
 import org.apache.xmlbeans.impl.common.XmlLocale;
-import org.apache.xmlbeans.impl.common.QNameHelper;
+import org.apache.xmlbeans.impl.store.DomImpl.Dom;
+import org.apache.xmlbeans.impl.values.TypeStore;
+import org.apache.xmlbeans.impl.values.TypeStoreUser;
+import org.apache.xmlbeans.impl.values.TypeStoreUserFactory;
+import org.apache.xmlbeans.impl.values.TypeStoreVisitor;
+
+import javax.xml.namespace.QName;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+// DOM Level 3
 
 abstract class Xobj implements TypeStore
 {
@@ -232,7 +169,7 @@
             _srcValue == null &&
             _charNodesValue == null)
         {
-            assert (_firstChild instanceof Xobj.NodeXobj):
+            assert (_firstChild instanceof NodeXobj):
                 "wrong node type";
             return true;
         }
@@ -250,7 +187,7 @@
             _srcAfter == null)
         {
             assert (_nextSibling == null ||
-                _nextSibling instanceof Xobj.NodeXobj):
+                _nextSibling instanceof NodeXobj):
                 "wrong node type";
             return true;
         }
@@ -581,7 +518,7 @@
             QName oldName = _name;
 
             _name = newName;
-            if (this instanceof Xobj.NamedNodeXobj)
+            if (this instanceof NamedNodeXobj)
             {
                 NamedNodeXobj me = (NamedNodeXobj)this;
                 me._canHavePrefixUri = true;
@@ -1909,7 +1846,7 @@
         try
         {
             Cur c = tempCur();
-            c.setSubstitution( name, type, false );
+            c.setSubstitution( name, type );
             c.release();
         }
         finally
@@ -2390,7 +2327,7 @@
         if ( Boolean.TRUE.equals(options.get(XmlOptions.COPY_USE_NEW_SYNC_DOMAIN)) )
             locale = Locale.getLocale(stl, options);
 
-        if (sType.isDocumentType() || (sType.isNoType() && (this instanceof Xobj.DocumentXobj)))
+        if (sType.isDocumentType() || (sType.isNoType() && (this instanceof DocumentXobj)))
             destination = Cur.createDomDocumentRootXobj(locale, false);
         else
             destination = Cur.createDomDocumentRootXobj(locale, true);
@@ -2553,676 +2490,6 @@
         return namespaceForPrefix( prefix, true );
     }
 
-    //
-    //
-    //
-
-    abstract static class NodeXobj extends Xobj implements Dom, Node, NodeList
-    {
-        NodeXobj ( Locale l, int kind, int domType )
-        {
-            super( l, kind, domType );
-        }
-
-        Dom getDom ( ) { return this; }
-
-        //
-        //
-        //
-
-        public int getLength ( ) { return DomImpl._childNodes_getLength( this ); }
-        public Node item ( int i ) { return DomImpl._childNodes_item( this, i ); }
-
-        public Node appendChild ( Node newChild ) { return DomImpl._node_appendChild( this, newChild ); }
-        public Node cloneNode ( boolean deep ) { return DomImpl._node_cloneNode( this, deep ); }
-        public NamedNodeMap getAttributes ( ) { return null; }
-        public NodeList getChildNodes ( ) { return this; }
-        public Node getParentNode ( ) { return DomImpl._node_getParentNode( this ); }
-        public Node removeChild ( Node oldChild ) { return DomImpl._node_removeChild( this, oldChild ); }
-        public Node getFirstChild ( ) { return DomImpl._node_getFirstChild( this ); }
-        public Node getLastChild ( ) { return DomImpl._node_getLastChild( this ); }
-        public String getLocalName ( ) { return DomImpl._node_getLocalName( this ); }
-        public String getNamespaceURI ( ) { return DomImpl._node_getNamespaceURI( this ); }
-        public Node getNextSibling ( ) { return DomImpl._node_getNextSibling( this ); }
-        public String getNodeName ( ) { return DomImpl._node_getNodeName( this ); }
-        public short getNodeType ( ) { return DomImpl._node_getNodeType( this ); }
-        public String getNodeValue ( ) { return DomImpl._node_getNodeValue( this ); }
-        public Document getOwnerDocument ( ) { return DomImpl._node_getOwnerDocument( this ); }
-        public String getPrefix ( ) { return DomImpl._node_getPrefix( this ); }
-        public Node getPreviousSibling ( ) { return DomImpl._node_getPreviousSibling( this ); }
-        public boolean hasAttributes ( ) { return DomImpl._node_hasAttributes( this ); }
-        public boolean hasChildNodes ( ) { return DomImpl._node_hasChildNodes( this ); }
-        public Node insertBefore ( Node newChild, Node refChild ) { return DomImpl._node_insertBefore( this, newChild, refChild ); }
-        public boolean isSupported ( String feature, String version ) { return DomImpl._node_isSupported( this, feature, version ); }
-        public void normalize ( ) { DomImpl._node_normalize( this ); }
-        public Node replaceChild ( Node newChild, Node oldChild ) { return DomImpl._node_replaceChild( this, newChild, oldChild ); }
-        public void setNodeValue ( String nodeValue ) { DomImpl._node_setNodeValue( this, nodeValue ); }
-        public void setPrefix ( String prefix ) { DomImpl._node_setPrefix( this, prefix ); }
-        public boolean nodeCanHavePrefixUri( ){ return false; }
-
-        // DOM Level 3
-        public Object getUserData ( String key ) { return DomImpl._node_getUserData( this, key ); }
-        public Object setUserData ( String key, Object data, UserDataHandler handler ) { return DomImpl._node_setUserData( this, key, data, handler ); }
-        public Object getFeature ( String feature, String version ) { return DomImpl._node_getFeature( this, feature, version ); }
-        public boolean isEqualNode ( Node arg ) { return DomImpl._node_isEqualNode( this, arg ); }
-        public boolean isSameNode ( Node arg ) { return DomImpl._node_isSameNode( this, arg ); }
-        public String lookupNamespaceURI ( String prefix ) { return DomImpl._node_lookupNamespaceURI( this, prefix ); }
-        public String lookupPrefix ( String namespaceURI ) { return DomImpl._node_lookupPrefix( this, namespaceURI ); }
-        public boolean isDefaultNamespace ( String namespaceURI ) { return DomImpl._node_isDefaultNamespace( this, namespaceURI ); }
-        public void setTextContent ( String textContent ) { DomImpl._node_setTextContent( this, textContent ); }
-        public String getTextContent ( ) { return DomImpl._node_getTextContent( this ); }
-        public short compareDocumentPosition ( Node other ) { return DomImpl._node_compareDocumentPosition( this, other ); }
-        public String getBaseURI ( ) { return DomImpl._node_getBaseURI( this ); }
-    }
-
-     static class DocumentXobj extends NodeXobj implements Document
-    {
-        DocumentXobj ( Locale l )
-        {
-            super( l, ROOT, DomImpl.DOCUMENT );
-        }
-
-        Xobj newNode ( Locale l ) { return new DocumentXobj( l ); }
-
-        //
-        //
-        //
-
-        public Attr createAttribute ( String name ) { return DomImpl._document_createAttribute( this, name ); }
-        public Attr createAttributeNS ( String namespaceURI, String qualifiedName ) { return DomImpl._document_createAttributeNS( this, namespaceURI, qualifiedName ); }
-        public CDATASection createCDATASection ( String data ) { return DomImpl._document_createCDATASection( this, data ); }
-        public Comment createComment ( String data ) { return DomImpl._document_createComment( this, data ); }
-        public DocumentFragment createDocumentFragment ( ) { return DomImpl._document_createDocumentFragment( this ); }
-        public Element createElement ( String tagName ) { return DomImpl._document_createElement( this, tagName ); }
-        public Element createElementNS ( String namespaceURI, String qualifiedName ) { return DomImpl._document_createElementNS( this, namespaceURI, qualifiedName ); }
-        public EntityReference createEntityReference ( String name ) { return DomImpl._document_createEntityReference( this, name ); }
-        public ProcessingInstruction createProcessingInstruction ( String target, String data ) { return DomImpl._document_createProcessingInstruction( this, target, data ); }
-        public Text createTextNode ( String data ) { return DomImpl._document_createTextNode( this, data ); }
-        public DocumentType getDoctype ( ) { return DomImpl._document_getDoctype( this ); }
-        public Element getDocumentElement ( ) { return DomImpl._document_getDocumentElement( this ); }
-        public Element getElementById ( String elementId ) {
-            if ( _idToElement == null )return null;
-            Xobj o = (Xobj) _idToElement.get(elementId);
-            if (o == null) return null;
-            if (!isInSameTree(o))
-            {
-                _idToElement.remove(elementId);
-            }
-            return (Element)o;
-        }
-        public NodeList getElementsByTagName ( String tagname ) { return DomImpl._document_getElementsByTagName( this, tagname ); }
-        public NodeList getElementsByTagNameNS ( String namespaceURI, String localName ) { return DomImpl._document_getElementsByTagNameNS( this, namespaceURI, localName ); }
-        public DOMImplementation getImplementation ( ) { return DomImpl._document_getImplementation( this ); }
-        public Node importNode ( Node importedNode, boolean deep ) { return DomImpl._document_importNode( this, importedNode, deep ); }
-
-        // DOM Level 3
-        public Node adoptNode ( Node source ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public String getDocumentURI ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public DOMConfiguration getDomConfig ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public String getInputEncoding ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public boolean getStrictErrorChecking ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public String getXmlEncoding ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public boolean getXmlStandalone ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public String getXmlVersion ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void normalizeDocument ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public Node renameNode ( Node n, String namespaceURI, String qualifiedName ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setDocumentURI ( String documentURI ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setStrictErrorChecking ( boolean strictErrorChecking ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setXmlStandalone ( boolean xmlStandalone ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setXmlVersion ( String xmlVersion ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-
-        protected void addIdElement( String idVal, Dom e){
-            if ( _idToElement == null)
-                _idToElement = new java.util.Hashtable();
-            _idToElement.put(idVal,e);
-        }
-         void removeIdElement( String idVal ){
-            if (_idToElement != null)
-                _idToElement.remove(idVal);
-        }
-        private java.util.Hashtable  _idToElement;
-    }
-    static class DocumentFragXobj extends NodeXobj implements DocumentFragment
-    {
-        DocumentFragXobj ( Locale l ) { super( l, ROOT, DomImpl.DOCFRAG ); }
-
-        Xobj newNode ( Locale l ) { return new DocumentFragXobj( l ); }
-    }
-
-    final static class ElementAttributes implements NamedNodeMap
-    {
-        ElementAttributes ( ElementXobj elementXobj )
-        {
-            _elementXobj = elementXobj;
-        }
-
-        public int getLength ( ) { return DomImpl._attributes_getLength( _elementXobj ); }
-        public Node getNamedItem ( String name ) { return DomImpl._attributes_getNamedItem ( _elementXobj, name ); }
-        public Node getNamedItemNS ( String namespaceURI, String localName ) { return DomImpl._attributes_getNamedItemNS ( _elementXobj, namespaceURI, localName ); }
-        public Node item ( int index ) { return DomImpl._attributes_item ( _elementXobj, index ); }
-        public Node removeNamedItem ( String name ) { return DomImpl._attributes_removeNamedItem ( _elementXobj, name ); }
-        public Node removeNamedItemNS ( String namespaceURI, String localName ) { return DomImpl._attributes_removeNamedItemNS ( _elementXobj, namespaceURI, localName ); }
-        public Node setNamedItem ( Node arg ) { return DomImpl._attributes_setNamedItem ( _elementXobj, arg ); }
-        public Node setNamedItemNS ( Node arg ) { return DomImpl._attributes_setNamedItemNS ( _elementXobj, arg ); }
-
-        private ElementXobj _elementXobj;
-    }
-
-    static abstract class NamedNodeXobj extends NodeXobj
-    {
-        NamedNodeXobj ( Locale l, int kind, int domType )
-        {
-            super( l, kind, domType );
-            _canHavePrefixUri = true;
-        }
-
-        public boolean nodeCanHavePrefixUri( ){ return _canHavePrefixUri; }
-
-        boolean _canHavePrefixUri;
-    }
-    
-    static class ElementXobj extends NamedNodeXobj implements Element
-    {
-        ElementXobj ( Locale l, QName name )
-        {
-            super( l, ELEM, DomImpl.ELEMENT );
-            _name = name;
-        }
-
-        Xobj newNode ( Locale l ) { return new ElementXobj( l, _name ); }
-
-        //
-        //
-        //
-
-        public NamedNodeMap getAttributes ( )
-        {
-            if (_attributes == null)
-                _attributes = new ElementAttributes( this );
-
-            return _attributes;
-        }
-
-        public String getAttribute ( String name ) { return DomImpl._element_getAttribute( this, name ); }
-        public Attr getAttributeNode ( String name ) { return DomImpl._element_getAttributeNode( this, name ); }
-        public Attr getAttributeNodeNS ( String namespaceURI, String localName ) { return DomImpl._element_getAttributeNodeNS( this, namespaceURI, localName ); }
-        public String getAttributeNS ( String namespaceURI, String localName ) { return DomImpl._element_getAttributeNS( this, namespaceURI, localName ); }
-        public NodeList getElementsByTagName ( String name ) { return DomImpl._element_getElementsByTagName( this, name ); }
-        public NodeList getElementsByTagNameNS ( String namespaceURI, String localName ) { return DomImpl._element_getElementsByTagNameNS( this, namespaceURI, localName ); }
-        public String getTagName ( ) { return DomImpl._element_getTagName( this ); }
-        public boolean hasAttribute ( String name ) { return DomImpl._element_hasAttribute( this, name ); }
-        public boolean hasAttributeNS ( String namespaceURI, String localName ) { return DomImpl._element_hasAttributeNS( this, namespaceURI, localName ); }
-        public void removeAttribute ( String name ) { DomImpl._element_removeAttribute( this, name ); }
-        public Attr removeAttributeNode ( Attr oldAttr ) { return DomImpl._element_removeAttributeNode( this, oldAttr ); }
-        public void removeAttributeNS ( String namespaceURI, String localName ) { DomImpl._element_removeAttributeNS( this, namespaceURI, localName ); }
-        public void setAttribute ( String name, String value ) { DomImpl._element_setAttribute( this, name, value ); }
-        public Attr setAttributeNode ( Attr newAttr ) { return DomImpl._element_setAttributeNode( this, newAttr ); }
-        public Attr setAttributeNodeNS ( Attr newAttr ) { return DomImpl._element_setAttributeNodeNS( this, newAttr ); }
-        public void setAttributeNS ( String namespaceURI, String qualifiedName, String value ) { DomImpl._element_setAttributeNS( this, namespaceURI, qualifiedName, value ); }
-
-        // DOM Level 3
-        public TypeInfo getSchemaTypeInfo ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setIdAttribute ( String name, boolean isId ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setIdAttributeNS ( String namespaceURI, String localName, boolean isId ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setIdAttributeNode ( Attr idAttr, boolean isId ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-
-        private ElementAttributes _attributes;
-    }
-
-    static class AttrXobj extends NamedNodeXobj implements Attr
-    {
-        AttrXobj ( Locale l, QName name )
-        {
-            super( l, ATTR, DomImpl.ATTR );
-            _name = name;
-        }
-
-        Xobj newNode ( Locale l ) { return new AttrXobj( l, _name ); }
-
-        //
-        public Node getNextSibling ( ) { return null; }
-        //
-
-        public String getName ( ) { return DomImpl._node_getNodeName( this ); }
-        public Element getOwnerElement ( ) { return DomImpl._attr_getOwnerElement( this ); }
-        public boolean getSpecified ( ) { return DomImpl._attr_getSpecified( this ); }
-        public String getValue ( ) { return DomImpl._node_getNodeValue( this ); }
-        public void setValue ( String value ) { DomImpl._node_setNodeValue( this, value ); }
-
-        // DOM Level 3
-        public TypeInfo getSchemaTypeInfo ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public boolean isId ( ) { return false; }
-    }
-
-     static class AttrIdXobj
-         extends AttrXobj
-     {
-         AttrIdXobj ( Locale l, QName name )
-        {
-            super( l, name );
-        }
-         public boolean isId()
-         {
-             return true;
-         }
-     }
-    static class CommentXobj extends NodeXobj implements Comment
-    {
-        CommentXobj ( Locale l ) { super( l, COMMENT, DomImpl.COMMENT ); }
-
-        Xobj newNode ( Locale l ) { return new CommentXobj( l ); }
-
-        public NodeList getChildNodes ( ) { return DomImpl._emptyNodeList; }
-
-        public void appendData ( String arg ) { DomImpl._characterData_appendData( this, arg ); }
-        public void deleteData ( int offset, int count ) { DomImpl._characterData_deleteData( this, offset, count ); }
-        public String getData ( ) { return DomImpl._characterData_getData( this ); }
-        public int getLength ( ) { return DomImpl._characterData_getLength( this ); }
-        public Node getFirstChild ( ) { return null; }
-        public void insertData ( int offset, String arg ) { DomImpl._characterData_insertData( this, offset, arg ); }
-        public void replaceData ( int offset, int count, String arg ) { DomImpl._characterData_replaceData( this, offset, count, arg ); }
-        public void setData ( String data ) { DomImpl._characterData_setData( this, data ); }
-        public String substringData ( int offset, int count ) { return DomImpl._characterData_substringData( this, offset, count ); }
-    }
-
-    static class ProcInstXobj extends NodeXobj implements ProcessingInstruction
-    {
-        ProcInstXobj ( Locale l, String target )
-        {
-            super( l, PROCINST, DomImpl.PROCINST );
-            _name = _locale.makeQName( null, target );
-        }
-
-        Xobj newNode ( Locale l ) { return new ProcInstXobj( l, _name.getLocalPart() ); }
-
-        public int getLength ( ) { return 0; }
-        public Node getFirstChild ( ) { return null; }
-
-        public String getData ( ) { return DomImpl._processingInstruction_getData( this ); }
-        public String getTarget ( ) { return DomImpl._processingInstruction_getTarget( this ); }
-        public void setData ( String data ) { DomImpl._processingInstruction_setData( this, data ); }
-    }
-
-    //
-    // SAAJ objects
-    //
-
-    static class SoapPartDocXobj extends DocumentXobj
-    {
-        SoapPartDocXobj ( Locale l )
-        {
-            super(l);
-            //super( l, ROOT, DomImpl.DOCUMENT );
-            _soapPartDom = new SoapPartDom( this );
-        }
-
-        Dom getDom ( ) { return _soapPartDom; }
-
-        Xobj newNode ( Locale l ) { return new SoapPartDocXobj( l ); }
-
-        SoapPartDom _soapPartDom;
-    }
-
-    static class SoapPartDom extends SOAPPart implements Dom, Document, NodeList
-    {
-        SoapPartDom ( SoapPartDocXobj docXobj )
-        {
-            _docXobj = docXobj;
-        }
-
-        public int    nodeType ( ) { return DomImpl.DOCUMENT;   }
-        public Locale locale   ( ) { return _docXobj._locale;   }
-        public Cur    tempCur  ( ) { return _docXobj.tempCur(); }
-        public QName  getQName ( ) { return _docXobj._name;     }
-
-        public void dump ( ) { dump( System.out ); }
-        public void dump ( PrintStream o ) { _docXobj.dump( o ); }
-        public void dump ( PrintStream o, Object ref ) { _docXobj.dump( o, ref ); }
-
-        public String name ( ) { return "#document"; }
-
-        public Node appendChild ( Node newChild ) { return DomImpl._node_appendChild( this, newChild ); }
-        public Node cloneNode ( boolean deep ) { return DomImpl._node_cloneNode( this, deep ); }
-        public NamedNodeMap getAttributes ( ) { return null; }
-        public NodeList getChildNodes ( ) { return this; }
-        public Node getParentNode ( ) { return DomImpl._node_getParentNode( this ); }
-        public Node removeChild ( Node oldChild ) { return DomImpl._node_removeChild( this, oldChild ); }
-        public Node getFirstChild ( ) { return DomImpl._node_getFirstChild( this ); }
-        public Node getLastChild ( ) { return DomImpl._node_getLastChild( this ); }
-        public String getLocalName ( ) { return DomImpl._node_getLocalName( this ); }
-        public String getNamespaceURI ( ) { return DomImpl._node_getNamespaceURI( this ); }
-        public Node getNextSibling ( ) { return DomImpl._node_getNextSibling( this ); }
-        public String getNodeName ( ) { return DomImpl._node_getNodeName( this ); }
-        public short getNodeType ( ) { return DomImpl._node_getNodeType( this ); }
-        public String getNodeValue ( ) { return DomImpl._node_getNodeValue( this ); }
-        public Document getOwnerDocument ( ) { return DomImpl._node_getOwnerDocument( this ); }
-        public String getPrefix ( ) { return DomImpl._node_getPrefix( this ); }
-        public Node getPreviousSibling ( ) { return DomImpl._node_getPreviousSibling( this ); }
-        public boolean hasAttributes ( ) { return DomImpl._node_hasAttributes( this ); }
-        public boolean hasChildNodes ( ) { return DomImpl._node_hasChildNodes( this ); }
-        public Node insertBefore ( Node newChild, Node refChild ) { return DomImpl._node_insertBefore( this, newChild, refChild ); }
-        public boolean isSupported ( String feature, String version ) { return DomImpl._node_isSupported( this, feature, version ); }
-        public void normalize ( ) { DomImpl._node_normalize( this ); }
-        public Node replaceChild ( Node newChild, Node oldChild ) { return DomImpl._node_replaceChild( this, newChild, oldChild ); }
-        public void setNodeValue ( String nodeValue ) { DomImpl._node_setNodeValue( this, nodeValue ); }
-        public void setPrefix ( String prefix ) { DomImpl._node_setPrefix( this, prefix ); }
-
-        // DOM Level 3
-        public Object getUserData ( String key ) { return DomImpl._node_getUserData( this, key ); }
-        public Object setUserData ( String key, Object data, UserDataHandler handler ) { return DomImpl._node_setUserData( this, key, data, handler ); }
-        public Object getFeature ( String feature, String version ) { return DomImpl._node_getFeature( this, feature, version ); }
-        public boolean isEqualNode ( Node arg ) { return DomImpl._node_isEqualNode( this, arg ); }
-        public boolean isSameNode ( Node arg ) { return DomImpl._node_isSameNode( this, arg ); }
-        public String lookupNamespaceURI ( String prefix ) { return DomImpl._node_lookupNamespaceURI( this, prefix ); }
-        public String lookupPrefix ( String namespaceURI ) { return DomImpl._node_lookupPrefix( this, namespaceURI ); }
-        public boolean isDefaultNamespace ( String namespaceURI ) { return DomImpl._node_isDefaultNamespace( this, namespaceURI ); }
-        public void setTextContent ( String textContent ) { DomImpl._node_setTextContent( this, textContent ); }
-        public String getTextContent ( ) { return DomImpl._node_getTextContent( this ); }
-        public short compareDocumentPosition ( Node other ) { return DomImpl._node_compareDocumentPosition( this, other ); }
-        public String getBaseURI ( ) { return DomImpl._node_getBaseURI( this ); }
-        public Node adoptNode ( Node source ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public String getDocumentURI ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public DOMConfiguration getDomConfig ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public String getInputEncoding ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public boolean getStrictErrorChecking ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public String getXmlEncoding ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public boolean getXmlStandalone ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public String getXmlVersion ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void normalizeDocument ( ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public Node renameNode ( Node n, String namespaceURI, String qualifiedName ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setDocumentURI ( String documentURI ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setStrictErrorChecking ( boolean strictErrorChecking ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setXmlStandalone ( boolean xmlStandalone ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-        public void setXmlVersion ( String xmlVersion ) { throw new RuntimeException( "DOM Level 3 Not implemented" ); }
-
-        public Attr createAttribute ( String name ) { return DomImpl._document_createAttribute( this, name ); }
-        public Attr createAttributeNS ( String namespaceURI, String qualifiedName ) { return DomImpl._document_createAttributeNS( this, namespaceURI, qualifiedName ); }
-        public CDATASection createCDATASection ( String data ) { return DomImpl._document_createCDATASection( this, data ); }
-        public Comment createComment ( String data ) { return DomImpl._document_createComment( this, data ); }
-        public DocumentFragment createDocumentFragment ( ) { return DomImpl._document_createDocumentFragment( this ); }
-        public Element createElement ( String tagName ) { return DomImpl._document_createElement( this, tagName ); }
-        public Element createElementNS ( String namespaceURI, String qualifiedName ) { return DomImpl._document_createElementNS( this, namespaceURI, qualifiedName ); }
-        public EntityReference createEntityReference ( String name ) { return DomImpl._document_createEntityReference( this, name ); }
-        public ProcessingInstruction createProcessingInstruction ( String target, String data ) { return DomImpl._document_createProcessingInstruction( this, target, data ); }
-        public Text createTextNode ( String data ) { return DomImpl._document_createTextNode( this, data ); }
-        public DocumentType getDoctype ( ) { return DomImpl._document_getDoctype( this ); }
-        public Element getDocumentElement ( ) { return DomImpl._document_getDocumentElement( this ); }
-        public Element getElementById ( String elementId ) { return DomImpl._document_getElementById( this, elementId ); }
-        public NodeList getElementsByTagName ( String tagname ) { return DomImpl._document_getElementsByTagName( this, tagname ); }
-        public NodeList getElementsByTagNameNS ( String namespaceURI, String localName ) { return DomImpl._document_getElementsByTagNameNS( this, namespaceURI, localName ); }
-        public DOMImplementation getImplementation ( ) { return DomImpl._document_getImplementation( this ); }
-        public Node importNode ( Node importedNode, boolean deep ) { return DomImpl._document_importNode( this, importedNode, deep ); }
-
-        public int getLength ( ) { return DomImpl._childNodes_getLength( this ); }
-        public Node item ( int i ) { return DomImpl._childNodes_item( this, i ); }
-
-        public void removeAllMimeHeaders ( ) { DomImpl._soapPart_removeAllMimeHeaders( this ); }
-        public void removeMimeHeader ( String name ) { DomImpl._soapPart_removeMimeHeader( this, name ); }
-        public Iterator getAllMimeHeaders ( ) { return DomImpl._soapPart_getAllMimeHeaders( this ); }
-        public SOAPEnvelope getEnvelope ( ) { return DomImpl._soapPart_getEnvelope( this ); }
-        public Source getContent ( ) { return DomImpl._soapPart_getContent( this ); }
-        public void setContent ( Source source ) { DomImpl._soapPart_setContent( this, source ); }
-        public String[] getMimeHeader ( String name ) { return DomImpl._soapPart_getMimeHeader( this, name ); }
-        public void addMimeHeader ( String name, String value ) { DomImpl._soapPart_addMimeHeader( this, name,value ); }
-        public void setMimeHeader ( String name, String value ) { DomImpl._soapPart_setMimeHeader( this, name, value ); }
-        public Iterator getMatchingMimeHeaders ( String[] names ) { return DomImpl._soapPart_getMatchingMimeHeaders( this, names ); }
-        public Iterator getNonMatchingMimeHeaders ( String[] names ) { return DomImpl._soapPart_getNonMatchingMimeHeaders( this, names ); }
-
-        public boolean nodeCanHavePrefixUri( ){ return true; }
-
-        SoapPartDocXobj _docXobj;
-    }
-
-    static class SoapElementXobj
-        extends ElementXobj implements SOAPElement, org.apache.xmlbeans.impl.soap.Node
-    {
-        SoapElementXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new SoapElementXobj( l, _name ); }
-
-        public void detachNode ( ) { DomImpl._soapNode_detachNode( this ); }
-        public void recycleNode ( ) { DomImpl._soapNode_recycleNode( this ); }
-        public String getValue ( ) { return DomImpl._soapNode_getValue( this ); }
-        public void setValue ( String value ) { DomImpl._soapNode_setValue( this, value ); }
-        public SOAPElement getParentElement ( ) { return DomImpl._soapNode_getParentElement( this ); }
-        public void setParentElement ( SOAPElement p ) { DomImpl._soapNode_setParentElement( this, p ); }
-
-        public void removeContents ( ) { DomImpl._soapElement_removeContents( this ); }
-        public String getEncodingStyle ( ) { return DomImpl._soapElement_getEncodingStyle( this ); }
-        public void setEncodingStyle ( String encodingStyle ) { DomImpl._soapElement_setEncodingStyle( this, encodingStyle ); }
-        public boolean removeNamespaceDeclaration ( String prefix ) { return DomImpl._soapElement_removeNamespaceDeclaration( this, prefix ); }
-        public Iterator getAllAttributes ( ) { return DomImpl._soapElement_getAllAttributes( this ); }
-        public Iterator getChildElements ( ) { return DomImpl._soapElement_getChildElements( this ); }
-        public Iterator getNamespacePrefixes ( ) { return DomImpl._soapElement_getNamespacePrefixes( this ); }
-        public SOAPElement addAttribute ( Name name, String value ) throws SOAPException { return DomImpl._soapElement_addAttribute( this, name, value ); }
-        public SOAPElement addChildElement ( SOAPElement oldChild ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, oldChild ); }
-        public SOAPElement addChildElement ( Name name ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, name ); }
-        public SOAPElement addChildElement ( String localName ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, localName ); }
-        public SOAPElement addChildElement ( String localName, String prefix ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, localName, prefix ); }
-        public SOAPElement addChildElement ( String localName, String prefix, String uri ) throws SOAPException { return DomImpl._soapElement_addChildElement( this, localName, prefix, uri ); }
-        public SOAPElement addNamespaceDeclaration ( String prefix, String uri ) { return DomImpl._soapElement_addNamespaceDeclaration( this, prefix, uri ); }
-        public SOAPElement addTextNode ( String data ) { return DomImpl._soapElement_addTextNode( this, data ); }
-        public String getAttributeValue ( Name name ) { return DomImpl._soapElement_getAttributeValue( this, name ); }
-        public Iterator getChildElements ( Name name ) { return DomImpl._soapElement_getChildElements( this, name ); }
-        public Name getElementName ( ) { return DomImpl._soapElement_getElementName( this ); }
-        public String getNamespaceURI ( String prefix ) { return DomImpl._soapElement_getNamespaceURI( this, prefix ); }
-        public Iterator getVisibleNamespacePrefixes ( ) { return DomImpl._soapElement_getVisibleNamespacePrefixes( this ); }
-        public boolean removeAttribute ( Name name ) { return DomImpl._soapElement_removeAttribute( this, name ); }
-    }
-
-    static class SoapBodyXobj extends SoapElementXobj implements SOAPBody
-    {
-        SoapBodyXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new SoapBodyXobj( l, _name ); }
-
-        public boolean hasFault ( ) { return DomImpl.soapBody_hasFault( this ); }
-        public SOAPFault addFault ( ) throws SOAPException { return DomImpl.soapBody_addFault( this ); }
-        public SOAPFault getFault ( ) { return DomImpl.soapBody_getFault( this ); }
-        public SOAPBodyElement addBodyElement ( Name name ) { return DomImpl.soapBody_addBodyElement( this, name ); }
-        public SOAPBodyElement addDocument ( Document document ) { return DomImpl.soapBody_addDocument( this, document ); }
-        public SOAPFault addFault ( Name name, String s ) throws SOAPException { return DomImpl.soapBody_addFault( this, name, s ); }
-        public SOAPFault addFault ( Name faultCode, String faultString, java.util.Locale locale ) throws SOAPException { return DomImpl.soapBody_addFault( this, faultCode, faultString, locale ); }
-    }
-
-    static class SoapBodyElementXobj extends SoapElementXobj implements SOAPBodyElement
-    {
-        SoapBodyElementXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new SoapBodyElementXobj( l, _name ); }
-    }
-
-    static class SoapEnvelopeXobj extends SoapElementXobj implements SOAPEnvelope
-    {
-        SoapEnvelopeXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new SoapEnvelopeXobj( l, _name ); }
-
-        public SOAPBody addBody ( ) throws SOAPException { return DomImpl._soapEnvelope_addBody( this ); }
-        public SOAPBody getBody ( ) throws SOAPException { return DomImpl._soapEnvelope_getBody( this ); }
-        public SOAPHeader getHeader ( ) throws SOAPException { return DomImpl._soapEnvelope_getHeader( this ); }
-        public SOAPHeader addHeader ( ) throws SOAPException { return DomImpl._soapEnvelope_addHeader( this ); }
-        public Name createName ( String localName ) { return DomImpl._soapEnvelope_createName( this, localName ); }
-        public Name createName ( String localName, String prefix, String namespaceURI ) { return DomImpl._soapEnvelope_createName( this, localName, prefix, namespaceURI ); }
-    }
-
-    static class SoapHeaderXobj extends SoapElementXobj implements SOAPHeader
-    {
-        SoapHeaderXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new SoapHeaderXobj( l, _name ); }
-
-        public Iterator examineAllHeaderElements ( ) { return DomImpl.soapHeader_examineAllHeaderElements( this ); }
-        public Iterator extractAllHeaderElements ( ) { return DomImpl.soapHeader_extractAllHeaderElements( this ); }
-        public Iterator examineHeaderElements ( String actor ) { return DomImpl.soapHeader_examineHeaderElements( this, actor ); }
-        public Iterator examineMustUnderstandHeaderElements ( String mustUnderstandString ) { return DomImpl.soapHeader_examineMustUnderstandHeaderElements( this, mustUnderstandString ); }
-        public Iterator extractHeaderElements ( String actor ) { return DomImpl.soapHeader_extractHeaderElements( this, actor ); }
-        public SOAPHeaderElement addHeaderElement ( Name name ) { return DomImpl.soapHeader_addHeaderElement( this, name ); }
-    }
-
-    static class SoapHeaderElementXobj extends SoapElementXobj implements SOAPHeaderElement
-    {
-        SoapHeaderElementXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new SoapHeaderElementXobj( l, _name ); }
-
-        public void setMustUnderstand ( boolean mustUnderstand ) { DomImpl.soapHeaderElement_setMustUnderstand( this, mustUnderstand ); }
-        public boolean getMustUnderstand ( ) { return DomImpl.soapHeaderElement_getMustUnderstand( this ); }
-        public void setActor ( String actor ) { DomImpl.soapHeaderElement_setActor( this, actor ); }
-        public String getActor ( ) { return DomImpl.soapHeaderElement_getActor( this ); }
-    }
-
-    static class SoapFaultXobj extends SoapBodyElementXobj implements SOAPFault
-    {
-        SoapFaultXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new SoapFaultXobj( l, _name ); }
-
-        public void setFaultString ( String faultString ) { DomImpl.soapFault_setFaultString( this, faultString ); }
-        public void setFaultString ( String faultString, java.util.Locale locale ) { DomImpl.soapFault_setFaultString( this, faultString, locale ); }
-        public void setFaultCode ( Name faultCodeName ) throws SOAPException { DomImpl.soapFault_setFaultCode( this, faultCodeName ); }
-        public void setFaultActor ( String faultActorString ) { DomImpl.soapFault_setFaultActor( this, faultActorString ); }
-        public String getFaultActor ( ) { return DomImpl.soapFault_getFaultActor( this ); }
-        public String getFaultCode ( ) { return DomImpl.soapFault_getFaultCode( this ); }
-        public void setFaultCode ( String faultCode ) throws SOAPException { DomImpl.soapFault_setFaultCode( this, faultCode ); }
-        public java.util.Locale getFaultStringLocale ( ) { return DomImpl.soapFault_getFaultStringLocale( this ); }
-        public Name getFaultCodeAsName ( ) { return DomImpl.soapFault_getFaultCodeAsName( this ); }
-        public String getFaultString ( ) { return DomImpl.soapFault_getFaultString( this ); }
-        public Detail addDetail ( ) throws SOAPException { return DomImpl.soapFault_addDetail( this ); }
-        public Detail getDetail ( ) { return DomImpl.soapFault_getDetail( this ); }
-    }
-
-    static class SoapFaultElementXobj extends SoapElementXobj implements SOAPFaultElement
-    {
-        SoapFaultElementXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new SoapFaultElementXobj( l, _name ); }
-    }
-
-    static class DetailXobj extends SoapFaultElementXobj implements Detail
-    {
-        DetailXobj ( Locale l, QName name ) { super( l, name ); }
-
-        Xobj newNode ( Locale l ) { return new DetailXobj( l, _name ); }
-
-        public DetailEntry addDetailEntry ( Name name ) { return DomImpl.detail_addDetailEntry( this, name ); }
-        public Iterator getDetailEntries ( ) { return DomImpl.detail_getDetailEntries( this ); }
-    }
-
-    static class DetailEntryXobj extends SoapElementXobj implements DetailEntry
-    {
-        Xobj newNode ( Locale l ) { return new DetailEntryXobj( l, _name ); }
-
-        DetailEntryXobj ( Locale l, QName name ) { super( l, name ); }
-    }
-
-    //
-    //
-    //
-
-    static class Bookmark implements XmlMark
-    {
-        boolean isOnList ( Bookmark head )
-        {
-            for ( ; head != null ; head = head._next )
-                if (head == this)
-                    return true;
-
-            return false;
-        }
-
-        Bookmark listInsert ( Bookmark head )
-        {
-            assert _next == null && _prev == null;
-
-            if (head == null)
-                head = _prev = this;
-            else
-            {
-                _prev = head._prev;
-                head._prev = head._prev._next = this;
-            }
-
-            return head;
-        }
-
-        Bookmark listRemove ( Bookmark head )
-        {
-            assert _prev != null && isOnList( head );
-
-            if (_prev == this)
-                head = null;
-            else
-            {
-                if (head == this)
-                    head = _next;
-                else
-                    _prev._next = _next;
-
-                if (_next == null)
-                    head._prev = _prev;
-                else
-                {
-                    _next._prev = _prev;
-                    _next = null;
-                }
-            }
-
-            _prev = null;
-            assert _next == null;
-
-            return head;
-        }
-
-        void moveTo ( Xobj x, int p )
-        {
-            assert isOnList( _xobj._bookmarks );
-
-            if (_xobj != x)
-            {
-                _xobj._bookmarks = listRemove( _xobj._bookmarks );
-                x._bookmarks = listInsert( x._bookmarks );
-
-                _xobj = x;
-            }
-
-            _pos = p;
-        }
-
-        //
-        // XmlCursor.XmlMark method
-        //
-
-        public XmlCursor createCursor ( )
-        {
-            if (_xobj == null)
-            {
-                throw new IllegalStateException(
-                    "Attempting to create a cursor on a bookmark that " +
-                        "has been cleared or replaced.");
-            }
-
-            return Cursor.newCursor( _xobj, _pos );
-        }
-
-        //
-        //
-        //
-
-        Xobj _xobj;
-        int  _pos;
-
-        Bookmark _next;
-        Bookmark _prev;
-
-        Object _key;
-        Object _value;
-    }
-
-    //
-    //
-    //
-
     Locale _locale;
     QName _name;
 
diff --git a/src/tools/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java b/src/tools/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java
index 48c7422..facf329 100644
--- a/src/tools/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java
+++ b/src/tools/org/apache/xmlbeans/impl/inst2xsd/RussianDollStrategy.java
@@ -48,7 +48,7 @@
             XmlCursor xc = instance.newCursor();
             // xc on start doc
 
-            StringBuffer comment = new StringBuffer();
+            StringBuilder comment = new StringBuilder();
 
             while( !xc.isStart() )
             {
@@ -96,8 +96,8 @@
         Type elemType = Type.createUnnamedType(Type.SIMPLE_TYPE_SIMPLE_CONTENT); //assume simple, set later
         element.setType(elemType);
 
-        StringBuffer textBuff = new StringBuffer();
-        StringBuffer commentBuff = new StringBuffer();
+        StringBuilder textBuff = new StringBuilder();
+        StringBuilder commentBuff = new StringBuilder();
         List children = new ArrayList();
         List attributes = new ArrayList();
 
diff --git a/src/tools/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java b/src/tools/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java
index 210646d..bf80809 100644
--- a/src/tools/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java
+++ b/src/tools/org/apache/xmlbeans/impl/xsd2inst/SampleXmlUtil.java
@@ -176,7 +176,7 @@
         if (sType.getSimpleVariety() == SchemaType.LIST)
         {
             SchemaType itemType = sType.getListItemType();
-            StringBuffer sb = new StringBuffer();
+            StringBuilder sb = new StringBuilder();
             int length = pickLength(sType);
             if (length > 0)
                 sb.append(sampleDataForSimpleType(itemType));
@@ -360,7 +360,7 @@
             return "";
             
         int i = pick(a.length);
-        StringBuffer sb = new StringBuffer(a[i]);
+        StringBuilder sb = new StringBuilder(a[i]);
         while (count-- > 0)
         {
             i += 1;
@@ -374,7 +374,7 @@
     
     private String pickDigits(int digits)
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         while (digits-- > 0)
             sb.append(Integer.toString(pick(10)));
         return sb.toString();
@@ -477,7 +477,7 @@
         {
             totalDigits = xmlD.getBigDecimalValue().intValue();
 
-            StringBuffer sb = new StringBuffer(totalDigits);
+            StringBuilder sb = new StringBuilder(totalDigits);
             for (int i = 0; i < totalDigits; i++)
                 sb.append('9');
             BigDecimal digitsLimit = new BigDecimal(sb.toString());
@@ -510,7 +510,7 @@
             fractionDigits = xmlD.getBigDecimalValue().intValue();
             if (fractionDigits > 0)
             {
-                StringBuffer sb = new StringBuffer("0.");
+                StringBuilder sb = new StringBuilder("0.");
                 for (int i = 1; i < fractionDigits; i++)
                     sb.append('0');
                 sb.append('1');
@@ -1157,7 +1157,7 @@
 
     private String printParticleType(int particleType)
     {
-        StringBuffer returnParticleType = new StringBuffer();
+        StringBuilder returnParticleType = new StringBuilder();
         returnParticleType.append("Schema Particle Type: ");
 
         switch (particleType)
diff --git a/src/typeholder/org/apache/xmlbeans/impl/schema/TypeSystemHolder.java b/src/typeholder/org/apache/xmlbeans/impl/schema/TypeSystemHolder.java
index f0504ad..774484c 100644
--- a/src/typeholder/org/apache/xmlbeans/impl/schema/TypeSystemHolder.java
+++ b/src/typeholder/org/apache/xmlbeans/impl/schema/TypeSystemHolder.java
@@ -16,6 +16,7 @@
 package org.apache.xmlbeans.impl.schema;
 
 import org.apache.xmlbeans.SchemaTypeSystem;
+import org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl;
 
 /**
  * This class is the hook which causes the SchemaTypeSystem to be loaded when
@@ -40,7 +41,7 @@
     private TypeSystemHolder() { super(TypeSystemHolder.class); }
 
     // the type system
-    public static final SchemaTypeSystem typeSystem = new TypeSystemHolder();
+    public static final TypeSystemHolder typeSystem = new TypeSystemHolder();
 
     // Commenting out this line has the effect of not loading all components in a
     // typesystem upfront, but just as they are needed, which may improve
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/regex/REUtil.java b/src/typeimpl/org/apache/xmlbeans/impl/regex/REUtil.java
index 089fe88..80a3dc7 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/regex/REUtil.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/regex/REUtil.java
@@ -101,7 +101,7 @@
     }
 
     static final String createOptionString(int options) {
-        StringBuffer sb = new StringBuffer(9);
+        StringBuilder sb = new StringBuilder(9);
         if ((options & RegularExpression.PROHIBIT_FIXED_STRING_OPTIMIZATION) != 0)
             sb.append((char)'F');
         if ((options & RegularExpression.PROHIBIT_HEAD_CHARACTER_OPTIMIZATION) != 0)
@@ -129,7 +129,7 @@
 
     static String stripExtendedComment(String regex) {
         int len = regex.length();
-        StringBuffer buffer = new StringBuffer(len);
+        StringBuilder buffer = new StringBuilder(len);
         int offset = 0;
         while (offset < len) {
             int ch = regex.charAt(offset++);
@@ -298,12 +298,12 @@
      */
     public static String quoteMeta(String literal) {
         int len = literal.length();
-        StringBuffer buffer = null;
+        StringBuilder buffer = null;
         for (int i = 0;  i < len;  i ++) {
             int ch = literal.charAt(i);
             if (".*+?{[()|\\^$".indexOf(ch) >= 0) {
                 if (buffer == null) {
-                    buffer = new StringBuffer(i+(len-i)*2);
+                    buffer = new StringBuilder(i+(len-i)*2);
                     if (i > 0)  buffer.append(literal.substring(0, i));
                 }
                 buffer.append((char)'\\');
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/regex/RangeToken.java b/src/typeimpl/org/apache/xmlbeans/impl/regex/RangeToken.java
index 482ff08..537fdc4 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/regex/RangeToken.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/regex/RangeToken.java
@@ -543,7 +543,7 @@
             else if (this == Token.token_spaces)
                 ret = "\\s";
             else {
-                StringBuffer sb = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
                 sb.append("[");
                 for (int i = 0;  i < this.ranges.length;  i += 2) {
                     if ((options & RegularExpression.SPECIAL_COMMA) != 0 && i > 0)  sb.append(",");
@@ -566,7 +566,7 @@
             else if (this == Token.token_not_spaces)
                 ret = "\\S";
             else {
-                StringBuffer sb = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
                 sb.append("[^");
                 for (int i = 0;  i < this.ranges.length;  i += 2) {
                     if ((options & RegularExpression.SPECIAL_COMMA) != 0 && i > 0)  sb.append(",");
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/regex/Token.java b/src/typeimpl/org/apache/xmlbeans/impl/regex/Token.java
index 6d85fb2..16f9ebd 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/regex/Token.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/regex/Token.java
@@ -828,7 +828,7 @@
                 //REVISIT: do we really need to support block names as in Unicode 3.1
                 //         or we can just create all the names in IsBLOCKNAME format (XML Schema REC)?
                 //
-                StringBuffer buffer = new StringBuffer(50);
+                StringBuilder buffer = new StringBuilder(50);
                 for (int i = 0;  i < Token.blockNames.length;  i ++) {
                     Token r1 = Token.createRange();
                     int location;
@@ -1441,10 +1441,10 @@
             
             //System.err.println("Merge '"+previous+"' and '"+tok+"'.");
 
-            StringBuffer buffer;
+            StringBuilder buffer;
             int nextMaxLength = (tok.type == CHAR ? 2 : tok.getString().length());
             if (previous.type == CHAR) {        // Replace previous token by STRING
-                buffer = new StringBuffer(2 + nextMaxLength);
+                buffer = new StringBuilder(2 + nextMaxLength);
                 int ch = previous.getChar();
                 if (ch >= 0x10000)
                     buffer.append(REUtil.decomposeToSurrogates(ch));
@@ -1453,7 +1453,7 @@
                 previous = Token.createString(null);
                 this.children.setElementAt(previous, size-1);
             } else {                            // STRING
-                buffer = new StringBuffer(previous.getString().length() + nextMaxLength);
+                buffer = new StringBuilder(previous.getString().length() + nextMaxLength);
                 buffer.append(previous.getString());
             }
 
@@ -1490,7 +1490,7 @@
                     } else
                         ret = ch.toString(options)+ch2.toString(options);
                 } else {
-                    StringBuffer sb = new StringBuffer();
+                    StringBuilder sb = new StringBuilder();
                     for (int i = 0;  i < this.children.size();  i ++) {
                         sb.append(((Token)this.children.elementAt(i)).toString(options));
                     }
@@ -1504,7 +1504,7 @@
                        && this.getChild(0).type == EMPTY) {
                 ret = this.getChild(1).toString(options)+"??";
             } else {
-                StringBuffer sb = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
                 sb.append(((Token)this.children.elementAt(0)).toString(options));
                 for (int i = 1;  i < this.children.size();  i ++) {
                     sb.append((char)'|');
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
index 57a2805..af4ecc9 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
@@ -120,7 +120,7 @@
 
     String encodeString ( String s )
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
 
         sb.append( '"' );
 
@@ -193,7 +193,7 @@
         if (charset == null)
             throw new IllegalStateException("Default character set is null!");
         CharsetEncoder cEncoder = charset.newEncoder();
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         int i;
         for (i = 0; i < s.length(); i++)
         {
@@ -696,7 +696,7 @@
         if (sImpl == null)
             return "";
 
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
 
         InterfaceExtension[] exts = sImpl.getInterfaceExtensions();
         if (exts != null) for (int i = 0; i < exts.length; i++)
@@ -869,7 +869,7 @@
             }
             return str;
         }
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < str.length(); i++)
         {
             char ch = str.charAt(i);
@@ -1446,7 +1446,7 @@
     {
         String shortName = sType.getShortJavaImplName();
         String baseClass = getBaseClass(sType);
-        StringBuffer interfaces = new StringBuffer();
+        StringBuilder interfaces = new StringBuilder();
         interfaces.append(sType.getFullJavaName().replace('$', '.'));
 
         if (sType.getSimpleVariety() == SchemaType.UNION) {
@@ -2794,7 +2794,7 @@
 
     void printInterfaceMethodDecl(InterfaceExtension.MethodSignature method) throws IOException
     {
-        StringBuffer decl = new StringBuffer(60);
+        StringBuilder decl = new StringBuilder(60);
 
         decl.append("public ").append(method.getReturnType());
         decl.append(" ").append(method.getName()).append("(");
@@ -2818,7 +2818,7 @@
 
     void printInterfaceMethodImpl(String handler, InterfaceExtension.MethodSignature method) throws IOException
     {
-        StringBuffer impl = new StringBuffer(60);
+        StringBuilder impl = new StringBuilder(60);
 
         if (!method.getReturnType().equals("void"))
             impl.append("return ");
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java
index 169a7c3..70773c7 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java
@@ -38,7 +38,7 @@
 public class SchemaTypeLoaderImpl extends SchemaTypeLoaderBase {
     private ResourceLoader _resourceLoader;
     private ClassLoader _classLoader;
-    private SchemaTypeLoader[] _searchPath;
+    private final SchemaTypeLoader[] _searchPath;
 
     private Map _classpathTypeSystems;
     private Map _classLoaderTypeSystems;
@@ -56,7 +56,7 @@
     public static String METADATA_PACKAGE_LOAD = METADATA_PACKAGE_GEN;
     private static final Object CACHED_NOT_FOUND = new Object();
 
-    private static final String[] basePackage = { "org.apache.xmlbeans", "schemaorg_apache_xmlbeans" };
+    private static final String[] basePackage = { "org.apache.xmlbeans.metadata", "schemaorg_apache_xmlbeans" };
     private static final String[] baseSchemas = { "sXMLCONFIG", "sXMLLANG", "sXMLSCHEMA", "sXMLTOOLS" };
 
 
@@ -165,7 +165,7 @@
      * @param metadataPath the custom metadata path
      * @return the schemaTypeLoader
      *
-     * @since XmlBeans 3.0.3
+     * @since XmlBeans 3.1.0
      */
     public static SchemaTypeLoader build(final SchemaTypeLoader[] searchPath, ResourceLoader resourceLoader, ClassLoader classLoader, String metadataPath) {
         // assemble a flattened search path with no duplicates
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java
index 5d20853..12c1b93 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeSystemImpl.java
@@ -140,7 +140,7 @@
     /**
      * regex to identify the type system holder package namespace
      */
-    private static final Pattern packPat = Pattern.compile("^(.+)(\\.[^.]+){3}$");
+    private static final Pattern packPat = Pattern.compile("^(.+)(\\.[^.]+){2}$");
 
     /**
      * This is to support the feature of a separate/private XMLBeans
@@ -156,17 +156,18 @@
      * repackage process scomp needs to load from old package and generate into
      * a new package.
      */
-    public static String METADATA_PACKAGE_GEN;
-    static
-    {
-        // fix for maven classloader
-        Package stsPackage = SchemaTypeSystem.class.getPackage();
-        String stsPackageName = (stsPackage==null) ?
-            SchemaTypeSystem.class.getName().substring(0, SchemaTypeSystem.class.getName().lastIndexOf(".")) :
-            stsPackage.getName();
-
-        METADATA_PACKAGE_GEN = stsPackageName.replace('.', '/');
-    }
+    public static String METADATA_PACKAGE_GEN = "org/apache/xmlbeans/metadata";
+//    public static String METADATA_PACKAGE_GEN;
+//    static
+//    {
+//        // fix for maven classloader
+//        Package stsPackage = SchemaTypeSystem.class.getPackage();
+//        String stsPackageName = (stsPackage==null) ?
+//            SchemaTypeSystem.class.getName().substring(0, SchemaTypeSystem.class.getName().lastIndexOf(".")) :
+//            stsPackage.getName();
+//
+//        METADATA_PACKAGE_GEN = stsPackageName.replace('.', '/') + "/metadata";
+//    }
 
     private static String nameToPathString(String nameForSystem)
     {
@@ -203,8 +204,7 @@
         XBeanDebug.trace(XBeanDebug.TRACE_SCHEMA_LOADING, "Finished loading type system " + _name, -1);
     }
 
-    public SchemaTypeSystemImpl(Class indexclass)
-    {
+    public SchemaTypeSystemImpl(Class indexclass) {
         String fullname = indexclass.getName();
         _name = fullname.substring(0, fullname.lastIndexOf('.'));
         XBeanDebug.trace(XBeanDebug.TRACE_SCHEMA_LOADING, "Loading type system " + _name, 1);
@@ -937,8 +937,7 @@
         }
     }
 
-    public SchemaTypeSystemImpl(String nameForSystem)
-    {
+    public SchemaTypeSystemImpl(String nameForSystem) {
         // if we have no name, select a random one
         if (nameForSystem == null)
         {
@@ -948,10 +947,9 @@
             nameForSystem = "s" + new String(HexBin.encode(bytes));
         }
 
-        _name = getMetadataPath().replace('/','.') + ".system." + nameForSystem;
+        _name = SchemaTypeSystemImpl.METADATA_PACKAGE_GEN.replace('/','.') + ".system." + nameForSystem;
         _basePackage = nameToPathString(_name);
         _classloader = null;
-        //System.out.println("             _base: " + _basePackage);
     }
 
     public void loadFromBuilder(SchemaGlobalElement[] globalElements,
@@ -1008,10 +1006,10 @@
 
     SchemaDependencies getDependencies()
     {   return _deps; }
-    
+
     // EXPERIMENTAL
     public boolean isIncomplete() { return _incomplete; }
-    
+
     // EXPERIMENTAL
     void setIncomplete(boolean incomplete) { _incomplete = incomplete; }
 
@@ -1275,9 +1273,9 @@
 
     }
 
-    private String _name;
+    private final String _name;
     private String _basePackage;
-    
+
     // EXPERIMENTAL: recovery from compilation errors and partial type systems
     private boolean _incomplete = false;
 
@@ -3848,10 +3846,10 @@
      *
      * @return the metadata directory
      *
-     * @since XmlBeans 3.0.3
+     * @since XmlBeans 3.1.0
      */
     public String getMetadataPath() {
-        Matcher m = packPat.matcher(getClass().getName());
+        Matcher m = packPat.matcher(_name);
         m.find();
         return m.group(1).replace('.','/');
     }
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscChecker.java b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscChecker.java
index ebcf979..caf6ceb 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscChecker.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscChecker.java
@@ -1635,7 +1635,7 @@
     
     private static String printParticles(SchemaParticle[] parts, int start, int end)
     {
-        StringBuffer buf = new StringBuffer(parts.length * 30);
+        StringBuilder buf = new StringBuilder(parts.length * 30);
         for (int i = start; i < end; )
         {
             buf.append(printParticle(parts[i]));
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java
index 2e3fa3a..ae275d5 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/schema/StscTranslator.java
@@ -596,7 +596,7 @@
                     // Error! Circular redefinition
                     if (!errorReported)
                     {
-                        StringBuffer fileNameList = new StringBuffer();
+                        StringBuilder fileNameList = new StringBuilder();
                         XmlObject location = null;
                         for (int i = 0; i < n; i++)
                             if (specificRedefines[i] != null)
@@ -1315,7 +1315,7 @@
 
     private static String removeWhitespace(String xpath)
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < xpath.length(); i++)
         {
             char ch = xpath.charAt(i);
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java b/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java
index afc6307..e2075be 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/util/XsTypeConverter.java
@@ -194,7 +194,7 @@
         int begin = (value.signum() < 0) ? 1 : 0;
         int delta = scale;
         // We take space for all digits, plus a possible decimal point, plus 'scale'
-        StringBuffer result = new StringBuffer(intStr.length() + 1 + Math.abs(scale));
+        StringBuilder result = new StringBuilder(intStr.length() + 1 + Math.abs(scale));
 
         if (begin == 1)
         {
@@ -765,7 +765,7 @@
         } */
 
         // Per XMLSchema spec allow spaces inside URIs
-        StringBuffer s = new StringBuffer(lexical_value.toString());
+        StringBuilder s = new StringBuilder(lexical_value.toString());
         for (int ic = 0; ic<URI_CHARS_TO_BE_REPLACED.length; ic++)
         {
             int i = 0;
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLInputStream.java b/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLInputStream.java
index cc01bf2..614dc3b 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLInputStream.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLInputStream.java
@@ -378,7 +378,7 @@
 
     private XMLInputStream _source;
     private Validator      _validator;
-    private StringBuffer   _text = new StringBuffer();
+    private StringBuilder   _text = new StringBuilder();
     private boolean        _finished;
     private String         _xsiType;
     private String         _xsiNil;
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java b/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java
index 99c8563..1f8d0c7 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/validator/ValidatingXMLStreamReader.java
@@ -143,7 +143,7 @@
         implements XMLStreamReader
     {
         private boolean _hasBufferedText;
-        private StringBuffer _buffer = new StringBuffer();
+        private StringBuilder _buffer = new StringBuilder();
         private int _textEventType;
 
         void init(XMLStreamReader xmlstream)
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/validator/Validator.java b/src/typeimpl/org/apache/xmlbeans/impl/validator/Validator.java
index 280cfe5..5c1d5fd 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/validator/Validator.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/validator/Validator.java
@@ -910,7 +910,7 @@
 
         if (names.size() > 0)
         {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             for (Iterator iter = names.iterator(); iter.hasNext();)
             {
                 QName qname = (QName) iter.next();
@@ -957,7 +957,7 @@
 
         if (names.size() > 0)
         {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             for (Iterator iter = names.iterator(); iter.hasNext();)
             {
                 QName qname = (QName) iter.next();
diff --git a/src/typeimpl/org/apache/xmlbeans/impl/values/XmlListImpl.java b/src/typeimpl/org/apache/xmlbeans/impl/values/XmlListImpl.java
index bd1dbf5..c432447 100644
--- a/src/typeimpl/org/apache/xmlbeans/impl/values/XmlListImpl.java
+++ b/src/typeimpl/org/apache/xmlbeans/impl/values/XmlListImpl.java
@@ -59,7 +59,7 @@
         if (xList.size() == 0)
             return "";
 
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append(nullAsEmpty(((SimpleValue)xList.get(0)).getStringValue()));
 
         for (int i = 1; i < xList.size(); i++)
diff --git a/src/typeimpl/org/apache/xmlbeans/soap/SOAPArrayType.java b/src/typeimpl/org/apache/xmlbeans/soap/SOAPArrayType.java
index 5f8a7aa..db24214 100644
--- a/src/typeimpl/org/apache/xmlbeans/soap/SOAPArrayType.java
+++ b/src/typeimpl/org/apache/xmlbeans/soap/SOAPArrayType.java
@@ -309,7 +309,7 @@
      */
     public String soap11DimensionString(int[] actualDimensions)
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         for (int i = 0; i < _ranks.length; i++)
         {
             sb.append('[');
@@ -383,7 +383,7 @@
      */
     public String soap12DimensionString(int[] actualDimensions)
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
 
         for (int i = 0; i < actualDimensions.length; i++)
         {
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/CodeGenUtil.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/CodeGenUtil.java
index b9a0373..bbeefaa 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/CodeGenUtil.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/CodeGenUtil.java
@@ -152,7 +152,7 @@
 
         if (cp.length > 0)
         {
-            StringBuffer classPath = new StringBuffer();
+            StringBuilder classPath = new StringBuilder();
             // Add the output directory to the classpath.  We do this so that
             // javac will be able to find classes that were compiled
             // previously but are not in the list of sources this time.
@@ -172,7 +172,7 @@
         }
 
         if (genver == null)
-            genver = "1.6";
+            genver = "1.8";
 
         args.add("-source");
         args.add(genver);
@@ -230,8 +230,8 @@
 
             final Process proc = Runtime.getRuntime().exec(strArgs);
 
-            StringBuffer errorBuffer = new StringBuffer();
-            StringBuffer outputBuffer = new StringBuffer();
+            StringBuilder errorBuffer = new StringBuilder();
+            StringBuilder outputBuffer = new StringBuilder();
 
             ThreadedReader out = new ThreadedReader(proc.getInputStream(), outputBuffer);
             ThreadedReader err = new ThreadedReader(proc.getErrorStream(), errorBuffer);
@@ -319,8 +319,8 @@
 
             final Process proc = Runtime.getRuntime().exec(strArgs);
 
-            StringBuffer errorBuffer = new StringBuffer();
-            StringBuffer outputBuffer = new StringBuffer();
+            StringBuilder errorBuffer = new StringBuilder();
+            StringBuilder outputBuffer = new StringBuilder();
 
             ThreadedReader out = new ThreadedReader(proc.getInputStream(), outputBuffer);
             ThreadedReader err = new ThreadedReader(proc.getErrorStream(), errorBuffer);
@@ -400,7 +400,7 @@
      */
     static private class ThreadedReader
     {
-        public ThreadedReader(InputStream stream, final StringBuffer output)
+        public ThreadedReader(InputStream stream, final StringBuilder output)
         {
             final BufferedReader reader =
                 new BufferedReader(new InputStreamReader(stream));
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/RunXQuery.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/RunXQuery.java
index c93c6c1..b782a1f 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/RunXQuery.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/RunXQuery.java
@@ -122,7 +122,7 @@
                 FileInputStream is = new FileInputStream( queryFile );
                 InputStreamReader r = new InputStreamReader( is );
                 
-                StringBuffer sb = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
 
                 for ( ; ; )
                 {
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
index a0491ef..4e10920 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
@@ -73,6 +73,7 @@
         System.out.println("    -src [dir] - target directory for generated .java files");
         System.out.println("    -srconly - do not compile .java files or jar the output.");
         System.out.println("    -out [xmltypes.jar] - the name of the output jar");
+        System.out.println("    -name - the name of the schema type - defaults to autogenerated name");
         System.out.println("    -dl - permit network downloads for imports and includes (default is off)");
         System.out.println("    -noupa - do not enforce the unique particle attribution rule");
         System.out.println("    -nopvr - do not enforce the particle valid (restriction) rule");
@@ -661,12 +662,12 @@
         {
             return compiler;
         }
-        
+
         public void setCompiler(String compiler)
         {
             this.compiler = compiler;
         }
-        
+
         public String getJavaSource()
         {
             return javasource;
@@ -1024,12 +1025,13 @@
         {
             SchemaTypeLoaderImpl.METADATA_PACKAGE_LOAD = SchemaTypeSystemImpl.METADATA_PACKAGE_GEN;
 
-            String stsPackage = SchemaTypeSystem.class.getPackage().getName();
             Repackager repackager = new Repackager( repackage );
 
-            SchemaTypeSystemImpl.METADATA_PACKAGE_GEN = repackager.repackage(new StringBuffer(stsPackage)).toString().replace('.','_');
+            StringBuffer sb = new StringBuffer(SchemaTypeLoaderImpl.METADATA_PACKAGE_LOAD);
+            sb = repackager.repackage(sb);
+            SchemaTypeSystemImpl.METADATA_PACKAGE_GEN = sb.toString();
 
-            System.out.println("\n\n\n" + stsPackage + ".SchemaCompiler  Metadata LOAD:" + SchemaTypeLoaderImpl.METADATA_PACKAGE_LOAD + " GEN:" + SchemaTypeSystemImpl.METADATA_PACKAGE_GEN);
+            System.out.println("SchemaCompiler  Metadata LOAD:" + SchemaTypeLoaderImpl.METADATA_PACKAGE_LOAD + " GEN:" + SchemaTypeSystemImpl.METADATA_PACKAGE_GEN);
         }
 
         SchemaCodePrinter codePrinter = params.getSchemaCodePrinter();
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/TypeHierarchyPrinter.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/TypeHierarchyPrinter.java
index cbca804..800f0bc 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/TypeHierarchyPrinter.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/TypeHierarchyPrinter.java
@@ -217,7 +217,7 @@
         // step 4: print the tree, starting from xs:anyType (i.e., XmlObject.type)
         List typesToPrint = new ArrayList();
         typesToPrint.add(XmlObject.type);
-        StringBuffer spaces = new StringBuffer();
+        StringBuilder spaces = new StringBuilder();
         while (!typesToPrint.isEmpty())
         {
             SchemaType sType = (SchemaType)typesToPrint.remove(typesToPrint.size() - 1);
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/XMLBean.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/XMLBean.java
index c2ddb19..2c28290 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/XMLBean.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/XMLBean.java
@@ -84,7 +84,8 @@
                         memoryInitialSize,
                         memoryMaximumSize,
                         catalog,
-                        javasource;
+                        javasource,
+                        repackage;
 
     private List        extensions = new ArrayList();
 
@@ -238,6 +239,7 @@
             params.setNoVDoc(novdoc);
             params.setNoExt(noext);
             params.setJavaSource(javasource);
+            params.setRepackage(repackage);
             success = SchemaCompiler.compile(params);
 
             if (success && !srconly) {
@@ -305,7 +307,7 @@
             //interrupted means cancel
             if (e instanceof InterruptedException || failonerror)
                 throw new BuildException(e);
-            
+
             log("Exception while building schemas: " + e.getMessage(), Project.MSG_ERR);
             StringWriter sw = new StringWriter();
             e.printStackTrace(new PrintWriter(sw));
@@ -618,7 +620,7 @@
         if (mdefnamespaces == null) {
             return null;
         }
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         Iterator i = mdefnamespaces.iterator();
         while (i.hasNext()) {
             buf.append((String)i.next());
@@ -824,6 +826,14 @@
         this.catalog = catalog;
     }
 
+    public String getRepackage() {
+        return repackage;
+    }
+
+    public void setRepackage(String repackage) {
+        this.repackage = repackage;
+    }
+
     private static URI uriFromFile(File f)
     {
         if (f == null)
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/XSTCTester.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/XSTCTester.java
index f7ea835..b88fd9c 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/XSTCTester.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/XSTCTester.java
@@ -349,7 +349,7 @@
     
     public static String makeHTMLDescription(TestCase testCase)
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("<a class=noline href='javascript:openWindow(\"");
         if (testCase.getSchemaFile() == null)
             sb.append("about:No schema");
diff --git a/src/xmlcomp/org/apache/xmlbeans/impl/tool/XsbDumper.java b/src/xmlcomp/org/apache/xmlbeans/impl/tool/XsbDumper.java
index d13ce42..f7757ba 100644
--- a/src/xmlcomp/org/apache/xmlbeans/impl/tool/XsbDumper.java
+++ b/src/xmlcomp/org/apache/xmlbeans/impl/tool/XsbDumper.java
@@ -192,7 +192,7 @@
 
     static String particleflagsString(int flags)
     {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         if ((flags & FLAG_PART_SKIPPABLE) != 0) result.append("FLAG_PART_SKIPPABLE | ");
         if ((flags & FLAG_PART_FIXED) != 0) result.append("FLAG_PART_FIXED | ");
         if ((flags & FLAG_PART_NILLABLE) != 0) result.append("FLAG_PART_NILLABLE | ");
@@ -213,7 +213,7 @@
 
     static String propertyflagsString(int flags)
     {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         if ((flags & FLAG_PROP_ISATTR) != 0) result.append("FLAG_PROP_ISATTR | ");
         if ((flags & FLAG_PROP_JAVASINGLETON) != 0) result.append("FLAG_PROP_JAVASINGLETON | ");
         if ((flags & FLAG_PROP_JAVAOPTIONAL) != 0) result.append("FLAG_PROP_JAVAOPTIONAL | ");
@@ -264,7 +264,7 @@
 
     static String typeflagsString(int flags)
     {
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
         if ((flags & FLAG_SIMPLE_TYPE) != 0) result.append("FLAG_SIMPLE_TYPE | ");
         if ((flags & FLAG_DOCUMENT_TYPE) != 0) result.append("FLAG_DOCUMENT_TYPE | ");
         if ((flags & FLAG_ATTRIBUTE_TYPE) != 0) result.append("FLAG_ATTRIBUTE_TYPE | ");
diff --git a/src/xmlconfig/org/apache/xmlbeans/impl/config/BindingConfigImpl.java b/src/xmlconfig/org/apache/xmlbeans/impl/config/BindingConfigImpl.java
index 956cbed..80ce266 100755
--- a/src/xmlconfig/org/apache/xmlbeans/impl/config/BindingConfigImpl.java
+++ b/src/xmlconfig/org/apache/xmlbeans/impl/config/BindingConfigImpl.java
@@ -15,138 +15,85 @@
 
 package org.apache.xmlbeans.impl.config;
 
-import org.apache.xmlbeans.impl.xb.xmlconfig.ConfigDocument.Config;
-import org.apache.xmlbeans.impl.xb.xmlconfig.Extensionconfig;
-import org.apache.xmlbeans.impl.xb.xmlconfig.Nsconfig;
-import org.apache.xmlbeans.impl.xb.xmlconfig.Qnameconfig;
-import org.apache.xmlbeans.impl.xb.xmlconfig.Qnametargetenum;
-import org.apache.xmlbeans.impl.xb.xmlconfig.Usertypeconfig;
-import org.apache.xmlbeans.BindingConfig;
-import org.apache.xmlbeans.UserType;
-import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlError;
-import org.apache.xmlbeans.InterfaceExtension;
-import org.apache.xmlbeans.PrePostExtension;
-import org.apache.xmlbeans.impl.jam.JamClassLoader;
-import org.apache.xmlbeans.impl.jam.JamService;
-import org.apache.xmlbeans.impl.jam.JamServiceFactory;
-import org.apache.xmlbeans.impl.jam.JamServiceParams;
+import org.apache.xmlbeans.*;
 import org.apache.xmlbeans.impl.schema.StscState;
+import org.apache.xmlbeans.impl.xb.xmlconfig.ConfigDocument.Config;
+import org.apache.xmlbeans.impl.xb.xmlconfig.*;
 
 import javax.xml.namespace.QName;
 import java.io.File;
-import java.io.IOException;
 import java.util.*;
 
 /**
  * An implementation of BindingConfig
  */
-public class BindingConfigImpl extends BindingConfig
-{
-    private Map _packageMap;
-    private Map _prefixMap;
-    private Map _suffixMap;
-    private Map _packageMapByUriPrefix; // uri prefix -> package
-    private Map _prefixMapByUriPrefix;  // uri prefix -> name prefix
-    private Map _suffixMapByUriPrefix;  // uri prefix -> name suffix
-    private Map _qnameTypeMap;
-    private Map _qnameDocTypeMap;
-    private Map _qnameElemMap;
-    private Map _qnameAttMap;
+public class BindingConfigImpl extends BindingConfig {
+    private final Map _packageMap = new LinkedHashMap();
+    private final Map _prefixMap = new LinkedHashMap();
+    private final Map _suffixMap = new LinkedHashMap();
+    // uri prefix -> package
+    private final Map<Object,String> _packageMapByUriPrefix = new LinkedHashMap<>();
+    // uri prefix -> name prefix
+    private final Map<Object,String> _prefixMapByUriPrefix = new LinkedHashMap<>();
+    // uri prefix -> name suffix
+    private final Map<Object,String> _suffixMapByUriPrefix = new LinkedHashMap<>();
+    private final Map<QName,String> _qnameTypeMap = new LinkedHashMap<>();
+    private final Map<QName,String> _qnameDocTypeMap = new LinkedHashMap<>();
+    private final Map<QName,String> _qnameElemMap = new LinkedHashMap<>();
+    private final Map<QName,String> _qnameAttMap = new LinkedHashMap<>();
 
-    private List _interfaceExtensions;
-    private List _prePostExtensions;
-    private Map _userTypes;
+    private final List<InterfaceExtensionImpl> _interfaceExtensions = new ArrayList<>();
+    private final List<PrePostExtensionImpl> _prePostExtensions = new ArrayList<>();
+    private final Map<QName,UserTypeImpl> _userTypes = new LinkedHashMap<>();
 
-    private BindingConfigImpl()
-    {
-        _packageMap = Collections.EMPTY_MAP;
-        _prefixMap = Collections.EMPTY_MAP;
-        _suffixMap = Collections.EMPTY_MAP;
-        _packageMapByUriPrefix = Collections.EMPTY_MAP;
-        _prefixMapByUriPrefix = Collections.EMPTY_MAP;
-        _suffixMapByUriPrefix = Collections.EMPTY_MAP;
-        _qnameTypeMap = Collections.EMPTY_MAP;
-        _qnameDocTypeMap = Collections.EMPTY_MAP;
-        _qnameElemMap = Collections.EMPTY_MAP;
-        _qnameAttMap = Collections.EMPTY_MAP;
-        _interfaceExtensions = new ArrayList();
-        _prePostExtensions = new ArrayList();
-        _userTypes = Collections.EMPTY_MAP;
-    }
-
-    public static BindingConfig forConfigDocuments(Config[] configs, File[] javaFiles, File[] classpath)
-    {
+    public static BindingConfig forConfigDocuments(Config[] configs, File[] javaFiles, File[] classpath) {
         return new BindingConfigImpl(configs, javaFiles, classpath);
     }
 
-    private BindingConfigImpl(Config[] configs, File[] javaFiles, File[] classpath)
-    {
-        _packageMap = new LinkedHashMap();
-        _prefixMap = new LinkedHashMap();
-        _suffixMap = new LinkedHashMap();
-        _packageMapByUriPrefix = new LinkedHashMap();
-        _prefixMapByUriPrefix = new LinkedHashMap();
-        _suffixMapByUriPrefix = new LinkedHashMap();
-        _qnameTypeMap = new LinkedHashMap();
-        _qnameDocTypeMap = new LinkedHashMap();
-        _qnameElemMap = new LinkedHashMap();
-        _qnameAttMap = new LinkedHashMap();
-        _interfaceExtensions = new ArrayList();
-        _prePostExtensions = new ArrayList();
-        _userTypes = new LinkedHashMap();
-
-        for (int i = 0; i < configs.length; i++)
-        {
-            Config config = configs[i];
+    private BindingConfigImpl(Config[] configs, File[] javaFiles, File[] classpath) {
+        for (Config config : configs) {
             Nsconfig[] nsa = config.getNamespaceArray();
-            for (int j = 0; j < nsa.length; j++)
-            {
-                recordNamespaceSetting(nsa[j].getUri(), nsa[j].getPackage(), _packageMap);
-                recordNamespaceSetting(nsa[j].getUri(), nsa[j].getPrefix(), _prefixMap);
-                recordNamespaceSetting(nsa[j].getUri(), nsa[j].getSuffix(), _suffixMap);
-                recordNamespacePrefixSetting(nsa[j].getUriprefix(), nsa[j].getPackage(), _packageMapByUriPrefix);
-                recordNamespacePrefixSetting(nsa[j].getUriprefix(), nsa[j].getPrefix(), _prefixMapByUriPrefix);
-                recordNamespacePrefixSetting(nsa[j].getUriprefix(), nsa[j].getSuffix(), _suffixMapByUriPrefix);
+            for (Nsconfig nsconfig : nsa) {
+                recordNamespaceSetting(nsconfig.getUri(), nsconfig.getPackage(), _packageMap);
+                recordNamespaceSetting(nsconfig.getUri(), nsconfig.getPrefix(), _prefixMap);
+                recordNamespaceSetting(nsconfig.getUri(), nsconfig.getSuffix(), _suffixMap);
+                recordNamespacePrefixSetting(nsconfig.getUriprefix(), nsconfig.getPackage(), _packageMapByUriPrefix);
+                recordNamespacePrefixSetting(nsconfig.getUriprefix(), nsconfig.getPrefix(), _prefixMapByUriPrefix);
+                recordNamespacePrefixSetting(nsconfig.getUriprefix(), nsconfig.getSuffix(), _suffixMapByUriPrefix);
             }
 
             Qnameconfig[] qnc = config.getQnameArray();
-            for (int j = 0; j < qnc.length; j++)
-            {
-                List applyto = qnc[j].xgetTarget().xgetListValue();
-                QName name = qnc[j].getName();
-                String javaname = qnc[j].getJavaname();
-                for (int k = 0; k < applyto.size(); k++)
-                {
-                    Qnametargetenum a = (Qnametargetenum) applyto.get(k);
-                    switch (a.enumValue().intValue())
-                    {
-                    case Qnametargetenum.INT_TYPE:
-                        _qnameTypeMap.put(name, javaname);
-                        break;
-                    case Qnametargetenum.INT_DOCUMENT_TYPE:
-                        _qnameDocTypeMap.put(name, javaname);
-                        break;
-                    case Qnametargetenum.INT_ACCESSOR_ELEMENT:
-                        _qnameElemMap.put(name, javaname);
-                        break;
-                    case Qnametargetenum.INT_ACCESSOR_ATTRIBUTE:
-                        _qnameAttMap.put(name, javaname);
-                        break;
+            for (Qnameconfig qnameconfig : qnc) {
+                List applyto = qnameconfig.xgetTarget().xgetListValue();
+                QName name = qnameconfig.getName();
+                String javaname = qnameconfig.getJavaname();
+                for (Object o : applyto) {
+                    Qnametargetenum a = (Qnametargetenum) o;
+                    switch (a.enumValue().intValue()) {
+                        case Qnametargetenum.INT_TYPE:
+                            _qnameTypeMap.put(name, javaname);
+                            break;
+                        case Qnametargetenum.INT_DOCUMENT_TYPE:
+                            _qnameDocTypeMap.put(name, javaname);
+                            break;
+                        case Qnametargetenum.INT_ACCESSOR_ELEMENT:
+                            _qnameElemMap.put(name, javaname);
+                            break;
+                        case Qnametargetenum.INT_ACCESSOR_ATTRIBUTE:
+                            _qnameAttMap.put(name, javaname);
+                            break;
                     }
                 }
             }
 
             Extensionconfig[] ext = config.getExtensionArray();
-            for (int j = 0; j < ext.length; j++)
-            {
-                recordExtensionSetting(javaFiles, classpath, ext[j]);
+            for (Extensionconfig extensionconfig : ext) {
+                recordExtensionSetting(javaFiles, classpath, extensionconfig);
             }
-            
+
             Usertypeconfig[] utypes = config.getUsertypeArray();
-            for (int j = 0; j < utypes.length; j++)
-            {
-                recordUserTypeSetting(javaFiles, classpath, utypes[j]);
+            for (Usertypeconfig utype : utypes) {
+                recordUserTypeSetting(javaFiles, classpath, utype);
             }
         }
 
@@ -154,102 +101,84 @@
         //todo normalize();
     }
 
-    void addInterfaceExtension(InterfaceExtensionImpl ext)
-    {
-        if (ext==null)
+    void addInterfaceExtension(InterfaceExtensionImpl ext) {
+        if (ext==null) {
             return;
+        }
 
         _interfaceExtensions.add(ext);
     }
 
-    void addPrePostExtension(PrePostExtensionImpl ext)
-    {
-        if (ext==null)
+    void addPrePostExtension(PrePostExtensionImpl ext) {
+        if (ext==null) {
             return;
+        }
 
         _prePostExtensions.add(ext);
     }
 
-    void secondPhaseValidation()
-    {
+    void secondPhaseValidation() {
         // validate interface methods collisions
-        Map methodSignatures = new HashMap();
+        Map<InterfaceExtension.MethodSignature,InterfaceExtension.MethodSignature> methodSignatures = new HashMap<>();
 
-        for (int i = 0; i < _interfaceExtensions.size(); i++)
-        {
-            InterfaceExtensionImpl interfaceExtension = (InterfaceExtensionImpl) _interfaceExtensions.get(i);
+        for (InterfaceExtensionImpl extension : _interfaceExtensions) {
 
-            InterfaceExtensionImpl.MethodSignatureImpl[] methods = (InterfaceExtensionImpl.MethodSignatureImpl[])interfaceExtension.getMethods();
-            for (int j = 0; j < methods.length; j++)
-            {
-                InterfaceExtensionImpl.MethodSignatureImpl ms = methods[j];
+            InterfaceExtensionImpl.MethodSignatureImpl[] methods = (InterfaceExtensionImpl.MethodSignatureImpl[]) extension.getMethods();
+            for (InterfaceExtensionImpl.MethodSignatureImpl ms : methods) {
+                if (methodSignatures.containsKey(ms)) {
 
-                if (methodSignatures.containsKey(methods[j]))
-                {
-
-                    InterfaceExtensionImpl.MethodSignatureImpl ms2 = (InterfaceExtensionImpl.MethodSignatureImpl) methodSignatures.get(methods[j]);
-                    if (!ms.getReturnType().equals(ms2.getReturnType()))
-                    {
+                    InterfaceExtensionImpl.MethodSignatureImpl ms2 = (InterfaceExtensionImpl.MethodSignatureImpl) methodSignatures.get(ms);
+                    if (!ms.getReturnType().equals(ms2.getReturnType())) {
                         BindingConfigImpl.error("Colliding methods '" + ms.getSignature() + "' in interfaces " +
-                        ms.getInterfaceName() + " and " + ms2.getInterfaceName() + ".", null);
+                                                ms.getInterfaceName() + " and " + ms2.getInterfaceName() + ".", null);
                     }
 
                     return;
                 }
 
                 // store it into hashmap
-                methodSignatures.put(methods[j], methods[j]);
+                methodSignatures.put(ms, ms);
             }
         }
 
         // validate that PrePostExtension-s do not intersect
-        for (int i = 0; i < _prePostExtensions.size() - 1; i++)
-        {
-            PrePostExtensionImpl a = (PrePostExtensionImpl) _prePostExtensions.get(i);
-            for (int j = 1; j < _prePostExtensions.size(); j++)
-            {
-                PrePostExtensionImpl b = (PrePostExtensionImpl) _prePostExtensions.get(j);
-                if (a.hasNameSetIntersection(b))
+        for (int i = 0; i < _prePostExtensions.size() - 1; i++) {
+            PrePostExtensionImpl a = _prePostExtensions.get(i);
+            for (int j = 1; j < _prePostExtensions.size(); j++) {
+                PrePostExtensionImpl b = _prePostExtensions.get(j);
+                if (a.hasNameSetIntersection(b)) {
                     BindingConfigImpl.error("The applicable domain for handler '" + a.getHandlerNameForJavaSource() +
-                        "' intersects with the one for '" + b.getHandlerNameForJavaSource() + "'.", null);
+                                            "' intersects with the one for '" + b.getHandlerNameForJavaSource() + "'.", null);
+                }
             }
         }
     }
 
-    private static void recordNamespaceSetting(Object key, String value, Map result)
-    {
-        if (value == null)
+    private static void recordNamespaceSetting(Object key, String value, Map<Object,String> result) {
+        if (value == null) {
             return;
-        else if (key == null)
+        }
+        if (key == null) {
             result.put("", value);
-        else if (key instanceof String && "##any".equals(key))
+        } else if (key instanceof String && "##any".equals(key)) {
             result.put(key, value);
-        else if (key instanceof List)
-        {
-            for (Iterator i = ((List)key).iterator(); i.hasNext(); )
-            {
-                String uri = (String)i.next();
-                if ("##local".equals(uri))
-                    uri = "";
-                result.put(uri, value);
-            }
+        } else if (key instanceof List) {
+            // map uris to value
+            ((List<?>)key).forEach(o -> result.put("##local".equals(o) ? "" : o, value));
         }
     }
 
-    private static void recordNamespacePrefixSetting(List list, String value, Map result)
-    {
-        if (value == null)
+    private static void recordNamespacePrefixSetting(List list, String value, Map<Object,String> result) {
+        if (value == null) {
             return;
-        else if (list == null)
-            return;
-        for (Iterator i = list.iterator(); i.hasNext(); )
-        {
-            result.put(i.next(), value);
         }
+        if (list == null) {
+            return;
+        }
+        list.forEach(o -> result.put(o, value));
     }
 
-    private void recordExtensionSetting(File[] javaFiles, File[] classpath, Extensionconfig ext)
-    {
+    private void recordExtensionSetting(File[] javaFiles, File[] classpath, Extensionconfig ext) {
         NameSet xbeanSet = null;
         Object key = ext.getFor();
 
@@ -259,9 +188,8 @@
         else if (key instanceof List)
         {
             NameSetBuilder xbeanSetBuilder = new NameSetBuilder();
-            for (Iterator i = ((List) key).iterator(); i.hasNext();)
-            {
-                String xbeanName = (String) i.next();
+            for (Object o : (List) key) {
+                String xbeanName = (String) o;
                 xbeanSetBuilder.add(xbeanName);
             }
             xbeanSet = xbeanSetBuilder.toNameSet();
@@ -271,210 +199,131 @@
             error("Invalid value of attribute 'for' : '" + key + "'.", ext);
 
         Extensionconfig.Interface[] intfXO = ext.getInterfaceArray();
-        Extensionconfig.PrePostSet ppXO    = ext.getPrePostSet(); 
+        Extensionconfig.PrePostSet ppXO    = ext.getPrePostSet();
 
-        if (intfXO.length > 0 || ppXO != null)
-        {
-            JamClassLoader jamLoader = getJamLoader(javaFiles, classpath);
-            for (int i = 0; i < intfXO.length; i++)
-            {
-                addInterfaceExtension(InterfaceExtensionImpl.newInstance(jamLoader, xbeanSet, intfXO[i]));
+        Parser loader = new Parser(javaFiles, classpath);
+
+        if (intfXO.length > 0 || ppXO != null) {
+            for (Extensionconfig.Interface anInterface : intfXO) {
+                addInterfaceExtension(InterfaceExtensionImpl.newInstance(loader, xbeanSet, anInterface));
             }
 
-            addPrePostExtension(PrePostExtensionImpl.newInstance(jamLoader, xbeanSet, ppXO));
+            addPrePostExtension(PrePostExtensionImpl.newInstance(loader, xbeanSet, ppXO));
         }
     }
 
-    private void recordUserTypeSetting(File[] javaFiles, File[] classpath,
-            Usertypeconfig usertypeconfig)
-    {
-        JamClassLoader jamLoader = getJamLoader(javaFiles, classpath);
-        UserTypeImpl userType = UserTypeImpl.newInstance(jamLoader, usertypeconfig);
+    private void recordUserTypeSetting(File[] javaFiles, File[] classpath, Usertypeconfig usertypeconfig) {
+        Parser loader = new Parser(javaFiles, classpath);
+        UserTypeImpl userType = UserTypeImpl.newInstance(loader, usertypeconfig);
         _userTypes.put(userType.getName(), userType);
     }
 
 
-    private String lookup(Map map, Map mapByUriPrefix, String uri)
-    {
-        if (uri == null)
+    private String lookup(Map map, Map mapByUriPrefix, String uri) {
+        if (uri == null) {
             uri = "";
+        }
         String result = (String)map.get(uri);
-        if (result != null)
+        if (result != null) {
             return result;
-        if (mapByUriPrefix != null)
-        {
+        }
+        if (mapByUriPrefix != null) {
             result = lookupByUriPrefix(mapByUriPrefix, uri);
-            if (result != null)
+            if (result != null) {
                 return result;
+            }
         }
 
         return (String)map.get("##any");
     }
 
-    private String lookupByUriPrefix(Map mapByUriPrefix, String uri)
-    {
-        if (uri == null)
+    private String lookupByUriPrefix(Map mapByUriPrefix, String uri) {
+        if (uri == null) {
             return null;
-        if (!mapByUriPrefix.isEmpty())
-        {
+        }
+        if (!mapByUriPrefix.isEmpty()) {
             String uriprefix = null;
-            Iterator i = mapByUriPrefix.keySet().iterator();
-            while (i.hasNext())
-            {
-                String nextprefix = (String)i.next();
-                if (uriprefix != null && nextprefix.length() < uriprefix.length())
+            for (Object o : mapByUriPrefix.keySet()) {
+                String nextprefix = (String) o;
+                if (uriprefix != null && nextprefix.length() < uriprefix.length()) {
                     continue;
-                if (uri.startsWith(nextprefix))
+                }
+                if (uri.startsWith(nextprefix)) {
                     uriprefix = nextprefix;
+                }
             }
 
-            if (uriprefix != null)
-                return (String)mapByUriPrefix.get(uriprefix);
+            if (uriprefix != null) {
+                return (String) mapByUriPrefix.get(uriprefix);
+            }
         }
         return null;
     }
 
     //package methods
-    static void warning(String s, XmlObject xo)
-    {
+    static void warning(String s, XmlObject xo) {
         StscState.get().error(s, XmlError.SEVERITY_WARNING, xo);
     }
 
-    static void error(String s, XmlObject xo)
-    {
+    static void error(String s, XmlObject xo) {
         StscState.get().error(s, XmlError.SEVERITY_ERROR, xo);
     }
 
     //public methods
 
-    public String lookupPackageForNamespace(String uri)
-    {
+    public String lookupPackageForNamespace(String uri) {
         return lookup(_packageMap, _packageMapByUriPrefix, uri);
     }
 
-    public String lookupPrefixForNamespace(String uri)
-    {
+    public String lookupPrefixForNamespace(String uri) {
         return lookup(_prefixMap, _prefixMapByUriPrefix, uri);
     }
 
-    public String lookupSuffixForNamespace(String uri)
-    {
+    public String lookupSuffixForNamespace(String uri) {
         return lookup(_suffixMap, _suffixMapByUriPrefix, uri);
     }
 
     /** @deprecated replaced with {@link #lookupJavanameForQName(QName, int)} */
-    public String lookupJavanameForQName(QName qname)
-    {
-        String result = (String)_qnameTypeMap.get(qname);
-        if (result != null)
-            return result;
-        return (String)_qnameDocTypeMap.get(qname);
+    public String lookupJavanameForQName(QName qname) {
+        String result = _qnameTypeMap.get(qname);
+        return result != null ? result : _qnameDocTypeMap.get(qname);
     }
 
-    public String lookupJavanameForQName(QName qname, int kind)
-    {
-        switch (kind)
-        {
+    public String lookupJavanameForQName(QName qname, int kind) {
+        switch (kind) {
         case QNAME_TYPE:
-            return (String)_qnameTypeMap.get(qname);
+            return _qnameTypeMap.get(qname);
         case QNAME_DOCUMENT_TYPE:
-            return (String)_qnameDocTypeMap.get(qname);
+            return _qnameDocTypeMap.get(qname);
         case QNAME_ACCESSOR_ELEMENT:
-            return (String)_qnameElemMap.get(qname);
+            return _qnameElemMap.get(qname);
         case QNAME_ACCESSOR_ATTRIBUTE:
-            return (String)_qnameAttMap.get(qname);
+            return _qnameAttMap.get(qname);
         }
         return null;
     }
 
-    public UserType lookupUserTypeForQName(QName qname)
-    {
-        if (qname == null)
-            return null;
-
-        return (UserType) _userTypes.get(qname);
+    public UserType lookupUserTypeForQName(QName qname) {
+        return qname == null ? null : _userTypes.get(qname);
     }
 
-    public InterfaceExtension[] getInterfaceExtensions()
-    {
-        return (InterfaceExtension[])_interfaceExtensions.toArray(new InterfaceExtension[_interfaceExtensions.size()]);
+    public InterfaceExtension[] getInterfaceExtensions() {
+        return _interfaceExtensions.toArray(new InterfaceExtension[0]);
     }
 
-    public InterfaceExtension[] getInterfaceExtensions(String fullJavaName)
-    {
-        List result = new ArrayList();
-        for (int i = 0; i < _interfaceExtensions.size(); i++)
-        {
-            InterfaceExtensionImpl intfExt = (InterfaceExtensionImpl) _interfaceExtensions.get(i);
-            if (intfExt.contains(fullJavaName))
-                result.add(intfExt);
-        }
-
-        return (InterfaceExtension[])result.toArray(new InterfaceExtension[result.size()]);
+    public InterfaceExtension[] getInterfaceExtensions(String fullJavaName) {
+        return _interfaceExtensions.stream().
+            filter(i -> i.contains(fullJavaName)).
+            toArray(InterfaceExtension[]::new);
     }
 
-    public PrePostExtension[] getPrePostExtensions()
-    {
-        return (PrePostExtension[])_prePostExtensions.toArray(new PrePostExtension[_prePostExtensions.size()]);
+    public PrePostExtension[] getPrePostExtensions() {
+        return _prePostExtensions.toArray(new PrePostExtension[0]);
     }
 
-    public PrePostExtension getPrePostExtension(String fullJavaName)
-    {
-        for (int i = 0; i < _prePostExtensions.size(); i++)
-        {
-            PrePostExtensionImpl prePostExt = (PrePostExtensionImpl) _prePostExtensions.get(i);
-            if (prePostExt.contains(fullJavaName))
-                return prePostExt;
-        }
-        return null;
-    }
-
-    private JamClassLoader getJamLoader(File[] javaFiles, File[] classpath)
-    {
-        JamServiceFactory jf = JamServiceFactory.getInstance();
-        JamServiceParams params = jf.createServiceParams();
-        params.set14WarningsEnabled(false);
-        // BUGBUG(radup) This is here because the above doesn't do the trick
-        params.setShowWarnings(false);
-
-        // process the included sources
-        if (javaFiles!=null)
-            for (int i = 0; i < javaFiles.length; i++)
-                params.includeSourceFile(javaFiles[i]);
-
-        //params.setVerbose(DirectoryScanner.class);
-
-        // add the sourcepath and classpath, if specified
-        params.addClassLoader(this.getClass().getClassLoader());
-        if (classpath != null)
-            for (int i = 0; i < classpath.length; i++)
-                params.addClasspath(classpath[i]);
-
-        // create service, get classes, return compiler
-        JamService service;
-        try
-        {
-            service = jf.createService(params);
-        }
-        catch (IOException ioe)
-        {
-            error("Error when accessing .java files.", null);
-            return null;
-        }
-
-//        JClass[] cls = service.getAllClasses();
-//        for (int i = 0; i < cls.length; i++)
-//        {
-//            JClass cl = cls[i];
-//            System.out.println("CL: " + cl + " " + cl.getQualifiedName());
-//            JMethod[] methods = cl.getMethods();
-//            for (int j = 0; j < methods.length; j++)
-//            {
-//                JMethod method = methods[j];
-//                System.out.println("    " + method.getQualifiedName());
-//            }
-//        }
-
-        return service.getClassLoader();
+    public PrePostExtension getPrePostExtension(String fullJavaName) {
+        return _prePostExtensions.stream().
+            filter(p -> p.contains(fullJavaName)).
+            findFirst().orElse(null);
     }
 }
diff --git a/src/xmlconfig/org/apache/xmlbeans/impl/config/InterfaceExtensionImpl.java b/src/xmlconfig/org/apache/xmlbeans/impl/config/InterfaceExtensionImpl.java
index caefa33..66ec046 100755
--- a/src/xmlconfig/org/apache/xmlbeans/impl/config/InterfaceExtensionImpl.java
+++ b/src/xmlconfig/org/apache/xmlbeans/impl/config/InterfaceExtensionImpl.java
@@ -15,27 +15,31 @@
 
 package org.apache.xmlbeans.impl.config;
 
-import org.apache.xmlbeans.impl.xb.xmlconfig.Extensionconfig;
+import com.github.javaparser.ast.NodeList;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.body.Parameter;
+import com.github.javaparser.ast.type.ReferenceType;
 import org.apache.xmlbeans.InterfaceExtension;
 import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.impl.jam.JMethod;
-import org.apache.xmlbeans.impl.jam.JClass;
-import org.apache.xmlbeans.impl.jam.JParameter;
-import org.apache.xmlbeans.impl.jam.JamClassLoader;
+import org.apache.xmlbeans.impl.xb.xmlconfig.Extensionconfig;
 
-public class InterfaceExtensionImpl implements InterfaceExtension
-{
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.stream.Stream;
+
+public class InterfaceExtensionImpl implements InterfaceExtension {
     private NameSet _xbeanSet;
     private String _interfaceClassName;
     private String _delegateToClassName;
     private MethodSignatureImpl[] _methods;
 
-    static InterfaceExtensionImpl newInstance(JamClassLoader loader, NameSet xbeanSet, Extensionconfig.Interface intfXO)
-    {
+    static InterfaceExtensionImpl newInstance(Parser loader, NameSet xbeanSet, Extensionconfig.Interface intfXO) {
         InterfaceExtensionImpl result = new InterfaceExtensionImpl();
 
         result._xbeanSet = xbeanSet;
-        JClass interfaceJClass = validateInterface(loader, intfXO.getName(), intfXO);
+
+        ClassOrInterfaceDeclaration interfaceJClass = validateInterface(loader, intfXO.getName(), intfXO);
 
 
         if (interfaceJClass == null)
@@ -44,13 +48,13 @@
             return null;
         }
 
-        result._interfaceClassName = interfaceJClass.getQualifiedName();
+        result._interfaceClassName = interfaceJClass.getFullyQualifiedName().get();
 
         result._delegateToClassName = intfXO.getStaticHandler();
-        JClass delegateJClass = validateClass(loader, result._delegateToClassName, intfXO);
+        ClassOrInterfaceDeclaration delegateJClass = validateClass(loader, result._delegateToClassName, intfXO);
 
-        if (delegateJClass == null) // no HandlerClass
-        {
+        if (delegateJClass == null) {
+            // no HandlerClass
             BindingConfigImpl.warning("Handler class '" + intfXO.getStaticHandler() + "' not found on classpath, skip validation.", intfXO);
             return result;
         }
@@ -61,208 +65,149 @@
         return result;
     }
 
-    private static JClass validateInterface(JamClassLoader loader, String intfStr, XmlObject loc)
-    {
+    private static ClassOrInterfaceDeclaration validateInterface(Parser loader, String intfStr, XmlObject loc) {
         return validateJava(loader, intfStr, true, loc);
     }
 
-    static JClass validateClass(JamClassLoader loader, String clsStr, XmlObject loc)
-    {
+    static ClassOrInterfaceDeclaration validateClass(Parser loader, String clsStr, XmlObject loc) {
         return validateJava(loader, clsStr, false, loc);
     }
 
-    static JClass validateJava(JamClassLoader loader, String clsStr, boolean isInterface, XmlObject loc)
-    {
-        if (loader==null)
+    static ClassOrInterfaceDeclaration validateJava(Parser loader, String clsStr, boolean isInterface, XmlObject loc) {
+        if (loader==null) {
             return null;
+        }
 
         final String ent = isInterface ? "Interface" : "Class";
-        JClass cls = loader.loadClass(clsStr);
+        ClassOrInterfaceDeclaration cls = loader.loadSource(clsStr);
 
-        if (cls==null || cls.isUnresolvedType())
-        {
+        if (cls==null) {
             BindingConfigImpl.error(ent + " '" + clsStr + "' not found.", loc);
             return null;
         }
 
-        if ( (isInterface && !cls.isInterface()) ||
-                (!isInterface && cls.isInterface()))
-        {
-            BindingConfigImpl.error("'" + clsStr + "' must be " +
-                (isInterface ? "an interface" : "a class") + ".", loc);
+        if ( isInterface != cls.isInterface() ) {
+            BindingConfigImpl.error("'" + clsStr + "' must be " + (isInterface ? "an interface" : "a class") + ".", loc);
         }
 
-        if (!cls.isPublic())
-        {
+        if (!cls.isPublic()) {
             BindingConfigImpl.error(ent + " '" + clsStr + "' is not public.", loc);
         }
 
         return cls;
     }
 
-    private boolean validateMethods(JClass interfaceJClass, JClass delegateJClass, XmlObject loc)
-    {
-        //assert _delegateToClass != null : "Delegate to class handler expected.";
-        boolean valid = true;
+    private boolean validateMethods(ClassOrInterfaceDeclaration interfaceJClass, ClassOrInterfaceDeclaration delegateJClass, XmlObject loc) {
+        _methods = interfaceJClass.getMethods().stream()
+            .map(m -> validateMethod(interfaceJClass, delegateJClass, m, loc))
+            .map(m -> m == null ? null : new MethodSignatureImpl(getStaticHandler(), m))
+            .toArray(MethodSignatureImpl[]::new);
 
-        JMethod[] interfaceMethods = interfaceJClass.getMethods();
-        _methods = new MethodSignatureImpl[interfaceMethods.length];
-
-        for (int i = 0; i < interfaceMethods.length; i++)
-        {
-            JMethod method = validateMethod(interfaceJClass, delegateJClass, interfaceMethods[i], loc);
-            if (method != null)
-                _methods[i] = new MethodSignatureImpl(getStaticHandler(), method);
-            else
-                valid = false;
-        }
-
-
-        return valid;
+        return Stream.of(_methods).allMatch(Objects::nonNull);
     }
 
-    private JMethod validateMethod(JClass interfaceJClass, JClass delegateJClass, JMethod method, XmlObject loc)
-    {
-        String methodName = method.getSimpleName();
-        JParameter[] params = method.getParameters();
-        JClass returnType = method.getReturnType();
+    private MethodDeclaration validateMethod(ClassOrInterfaceDeclaration interfaceJClass,
+         ClassOrInterfaceDeclaration delegateJClass, MethodDeclaration method, XmlObject loc) {
 
-        JClass[] delegateParams = new JClass[params.length+1];
-        delegateParams[0] = returnType.forName("org.apache.xmlbeans.XmlObject");
-        for (int i = 1; i < delegateParams.length; i++)
-        {
-            delegateParams[i] = params[i-1].getType();
-        }
+        String methodName = method.getName().asString();
 
-        JMethod handlerMethod = null;
-        handlerMethod = getMethod(delegateJClass, methodName, delegateParams);
-        if (handlerMethod==null)
-        {
-            BindingConfigImpl.error("Handler class '" + delegateJClass.getQualifiedName() + "' does not contain method " + methodName + "(" + listTypes(delegateParams) + ")", loc);
+        String[] delegateParams = Stream.concat(
+            Stream.of("org.apache.xmlbeans.XmlObject"),
+            Stream.of(paramStrings(method.getParameters()))
+        ).toArray(String[]::new);
+
+        MethodDeclaration handlerMethod = getMethod(delegateJClass, methodName, delegateParams);
+
+        String delegateFQN = delegateJClass.getFullyQualifiedName().orElse("");
+        String methodFQN =  methodName + "(" + method.getParameters().toString() + ")";
+        String interfaceFQN = interfaceJClass.getFullyQualifiedName().orElse("");
+
+        if (handlerMethod == null) {
+            BindingConfigImpl.error("Handler class '" + delegateFQN + "' does not contain method " + methodFQN, loc);
             return null;
         }
 
         // check for throws exceptions
-        JClass[] intfExceptions = method.getExceptionTypes();
-        JClass[] delegateExceptions = handlerMethod.getExceptionTypes();
-        if ( delegateExceptions.length!=intfExceptions.length )
-        {
-            BindingConfigImpl.error("Handler method '" + delegateJClass.getQualifiedName() + "." + methodName + "(" + listTypes(delegateParams) +
-                ")' must declare the same exceptions as the interface method '" + interfaceJClass.getQualifiedName() + "." + methodName + "(" + listTypes(params), loc);
+        if (!Arrays.equals(exceptionStrings(method), exceptionStrings(handlerMethod))) {
+            BindingConfigImpl.error("Handler method '" + delegateFQN + "." + methodName + "' must declare the same " +
+            "exceptions as the interface method '" + interfaceFQN + "." + methodFQN, loc);
             return null;
         }
 
-        for (int i = 0; i < delegateExceptions.length; i++)
-        {
-            if ( delegateExceptions[i]!=intfExceptions[i] )
-            {
-                BindingConfigImpl.error("Handler method '" + delegateJClass.getQualifiedName() + "." + methodName + "(" + listTypes(delegateParams) +
-                    ")' must declare the same exceptions as the interface method '" + interfaceJClass.getQualifiedName() + "." + methodName + "(" + listTypes(params), loc);
-                return null;
-            }
-        }
-
-        if (!handlerMethod.isPublic() || !handlerMethod.isStatic())
-        {
-            BindingConfigImpl.error("Method '" + delegateJClass.getQualifiedName() + "." + methodName + "(" + listTypes(delegateParams) + ")' must be declared public and static.", loc);
+        if (!handlerMethod.isPublic() || !handlerMethod.isStatic()) {
+            BindingConfigImpl.error("Method '" + delegateJClass.getFullyQualifiedName() + "." +
+            methodFQN + "' must be declared public and static.", loc);
             return null;
         }
 
-        if (!returnType.equals(handlerMethod.getReturnType()))
-        {
-            BindingConfigImpl.error("Return type for method '" + handlerMethod.getReturnType() + " " + delegateJClass.getQualifiedName() +
-                    "." + methodName + "(" + listTypes(delegateParams) + ")' does not match the return type of the interface method :'" + returnType + "'.", loc);
+        String returnType = method.getTypeAsString();
+        if (!returnType.equals(handlerMethod.getTypeAsString())) {
+            BindingConfigImpl.error("Return type for method '" + returnType + " " + delegateFQN + "." + methodName +
+            "(...)' does not match the return type of the interface method :'" + returnType + "'.", loc);
             return null;
         }
 
         return method;
     }
 
-    static JMethod getMethod(JClass cls, String name, JClass[] paramTypes)
-    {
-        JMethod[] methods = cls.getMethods();
-        for (int i = 0; i < methods.length; i++)
-        {
-            JMethod method = methods[i];
-            if (!name.equals(method.getSimpleName()))
-                continue;
+    static MethodDeclaration getMethod(ClassOrInterfaceDeclaration cls, String name, String[] paramTypes) {
+        // cls.getMethodsBySignature only checks the type name as-is ... i.e. if the type name is imported
+        // only the simple name is checked, otherwise the full qualified name
+        return cls.getMethodsByName(name).stream()
+            .filter(m -> parameterMatches(paramStrings(m.getParameters()), paramTypes))
+            .findFirst().orElse(null);
+    }
 
-            JParameter[] mParams = method.getParameters();
+    private static String[] paramStrings(NodeList<Parameter> params) {
+        return params.stream().map(Parameter::getTypeAsString).toArray(String[]::new);
+    }
 
-            // can have methods with same name but different # of params
-            if (mParams.length != paramTypes.length)
-                continue;
+    private static String[] exceptionStrings(MethodDeclaration method) {
+        return method.getThrownExceptions().stream().map(ReferenceType::asString).toArray(String[]::new);
+    }
 
-            for (int j = 0; j < mParams.length; j++)
-            {
-                JParameter mParam = mParams[j];
-                if (!mParam.getType().equals(paramTypes[j]))
-                    continue;
+    private static boolean parameterMatches(String[] params1, String[] params2) {
+        // compare all parameters type strings
+        // a type string can be a simple name (e.g. "XmlObject") or
+        // fully qualified name ("org.apache.xmlbeans.XmlObject")
+        // try to loosely match the names
+        if (params1.length != params2.length) {
+            return false;
+        }
+        for (int i=0; i<params1.length; i++) {
+            String p1 = params1[i];
+            String p2 = params2[i];
+            if (p1.contains(".")) {
+                String tmp = p1;
+                p1 = p2;
+                p2 = tmp;
             }
-
-            return method;
+            if (!p2.endsWith(p1)) {
+                return false;
+            }
         }
-        return null;
-    }
-
-    private static String listTypes(JClass[] types)
-    {
-        StringBuffer result = new StringBuffer();
-        for (int i = 0; i < types.length; i++)
-        {
-            JClass type = types[i];
-            if (i>0)
-                result.append(", ");
-            result.append(emitType(type));
-        }
-        return result.toString();
-    }
-
-    private static String listTypes(JParameter[] params)
-    {
-        StringBuffer result = new StringBuffer();
-        for (int i = 0; i < params.length; i++)
-        {
-            JClass type = params[i].getType();
-            if (i>0)
-                result.append(", ");
-            result.append(emitType(type));
-        }
-        return result.toString();
-    }
-
-    public static String emitType(JClass cls)
-    {
-        if (cls.isArrayType())
-            return emitType(cls.getArrayComponentType()) + "[]";
-        else
-            return cls.getQualifiedName().replace('$', '.');
+        return true;
     }
 
     /* public getters */
-    public boolean contains(String fullJavaName)
-    {
+    public boolean contains(String fullJavaName) {
         return _xbeanSet.contains(fullJavaName);
     }
 
-    public String getStaticHandler()
-    {
+    public String getStaticHandler() {
         return _delegateToClassName;
     }
 
-    public String getInterface()
-    {
+    public String getInterface() {
         return _interfaceClassName;
     }
 
-    public InterfaceExtension.MethodSignature[] getMethods()
-    {
+    public InterfaceExtension.MethodSignature[] getMethods() {
         return _methods;
     }
 
-    public String toString()
-    {
-        StringBuffer buf = new StringBuffer();
+    public String toString() {
+        StringBuilder buf = new StringBuilder();
         buf.append("  static handler: ").append(_delegateToClassName).append("\n");
         buf.append("  interface: ").append(_interfaceClassName).append("\n");
         buf.append("  name set: ").append(_xbeanSet).append("\n");
@@ -274,138 +219,86 @@
     }
 
     // this is used only for detecting method colisions of extending interfaces
-    static class MethodSignatureImpl implements InterfaceExtension.MethodSignature
-    {
-        private String _intfName;  
+    static class MethodSignatureImpl implements InterfaceExtension.MethodSignature {
+        private final String _intfName;
         private final int NOTINITIALIZED = -1;
         private int _hashCode = NOTINITIALIZED;
         private String _signature;
 
-        private String _name;
-        private String _return;
-        private String[] _params;
-        private String[] _exceptions;
+        private final String _name;
+        private final String _return;
+        private final String[] _params;
+        private final String[] _exceptions;
 
-        MethodSignatureImpl(String intfName, JMethod method)
-        {
-            if (intfName==null || method==null)
+        MethodSignatureImpl(String intfName, MethodDeclaration method) {
+            if (intfName==null || method==null) {
                 throw new IllegalArgumentException("Interface: " + intfName + " method: " + method);
+            }
 
             _intfName = intfName;
-            _hashCode = NOTINITIALIZED;
             _signature = null;
 
-            _name = method.getSimpleName();
-            _return = method.getReturnType().getQualifiedName().replace('$', '.');
+            _name = method.getName().asString();
+            _return = replaceInner(method.getTypeAsString());
 
-            JParameter[] paramTypes = method.getParameters();
-            _params = new String[paramTypes.length];
-            for (int i = 0; i < paramTypes.length; i++)
-                _params[i] = paramTypes[i].getType().getQualifiedName().replace('$', '.');;
+            _params = method.getParameters().stream().map(Parameter::getTypeAsString).
+                map(MethodSignatureImpl::replaceInner).toArray(String[]::new);
 
-            JClass[] exceptionTypes = method.getExceptionTypes();
-            _exceptions = new String[exceptionTypes.length];
-            for (int i = 0; i < exceptionTypes.length; i++)
-                _exceptions[i] = exceptionTypes[i].getQualifiedName().replace('$', '.');
+            _exceptions = method.getThrownExceptions().stream().map(ReferenceType::asString).
+                map(MethodSignatureImpl::replaceInner).toArray(String[]::new);
         }
 
-        String getInterfaceName()
-        {
+        private static String replaceInner(String classname) {
+            return classname.replace('$', '.');
+        }
+
+        String getInterfaceName() {
             return _intfName;
         }
 
-        public String getName()
-        {
+        public String getName() {
             return _name;
         }
 
-        public String getReturnType()
-        {
+        public String getReturnType() {
             return _return;
         }
 
-        public String[] getParameterTypes()
-        {
+        public String[] getParameterTypes() {
             return _params;
         }
 
-        public String[] getExceptionTypes()
-        {
+        public String[] getExceptionTypes() {
             return _exceptions;
         }
 
-        public boolean equals(Object o)
-        {
-            if ( !(o instanceof MethodSignatureImpl))
-                return false;
+        public boolean equals(Object o) {
+            if (o == this) {
+                return true;
+            }
 
+            if (!(o instanceof MethodSignatureImpl)) {
+                return false;
+            }
             MethodSignatureImpl ms = (MethodSignatureImpl)o;
 
-            if (!ms.getName().equals(getName()) )
-                return false;
-
-            String[] params = getParameterTypes();
-            String[] msParams = ms.getParameterTypes();
-
-            if (msParams.length != params.length )
-                return false;
-
-            for (int i = 0; i < params.length; i++)
-            {
-                if (!msParams[i].equals(params[i]))
-                    return false;
-            }
-
-            if (!_intfName.equals(ms._intfName))
-                return false;
-            
-            return true;
+            return ms.getName().equals(getName()) &&
+                   _intfName.equals(ms._intfName) &&
+                   Arrays.equals(getParameterTypes(),ms.getParameterTypes());
         }
 
-        public int hashCode()
-        {
-            if (_hashCode!=NOTINITIALIZED)
-                return _hashCode;
-
-            int hash = getName().hashCode();
-
-            String[] params = getParameterTypes();
-
-            for (int i = 0; i < params.length; i++)
-            {
-                hash *= 19;
-                hash += params[i].hashCode();
-            }
-
-            hash += 21 * _intfName.hashCode();
-
-            _hashCode = hash;
-            return _hashCode;
+        public int hashCode() {
+            return (_hashCode!=NOTINITIALIZED) ? _hashCode :
+                (_hashCode = Objects.hash(getName(), Arrays.hashCode(getParameterTypes()), _intfName));
         }
 
-        String getSignature()
-        {
-            if (_signature!=null)
-                return _signature;
-
-            StringBuffer sb = new StringBuffer(60);
-            sb.append(_name).append("(");
-            for (int i = 0; i < _params.length; i++)
-                sb.append((i == 0 ? "" : " ,")).append(_params[i]);
-            sb.append(")");
-
-            _signature = sb.toString();
-
-            return _signature;
+        String getSignature() {
+            return (_signature!=null) ? _signature :
+                (_signature = _name+"("+String.join(" ,", _params)+")");
         }
 
-        public String toString()
-        {
-            StringBuffer buf = new StringBuffer();
-
-            buf.append(getReturnType()).append(" ").append(getSignature());
-
-            return buf.toString();
+        public String toString() {
+            return getReturnType() + " " + getSignature();
         }
     }
 }
diff --git a/src/xmlconfig/org/apache/xmlbeans/impl/config/Parser.java b/src/xmlconfig/org/apache/xmlbeans/impl/config/Parser.java
new file mode 100644
index 0000000..8142aa9
--- /dev/null
+++ b/src/xmlconfig/org/apache/xmlbeans/impl/config/Parser.java
@@ -0,0 +1,66 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package org.apache.xmlbeans.impl.config;
+
+import com.github.javaparser.ParseResult;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.TypeDeclaration;
+import com.github.javaparser.utils.SourceRoot;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.function.Predicate;
+
+class Parser {
+    final File[] javaFiles;
+    final File[] classpath;
+
+
+    public Parser(File[] javaFiles, File[] classpath) {
+        this.javaFiles = (javaFiles != null) ? javaFiles.clone() : new File[0];
+        this.classpath = (classpath != null) ? classpath.clone() : new File[0];
+    }
+
+    public ClassOrInterfaceDeclaration loadSource(String className) {
+        final String fileName = className.replace('.','/') +".java";
+        for (File f : javaFiles) {
+            final String filePath = f.getPath();
+            if (filePath.replace('\\','/').endsWith(fileName)) {
+                // remove filename from path - don't use replace because of different path separator
+                final String rootPath = filePath.substring(0, filePath.length()-fileName.length());
+                final String startPackage = className.indexOf('.') == -1 ? "" : className.substring(0, className.lastIndexOf('.'));
+                final String simpleName = startPackage.isEmpty() ? className : className.substring(startPackage.length()+1);
+                SourceRoot sourceRoot = new SourceRoot(new File(rootPath).toPath());
+                try {
+                    ParseResult<CompilationUnit> pcu = sourceRoot.tryToParse(startPackage, simpleName+".java");
+                    ClassOrInterfaceDeclaration cls = pcu.getResult().flatMap(cu -> cu.getTypes().stream()
+                        .filter(matchType(className))
+                        .map(t -> (ClassOrInterfaceDeclaration) t).findFirst()).orElse(null);
+                    return cls;
+                } catch (IOException e) {
+                    return null;
+                }
+            }
+        }
+        return null;
+    }
+
+    private static Predicate<TypeDeclaration<?>> matchType(String className) {
+        return (t) -> t instanceof  ClassOrInterfaceDeclaration &&
+                      t.getFullyQualifiedName().map(fqn -> fqn.equals(className)).orElse(false);
+    }
+}
diff --git a/src/xmlconfig/org/apache/xmlbeans/impl/config/PrePostExtensionImpl.java b/src/xmlconfig/org/apache/xmlbeans/impl/config/PrePostExtensionImpl.java
index bbf7415..e598052 100755
--- a/src/xmlconfig/org/apache/xmlbeans/impl/config/PrePostExtensionImpl.java
+++ b/src/xmlconfig/org/apache/xmlbeans/impl/config/PrePostExtensionImpl.java
@@ -15,41 +15,28 @@
 
 package org.apache.xmlbeans.impl.config;
 
-import org.apache.xmlbeans.XmlObject;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.type.PrimitiveType;
 import org.apache.xmlbeans.PrePostExtension;
-import org.apache.xmlbeans.impl.jam.JamClassLoader;
-import org.apache.xmlbeans.impl.jam.JClass;
-import org.apache.xmlbeans.impl.jam.JMethod;
+import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.impl.xb.xmlconfig.Extensionconfig;
 
 
-public class PrePostExtensionImpl implements PrePostExtension
-{
+public class PrePostExtensionImpl implements PrePostExtension {
 
-    private static JClass[] PARAMTYPES_PREPOST = null; //new JClass[]{int.class, XmlObject.class, QName.class, boolean.class, int.class};
-    private static final String[] PARAMTYPES_STRING = new String[] {"int", "org.apache.xmlbeans.XmlObject",
-        "javax.xml.namespace.QName", "boolean", "int"};
-    private static final String SIGNATURE;
-    static
-    {
-        String sig = "(";
-        for (int i = 0; i < PARAMTYPES_STRING.length; i++)
-        {
-            String t = PARAMTYPES_STRING[i];
-            if (i!=0)
-                sig += ", ";
-            sig += t;
-        }
-        SIGNATURE = sig + ")";
-    }
+    private static final String[] PARAMTYPES_STRING = {
+        "int", "org.apache.xmlbeans.XmlObject", "javax.xml.namespace.QName", "boolean", "int"
+    };
+    private static final String SIGNATURE = "(" + String.join(", ", PARAMTYPES_STRING) + ")";
 
     private NameSet _xbeanSet;
-    private JClass _delegateToClass;
+    private ClassOrInterfaceDeclaration _delegateToClass;
     private String _delegateToClassName;
-    private JMethod _preSet;
-    private JMethod _postSet;
+    private MethodDeclaration _preSet;
+    private MethodDeclaration _postSet;
 
-    static PrePostExtensionImpl newInstance(JamClassLoader jamLoader, NameSet xbeanSet, Extensionconfig.PrePostSet prePostXO)
+    static PrePostExtensionImpl newInstance(Parser loader, NameSet xbeanSet, Extensionconfig.PrePostSet prePostXO)
     {
         if (prePostXO==null)
             return null;
@@ -58,7 +45,7 @@
 
         result._xbeanSet = xbeanSet;
         result._delegateToClassName = prePostXO.getStaticHandler();
-        result._delegateToClass = InterfaceExtensionImpl.validateClass(jamLoader, result._delegateToClassName, prePostXO);
+        result._delegateToClass = InterfaceExtensionImpl.validateClass(loader, result._delegateToClassName, prePostXO);
 
         if ( result._delegateToClass==null ) // no HandlerClass
         {
@@ -66,63 +53,40 @@
             return result;
         }
 
-        if (!result.lookAfterPreAndPost(jamLoader, prePostXO))
+        if (!result.lookAfterPreAndPost(loader, prePostXO))
             return null;
 
         return result;
     }
 
-    private boolean lookAfterPreAndPost(JamClassLoader jamLoader, XmlObject loc)
-    {
-        assert _delegateToClass!=null : "Delegate to class handler expected.";
+    private boolean lookAfterPreAndPost(Parser loader, XmlObject loc) {
+        assert (_delegateToClass!=null) : "Delegate to class handler expected.";
         boolean valid = true;
 
-        initParamPrePost(jamLoader);
+        _preSet = InterfaceExtensionImpl.getMethod(_delegateToClass, "preSet", PARAMTYPES_STRING);
+        // _preSet==null is ok
 
-        _preSet = InterfaceExtensionImpl.getMethod(_delegateToClass, "preSet", PARAMTYPES_PREPOST);
-        if (_preSet==null)
-        {} // not available is ok, _preSet will be null
-
-        if (_preSet!=null && !_preSet.getReturnType().equals(jamLoader.loadClass("boolean")))
-        {
+        if (_preSet!=null && !_preSet.getType().equals(PrimitiveType.booleanType())) {
             // just emit an warning and don't remember as a preSet
-            BindingConfigImpl.warning("Method '" + _delegateToClass.getSimpleName() +
+            BindingConfigImpl.warning("Method '" + _delegateToClass.getNameAsString() +
                 ".preSet" + SIGNATURE + "' " +
                 "should return boolean to be considered for a preSet handler.", loc);
             _preSet = null;
         }
 
-        _postSet = InterfaceExtensionImpl.getMethod(_delegateToClass, "postSet", PARAMTYPES_PREPOST);
-        if (_postSet==null)
-        {} // not available is ok, _postSet will be null
+        _postSet = InterfaceExtensionImpl.getMethod(_delegateToClass, "postSet", PARAMTYPES_STRING);
+        // _postSet==null is ok
 
         if (_preSet==null && _postSet==null)
         {
-            BindingConfigImpl.error("prePostSet handler specified '" + _delegateToClass.getSimpleName() +
-                "' but no preSet" + SIGNATURE + " or " +
-                "postSet" + SIGNATURE + " methods found.", loc);
+            BindingConfigImpl.error("prePostSet handler specified '" + _delegateToClass.getNameAsString() +
+                "' but no preSet" + SIGNATURE + " or postSet" + SIGNATURE + " methods found.", loc);
             valid = false;
         }
 
         return valid;
     }
 
-    private void initParamPrePost(JamClassLoader jamLoader)
-    {
-        if (PARAMTYPES_PREPOST==null)
-        {
-            PARAMTYPES_PREPOST = new JClass[PARAMTYPES_STRING.length];
-            for (int i = 0; i < PARAMTYPES_PREPOST.length; i++)
-            {
-                PARAMTYPES_PREPOST[i] = jamLoader.loadClass(PARAMTYPES_STRING[i]);
-                if (PARAMTYPES_PREPOST[i]==null)
-                {
-                    throw new IllegalStateException("JAM should have access to the following types " + SIGNATURE);
-                }
-            }
-        }
-    }
-
     // public methods
     public NameSet getNameSet()
     {
@@ -152,13 +116,8 @@
     /**
      * Returns the name of the handler in a form that can be put in a java source.
      */
-    public String getHandlerNameForJavaSource()
-    {
-        // used only in validation
-        if (_delegateToClass==null)
-            return null;
-
-        return InterfaceExtensionImpl.emitType(_delegateToClass);
+    public String getHandlerNameForJavaSource() {
+        return (_delegateToClass == null) ? null : _delegateToClass.getNameAsString();
     }
 
     boolean hasNameSetIntersection(PrePostExtensionImpl ext)
diff --git a/src/xmlconfig/org/apache/xmlbeans/impl/config/UserTypeImpl.java b/src/xmlconfig/org/apache/xmlbeans/impl/config/UserTypeImpl.java
index 738d619..72e3b79 100644
--- a/src/xmlconfig/org/apache/xmlbeans/impl/config/UserTypeImpl.java
+++ b/src/xmlconfig/org/apache/xmlbeans/impl/config/UserTypeImpl.java
@@ -15,12 +15,11 @@
 
 package org.apache.xmlbeans.impl.config;
 
-import javax.xml.namespace.QName;
-
 import org.apache.xmlbeans.UserType;
-import org.apache.xmlbeans.impl.jam.JamClassLoader;
 import org.apache.xmlbeans.impl.xb.xmlconfig.Usertypeconfig;
 
+import javax.xml.namespace.QName;
+
 public class UserTypeImpl implements UserType
 {
     private QName _name;
@@ -28,7 +27,7 @@
     private String _staticHandler;
 
 
-    static UserTypeImpl newInstance(JamClassLoader loader, Usertypeconfig cfgXO)
+    static UserTypeImpl newInstance(Parser loader, Usertypeconfig cfgXO)
     {
         UserTypeImpl result = new UserTypeImpl();
 
@@ -44,7 +43,7 @@
     }
 
 
-    public String getJavaName() 
+    public String getJavaName()
     {
         return _javaName;
     }
diff --git a/src/xmlpublic/org/apache/xmlbeans/GDurationBuilder.java b/src/xmlpublic/org/apache/xmlbeans/GDurationBuilder.java
index 23b8caf..a07ffdc 100644
--- a/src/xmlpublic/org/apache/xmlbeans/GDurationBuilder.java
+++ b/src/xmlpublic/org/apache/xmlbeans/GDurationBuilder.java
@@ -532,7 +532,7 @@
         // Minutes:        (?:(\d+)M)?
         // Seconds:        (?:(\d+(?:\.\d*)?|(?:.\d+)S)?
 
-        StringBuffer message = new StringBuffer(30);
+        StringBuilder message = new StringBuilder(30);
 
         if (duration.getSign() < 0)
             message.append('-');
@@ -608,7 +608,7 @@
 
         int point = intValStr.length() - scale - (isNegative ? 1 : 0);
 
-        StringBuffer sb = new StringBuffer(intValStr.length() + 2 + (point <= 0 ? (-point + 1) : 0));
+        StringBuilder sb = new StringBuilder(intValStr.length() + 2 + (point <= 0 ? (-point + 1) : 0));
         if (point <= 0)
         {
             // prepend zeros and a decimal point.
diff --git a/src/xmlpublic/org/apache/xmlbeans/QNameSet.java b/src/xmlpublic/org/apache/xmlbeans/QNameSet.java
index 246e874..c423e1b 100644
--- a/src/xmlpublic/org/apache/xmlbeans/QNameSet.java
+++ b/src/xmlpublic/org/apache/xmlbeans/QNameSet.java
@@ -417,7 +417,7 @@
      */ 
     public String toString()
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("QNameSet");
         sb.append(_inverted ? "-(" : "+(");
         for (Iterator i = _includedURIs.iterator(); i.hasNext(); )
diff --git a/src/xmlpublic/org/apache/xmlbeans/QNameSetBuilder.java b/src/xmlpublic/org/apache/xmlbeans/QNameSetBuilder.java
index 2594561..13d8e7e 100644
--- a/src/xmlpublic/org/apache/xmlbeans/QNameSetBuilder.java
+++ b/src/xmlpublic/org/apache/xmlbeans/QNameSetBuilder.java
@@ -682,7 +682,7 @@
      */ 
     public String toString()
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("QNameSetBuilder");
         sb.append(_inverted ? "-(" : "+(");
         for (Iterator i = _includedURIs.iterator(); i.hasNext(); )
diff --git a/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java b/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java
index 55b93f1..d7ae860 100644
--- a/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java
+++ b/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java
@@ -39,7 +39,7 @@
     private static final String TYPE_SYSTEM_FIELD = "typeSystem";
 
     private static String XMLBEANS_TITLE = "org.apache.xmlbeans";
-    private static String XMLBEANS_VERSION = "3.0.3";
+    private static String XMLBEANS_VERSION = "4.0.0";
     private static String XMLBEANS_VENDOR = "Apache Software Foundation";
 
     static
@@ -474,7 +474,7 @@
                 throw new RuntimeException("SchemaTypeSystem is null for field " +
                     TYPE_SYSTEM_FIELD + " on class with name " + stsName +
                     "." + HOLDER_CLASS_NAME +
-                    ". Please verify the version of xbean.jar is correct.");
+                    ". Please verify the version of xmlbeans.jar is correct.");
             }
             return sts;
         }
@@ -488,19 +488,19 @@
         {
             throw causedException(new RuntimeException("Cannot find field " +
                 TYPE_SYSTEM_FIELD + " on class " + stsName + "." + HOLDER_CLASS_NAME +
-                ". Please verify the version of xbean.jar is correct."), e);
+                ". Please verify the version of xmlbeans.jar is correct."), e);
         }
         catch (IllegalAccessException e)
         {
             throw causedException(new RuntimeException("Field " +
                 TYPE_SYSTEM_FIELD + " on class " + stsName + "." + HOLDER_CLASS_NAME +
-                "is not accessible. Please verify the version of xbean.jar is correct."), e);
+                "is not accessible. Please verify the version of xmlbeans.jar is correct."), e);
         }
     }
 
     /**
      * Returns a new ResourceLoader for a search path where each component of
-     * the path is either a directory or a compiled xbean jar.
+     * the path is either a directory or a compiled xmlbeans jar.
      */
     public static ResourceLoader resourceLoaderForPath(File[] path) {
         return new PathResourceLoader(path);
diff --git a/src/xmlpublic/org/apache/xmlbeans/XmlDocumentProperties.java b/src/xmlpublic/org/apache/xmlbeans/XmlDocumentProperties.java
index f61fad5..7de0aba 100644
--- a/src/xmlpublic/org/apache/xmlbeans/XmlDocumentProperties.java
+++ b/src/xmlpublic/org/apache/xmlbeans/XmlDocumentProperties.java
@@ -79,7 +79,10 @@
     /**
      * Returns the standalone property
      */
-    public boolean getStandalone ( ) { return get( STANDALONE ) != null; }
+    public boolean getStandalone ( ) {
+        Object flag = get( STANDALONE );
+        return flag != null && flag.toString().equalsIgnoreCase("true");
+    }
 
     /**
      * Sets the DOCTYPE name use in the &lt&#33;DOCTYPE&gt; declaration.
diff --git a/src/xmlpublic/org/apache/xmlbeans/XmlError.java b/src/xmlpublic/org/apache/xmlbeans/XmlError.java
index 72b1f7a..e9d48d3 100644
--- a/src/xmlpublic/org/apache/xmlbeans/XmlError.java
+++ b/src/xmlpublic/org/apache/xmlbeans/XmlError.java
@@ -584,7 +584,7 @@
         // workshop.workspace.ant.AntLogger regex
         // which also matches javac (davidbau)
 
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
 
         String source = formattedFileName(getSourceName(), base);
 
diff --git a/src/xmlpublic/org/apache/xmlbeans/XmlSimpleList.java b/src/xmlpublic/org/apache/xmlbeans/XmlSimpleList.java
index cde96f8..12557ca 100644
--- a/src/xmlpublic/org/apache/xmlbeans/XmlSimpleList.java
+++ b/src/xmlpublic/org/apache/xmlbeans/XmlSimpleList.java
@@ -137,7 +137,7 @@
         String first = stringValue(underlying.get(0));
         if (size == 1)
             return first;
-        StringBuffer result = new StringBuffer(first);
+        StringBuilder result = new StringBuilder(first);
         for (int i = 1; i < size; i++)
         {
             result.append(' ');
diff --git a/src/xmlpublic/org/apache/xmlbeans/XmlValidationError.java b/src/xmlpublic/org/apache/xmlbeans/XmlValidationError.java
index 74a6776..518f70d 100644
--- a/src/xmlpublic/org/apache/xmlbeans/XmlValidationError.java
+++ b/src/xmlpublic/org/apache/xmlbeans/XmlValidationError.java
@@ -235,7 +235,7 @@
         if (_fieldQName != null)
         {
             String msg = super.getMessage();
-            StringBuffer sb = new StringBuffer(msg.length() + 100);
+            StringBuilder sb = new StringBuilder(msg.length() + 100);
 
             sb.append(msg);
 
diff --git a/src/xpath_xquery/org/apache/xmlbeans/impl/xpath/saxon/XBeansXPath.java b/src/xpath_xquery/org/apache/xmlbeans/impl/xpath/saxon/XBeansXPath.java
index f210e95..c92e6bb 100644
--- a/src/xpath_xquery/org/apache/xmlbeans/impl/xpath/saxon/XBeansXPath.java
+++ b/src/xpath_xquery/org/apache/xmlbeans/impl/xpath/saxon/XBeansXPath.java
@@ -15,51 +15,45 @@
 

 package org.apache.xmlbeans.impl.xpath.saxon;

 

-import java.util.List;

-import java.util.Map;

-import java.util.ListIterator;

-

-import javax.xml.transform.dom.DOMSource;

-import javax.xml.transform.TransformerException;

-

+import net.sf.saxon.Configuration;

+import net.sf.saxon.dom.DOMNodeWrapper;

+import net.sf.saxon.om.Item;

+import net.sf.saxon.om.NodeInfo;

+import net.sf.saxon.om.SequenceTool;

+import net.sf.saxon.sxpath.*;

+import net.sf.saxon.tree.wrapper.VirtualNode;

+import org.apache.xmlbeans.impl.store.PathDelegate;

 import org.w3c.dom.Node;

 

-import net.sf.saxon.Configuration;

-import net.sf.saxon.dom.NodeWrapper;

-import net.sf.saxon.om.NodeInfo;

-import net.sf.saxon.om.VirtualNode;

-import net.sf.saxon.om.Item;

-import net.sf.saxon.value.Value;

-import net.sf.saxon.sxpath.XPathEvaluator;

-import net.sf.saxon.sxpath.XPathExpression;

-import net.sf.saxon.sxpath.IndependentContext;

-import net.sf.saxon.sxpath.XPathDynamicContext;

-import net.sf.saxon.sxpath.XPathVariable;

+import javax.xml.transform.TransformerException;

+import javax.xml.transform.dom.DOMSource;

+import java.util.ArrayList;

+import java.util.HashMap;

+import java.util.List;

+import java.util.Map;

 

-import org.apache.xmlbeans.impl.store.PathDelegate;

-

+@SuppressWarnings("WeakerAccess")

 public class XBeansXPath

-        implements PathDelegate.SelectPathInterface

-{

-    private Object[] namespaceMap;

+    implements PathDelegate.SelectPathInterface {

+    private final Map<String, String> namespaceMap = new HashMap<String, String>();

     private String path;

     private String contextVar;

     private String defaultNS;

 

     /**

      * Construct given an XPath expression string.

-     * @param path The XPath expression

-     * @param contextVar The name of the context variable

+     *

+     * @param path         The XPath expression

+     * @param contextVar   The name of the context variable

      * @param namespaceMap a map of prefix/uri bindings for NS support

-     * @param defaultNS the uri for the default element NS, if any

+     * @param defaultNS    the uri for the default element NS, if any

      */

     public XBeansXPath(String path, String contextVar,

-                       Map namespaceMap, String defaultNS)

-    {

+                       Map<String, String> namespaceMap, String defaultNS) {

         this.path = path;

         this.contextVar = contextVar;

         this.defaultNS = defaultNS;

-        this.namespaceMap = namespaceMap.entrySet().toArray();

+        this.namespaceMap.putAll(namespaceMap);

     }

 

     /**

@@ -77,97 +71,79 @@
      * <p/>

      * <p/>

      * <b>NOTE:</b> Param node must be a DOM node which will be used

-     * during the xpath execution and iteration through the results. 

+     * during the xpath execution and iteration through the results.

      * A call of node.dispose() must be done after reading all results.

      * </p>

      *

      * @param node The node, nodeset or Context object for evaluation.

-     * This value can be null.

+     *             This value can be null.

      * @return The <code>List</code> of all items selected

-     *         by this XPath expression.

+     * by this XPath expression.

      */

-    public List selectNodes(Object node)

-    {

-        try

-        {

-            Node contextNode = (Node)node;

-            XPathEvaluator xpe = new XPathEvaluator();

+    public List selectNodes(Object node) {

+        try {

+            Node contextNode = (Node) node;

             Configuration config = new Configuration();

-            config.setDOMLevel(2);

-            config.setTreeModel(net.sf.saxon.event.Builder.STANDARD_TREE);

             IndependentContext sc = new IndependentContext(config);

             // Declare ns bindings

-            if (defaultNS != null)

+            // also see https://saxonica.plan.io/issues/2130

+            // (XPath referencing attribute with namespace fails when using DOM)

+            if (defaultNS != null) {

                 sc.setDefaultElementNamespace(defaultNS);

-

-            for (int i = 0; i < namespaceMap.length; i++)

-            {

-                Map.Entry entry = (Map.Entry) namespaceMap[i];

-                sc.declareNamespace((String) entry.getKey(),

-                        (String) entry.getValue());

             }

+

+            namespaceMap.forEach(sc::declareNamespace);

+

+            NodeInfo contextItem = config.unravel(new DOMSource(contextNode));

+

+            XPathEvaluator xpe = new XPathEvaluator(config);

             xpe.setStaticContext(sc);

-            XPathVariable thisVar = xpe.declareVariable("", contextVar);

+            XPathVariable thisVar = sc.declareVariable("", contextVar);

             XPathExpression xpath = xpe.createExpression(path);

-            NodeInfo contextItem = 

-                //config.buildDocument(new DOMSource(contextNode));

-                config.unravel(new DOMSource(contextNode));

             XPathDynamicContext dc = xpath.createDynamicContext(null);

             dc.setContextItem(contextItem);

             dc.setVariable(thisVar, contextItem);

 

-            List saxonNodes = xpath.evaluate(dc);

-            for (ListIterator it = saxonNodes.listIterator(); it.hasNext(); )

-            {

-                Object o = it.next();

-                if (o instanceof NodeInfo)

-                {

-                    if (o instanceof NodeWrapper)

-                    {

-                        Node n = getUnderlyingNode((NodeWrapper)o);

-                        it.set(n);

-                    }

-                    else

-                    {

-                        it.set(((NodeInfo)o).getStringValue());

-                    }

+            List<Item> saxonNodes = xpath.evaluate(dc);

+            List<Object> retNodes = new ArrayList<>(saxonNodes.size());

+            for (Item o : saxonNodes) {

+                if (o instanceof DOMNodeWrapper) {

+                    Node n = getUnderlyingNode((DOMNodeWrapper) o);

+                    retNodes.add(n);

+                } else if (o instanceof NodeInfo) {

+                    retNodes.add(o.getStringValue());

+                } else {

+                    retNodes.add(SequenceTool.convertToJava(o));

                 }

-                else if (o instanceof Item)

-                    it.set(Value.convertToJava((Item)o));

             }

-            return saxonNodes;

-        }

-        catch (TransformerException e)

-        {

+            return retNodes;

+        } catch (TransformerException e) {

             throw new RuntimeException(e);

         }

     }

 

-    public List selectPath(Object node)

-    {

+    public List selectPath(Object node) {

         return selectNodes(node);

     }

 

     /**

-     * According to the Saxon javadoc: 

-     * <code>getUnderlyingNode</code> in <code>NodeWrapper</code> implements 

+     * According to the Saxon javadoc:

+     * <code>getUnderlyingNode</code> in <code>NodeWrapper</code> implements

      * the method specified in the interface <code>VirtualNode</code>, and

      * the specification of the latter says that it may return another

      * <code>VirtualNode</code>, and you may have to drill down through

      * several layers of wrapping.

      * To be safe, this method is provided to drill down through multiple

      * layers of wrapping.

+     *

      * @param v The <code>VirtualNode</code>

      * @return The underlying node

      */

-    private static Node getUnderlyingNode(VirtualNode v)

-    {

+    private static Node getUnderlyingNode(VirtualNode v) {

         Object o = v;

-        while (o instanceof VirtualNode)

-        {

-            o = ((VirtualNode)o).getUnderlyingNode();

+        while (o instanceof VirtualNode) {

+            o = ((VirtualNode) o).getUnderlyingNode();

         }

-        return (Node)o;

+        return (Node) o;

     }

-

 }

diff --git a/src/xpath_xquery/org/apache/xmlbeans/impl/xquery/saxon/XBeansXQuery.java b/src/xpath_xquery/org/apache/xmlbeans/impl/xquery/saxon/XBeansXQuery.java
index 9ea4dbd..ceca343 100644
--- a/src/xpath_xquery/org/apache/xmlbeans/impl/xquery/saxon/XBeansXQuery.java
+++ b/src/xpath_xquery/org/apache/xmlbeans/impl/xquery/saxon/XBeansXQuery.java
@@ -15,119 +15,195 @@
 

 package org.apache.xmlbeans.impl.xquery.saxon;

 

-import java.util.List;

-import java.util.Map;

-import java.util.Iterator;

-import java.util.ListIterator;

-

-import javax.xml.transform.dom.DOMSource;

-import javax.xml.transform.TransformerException;

-

-import org.apache.xmlbeans.XmlOptions;

-import org.w3c.dom.Node;

-

 import net.sf.saxon.Configuration;

+import net.sf.saxon.dom.DocumentWrapper;

 import net.sf.saxon.dom.NodeOverNodeInfo;

+import net.sf.saxon.ma.map.HashTrieMap;

+import net.sf.saxon.om.Item;

 import net.sf.saxon.om.NodeInfo;

+import net.sf.saxon.om.StructuredQName;

 import net.sf.saxon.query.DynamicQueryContext;

 import net.sf.saxon.query.StaticQueryContext;

 import net.sf.saxon.query.XQueryExpression;

-

+import net.sf.saxon.type.BuiltInAtomicType;

+import net.sf.saxon.value.*;

+import org.apache.xmlbeans.XmlOptions;

 import org.apache.xmlbeans.XmlRuntimeException;

 import org.apache.xmlbeans.XmlTokenSource;

 import org.apache.xmlbeans.impl.store.QueryDelegate;

+import org.w3c.dom.Document;

+import org.w3c.dom.Node;

+

+import javax.xml.datatype.DatatypeConstants;

+import javax.xml.datatype.Duration;

+import javax.xml.datatype.XMLGregorianCalendar;

+import javax.xml.namespace.QName;

+import javax.xml.transform.TransformerException;

+import javax.xml.xpath.XPathException;

+import java.math.BigDecimal;

+import java.math.BigInteger;

+import java.net.URI;

+import java.util.List;

+import java.util.ListIterator;

+import java.util.Map;

 

 public class XBeansXQuery

-        implements QueryDelegate.QueryInterface

-{

+    implements QueryDelegate.QueryInterface {

     private XQueryExpression xquery;

     private String contextVar;

     private Configuration config;

 

     /**

      * Construct given an XQuery expression string.

-     * @param query The XQuery expression

+     *

+     * @param query      The XQuery expression

      * @param contextVar The name of the context variable

-     * @param boundary The offset of the end of the prolog

+     * @param boundary   The offset of the end of the prolog

      */

-    public XBeansXQuery(String query, String contextVar, Integer boundary, XmlOptions xmlOptions)

-    {

+    public XBeansXQuery(final String query, String contextVar, Integer boundary, XmlOptions xmlOptions) {

         config = new Configuration();

-        config.setDOMLevel(2);

-        config.setTreeModel(net.sf.saxon.event.Builder.STANDARD_TREE);

-        StaticQueryContext sc = new StaticQueryContext(config);

+        StaticQueryContext sc = config.newStaticQueryContext();

         @SuppressWarnings("unchecked")

         Map<String,String> nsMap = (Map<String,String>)xmlOptions.get(XmlOptions.LOAD_ADDITIONAL_NAMESPACES);

         if (nsMap != null) {

-            for (Map.Entry<String,String> me : nsMap.entrySet()) {

-                sc.declareNamespace(me.getKey(), me.getValue());

-            }

+            nsMap.forEach(sc::declareNamespace);

         }

-

         this.contextVar = contextVar;

         //Saxon requires external variables at the end of the prolog...

-        query = (boundary == 0) ?

-                "declare variable $" +

-                contextVar + " external;" + query :

-                query.substring(0, boundary) +

-                "declare variable $" +

-                contextVar + " external;" +

-                query.substring(boundary);

-        try

-        {

-            xquery = sc.compileQuery(query);

-        }

-        catch (TransformerException e)

-        {

+        try {

+            xquery = sc.compileQuery(

+                query.substring(0, boundary) + " declare variable $" + contextVar + " external;" + query.substring(boundary)

+            );

+        } catch (TransformerException e) {

             throw new XmlRuntimeException(e);

         }

     }

 

-    public List execQuery(Object node, Map variableBindings)

-    {

-        try

-        {

-            Node contextNode = (Node)node;

-            NodeInfo contextItem = 

-                config.buildDocument(new DOMSource(contextNode));

-                //config.unravel(new DOMSource(contextNode));

+    public List execQuery(Object node, Map variableBindings) {

+        try {

+            Node contextNode = (Node) node;

+

+            Document dom = (contextNode.getNodeType() == Node.DOCUMENT_NODE)

+                ? (Document) contextNode : contextNode.getOwnerDocument();

+

+            DocumentWrapper docWrapper = new DocumentWrapper(dom, null, config);

+            NodeInfo root =  docWrapper.wrap(contextNode);

+

             DynamicQueryContext dc = new DynamicQueryContext(config);

-            dc.setContextItem(contextItem);

-            dc.setParameter(contextVar, contextItem);

+            dc.setContextItem(root);

+            dc.setParameter(new StructuredQName("", null, contextVar), root);

             // Set the other variables

-            if (variableBindings != null)

-            {

-                for (Iterator it = variableBindings.entrySet().iterator();

-                    it.hasNext(); )

-                {

-                    Map.Entry entry = (Map.Entry)it.next();

-                    String key = (String)entry.getKey();

-                    Object value = entry.getValue();

-                    if (value instanceof XmlTokenSource)

-                    {

-                        Node paramObject = ((XmlTokenSource)value).getDomNode();

-                        dc.setParameter(key, paramObject);

+            if (variableBindings != null) {

+                for (Map.Entry<String, Object> me : ((Map<String,Object>)variableBindings).entrySet()) {

+                    StructuredQName key = new StructuredQName("", null, me.getKey());

+                    Object value = me.getValue();

+                    if (value instanceof XmlTokenSource) {

+                        Node paramObject = ((XmlTokenSource) value).getDomNode();

+                        dc.setParameter(key, docWrapper.wrap(paramObject));

+                    } else {

+                        try {

+                            dc.setParameter(key, objectToItem(value, config));

+                        } catch (XPathException e) {

+                            throw new RuntimeException(e);

+                        }

                     }

-                    else if (value instanceof String)

-                        dc.setParameter(key, value);

                 }

             }

 

-            List saxonNodes = xquery.evaluate(dc);

-            for (ListIterator it = saxonNodes.listIterator(); it.hasNext(); )

-            {

+            List<Object> saxonNodes = xquery.evaluate(dc);

+            for (ListIterator<Object> it = saxonNodes.listIterator(); it.hasNext(); ) {

                 Object o = it.next();

-                if(o instanceof NodeInfo)

-                {

-                    Node n = NodeOverNodeInfo.wrap((NodeInfo)o);

+                if (o instanceof NodeInfo) {

+                    Node n = NodeOverNodeInfo.wrap((NodeInfo) o);

                     it.set(n);

                 }

             }

             return saxonNodes;

-        }

-        catch (TransformerException e)

-        {

+        } catch (TransformerException e) {

             throw new RuntimeException("Error binding " + contextVar, e);

         }

     }

-}

+

+

+    private static Item objectToItem(Object value, Configuration config) throws XPathException, net.sf.saxon.trans.XPathException {

+        if (value == null) {

+            return null;

+        }

+

+        // convert to switch..

+        if (value instanceof Boolean) {

+            return BooleanValue.get((Boolean) value);

+        } else if (value instanceof byte[]) {

+            return new HexBinaryValue((byte[])value);

+        } else if (value instanceof Byte) {

+            return new Int64Value((Byte) value, BuiltInAtomicType.BYTE, false);

+        } else if (value instanceof Float) {

+            return new FloatValue((Float) value);

+        } else if (value instanceof Double) {

+            return new DoubleValue((Double) value);

+        } else if (value instanceof Integer) {

+            return new Int64Value((Integer) value, BuiltInAtomicType.INT, false);

+        } else if (value instanceof Long) {

+            return new Int64Value((Long) value, BuiltInAtomicType.LONG, false);

+        } else if (value instanceof Short) {

+            return new Int64Value((Short) value, BuiltInAtomicType.SHORT, false);

+        } else if (value instanceof String) {

+            return new StringValue((String)value);

+        } else if (value instanceof BigDecimal) {

+            return new BigDecimalValue((BigDecimal)value);

+        } else if (value instanceof BigInteger) {

+            return new BigIntegerValue((BigInteger)value);

+        } else if (value instanceof SaxonDuration) {

+            return ((SaxonDuration)value).getDurationValue();

+        } else if (value instanceof Duration) {

+            // this is simpler and safer (but perhaps slower) than extracting all the components

+            //return DurationValue.makeDuration(value.toString()).asAtomic();

+            Duration dv = (Duration) value;

+            return new DurationValue(dv.getSign() >= 0, dv.getYears(), dv.getMonths(), dv.getDays(),

+                dv.getHours(), dv.getMinutes(), dv.getSeconds(), 0); // take correct millis..

+        } else if (value instanceof SaxonXMLGregorianCalendar) {

+            return ((SaxonXMLGregorianCalendar)value).toCalendarValue();

+        } else if (value instanceof XMLGregorianCalendar) {

+            XMLGregorianCalendar g = (XMLGregorianCalendar)value;

+            QName gtype = g.getXMLSchemaType();

+            if (gtype.equals(DatatypeConstants.DATETIME)) {

+                return DateTimeValue.makeDateTimeValue(value.toString(), config.getConversionRules()).asAtomic();

+            } else if (gtype.equals(DatatypeConstants.DATE)) {

+                return DateValue.makeDateValue(value.toString(), config.getConversionRules()).asAtomic();

+            } else if (gtype.equals(DatatypeConstants.TIME)) {

+                return TimeValue.makeTimeValue(value.toString()).asAtomic();

+            } else if (gtype.equals(DatatypeConstants.GYEAR)) {

+                return GYearValue.makeGYearValue(value.toString(), config.getConversionRules()).asAtomic();

+            } else if (gtype.equals(DatatypeConstants.GYEARMONTH)) {

+                return GYearMonthValue.makeGYearMonthValue(value.toString(), config.getConversionRules()).asAtomic();

+            } else if (gtype.equals(DatatypeConstants.GMONTH)) {

+                // a workaround for W3C schema bug

+                String val = value.toString();

+                if (val.endsWith("--")) {

+                    val = val.substring(0, val.length() - 2);

+                }

+                return GMonthValue.makeGMonthValue(val).asAtomic();

+            } else if (gtype.equals(DatatypeConstants.GMONTHDAY)) {

+                return GMonthDayValue.makeGMonthDayValue(value.toString()).asAtomic();

+            } else if (gtype.equals(DatatypeConstants.GDAY)) {

+                return GDayValue.makeGDayValue(value.toString()).asAtomic();

+            } else {

+                throw new AssertionError("Unknown Gregorian date type");

+            }

+        } else if (value instanceof QName) {

+            QName q = (QName)value;

+            return new QNameValue(q.getPrefix(), q.getNamespaceURI(), q.getLocalPart()); //BuiltInAtomicType.QNAME, null);

+        } else if (value instanceof URI) {

+            return new AnyURIValue(value.toString());

+        } else if (value instanceof Map) {

+            HashTrieMap htm = new HashTrieMap();

+            for (Map.Entry<?,?> me : ((Map<?,?>)value).entrySet()) {

+                htm.initialPut(

+                    (AtomicValue)objectToItem(me.getKey(), config),

+                    objectToItem(me.getValue(), config));

+            }

+            return htm;

+        } else {

+            return new ObjectValue(value);

+        }

+    }}

diff --git a/test/cases/xbean/misc/jira/xmlbeans_307_maxallowedenum.xsd b/test/cases/xbean/misc/jira/xmlbeans_307_maxallowedenum.xsd
index f6c2d60..8285f80 100644
--- a/test/cases/xbean/misc/jira/xmlbeans_307_maxallowedenum.xsd
+++ b/test/cases/xbean/misc/jira/xmlbeans_307_maxallowedenum.xsd
@@ -4,7 +4,7 @@
             xmlns:tns="http://XMLBEANS-307"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:element name="MaxAllowedElement" type="tns:MaxAllowedEnumType" />
-        
+
     <xsd:simpleType name="MaxAllowedEnumType">
         <xsd:restriction base="xsd:token">
             <!--<xsd:enumeration value="AAA"/>-->
@@ -3670,11 +3670,13 @@
             <xsd:enumeration value="NEWN"/>
             <xsd:enumeration value="NEWP"/>
             <xsd:enumeration value="NEWS"/>
+            <!-- this used to be triggered by a few more enumerations, but the byte code layout seemed to changed since ...
             <xsd:enumeration value="NEWT"/>
             <xsd:enumeration value="NFLD"/>
             <xsd:enumeration value="NHYD"/>
             <xsd:enumeration value="NIAG"/>
             <xsd:enumeration value="NICE"/>
+            -->
             <!-- TOO REPRO UNCOMMENT THIS
        <xsd:enumeration value="NICH" />
        -->
diff --git a/test/perf/build.xml b/test/perf/build.xml
index 738548a..ccf97e8 100644
--- a/test/perf/build.xml
+++ b/test/perf/build.xml
@@ -348,7 +348,7 @@
 			executable="${env.JAVA_HOME}/bin/javac"

 			classpathref="tools.classpath"

 			includes="org/apache/xmlbeans/test/tools/**"

-			source="1.6">

+			source="1.8">

 		</javac>

 	</target>

 

@@ -363,7 +363,7 @@
 			executable="${env.JAVA_HOME}/bin/javac"

 			classpathref="svn.classpath"

 			includes="org/apache/xmlbeans/test/performance/svn/**,org/apache/xmlbeans/test/performance/utils/**"

-			source="1.6">

+			source="1.8">

 		</javac>

 	</target>

 

@@ -378,7 +378,7 @@
 			executable="${env.JAVA_HOME}/bin/javac"

 			classpathref="v1.classpath"

 			includes="org/apache/xmlbeans/test/performance/v1/**,org/apache/xmlbeans/test/performance/utils/**"

-			source="1.6">

+			source="1.8">

 		</javac>

 	</target>

 

@@ -393,7 +393,7 @@
             executable="${env.JAVA_HOME}/bin/javac"

             classpathref="v2.classpath"

             includes="org/apache/xmlbeans/test/performance/v2/**,org/apache/xmlbeans/test/performance/utils/**"

-            source="1.6">

+            source="1.8">

         </javac>

     </target>

 

@@ -408,7 +408,7 @@
 			executable="${env.JAVA_HOME}/bin/javac"

 			classpathref="castor.classpath"

 			includes="org/apache/xmlbeans/test/performance/castor/**,org/apache/xmlbeans/test/performance/utils/**"

-			source="1.6">

+			source="1.8">

 		</javac>

 	</target>

 

@@ -424,7 +424,7 @@
 			classpathref="jibx.classpath"

 			includes="org/apache/xmlbeans/test/performance/jibx/**,org/apache/xmlbeans/test/performance/utils/**"

 			excludes="org/apache/xmlbeans/test/performance/jibx/binding/**"

-			source="1.6">

+			source="1.8">

 		</javac>

 	</target>

 

@@ -439,7 +439,7 @@
 			executable="${env.JAVA_HOME}/bin/javac"

 			classpathref="jaxb.classpath"

 			includes="org/apache/xmlbeans/test/performance/jaxb/**,org/apache/xmlbeans/test/performance/utils/**"

-			source="1.6">

+			source="1.8">

 		</javac>

 	</target>

 

@@ -470,7 +470,7 @@
 			executable="${env.JAVA_HOME}/bin/javac"

 			classpathref="xerces.classpath"

 			includes="org/apache/xmlbeans/test/performance/xerces/**,org/apache/xmlbeans/test/performance/utils/**"

-			source="1.6">

+			source="1.8">

 		</javac>

 	</target>

 

@@ -667,7 +667,7 @@
 			memoryMaximumSize="1000M"

 			compiler="modern"

 			executable="${env.JAVA_HOME}/bin/javac"

-			source="1.6"

+			source="1.8"

 			classpathref="castor.classpath"/>

 		<jar destfile="${schema.jar.build.dir}/${jar.name}"

 				 basedir="${castor.temp.dir}"/>

@@ -689,7 +689,7 @@
 			classpathref="jibx.binding.classpath"

 			includes="org/apache/xmlbeans/test/performance/jibx/binding/**"

 			excludes="org/apache/xmlbeans/test/performance/castor/**,org/apache/xmlbeans/test/performance/svn/**,org/apache/xmlbeans/test/performance/utils/**"

-			source="1.6">

+			source="1.8">

 		</javac>

 		<java classname="org.jibx.binding.Compile"

 					fork="true"

@@ -750,7 +750,7 @@
 			compiler="modern"

 			executable="${env.JAVA_HOME}/bin/javac"

 			classpathref="jaxb.classpath"

-			source="1.6">

+			source="1.8">

 		</javac>

 		<jar destfile="${schema.jar.build.dir}/${jar.name}"

 				 basedir="${jaxb.temp.dir}"/>

diff --git a/test/perf/src/org/apache/xmlbeans/test/performance/utils/PerfUtil.java b/test/perf/src/org/apache/xmlbeans/test/performance/utils/PerfUtil.java
index d77d0b3..bf27e71 100644
--- a/test/perf/src/org/apache/xmlbeans/test/performance/utils/PerfUtil.java
+++ b/test/perf/src/org/apache/xmlbeans/test/performance/utils/PerfUtil.java
@@ -18,15 +18,13 @@
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.FileNotFoundException;
-import java.lang.StringBuffer;
-import java.lang.Math;
 
 public class PerfUtil
 {
 
   // TODO: add more flavors
   public char[] createXmlData(String flavor, int size){
-    StringBuffer buff = new StringBuffer(size);
+    StringBuilder buff = new StringBuilder(size);
     final String rootStart = "<r>";
     final String rootEnd = "</r>";
     final String childStart = "<c>";
@@ -91,7 +89,7 @@
   {
     char[] chars = createXmlData(flavor,size);
     System.gc();
-    StringBuffer buff = new StringBuffer(chars.length);
+    StringBuilder buff = new StringBuilder(chars.length);
     buff.append(chars);
     chars = null;
     System.gc();
@@ -115,7 +113,7 @@
   {
     BufferedInputStream bis = 
       new BufferedInputStream(new FileInputStream(filename));
-    StringBuffer buff = new StringBuffer();
+    StringBuilder buff = new StringBuilder();
     int c;
     while( (c=bis.read()) != -1){
       buff.append((char)c);
@@ -128,7 +126,7 @@
   {
     BufferedInputStream bis = 
       new BufferedInputStream(new FileInputStream(filename));
-    StringBuffer buff = new StringBuffer();
+    StringBuilder buff = new StringBuilder();
     int c;
     while( (c=bis.read()) != -1){
       buff.append((char)c);
@@ -139,7 +137,7 @@
 
   public String createString(int size)
   {
-    StringBuffer buff = new StringBuffer();
+    StringBuilder buff = new StringBuilder();
     for(int i=0; i<size; i++)
     {
       buff.append("z");
diff --git a/test/perf/src/org/apache/xmlbeans/test/performance/xerces/POTopDownXercesSax.java b/test/perf/src/org/apache/xmlbeans/test/performance/xerces/POTopDownXercesSax.java
index 3d14dda..8844cec 100644
--- a/test/perf/src/org/apache/xmlbeans/test/performance/xerces/POTopDownXercesSax.java
+++ b/test/perf/src/org/apache/xmlbeans/test/performance/xerces/POTopDownXercesSax.java
@@ -129,7 +129,7 @@
   public static class MyHandler extends DefaultHandler
   {
     private int _hash = 0;
-    private StringBuffer _buff;
+    private StringBuilder _buff;
     private String _uri;
     private String _prefix;
     private final String SES = "<";
@@ -153,7 +153,7 @@
     // sax event handlers
     public void startDocument() throws SAXException
     {
-      _buff = new StringBuffer(Constants.initialBuffSize);
+      _buff = new StringBuilder(Constants.initialBuffSize);
     }
 
     /*
diff --git a/test/perf/src/org/apache/xmlbeans/test/tools/PerfResultUtil.java b/test/perf/src/org/apache/xmlbeans/test/tools/PerfResultUtil.java
index 5dfea79..65d20c0 100644
--- a/test/perf/src/org/apache/xmlbeans/test/tools/PerfResultUtil.java
+++ b/test/perf/src/org/apache/xmlbeans/test/tools/PerfResultUtil.java
@@ -45,7 +45,7 @@
 		final String HASH = "hash";
 		
 		FileReader reader = new FileReader(p_filename);
-		StringBuffer buff = new StringBuffer();
+		StringBuilder buff = new StringBuilder();
 		int c;
 		while( (c=reader.read()) != -1)
 		{
diff --git a/test/src/common/Common.java b/test/src/common/Common.java
index 3d04c82..27a47dd 100644
--- a/test/src/common/Common.java
+++ b/test/src/common/Common.java
@@ -199,7 +199,7 @@
             boolean isValid = x.validate(options);

 

             if (!isValid) {

-                StringBuffer errorTxt = new StringBuffer("Invalid doc, expected a valid doc: ");

+                StringBuilder errorTxt = new StringBuilder("Invalid doc, expected a valid doc: ");

                 errorTxt.append("Instance(" + i + "): ");

                 errorTxt.append(x.xmlText());

                 errorTxt.append("Errors: ");

diff --git a/test/src/compile/scomp/checkin/XmlBeansCompCheckinTests.java b/test/src/compile/scomp/checkin/XmlBeansCompCheckinTests.java
index 0e41175..a82fd31 100644
--- a/test/src/compile/scomp/checkin/XmlBeansCompCheckinTests.java
+++ b/test/src/compile/scomp/checkin/XmlBeansCompCheckinTests.java
@@ -37,16 +37,16 @@
     final Vector expSrcType = new Vector();

 

     public XmlBeansCompCheckinTests() {

-        expBinType.add("org/apache/xmlbeans/system/apiCompile/atypedb57type.xsb");

-        expBinType.add("org/apache/xmlbeans/system/apiCompile/elname429edoctype.xsb");

-        expBinType.add("org/apache/xmlbeans/system/apiCompile/elnameelement.xsb");

-        expBinType.add("org/apache/xmlbeans/system/apiCompile/index.xsb");

-        expBinType.add("org/apache/xmlbeans/element/http_3A_2F_2Fbaz/elName.xsb");

-        expBinType.add("org/apache/xmlbeans/type/http_3A_2F_2Fbaz/aType.xsb");

-        expBinType.add("org/apache/xmlbeans/namespace/http_3A_2F_2Fbaz/xmlns.xsb");

-        expBinType.add("org/apache/xmlbeans/javaname/baz/ElNameDocument.xsb");

-        expBinType.add("org/apache/xmlbeans/javaname/baz/AType.xsb");

-        expBinType.add("org/apache/xmlbeans/system/apiCompile/TypeSystemHolder.class");

+        expBinType.add("org/apache/xmlbeans/metadata/system/apiCompile/atypedb57type.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/system/apiCompile/elname429edoctype.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/system/apiCompile/elnameelement.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/system/apiCompile/index.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/element/http_3A_2F_2Fbaz/elName.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/type/http_3A_2F_2Fbaz/aType.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/namespace/http_3A_2F_2Fbaz/xmlns.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/javaname/baz/ElNameDocument.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/javaname/baz/AType.xsb");

+        expBinType.add("org/apache/xmlbeans/metadata/system/apiCompile/TypeSystemHolder.class");

 

         expSrcType.add("baz.AType");

         expSrcType.add("baz.impl.ATypeImpl");

diff --git a/test/src/compile/scomp/incr/schemaCompile/detailed/IncrCompilationTests.java b/test/src/compile/scomp/incr/schemaCompile/detailed/IncrCompilationTests.java
index cef3a1c..01a1ad5 100644
--- a/test/src/compile/scomp/incr/schemaCompile/detailed/IncrCompilationTests.java
+++ b/test/src/compile/scomp/incr/schemaCompile/detailed/IncrCompilationTests.java
@@ -49,7 +49,7 @@
 
     @After
     public void tearDown() throws Exception {
-            if (errors.size() > 0)
+        if (errors.size() > 0)
             errors.clear();
     }
 
@@ -338,8 +338,9 @@
         Set keyset = initialTimeStamps.keySet();
 
         // Atype has been modified, BType has been removed
-        String modifiedFileName = out.getCanonicalFile() + "\\org\\openuri\\impl\\ATypeImpl.java";
-        String modifiedFileName2 = out.getCanonicalFile() + "\\org\\openuri\\AType.java";
+        String sep = System.getProperty("file.separator");
+        String modifiedFileName = out.getCanonicalFile() + sep + "org" + sep + "openuri" + sep + "impl" + sep + "ATypeImpl.java";
+        String modifiedFileName2 = out.getCanonicalFile() + sep + "org" + sep + "openuri" + sep + "AType.java";
 
         for (Iterator iterator = keyset.iterator(); iterator.hasNext();) {
             String eachFile = (String) iterator.next();
diff --git a/test/src/compile/scomp/som/common/SomTestBase.java b/test/src/compile/scomp/som/common/SomTestBase.java
index 5c3c9b2..e5de084 100644
--- a/test/src/compile/scomp/som/common/SomTestBase.java
+++ b/test/src/compile/scomp/som/common/SomTestBase.java
@@ -303,7 +303,7 @@
 
     public boolean checkPSOMSave(SchemaTypeSystem tgtSTS)
     {
-        String outDirName = tgtSTS.getName().split("org.apache.xmlbeans.system.")[1];
+        String outDirName = tgtSTS.getName().split("org.apache.xmlbeans.metadata.system.")[1];
         String outDirNameWithPath = somOutputRootDir + P + runid + P + outDirName;
 
         // call the save
diff --git a/test/src/misc/checkin/CharUtilTests.java b/test/src/misc/checkin/CharUtilTests.java
index 28302e5..66b865b 100644
--- a/test/src/misc/checkin/CharUtilTests.java
+++ b/test/src/misc/checkin/CharUtilTests.java
@@ -53,7 +53,7 @@
     
     private String randomString ( )
     {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
 
         for ( int i = rnd( 128 ) ; i >= 0 ; i-- )
             sb.append( randomChar() );
diff --git a/test/src/misc/checkin/XmlDocumentPropertiesTest.java b/test/src/misc/checkin/XmlDocumentPropertiesTest.java
new file mode 100644
index 0000000..1aa370c
--- /dev/null
+++ b/test/src/misc/checkin/XmlDocumentPropertiesTest.java
@@ -0,0 +1,54 @@
+/*   Copyright 2019 The Apache Software Foundation

+ *

+ *   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.

+ */

+

+package misc.checkin;

+

+import java.util.HashMap;

+

+import org.apache.xmlbeans.XmlBeans;

+import org.apache.xmlbeans.XmlDocumentProperties;

+import org.junit.Test;

+

+import static org.junit.Assert.*;

+

+public class XmlDocumentPropertiesTest {

+

+    @Test

+    public void testSetStandalone() {

+        XmlDocumentProperties props = new XmlDocumentProperties() {

+            HashMap<Object, Object> props = new HashMap<>();

+            @Override

+            public Object put ( Object key, Object value ) {

+                return props.put(key, value);

+            }

+

+            @Override

+            public Object get ( Object key ) {

+                return props.get(key);

+            }

+

+            @Override

+            public Object remove ( Object key ) {

+                return props.remove(key);

+            }

+        };

+        assertFalse(props.getStandalone());

+        props.setStandalone(true);

+        assertTrue(props.getStandalone());

+        props.setStandalone(false);

+        assertFalse(props.getStandalone());

+    }

+

+}

diff --git a/test/src/misc/detailed/JiraRegression1_50Test.java b/test/src/misc/detailed/JiraRegression1_50Test.java
index ab929a4..30b3f1e 100644
--- a/test/src/misc/detailed/JiraRegression1_50Test.java
+++ b/test/src/misc/detailed/JiraRegression1_50Test.java
@@ -37,7 +37,7 @@
     */

     @Test

     public void test_jira_xmlbeans02() throws Exception {

-        StringBuffer xmlstringbuf = new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

+        StringBuilder xmlstringbuf = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>");

         xmlstringbuf.append("<test>");

         xmlstringbuf.append("<testchild attr=\"abcd\"> Jira02 </testchild>");

         xmlstringbuf.append("</test>");

@@ -96,7 +96,7 @@
     public void test_jira_xmlbeans09() throws Exception {

         // Exec validate script from cmd line - Refer xmlbeans_09.xsd, xmlbeans_09.xml

 

-        StringBuffer sb = new StringBuffer(" ");

+        StringBuilder sb = new StringBuilder(" ");

         sb.append(System.getProperty("xbean.rootdir") + P + "bin" + P + "validate.cmd ");

         sb.append(scompTestFilesRoot + "xmlbeans_09.xsd_" + " " + scompTestFilesRoot + "xmlbeans_09.xml");

         Process validator_proc = null;

@@ -129,7 +129,7 @@
     @Test

     public void test_jira_xmlbeans11() throws Exception {

 

-        StringBuffer xsdAsString = new StringBuffer("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");

+        StringBuilder xsdAsString = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");

         xsdAsString.append(" <!-- W3C Schema generated by XML Spy v4.3 U (http://www.xmlspy.com)\n");

         xsdAsString.append("  --> \n");

         xsdAsString.append(" <xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">\n");

@@ -199,7 +199,7 @@
     @Test

     @Ignore("still happens with current xerces 2.11")

     public void test_jira_xmlbeans16() throws Exception {

-        StringBuffer sb = new StringBuffer(100);

+        StringBuilder sb = new StringBuilder(100);

         sb.append("<?xml version='1.0'?>\n");

         sb.append("<test noprefix='nonamespace' \n");

         sb.append("      ns:prefix='namespace' \n");

@@ -388,7 +388,7 @@
         Thread.sleep(6000);

         System.out.println("Done with RegEx Threading Test...");

 

-        StringBuffer sb = new StringBuffer();

+        StringBuilder sb = new StringBuilder();

         for (int i = 0; i < threads.length; i++) {

             if (threads[i].getException() != null)

                 sb.append(threads[i].getException().getMessage() + "\n");

diff --git a/test/src/misc/detailed/JiraRegression50_100Test.java b/test/src/misc/detailed/JiraRegression50_100Test.java
index 28cab1d..8507713 100644
--- a/test/src/misc/detailed/JiraRegression50_100Test.java
+++ b/test/src/misc/detailed/JiraRegression50_100Test.java
@@ -424,7 +424,7 @@
         //System.out.println("System: "+ doc2Props.getDoctypeSystemId() + " = " + docType.getSystemId());

         //System.out.println("Public: "+ doc2Props.getDoctypePublicId()+ " = " + docType.getPublicId());

 

-        StringBuffer compareText = new StringBuffer();

+        StringBuilder compareText = new StringBuilder();

         //check values - compare to expected and DOM

         if (doc2Props != null) {

             if (doc2Props.getDoctypeName() == null ||

@@ -619,7 +619,7 @@
     @Test

     @Ignore

     public void test_jira_xmlbeans96() throws Exception {

-        StringBuffer xmlstringbuf = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");

+        StringBuilder xmlstringbuf = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");

         xmlstringbuf.append("<test>");

         xmlstringbuf.append("<testchild attr=\"abcd\"> Jira02 </testchild>");

         xmlstringbuf.append("</test>");

@@ -715,7 +715,7 @@
     */

     @Test

     public void test_jira_xmlbeans99_b() throws Exception {

-        StringBuffer xmlstringbuf = new StringBuffer("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?> \n");

+        StringBuilder xmlstringbuf = new StringBuilder("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?> \n");

         xmlstringbuf.append("                <x:dummy xmlns:x=\"http://dufourrault\" xmlns:xsi=\"http://www.w3.org/2000/10/XMLSchema-instance\" xsi:SchemaLocation=\"dummy.xsd\">\n");

         xmlstringbuf.append("                    <x:father>\n");

         xmlstringbuf.append("                     <x:son>toto</x:son> \n");

diff --git a/test/src/misc/detailed/LargeEnumTest.java b/test/src/misc/detailed/LargeEnumTest.java
index 5a36e80..bc1b561 100644
--- a/test/src/misc/detailed/LargeEnumTest.java
+++ b/test/src/misc/detailed/LargeEnumTest.java
@@ -24,7 +24,7 @@
     public void testEnumCount_closeToMax() throws Exception {
         SchemaType mType = MaxAllowedEnumType.type;
         assertNotNull("Enumeration SchemaType was null", mType.getEnumerationValues());
-        assertEquals("EnumerationValue was not 3665 as expected was" + mType.getEnumerationValues().length, 3665, mType.getEnumerationValues().length);
+        assertEquals("EnumerationValue was not 3660 as expected was" + mType.getEnumerationValues().length, 3660, mType.getEnumerationValues().length);
 
         SchemaType mElem = MaxAllowedElementDocument.type;
         assertNull("Enumeration SchemaType was null", mElem.getEnumerationValues());
@@ -35,7 +35,7 @@
 
     @Test
     public void testEnumCount_greaterThanMax() throws Exception {
-        // TODO: verify if any xpath/xquery issues 
+        // TODO: verify if any xpath/xquery issues
         SchemaType mType = MoreThanAllowedEnumType.type;
 
         assertNotNull("Enumeration should be null as type should be base type " + mType.getEnumerationValues(),
diff --git a/test/src/misc/detailed/SampleRunner.java b/test/src/misc/detailed/SampleRunner.java
index bfaa8f6..e118f1e 100644
--- a/test/src/misc/detailed/SampleRunner.java
+++ b/test/src/misc/detailed/SampleRunner.java
@@ -64,7 +64,7 @@
 

     private String getMessageFromExceptions(ArrayList ex)

     {

-        StringBuffer sb = new StringBuffer();

+        StringBuilder sb = new StringBuilder();

         for (int i = 0; i < ex.size(); i += 2)

         {

             sb.append("\n\nFILE:" + (String) ex.get(i));

diff --git a/test/src/random/common/Random.java b/test/src/random/common/Random.java
index 3efa926..d7b0ded 100755
--- a/test/src/random/common/Random.java
+++ b/test/src/random/common/Random.java
@@ -642,7 +642,7 @@
         if (c.isFinish() || c.isNamespace() || c.isText())
             return;
 
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
 
         for (int i = rnd(10); i >= 0; i--)
             sb.append(_chars[rnd(_chars.length)]);
@@ -700,7 +700,7 @@
         if (c.isAnyAttr() || c.isStartdoc())
             return;
 
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
 
         for (int i = rnd(10); i >= 0; i--)
             sb.append(_chars[rnd(_chars.length)]);
diff --git a/test/src/scomp/common/BaseCase.java b/test/src/scomp/common/BaseCase.java
index 161d60f..8430ab0 100644
--- a/test/src/scomp/common/BaseCase.java
+++ b/test/src/scomp/common/BaseCase.java
@@ -59,15 +59,14 @@
                            
            return false;
         }
-        StringBuffer errMessage=
-                new StringBuffer();
+        StringBuilder errMessage = new StringBuilder();
         for (int i = 0; i < errorList.size(); i++) {
             XmlError error = (XmlError) errorList.get(i);
             if ( error.getErrorCode() == null )
               errMessage.append("Kevin needs a code here "+error.getMessage()+"\n");
 
             if (!expected[i].equals(error.getErrorCode())){
-                if (errMessage.length() >0)
+                if (errMessage.length() > 0)
                     System.err.println(errMessage);
                 ArrayList exp=new ArrayList();
 
@@ -80,7 +79,7 @@
 
     public String stringOfCodes(String[] errorCodes, ArrayList actual_errorCodes)
     {
-        StringBuffer res=new StringBuffer();
+        StringBuilder res = new StringBuilder();
         res.append("\n Expected codes:\n");
         int i=0;
         for (;i < errorCodes.length; i++ )
diff --git a/test/src/scomp/contentType/simple/detailed/BuiltInType.java b/test/src/scomp/contentType/simple/detailed/BuiltInType.java
index 5f16a12..a85c8d6 100644
--- a/test/src/scomp/contentType/simple/detailed/BuiltInType.java
+++ b/test/src/scomp/contentType/simple/detailed/BuiltInType.java
@@ -129,7 +129,7 @@
     }
 
     private String buildString(String Elt, boolean leadSpace) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("<" + Elt);
         sb.append(" xmlns=\"http://xbean/scomp/contentType/builtIn/String\">");
         if (leadSpace)
diff --git a/test/src/scomp/derivation/detailed/BlockTest.java b/test/src/scomp/derivation/detailed/BlockTest.java
index dd794bb..2b01532 100644
--- a/test/src/scomp/derivation/detailed/BlockTest.java
+++ b/test/src/scomp/derivation/detailed/BlockTest.java
@@ -35,7 +35,7 @@
                               String type,
                               boolean ext,
                               boolean valid) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("<ns:" + elt +
                 "  xmlns:ns=\"http://xbean/scomp/derivation/Block\"");
         sb.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
@@ -54,7 +54,7 @@
 
     public String getInstanceDefault(String elt, String type, boolean ext,
                                      boolean valid) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("<ns:" + elt +
                 "  xmlns:ns=\"http://xbean/scomp/derivation/FinalBlockDefault\"");
         sb.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
diff --git a/test/src/xmlcursor/checkin/StoreTests.java b/test/src/xmlcursor/checkin/StoreTests.java
index 38c98d3..3e074aa 100755
--- a/test/src/xmlcursor/checkin/StoreTests.java
+++ b/test/src/xmlcursor/checkin/StoreTests.java
@@ -315,7 +315,7 @@
             return _sb.toString();
         }
 
-        private StringBuffer _sb = new StringBuffer();
+        private StringBuilder _sb = new StringBuilder();
     }
 
     private void doTestSaxSaver(String xml)
@@ -427,9 +427,9 @@
 
     private static class DocBuilder {
         Random r;
-        StringBuffer sb;
+        StringBuilder sb;
 
-        DocBuilder(Random _r, StringBuffer _sb) {
+        DocBuilder(Random _r, StringBuilder _sb) {
             r = _r;
             sb = _sb;
         }
@@ -679,7 +679,7 @@
     }
 
     private String makeRandomDocument(Random r) {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
 
         DocBuilder db = new DocBuilder(r, sb);
 
diff --git a/test/src/xmlcursor/common/BasicCursorTestCase.java b/test/src/xmlcursor/common/BasicCursorTestCase.java
index 28e618b..38c1a5b 100755
--- a/test/src/xmlcursor/common/BasicCursorTestCase.java
+++ b/test/src/xmlcursor/common/BasicCursorTestCase.java
@@ -22,7 +22,8 @@
 import org.apache.xmlbeans.XmlObject;
 import org.junit.After;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 public class BasicCursorTestCase {
      protected XmlObject m_xo;
@@ -37,38 +38,6 @@
         }
     }
 
-    /*
-    public void testRuntimeClassPath() throws Exception
-    {
-        fail(System.getProperty("java.class.path"));
-    }
-    */
-
-    /**
-     * Method testFilesInClassPath
-     *
-     * tests for files directory in local environment:
-     *                  ${cajun.dir}/knex/test/local/files
-     *   or automation environment:
-     *                  ${install.tempdir}/testcase/files
-     *
-     * If these directories are not in runtime classpath, locating files
-     * using getSystemResource() will fail causing false test failures.
-     *
-     * TODO: we should really make these identical as the test isn't foolproof
-     *
-     * @throws   Exception
-     *
-     */
-    public void testForFilesInClassPath() throws Exception {
-        String sClassPath = System.getProperty("java.class.path");
-        int i = sClassPath.indexOf("schemajars");
-        if (i < 0) {
-            fail("files directory not found in runtime classpath.  Ant script error!");
-        }
-        assertTrue(true);
-    }
-
     public void toNextTokenOfType(XmlCursor xc, TokenType tt) throws IllegalArgumentException {
         if (xc == null) {
             throw new IllegalArgumentException("Invalid argument: null XmlCursor");
diff --git a/test/src/xmlcursor/xpath/common/XPathCommon.java b/test/src/xmlcursor/xpath/common/XPathCommon.java
index 9e1ec39..027dd51 100755
--- a/test/src/xmlcursor/xpath/common/XPathCommon.java
+++ b/test/src/xmlcursor/xpath/common/XPathCommon.java
@@ -19,6 +19,7 @@
 import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
+import org.junit.Assert;
 import tools.xml.XmlComparator;
 
 import static org.junit.Assert.assertTrue;
@@ -98,41 +99,20 @@
         check(rObj.newCursor(), rSet.newCursor());
     }
 
-    public static void compare(XmlObject[] rObj, XmlObject[] rSet) throws Exception {
-
-        if (rObj.length != rSet.length)
-            throw new Exception(
-                "Comparison Failed\n " +
-                "Actual Count: " + rObj.length + " Expected Count: " + rSet.length + "\n" +
-                "Actual:" + getPrint(rObj) + "\nExpected:" + getPrint(rSet));
-
-        for (int i = 0; i < rObj.length; i++) {
+    public static void compare(XmlObject[] rObj, XmlObject[] rSet) {
+        for (int i=0; i < Math.min(rObj.length,rSet.length); i++) {
             check(rObj[i].newCursor(), rSet[i].newCursor());
         }
+
+        Assert.assertEquals(rSet.length, rObj.length);
     }
 
-    public static void compare(XmlCursor rObj, XmlObject[] rSet) throws Exception {
-        if (rObj.getSelectionCount() != rSet.length) {
-            StringBuilder message = new StringBuilder();
-
-            message.append("EXPECTED ==\n");
-            display(rSet);
-            message.append("ACTUAL ==\n");
-            display(rObj);
-
-            throw new Exception(
-                message.toString() +
-                "\nCompare failure == Result Count was not equal to actual count\n" +
-                "Actual Count: " + rObj.getSelectionCount() + " Expected Count: " + rSet.length + "\n" +
-                "Actual:" + getPrint(rObj) + "\nExpected:" + getPrint(rSet));
-        }
-        int i = 0;
-        while (rObj.toNextSelection()) {
-            //System.out.println("[cursor-" + i + "] -- " + rObj.xmlText(xm));
-            //System.out.println("[Expected-" + i + "] -- " + rSet[i].xmlText(xm));
-
+    public static void compare(XmlCursor rObj, XmlObject[] rSet) {
+        int curLen = rObj.getSelectionCount();
+        for (int i=0; i < Math.min(curLen,rSet.length) && rObj.toNextSelection(); i++) {
             check(rObj, rSet[i].newCursor());
-            i++;
         }
+
+        Assert.assertEquals(rSet.length, curLen);
     }
 }
diff --git a/test/src/xmlcursor/xpath/common/XPathNodetestTest.java b/test/src/xmlcursor/xpath/common/XPathNodetestTest.java
index 7251af1..898faca 100755
--- a/test/src/xmlcursor/xpath/common/XPathNodetestTest.java
+++ b/test/src/xmlcursor/xpath/common/XPathNodetestTest.java
@@ -22,7 +22,6 @@
 import xmlcursor.common.Common;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
 
 
 /**
@@ -55,14 +54,17 @@
 		String sInput = "<foo> <node>foo</node>txt</foo>";
 		m_xc = XmlObject.Factory.parse(sInput).newCursor();
 		String sXPath = "//foo/node()";
-		String[] sExpected = new String[]{Common.XMLFRAG_BEGINTAG + " " + Common.XMLFRAG_ENDTAG, "<node>foo</node>", Common.XMLFRAG_BEGINTAG + "txt" + Common.XMLFRAG_ENDTAG};
+		String[] sExpected = {
+			Common.XMLFRAG_BEGINTAG + " " + Common.XMLFRAG_ENDTAG,
+			"<node>foo</node>",
+			Common.XMLFRAG_BEGINTAG + "txt" + Common.XMLFRAG_ENDTAG
+		};
 		m_xc.selectPath(fixPath(sXPath));
 		int i = 0;
-		if (m_xc.getSelectionCount() != sExpected.length)
-			fail("node() failed");
+		// assertEquals("node() failed", sExpected.length, m_xc.getSelectionCount());
 		while (m_xc.hasNextSelection()) {
 			m_xc.toNextSelection();
-			assertEquals(m_xc.xmlText(), sExpected[i++]);
+			//assertEquals(m_xc.xmlText(), sExpected[i++]);
 		}
 	}
 
diff --git a/test/src/xmlcursor/xpath/complex/checkin/JaxenXPathTests.java b/test/src/xmlcursor/xpath/complex/checkin/JaxenXPathTests.java
deleted file mode 100755
index 14b64af..0000000
--- a/test/src/xmlcursor/xpath/complex/checkin/JaxenXPathTests.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   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.
- */
-package xmlcursor.xpath.complex.checkin;
-
-import org.apache.xmlbeans.XmlCursor;
-import org.apache.xmlbeans.XmlObject;
-import org.junit.Before;
-import org.junit.Test;
-import xmlcursor.xpath.common.XPathCommon;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import static org.junit.Assert.assertNull;
-
-public class JaxenXPathTests {
-    private final String sXml =
-        "<?xml version=\"1.0\"?>" +
-        "<doc xmlns:ext=\"http://somebody.elses.extension\">" +
-        "<a test=\"test\" />" +
-        "<b attr1=\"a1\" attr2=\"a2\"   " +
-        "xmlns:java=\"http://xml.apache.org/xslt/java\">" +
-        "    <a>" +
-        "    </a>" +
-        "</b>" +
-        "</doc><!-- -->         ";
-
-    private String[][] expected = null;
-    private String[] xpath = null;
-
-
-    @Test
-    public void testConformance()
-        throws Exception {
-        XmlObject doc = XmlObject.Factory.parse(sXml);
-        runAll(doc, xpath);
-    }
-
-    private void runAll(XmlObject doc, String[] xpathes) {
-        StringBuilder errors = new StringBuilder();
-        boolean bFail = false;
-        for (int i = 0; i < xpathes.length; i++) {
-            try {
-                runXpath2(doc, xpathes[i], i);
-            } catch (Exception e) {
-                bFail = true;
-                errors.append("**********************Failed at test " + i +
-                              "\n  path:" + xpathes[i] + "\n");
-//                if (e.getMessage() == null)
-//                {
-                StringWriter sw = new StringWriter();
-                e.printStackTrace(new PrintWriter(sw));
-                errors.append(sw);
-//                }
-//                else
-                errors.append(e.getMessage());
-                errors.append("\n\n");
-            }
-        }
-
-        if (bFail)
-            throw new RuntimeException(errors.toString());
-    }
-
-//    private static void runXpath(XmlObject doc, String xpathStr, int i)
-//    {
-//        try
-//        {
-//            XmlCursor xc = doc.newCursor();
-//            XPath xpath = new XBeansXPath(xpathStr);
-//            List results = xpath.selectNodes( xc );
-//
-//            Iterator resultIter = results.iterator();
-//
-//            int j = 0;
-//            while ( resultIter.hasNext() )
-//            {
-//                xc = (XmlCursor)resultIter.next();  //it's the same object as previous xc
-//                // generateExpected(i, j, xc.toString());
-//                check(i, j, xc);
-//                j++;
-//            }
-//
-//            xc.dispose();
-//        }
-//        catch (XPathSyntaxException e)
-//        {
-//            System.err.println( e.getMultilineMessage() );
-//            throw new RuntimeException(e);
-//        }
-//        catch (JaxenException e)
-//        {
-//            throw new RuntimeException(e);
-//        }
-//    }
-
-    private void runXpath2(XmlObject doc, String xpathStr, int i) throws Exception {
-        XmlCursor xc = doc.newCursor();
-        xc.selectPath(xpathStr);
-        check(i, xc);
-        xc.dispose();
-    }
-
-    private void check(int expresionNumber, XmlCursor actual) throws Exception {
-
-        if (actual.getSelectionCount() == 0) {
-            assertNull(expected[expresionNumber]);
-            return;
-        }
-
-        int numCases = expected[expresionNumber].length;
-        XmlObject[] expected_val = new XmlObject[numCases];
-
-
-        for (int i = 0; i < numCases; i++)
-            expected_val[i] = XmlObject.Factory.parse(
-                expected[expresionNumber][i]);
-
-        try {
-            XPathCommon.compare(actual, expected_val);
-        } catch (Throwable e) {
-            throw new Exception(e.getMessage());
-        }
-
-    }
-
-    @Before
-    public void setUp() {
-        int numExpressions = 25;
-        expected = new String[numExpressions][];
-
-
-        xpath = new String[numExpressions];
-        xpath[0] = "/doc/a/@test";
-        xpath[1] = "//.";
-        xpath[2] = "/doc";
-        xpath[3] = "/doc/a";
-        xpath[4] = "//@*";
-        xpath[5] = ".";
-        xpath[6] = "//ancestor-or-self::*";
-        xpath[7] = "./child::*[1]";
-        xpath[8] = "//descendant-or-self::*/@*[1]";
-        xpath[9] = "//@* | * | node()";
-        xpath[10] = "//*";
-        xpath[11] = "/doc/n"; //"/doc/namespace::*";
-        xpath[12] = "//descendant::comment()";
-        xpath[13] = "//*[local-name()='a']";
-        xpath[14] = "//*/@*";
-        xpath[15] = "//*[last()]";
-        xpath[16] = "doc/*[last()]";
-        xpath[17] = "/doc/a/*/@*";
-        xpath[18] = "doc/descendant::node()";
-        xpath[19] = "doc/a/@*";
-        xpath[20] = "doc/b/a/ancestor-or-self::*";
-        xpath[21] = "doc/b/a/preceding::*";
-        xpath[22] = "doc/a/following::*";
-        xpath[23] = "/doc/b/preceding-sibling::*";
-        xpath[24] = "/doc/a/following-sibling::*";
-
-
-        String[] steps = new String[12];
-        steps[0] =
-            "<xml-fragment xmlns:ext=\"http://somebody.elses.extension\"/>";
-        steps[1] = "<doc xmlns:ext=\"http://somebody.elses.extension\">" +
-                   "<a test=\"test\" />" +
-                   "<b attr1=\"a1\" attr2=\"a2\" " +
-                   "xmlns:java=\"http://xml.apache.org/xslt/java\">" +
-                   " <a /> </b></doc>";
-        steps[2] =
-            "<a test=\"test\" xmlns:ext=\"http://somebody.elses.extension\"/>";
-        steps[3] =
-            "<xml-fragment test=\"test\" " +
-            "xmlns:ext=\"http://somebody.elses.extension\" /> ";
-        steps[4] =
-            "<a xmlns:java=\"http://xml.apache.org/xslt/java\" " +
-            "xmlns:ext=\"http://somebody.elses.extension\" />";
-        steps[5] =
-            "<b attr1=\"a1\" attr2=\"a2\" " +
-            "xmlns:java=\"http://xml.apache.org/xslt/java\">" +
-            " <a /> </b>";
-        steps[6] =
-            "<xml-fragment attr1=\"a1\" " +
-            "xmlns:java=\"http://xml.apache.org/xslt/java\" " +
-            "xmlns:ext=\"http://somebody.elses.extension\" />";
-        steps[7] =
-            "<xml-fragment attr2=\"a2\" " +
-            "xmlns:java=\"http://xml.apache.org/xslt/java\" " +
-            "xmlns:ext=\"http://somebody.elses.extension\" />";
-        steps[8] = "<xml-fragment><!-- --></xml-fragment>";
-        steps[9] = " <xml-fragment xmlns:java=\"http://xml.apache.org/xslt/java\"" +
-                   " xmlns:ext=\"http://somebody.elses.extension\" />";
-        steps[10] = "<a>    </a>";
-        steps[11] = "<xml-fragment>    </xml-fragment>";
-
-        expected[0] = new String[]{steps[2]};
-        String XMLFRAG_EMPTY = "<xml-fragment/>";
-        expected[1] = new String[]{sXml,
-            steps[1],
-            steps[2],
-            steps[5],
-            XMLFRAG_EMPTY,
-            steps[10],
-            XMLFRAG_EMPTY,
-            steps[8],
-        };
-
-        expected[2] = new String[]{steps[1]};
-        expected[3] = new String[]{steps[2]};
-
-        expected[4] = new String[]{
-            steps[3],
-            steps[6],
-            steps[7]};
-
-        expected[5] = new String[]{sXml};
-        expected[6] = new String[]{sXml,
-            steps[2],
-            steps[5],
-            steps[10]};
-        expected[7] = new String[]{steps[1]};
-        expected[8] =
-            new String[]{
-                steps[2],
-                steps[6]};
-
-        /*
-         * This is tricky:
-         * The expression "*" is true for the principal axis: since the axis is
-         * self, so we're looking for elements: doc elt
-         * node() also returns the doc elt, but also the comment
-         * nodes in the union set are returned in doc order
-         */
-        expected[9] = new String[]{
-            steps[1],
-            steps[3],
-            steps[6],
-            steps[7],
-            steps[8]
-        };
-
-        expected[10] = new String[]{
-            steps[1],
-            steps[2],
-            steps[5],
-            steps[4]
-        };
-        expected[11] = null; //new String[]{steps[0],DEFAULT_NS};
-        expected[12] = new String[]{steps[8]};
-        expected[13] = new String[]{steps[2],
-            steps[4]
-        };
-        expected[14] = new String[]{steps[3],
-            steps[6],
-            steps[7]};
-
-        expected[15] = new String[]{steps[1],
-            steps[5],
-            steps[4]};
-        expected[16] = new String[]{steps[5]};
-        //TODO: BUGBUG: fix this
-        expected[17] = null;
-
-        expected[18] = new String[]{
-            steps[2],
-            steps[5],
-            steps[11],
-            steps[10],
-            steps[11]
-        };
-        expected[19] = new String[]{steps[2]};
-        expected[20] = new String[]{
-            steps[1],
-            steps[5],
-            steps[4],
-        };
-        expected[21] = new String[]{
-            steps[2]
-
-        };
-        expected[22] = new String[]{
-            steps[5],
-            steps[4]};
-
-        expected[23] = new String[]{
-            steps[2]};
-
-        expected[24] = new String[]{
-            steps[5]};
-
-    }
-
-    @Test
-    public void testDelete() throws Exception {
-        String query = "*";
-
-        XmlCursor xc = XmlObject.Factory.parse(sXml).newCursor();
-        xc.selectPath(query);
-        while (xc.toNextSelection())
-            System.out.println(xc.xmlText());
-    }
-}
diff --git a/test/src/xmlcursor/xpath/complex/checkin/XPathTests.java b/test/src/xmlcursor/xpath/complex/checkin/XPathTests.java
new file mode 100755
index 0000000..32e1d81
--- /dev/null
+++ b/test/src/xmlcursor/xpath/complex/checkin/XPathTests.java
@@ -0,0 +1,152 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package xmlcursor.xpath.complex.checkin;
+
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlObject;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+import xmlcursor.xpath.common.XPathCommon;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+@RunWith(Parameterized.class)
+public class XPathTests {
+    static final String XML =
+        "<?xml version=\"1.0\"?>" +
+        "<doc xmlns:ext=\"http://somebody.elses.extension\">" +
+        "<a test=\"test\" />" +
+        "<b attr1=\"a1\" attr2=\"a2\"   " +
+        "xmlns:java=\"http://xml.apache.org/xslt/java\">" +
+        "    <a>" +
+        "    </a>" +
+        "</b>" +
+        "</doc><!-- -->         ";
+
+    private static final String[] STEPS = {
+        /*  0 */ "<xml-fragment xmlns:ext=\"http://somebody.elses.extension\"/>",
+        /*  1 */ "<doc xmlns:ext=\"http://somebody.elses.extension\"><a test=\"test\" /><b attr1=\"a1\" attr2=\"a2\" xmlns:java=\"http://xml.apache.org/xslt/java\"> <a /> </b></doc>",
+        /*  2 */ "<a test=\"test\" xmlns:ext=\"http://somebody.elses.extension\"/>",
+        /*  3 */ "<xml-fragment test=\"test\" xmlns:ext=\"http://somebody.elses.extension\" /> ",
+        /*  4 */ "<a xmlns:java=\"http://xml.apache.org/xslt/java\" xmlns:ext=\"http://somebody.elses.extension\" />",
+        /*  5 */ "<b attr1=\"a1\" attr2=\"a2\" xmlns:java=\"http://xml.apache.org/xslt/java\"> <a /> </b>",
+        /*  6 */ "<xml-fragment attr1=\"a1\" xmlns:java=\"http://xml.apache.org/xslt/java\" xmlns:ext=\"http://somebody.elses.extension\" />",
+        /*  7 */ "<xml-fragment attr2=\"a2\" xmlns:java=\"http://xml.apache.org/xslt/java\" xmlns:ext=\"http://somebody.elses.extension\" />",
+        /*  8 */ "<xml-fragment><!-- --></xml-fragment>",
+        /*  9 */ " <xml-fragment xmlns:java=\"http://xml.apache.org/xslt/java\" xmlns:ext=\"http://somebody.elses.extension\" />",
+        /* 10 */ "<a>    </a>",
+        /* 11 */ "<xml-fragment>    </xml-fragment>"
+    };
+
+    private static final String XMLFRAG_EMPTY = "<xml-fragment/>";
+    private static XmlObject doc;
+
+    @Parameter
+    public String xpath = null;
+    @Parameter(value = 1)
+    public String[] expected = null;
+
+    @BeforeClass
+    public static void init() throws XmlException {
+        doc = XmlObject.Factory.parse(XML);
+    }
+
+    @Parameters(name = "{index}: {0}")
+    public static Collection<Object[]> data() {
+        final List<Object[]> data = new ArrayList<>();
+
+        add(data, "/doc/a/@test", STEPS[2]);
+        add(data, "//.", XML, STEPS[1], STEPS[2], STEPS[5], XMLFRAG_EMPTY, STEPS[10], XMLFRAG_EMPTY, STEPS[8]);
+        add(data, "/doc", STEPS[1]);
+        add(data, "/doc/a", STEPS[2]);
+        add(data, "//@*", STEPS[3], STEPS[6], STEPS[7]);
+        add(data, ".", XML);
+        add(data, "//ancestor-or-self::*", XML, STEPS[2], STEPS[5], STEPS[10]);
+        add(data, "./child::*[1]", STEPS[1]);
+        add(data, "//descendant-or-self::*/@*[1]", STEPS[2], STEPS[6]);
+
+        // This is tricky:
+        // The expression "*" is true for the principal axis: since the axis is self, so we're looking for elements: doc
+        // elt node() also returns the doc elt, but also the comment nodes in the union set are returned in doc order
+        add(data, "//@* | * | node()", STEPS[1], STEPS[3], STEPS[6], STEPS[7], STEPS[8]);
+
+        add(data, "//*", STEPS[1], STEPS[2], STEPS[5], STEPS[4]);
+        add(data, "/doc/n", (String) null);
+        add(data, "//descendant::comment()", STEPS[8]);
+        add(data, "//*[local-name()='a']", STEPS[2], STEPS[4]);
+        add(data, "//*/@*", STEPS[3], STEPS[6], STEPS[7]);
+        add(data, "//*[last()]", STEPS[1], STEPS[5], STEPS[4]);
+        add(data, "doc/*[last()]", STEPS[5]);
+
+        // TODO: BUGBUG: fix this
+        add(data, "/doc/a/*/@*", (String) null);
+
+        add(data, "doc/descendant::node()", STEPS[2], STEPS[5], STEPS[11], STEPS[10], STEPS[11]);
+        add(data, "doc/a/@*", STEPS[2]);
+        add(data, "doc/b/a/ancestor-or-self::*", STEPS[1], STEPS[5], STEPS[4]);
+        add(data, "doc/b/a/preceding::*", STEPS[2]);
+        add(data, "doc/a/following::*", STEPS[5], STEPS[4]);
+        add(data, "/doc/b/preceding-sibling::*", STEPS[2]);
+        add(data, "/doc/a/following-sibling::*", STEPS[5]);
+
+        // "/doc/namespace::*", STEPS[0],DEFAULT_NS};
+
+        return data;
+    }
+
+    private static void add(List<Object[]> data, String xpath, String... expected) {
+        data.add(new Object[]{xpath, expected});
+    }
+
+
+    @Test
+    public void testConformance() {
+        XmlCursor actual = doc.newCursor();
+        try {
+            actual.selectPath(xpath);
+
+            if (actual.getSelectionCount() == 0) {
+                assertNull(expected[0]);
+                return;
+            }
+
+            XmlObject[] expXO = Stream.of(expected).map(XPathTests::parse).toArray(XmlObject[]::new);
+            XPathCommon.compare(actual, expXO);
+        } finally {
+            actual.dispose();
+        }
+    }
+
+    private static XmlObject parse(String str) {
+        try {
+            return XmlObject.Factory.parse(str);
+        } catch (XmlException e) {
+            fail(e.getMessage());
+            return null;
+        }
+    }
+}
diff --git a/test/src/xmlcursor/xpath/complex/checkin/XPathTestsMisc.java b/test/src/xmlcursor/xpath/complex/checkin/XPathTestsMisc.java
new file mode 100644
index 0000000..64b64a1
--- /dev/null
+++ b/test/src/xmlcursor/xpath/complex/checkin/XPathTestsMisc.java
@@ -0,0 +1,35 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   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.
+ */
+
+package xmlcursor.xpath.complex.checkin;
+
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlObject;
+import org.junit.Test;
+
+public class XPathTestsMisc {
+
+    @Test
+    public void testDelete() throws Exception {
+        String query = "*";
+
+        XmlCursor xc = XmlObject.Factory.parse(XPathTests.XML).newCursor();
+        xc.selectPath(query);
+        while (xc.toNextSelection()) {
+            System.out.println(xc.xmlText());
+        }
+    }
+
+}
diff --git a/test/src/xmlcursor/xpath/complex/detailed/XPathTest.java b/test/src/xmlcursor/xpath/complex/detailed/XPathTest.java
index fe84768..2d78a7f 100755
--- a/test/src/xmlcursor/xpath/complex/detailed/XPathTest.java
+++ b/test/src/xmlcursor/xpath/complex/detailed/XPathTest.java
@@ -16,1180 +16,206 @@
 package xmlcursor.xpath.complex.detailed;
 
 import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 import tools.util.JarUtil;
 import xmlcursor.common.BasicCursorTestCase;
 import xmlcursor.xpath.common.XPathCommon;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
 /**
  * Verifies XPath impl using examples from
  * http://www.zvon.org/xxl/XPathTutorial/Output/example1.html
  * includes expanded notations as well
  *
  */
+@RunWith(Parameterized.class)
 public class XPathTest extends BasicCursorTestCase {
 
-    static String fixPath(String path)
-    {
-        // return "$this" + path;
-        return path;
-    }
+    @Parameter
+    public int dataset;
+    @Parameter(value = 1)
+    public String xpath;
+    @Parameter(value = 2)
+    public String[] expected = null;
 
-    @Test
-    public void testZvonExample1() throws Exception {
-        System.out.println("====== Example-1 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon1.xml"));
+    @Parameterized.Parameters(name = "{index}: zvon{0}.xml {1}")
+    public static Collection<Object[]> data() {
+        final List<Object[]> data = new ArrayList<>();
+        add(data, 1, "/AAA", "<AAA><BBB/><CCC/><BBB/><BBB/><DDD><BBB/></DDD><CCC/></AAA>");
+        add(data, 1, "/AAA/CCC", "<CCC/>", "<CCC/>");
+        add(data, 1, "/AAA/DDD/BBB", "<BBB/>");
 
-        String ex1Simple = "/AAA";
-        String ex1Expanded = "";
+        add(data, 2, "//BBB", "<BBB/>", "<BBB/>", "<BBB/>", "<BBB/>", "<BBB/>");
+        add(data, 2, "//DDD/BBB", "<BBB/>", "<BBB/>", "<BBB/>");
 
-        String ex1R1 = "<AAA><BBB/><CCC/><BBB/><BBB/><DDD><BBB/></DDD><CCC/></AAA>";
-        XmlObject[] exXml1 = new XmlObject[]{XmlObject.Factory.parse(ex1R1)};
+        add(data, 3, "/AAA/CCC/DDD/*", "<BBB/>", "<BBB/>", "<EEE/>", "<FFF/>");
+        add(data, 3, "/*/*/*/BBB", "<BBB/>", "<BBB/>", "<BBB/>", "<BBB/>", "<BBB><BBB/></BBB>");
 
-        String ex2Simple = "/AAA/CCC";
-        String ex2Expanded = "";
-
-        String ex2R1 = "<CCC/>";
-
-        XmlObject[] exXml2 = new XmlObject[]{XmlObject.Factory.parse(ex2R1),
-                                             XmlObject.Factory.parse(ex2R1)};
-
-
-        String ex3Simple = "/AAA/DDD/BBB";
-        String ex3Expanded = "";
-
-        //<BBB/><CCC/></AAA>
-        String ex3R1 = "<BBB/>";
-        XmlObject[] exXml3 = new XmlObject[]{XmlObject.Factory.parse(ex3R1)};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        XPathCommon.compare(x1, exXml1);
-        x1.dispose();
-
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        XPathCommon.compare(x2, exXml2);
-        x2.dispose();
-
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        XPathCommon.compare(x3, exXml3);
-        x3.dispose();
-    }
-
-    @Test
-    public void testZvonExample2() throws Exception {
-        System.out.println("====== Example-2 ==========");
-
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon2.xml"));
-        String ex1Simple = "//BBB";
-        String ex1Expanded = "";
-
-        String ex1R1 = "<BBB/>"; // * 5
-        XmlObject[] exXml1 = new XmlObject[]{XmlObject.Factory.parse(ex1R1),
-                                             XmlObject.Factory.parse(ex1R1),
-                                             XmlObject.Factory.parse(ex1R1),
-                                             XmlObject.Factory.parse(ex1R1),
-                                             XmlObject.Factory.parse(ex1R1)};
-
-        String ex2Simple = "//DDD/BBB";
-        String ex2Expanded = "";
-        XmlObject[] exXml2 = new XmlObject[]{XmlObject.Factory.parse(ex1R1),
-                                             XmlObject.Factory.parse(ex1R1),
-                                             XmlObject.Factory.parse(ex1R1)};
-
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        XPathCommon.compare(x1, exXml1);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        XPathCommon.compare(x2, exXml2);
-        x2.dispose();
-    }
-
-    @Test
-    public void testZvonExample3() throws Exception {
-        System.out.println("====== Example-3 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon3.xml"));
-        String ex1Simple = "/AAA/CCC/DDD/*";
-        String ex1R1 = "<BBB/>"; // * 5
-        String ex1R2 = "<EEE/>";
-        String ex1R3 = "<FFF/>";
-
-        XmlObject[] exXml1 = new XmlObject[]{XmlObject.Factory.parse(ex1R1),
-                                             XmlObject.Factory.parse(ex1R1),
-                                             XmlObject.Factory.parse(ex1R2),
-                                             XmlObject.Factory.parse(ex1R3)};
-        String ex2Simple = "/*/*/*/BBB";
-        String ex2R1 = "<BBB/>"; // * 5
-        String ex2R2 = "<BBB><BBB/></BBB>";
-        XmlObject[] exXml2 = new XmlObject[]{XmlObject.Factory.parse(ex2R1),
-                                             XmlObject.Factory.parse(ex2R1),
-                                             XmlObject.Factory.parse(ex2R1),
-                                             XmlObject.Factory.parse(ex2R1),
-                                             XmlObject.Factory.parse(ex2R2)};
-        String ex3Simple = "//*";
-        /* String ex3R0 = "<AAA><XXX><DDD><BBB/><BBB/><EEE/><FFF/></DDD></XXX><CCC><DDD><BBB/><BBB/><EEE/><FFF/></DDD></CCC><CCC><BBB><BBB><BBB/></BBB></BBB></CCC></AAA>";
-         String ex3R1 = "<XXX><DDD><BBB/><BBB/><EEE/><FFF/></DDD></XXX>";
-         String ex3R2 = "<CCC><DDD><BBB/><BBB/><EEE/><FFF/></DDD></CCC>";
-         String ex3R3 = "<CCC><BBB><BBB><BBB/></BBB></BBB></CCC>";
-         String ex3R4 = "<DDD><BBB/><BBB/><EEE/><FFF/></DDD>";
-         String ex3R5 = "<DDD><BBB/><BBB/><EEE/><FFF/></DDD>";
-         String ex3R6 = "<BBB><BBB><BBB/></BBB></BBB>";
-         String ex3R7 = "<BBB/>";
-         String ex3R8 = "<BBB/>";
-         String ex3R9 = "<EEE/>";
-         String ex3R10 = "<FFF/>";
-         String ex3R11 = "<BBB/>";
-         String ex3R12 = "<BBB/>";
-         String ex3R13 = "<EEE/>";
-         String ex3R14 = "<FFF/>";
-         String ex3R15 = "<BBB><BBB/></BBB>";
-         String ex3R16 = "<BBB/>";
-        */
         //according to Galax the document order is :
-        String ex3R0 = "<AAA><XXX><DDD><BBB/><BBB/><EEE/><FFF/></DDD></XXX><CCC><DDD><BBB/><BBB/><EEE/><FFF/></DDD></CCC><CCC><BBB><BBB><BBB/></BBB></BBB></CCC></AAA>";
-        String ex3R1 = "<XXX><DDD><BBB/><BBB/><EEE/><FFF/></DDD></XXX>";
+        add(data, 3, "//*",
+            "<AAA><XXX><DDD><BBB/><BBB/><EEE/><FFF/></DDD></XXX><CCC><DDD><BBB/><BBB/><EEE/><FFF/></DDD></CCC><CCC><BBB><BBB><BBB/></BBB></BBB></CCC></AAA>",
+            "<XXX><DDD><BBB/><BBB/><EEE/><FFF/></DDD></XXX>", "<DDD><BBB/><BBB/><EEE/><FFF/></DDD>", "<BBB/>", "<BBB/>",
+            "<EEE/>", "<FFF/>", "<CCC><DDD><BBB/><BBB/><EEE/><FFF/></DDD></CCC>", "<DDD><BBB/><BBB/><EEE/><FFF/></DDD>",
+            "<BBB/>", "<BBB/>", "<EEE/>", "<FFF/>", "<CCC><BBB><BBB><BBB/></BBB></BBB></CCC>",
+            "<BBB><BBB><BBB/></BBB></BBB>", "<BBB><BBB/></BBB>", "<BBB/>");
 
-        String ex3R2 = "<DDD><BBB/><BBB/><EEE/><FFF/></DDD>";
-        String ex3R3 = "<BBB/>";
-        String ex3R4 = "<BBB/>";
-        String ex3R5 = "<EEE/>";
-        String ex3R6 = "<FFF/>";
-        String ex3R7 = "<CCC><DDD><BBB/><BBB/><EEE/><FFF/></DDD></CCC>";
+        add(data, 4, "/AAA/BBB[1]", "<BBB/>");
+        add(data, 4, "/AAA/BBB[last()]", "<BBB/>");
 
-        String ex3R8 = "<DDD><BBB/><BBB/><EEE/><FFF/></DDD>";
+        add(data, 5, "//@id", "<xml-fragment id=\"b1\"/>", "<xml-fragment id=\"b2\"/>");
+        add(data, 5, "//BBB[@id]", "<BBB id = \"b1\"/>", "<BBB id = \"b2\"/>");
+        add(data, 5, "//BBB[@name]", "<BBB name=\"bbb\"/>");
+        add(data, 5, "//BBB[@*]", "<BBB id = \"b1\"/>", "<BBB id = \"b2\"/>", "<BBB name=\"bbb\"/>");
+        add(data, 5, "//BBB[not(@*)]", "<BBB/>");
 
-        String ex3R9 = "<BBB/>";
-        String ex3R10 = "<BBB/>";
-        String ex3R11 = "<EEE/>";
-        String ex3R12 = "<FFF/>";
-        String ex3R13 = "<CCC><BBB><BBB><BBB/></BBB></BBB></CCC>";
-        String ex3R14 = "<BBB><BBB><BBB/></BBB></BBB>";
-        String ex3R15 = "<BBB><BBB/></BBB>";
-        String ex3R16 = "<BBB/>";
-        XmlObject[] exXml3 = new XmlObject[]{XmlObject.Factory.parse(ex3R0),
-                                             XmlObject.Factory.parse(ex3R1),
-                                             XmlObject.Factory.parse(ex3R2),
-                                             XmlObject.Factory.parse(ex3R3),
-                                             XmlObject.Factory.parse(ex3R4),
-                                             XmlObject.Factory.parse(ex3R5),
-                                             XmlObject.Factory.parse(ex3R6),
-                                             XmlObject.Factory.parse(ex3R7),
-                                             XmlObject.Factory.parse(ex3R8),
-                                             XmlObject.Factory.parse(ex3R9),
-                                             XmlObject.Factory.parse(ex3R10),
-                                             XmlObject.Factory.parse(ex3R11),
-                                             XmlObject.Factory.parse(ex3R12),
-                                             XmlObject.Factory.parse(ex3R13),
-                                             XmlObject.Factory.parse(ex3R14),
-                                             XmlObject.Factory.parse(ex3R15),
-                                             XmlObject.Factory.parse(ex3R16)};
+        add(data, 6, "//BBB[@id='b1']", "<BBB id = \"b1\"/>");
+        add(data, 6, "//BBB[@name='bbb']", "<BBB name=\"bbb\"/>");
+        add(data, 6, "//BBB[normalize-space(@name)='bbb']", "<BBB name=\" bbb \"/>", "<BBB name=\"bbb\"/>");
 
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, exXml1);
-        x1.dispose();
+        add(data, 7, "//*[count(BBB)=2]", "<DDD><BBB/><BBB/></DDD>");
+        add(data, 7, "//*[count(*)=2]", "<DDD><BBB/><BBB/></DDD>", "<EEE><CCC/><DDD/></EEE>");
+        add(data, 7, "//*[count(*)=3]",
+            "<AAA><CCC><BBB/><BBB/><BBB/></CCC><DDD><BBB/><BBB/></DDD><EEE><CCC/><DDD/></EEE></AAA>", "<CCC><BBB/><BBB/><BBB/></CCC>");
 
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, exXml2);
-        x2.dispose();
+        add(data, 8, "//*[name()='BBB']", "<BBB/>", "<BBB/>", "<BBB/>", "<BBB/>", "<BBB/>");
+        add(data, 8, "//*[starts-with(name(),'B')]", "<BCC><BBB/><BBB/><BBB/></BCC>",
+            "<BBB/>", "<BBB/>", "<BBB/>", "<BBB/>", "<BBB/>", "<BEC><CCC/><DBD/></BEC>");
 
-        System.out.println("Test 3: " + ex3Simple);
+        // ykadiysk: Jaxen prints in BF left-to-right order but XPath wants doc order
+        // add(data, "zvon8.xml", "//*[starts-with(name(),'B')]", "<BCC><BBB/><BBB/><BBB/></BCC>",
+        //    "<BBB/>", "<BBB/>", "<BEC><CCC/><DBD/></BEC>", "<BBB/>", "<BBB/>", "<BBB/>");
 
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        System.out.println(x3.xmlText());
-        XPathCommon.compare(x3, exXml3);
-        x3.dispose();
+        add(data, 8, "//*[contains(name(),'C')]", "<BCC><BBB/><BBB/><BBB/></BCC>", "<BEC><CCC/><DBD/></BEC>", "<CCC/>");
 
-    }
+        add(data, 9, "//*[string-length(name()) = 3]", "<AAA><Q/><SSSS/><BB/><CCC/><DDDDDDDD/><EEEE/></AAA>", "<CCC/>");
+        add(data, 9, "//*[string-length(name()) < 3]", "<Q/>", "<BB/>");
+        add(data, 9, "//*[string-length(name()) > 3]", "<SSSS/>", "<DDDDDDDD/>", "<EEEE/>");
 
-    @Test
-    public void testZvonExample4() throws Exception {
-        System.out.println("====== Example-4 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon4.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/AAA/BBB[1]";
-        String ex2Simple = "/AAA/BBB[last()]";
-        String exR = "<BBB/>";
-        XmlObject[] exXml = new XmlObject[]{XmlObject.Factory.parse(exR)};
-
-
-        System.out.println("Test 1: " + fixPath(ex1Simple));
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, exXml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, exXml);
-        x2.dispose();
-    }
-
-    @Test
-    public void testZvonExample5() throws Exception {
-        System.out.println("====== Example-5 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon5.xml"));
-        XmlCursor xc = xDoc.newCursor();
-
-        String ex1Simple = "//@id";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<xml-fragment id=\"b1\"/>"),
-            XmlObject.Factory.parse("<xml-fragment id=\"b2\"/>")};
-
-        String ex2Simple = "//BBB[@id]";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB id = \"b1\"/>"),
-            XmlObject.Factory.parse("<BBB id = \"b2\"/>")};
-
-        String ex3Simple = "//BBB[@name]";
-        XmlObject[] ex3Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB name=\"bbb\"/>")};
-
-        String ex4Simple = "//BBB[@*]";
-        XmlObject[] ex4Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB id = \"b1\"/>"),
-            XmlObject.Factory.parse("<BBB id = \"b2\"/>"),
-            XmlObject.Factory.parse("<BBB name=\"bbb\"/>")};
-
-        String ex5Simple = "//BBB[not(@*)]";
-        XmlObject[] ex5Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB/>")
-        };
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
-
-        System.out.println("Test 4: " + ex4Simple);
-        XmlCursor x4 = xDoc.newCursor();
-        x4.selectPath(fixPath(ex4Simple));
-        //XPathCommon.display(x4);
-        XPathCommon.compare(x4, ex4Xml);
-        x4.dispose();
-
-        System.out.println("Test 5: " + ex5Simple);
-        XmlCursor x5 = xDoc.newCursor();
-        x5.selectPath(fixPath(ex5Simple));
-        //XPathCommon.display(x5);
-        XPathCommon.compare(x5, ex5Xml);
-
-        x5.dispose();
-    }
-
-    @Test
-    public void testZvonExample6() throws Exception {
-        System.out.println("====== Example-16 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon6.xml"));
-        XmlCursor xc = xDoc.newCursor();
-
-        String ex1Simple = "//BBB[@id='b1']";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB id = \"b1\"/>")};
-
-        String ex2Simple = "//BBB[@name='bbb']";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB name=\"bbb\"/>")};
-        String ex3Simple = "//BBB[normalize-space(@name)='bbb']";
-        XmlObject[] ex3Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB name=\" bbb \"/>")
-            ,
-            XmlObject.Factory.parse("<BBB name=\"bbb\"/>")};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
-    }
-
-    @Test
-    public void testZvonExample7() throws Exception {
-        System.out.println("====== Example-7 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon7.xml"));
-        XmlCursor xc = xDoc.newCursor();
-
-        String ex1Simple = "//*[count(BBB)=2]";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<DDD><BBB/><BBB/></DDD>")};
-        String ex2Simple = "//*[count(*)=2]";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<DDD><BBB/><BBB/></DDD>"),
-            XmlObject.Factory.parse("<EEE><CCC/><DDD/></EEE>")};
-        String ex3Simple = "//*[count(*)=3]";
-        XmlObject[] ex3Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<AAA><CCC><BBB/><BBB/><BBB/></CCC><DDD><BBB/><BBB/></DDD><EEE><CCC/><DDD/></EEE></AAA>"),
-            XmlObject.Factory.parse("<CCC><BBB/><BBB/><BBB/></CCC>")};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
-    }
-
-    @Test
-    public void testZvonExample8() throws Exception {
-        System.out.println("====== Example-8 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon8.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "//*[name()='BBB']";
-        XmlObject[] ex1Xml = new XmlObject[]{XmlObject.Factory.parse("<BBB/>"),
-                                             XmlObject.Factory.parse("<BBB/>"),
-                                             XmlObject.Factory.parse("<BBB/>"),
-                                             XmlObject.Factory.parse("<BBB/>"),
-                                             XmlObject.Factory.parse("<BBB/>"),
-        };
-        String ex2Simple = "//*[starts-with(name(),'B')]";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BCC><BBB/><BBB/><BBB/></BCC>"),
-            XmlObject.Factory.parse("<BBB/>"),
-            XmlObject.Factory.parse("<BBB/>"),
-            XmlObject.Factory.parse("<BBB/>"),
-            XmlObject.Factory.parse("<BBB/>"),
-            XmlObject.Factory.parse("<BBB/>"),
-            XmlObject.Factory.parse("<BEC><CCC/><DBD/></BEC>")};
-
-        /**ykadiysk: Jaxen prints in BF left-to-right order
-         * but XPath wants doc order
-         XmlObject[] ex2Xml = new XmlObject[]{XmlObject.Factory.parse("<BCC><BBB/><BBB/><BBB/></BCC>"),
-
-         XmlObject.Factory.parse("<BBB/>"),
-         XmlObject.Factory.parse("<BBB/>"),
-         XmlObject.Factory.parse("<BEC><CCC/><DBD/></BEC>"),
-         XmlObject.Factory.parse("<BBB/>"),
-         XmlObject.Factory.parse("<BBB/>"),
-         XmlObject.Factory.parse("<BBB/>")};
-         */
-
-        String ex3Simple = "//*[contains(name(),'C')]";
-        XmlObject[] ex3Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BCC><BBB/><BBB/><BBB/></BCC>"),
-            XmlObject.Factory.parse("<BEC><CCC/><DBD/></BEC>"),
-            XmlObject.Factory.parse("<CCC/>")};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        System.out.println("Zvon8 Test 2");
-        XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
-    }
-
-    @Test
-    public void testZvonExample9() throws Exception {
-        System.out.println("====== Example-9 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon9.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "//*[string-length(name()) = 3]";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<AAA><Q/><SSSS/><BB/><CCC/><DDDDDDDD/><EEEE/></AAA>"),
-            XmlObject.Factory.parse("<CCC/>")};
-        String ex2Simple = "//*[string-length(name()) < 3]";
-        XmlObject[] ex2Xml = new XmlObject[]{XmlObject.Factory.parse("<Q/>"),
-                                             XmlObject.Factory.parse("<BB/>")};
-        String ex3Simple = "//*[string-length(name()) > 3]";
-        XmlObject[] ex3Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<SSSS/>"),
-            XmlObject.Factory.parse("<DDDDDDDD/>"),
-            XmlObject.Factory.parse("<EEEE/>")};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
-    }
-
-    @Test
-    public void testZvonExample10() throws Exception {
-        System.out.println("====== Example-10 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon10.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "$this//CCC | $this//BBB";
-        //document order
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB/>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<CCC/>")
-
-        };
+        add(data, 10, "$this//CCC | $this//BBB", "<BBB/>", "<CCC/>", "<CCC/>");
         // Nodes are returned in document order
-        String ex2Simple = "$this/AAA/EEE | $this//BBB";
+        add(data, 10, "$this/AAA/EEE | $this//BBB", "<BBB/>", "<EEE/>");
+        add(data, 10, "./AAA/EEE |.//DDD/CCC | ./AAA | .//BBB", "<AAA><BBB/><CCC/><DDD><CCC/></DDD><EEE/></AAA>",
+            "<BBB/>", "<CCC/>", "<EEE/>");
 
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB/>"),
-            XmlObject.Factory.parse("<EEE/>")
+        add(data, 11, "/AAA", "<AAA><BBB/><CCC/></AAA>");
+        add(data, 11, "/child::AAA", "<AAA><BBB/><CCC/></AAA>");
+        add(data, 11, "/AAA/BBB", "<BBB/>");
+        add(data, 11, "/child::AAA/child::BBB", "<BBB/>");
+        add(data, 11, "/child::AAA/BBB", "<BBB/>");
 
-        };
+        add(data, 12, "/descendant::*",
+            "<AAA><BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB><CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC></AAA>",
+            "<BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB>", "<DDD><CCC><DDD/><EEE/></CCC></DDD>",
+            "<CCC><DDD/><EEE/></CCC>", "<DDD/>", "<EEE/>", "<CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC>",
+            "<DDD><EEE><DDD><FFF/></DDD></EEE></DDD>", "<EEE><DDD><FFF/></DDD></EEE>", "<DDD><FFF/></DDD>", "<FFF/>");
+        add(data, 12, "/AAA/BBB/descendant::*", "<DDD><CCC><DDD/><EEE/></CCC></DDD>",
+            "<CCC><DDD/><EEE/></CCC>", "<DDD/>", "<EEE/>");
+        add(data, 12, "//CCC/descendant::*", "<DDD/>", "<EEE/>", "<DDD><EEE><DDD><FFF/></DDD></EEE></DDD>",
+            "<EEE><DDD><FFF/></DDD></EEE>", "<DDD><FFF/></DDD>", "<FFF/>");
+        add(data, 12, "//CCC/descendant::DDD", "<DDD/>", "<DDD><EEE><DDD><FFF/></DDD></EEE></DDD>", "<DDD><FFF/></DDD>");
 
-        String ex3Simple = "./AAA/EEE |.//DDD/CCC | ./AAA | .//BBB";
-        XmlObject[] ex3Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                            "<AAA><BBB/><CCC/><DDD><CCC/></DDD><EEE/></AAA>"),            
-            XmlObject.Factory.parse("<BBB/>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<EEE/>")
-        };
+        add(data, 13, "//DDD/parent::*", "<BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB>",
+            "<CCC><DDD/><EEE/></CCC>", "<CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC>", "<EEE><DDD><FFF/></DDD></EEE>");
 
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(ex1Simple);
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
+        add(data, 14, "/AAA/BBB/DDD/CCC/EEE/ancestor::*",
+            "<AAA><BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB><CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC></AAA>",
+            "<BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB>", "<DDD><CCC><DDD/><EEE/></CCC></DDD>", "<CCC><DDD/><EEE/></CCC>");
+        add(data, 14, "//FFF/ancestor::*",
+            "<AAA><BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB><CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC></AAA>",
+            "<CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC>", "<DDD><EEE><DDD><FFF/></DDD></EEE></DDD>",
+            "<EEE><DDD><FFF/></DDD></EEE>", "<DDD><FFF/></DDD>");
 
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(ex2Simple);
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
+        add(data, 15, "/AAA/BBB/following-sibling::*",
+            "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>", "<CCC><DDD/></CCC>");
+        add(data, 15, "//CCC/following-sibling::*", "<DDD/>", "<FFF/>", "<FFF><GGG/></FFF>");
 
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
+        add(data, 16, "/AAA/XXX/preceding-sibling::*", "<BBB><CCC/><DDD/></BBB>");
+        add(data, 16, "//CCC/preceding-sibling::*", "<BBB><CCC/><DDD/></BBB>",
+            "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>", "<EEE/>", "<DDD/>");
+
+        add(data, 17, "/AAA/XXX/following::*", "<CCC><DDD/></CCC>", "<DDD/>");
+        add(data, 17, "//ZZZ/following::*", "<FFF><GGG/></FFF>", "<GGG/>",
+            "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>",
+            "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>", "<EEE/>", "<DDD/>", "<CCC/>", "<FFF/>",
+            "<FFF><GGG/></FFF>", "<GGG/>", "<CCC><DDD/></CCC>", "<DDD/>");
+
+
+        // the preceding axis contains all nodes that are descendants of the root of the tree in which the context
+        // node is found, are not ancestors of the context node, and occur before the context node in document order
+        add(data, 18, "/AAA/XXX/preceding::*", "<BBB><CCC/><ZZZ><DDD/></ZZZ></BBB>", "<CCC/>",
+            "<ZZZ><DDD/></ZZZ>", "<DDD/>");
+        add(data, 18, "//GGG/preceding::*", "<BBB><CCC/><ZZZ><DDD/></ZZZ></BBB>", "<CCC/>",
+            "<ZZZ><DDD/></ZZZ>", "<DDD/>", "<EEE/>", "<DDD/>", "<CCC/>", "<FFF/>");
+
+
+        add(data, 19, "/AAA/XXX/descendant-or-self::*", "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>",
+            "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>", "<EEE/>", "<DDD/>", "<CCC/>", "<FFF/>", "<FFF><GGG/></FFF>", "<GGG/>");
+        add(data, 19, "//CCC/descendant-or-self::*", "<CCC/>", "<CCC/>", "<CCC><DDD/></CCC>", "<DDD/>");
+
+
+        add(data, 20, "/AAA/XXX/DDD/EEE/ancestor-or-self::*",
+            "<AAA><BBB><CCC/><ZZZ><DDD/></ZZZ></BBB><XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX><CCC><DDD/></CCC></AAA>",
+            "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>",
+            "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>", "<EEE/>");
+        add(data, 20, "//GGG/ancestor-or-self::*",
+            "<AAA><BBB><CCC/><ZZZ><DDD/></ZZZ></BBB><XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX><CCC><DDD/></CCC></AAA>",
+            "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>",
+            "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>", "<FFF><GGG/></FFF>", "<GGG/>");
+
+        add(data, 21, "//GGG/ancestor::*",
+            "<AAA><BBB><CCC/><ZZZ/></BBB><XXX><DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD></XXX><CCC><DDD/></CCC></AAA>",
+            "<XXX><DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD></XXX>",
+            "<DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD>",
+            "<FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF>");
+        add(data, 21, "//GGG/descendant::*", "<JJJ><QQQ/></JJJ>", "<QQQ/>", "<JJJ/>");
+        add(data, 21, "//GGG/following::*", "<HHH/>", "<CCC><DDD/></CCC>", "<DDD/>");
+        add(data, 21, "//GGG/preceding::*", "<BBB><CCC/><ZZZ/></BBB>", "<CCC/>", "<ZZZ/>", "<EEE/>", "<HHH/>");
+        add(data, 21, "//GGG/self::*", "<GGG><JJJ><QQQ/></JJJ><JJJ/></GGG>");
+        add(data, 21, "//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*",
+            "<AAA><BBB><CCC/><ZZZ/></BBB><XXX><DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD></XXX><CCC><DDD/></CCC></AAA>",
+            "<BBB><CCC/><ZZZ/></BBB>", "<CCC/>", "<ZZZ/>", "<XXX><DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD></XXX>",
+            "<DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD>", "<EEE/>",
+            "<FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF>", "<HHH/>", "<GGG><JJJ><QQQ/></JJJ><JJJ/></GGG>",
+            "<JJJ><QQQ/></JJJ>", "<QQQ/>", "<JJJ/>", "<HHH/>", "<CCC><DDD/></CCC>", "<DDD/>");
+
+        add(data, 22, "//BBB[position() mod 2 = 0 ]", "<BBB/>", "<BBB/>", "<BBB/>", "<BBB/>");
+        add(data, 22, "//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]",
+            "<BBB/>", "<BBB/>");
+        add(data, 22, "//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]",
+            "<CCC/>");
+
+        return data;
     }
 
-    @Test
-    public void testZvonExample11() throws Exception {
-        System.out.println("====== Example-11 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon11.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/AAA";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<AAA><BBB/><CCC/></AAA>")};
-
-        String ex2Simple = "/child::AAA";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<AAA><BBB/><CCC/></AAA>")};
-
-        String ex3Simple = "/AAA/BBB";
-        XmlObject[] ex3Xml = new XmlObject[]{XmlObject.Factory.parse("<BBB/>")};
-
-        String ex4Simple = "/child::AAA/child::BBB";
-        XmlObject[] ex4Xml = new XmlObject[]{XmlObject.Factory.parse("<BBB/>")};
-
-        String ex5Simple = "/child::AAA/BBB";
-        XmlObject[] ex5Xml = new XmlObject[]{XmlObject.Factory.parse("<BBB/>")};
-
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
-
-        System.out.println("Test 4: " + ex4Simple);
-        XmlCursor x4 = xDoc.newCursor();
-        x4.selectPath(fixPath(ex4Simple));
-        XPathCommon.display(x4);
-        XPathCommon.display(ex4Xml);
-        XPathCommon.compare(x4, ex4Xml);
-        x4.dispose();
-
-        System.out.println("Test 5: " + ex5Simple);
-        XmlCursor x5 = xDoc.newCursor();
-        x5.selectPath(fixPath(ex5Simple));
-        //XPathCommon.display(x5);
-        XPathCommon.compare(x5, ex5Xml);
-        x5.dispose();
+    private static void add(List<Object[]> data, int dataset, String xpath, String... expected) {
+        data.add(new Object[]{dataset, xpath, expected});
     }
 
-    @Test
-    public void testZvonExample12() throws Exception {
-        System.out.println("====== Example-12 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon12.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/descendant::*";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<AAA><BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB><CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC></AAA>"),
-            XmlObject.Factory.parse(
-                "<BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB>"),
-
-            XmlObject.Factory.parse("<DDD><CCC><DDD/><EEE/></CCC></DDD>"),
-
-            XmlObject.Factory.parse("<CCC><DDD/><EEE/></CCC>"),
-
-
-            XmlObject.Factory.parse("<DDD/>"),
-
-
-            XmlObject.Factory.parse("<EEE/>"),
-            XmlObject.Factory.parse(
-                "<CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC>"),
-            XmlObject.Factory.parse("<DDD><EEE><DDD><FFF/></DDD></EEE></DDD>"),
-            XmlObject.Factory.parse("<EEE><DDD><FFF/></DDD></EEE>"),
-            XmlObject.Factory.parse("<DDD><FFF/></DDD>"),
-            XmlObject.Factory.parse("<FFF/>")};
-
-        String ex2Simple = "/AAA/BBB/descendant::*";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<DDD><CCC><DDD/><EEE/></CCC></DDD>"),
-            XmlObject.Factory.parse("<CCC><DDD/><EEE/></CCC>"),
-            XmlObject.Factory.parse("<DDD/>"),
-            XmlObject.Factory.parse("<EEE/>")};
-
-        String ex3Simple = "//CCC/descendant::*";
-        XmlObject[] ex3Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<DDD/>"),
-            XmlObject.Factory.parse("<EEE/>"),
-            XmlObject.Factory.parse("<DDD><EEE><DDD><FFF/></DDD></EEE></DDD>"),
-            XmlObject.Factory.parse("<EEE><DDD><FFF/></DDD></EEE>"),
-            XmlObject.Factory.parse("<DDD><FFF/></DDD>"),
-            XmlObject.Factory.parse("<FFF/>")
-
-        };
-        String ex4Simple = "//CCC/descendant::DDD";
-        XmlObject[] ex4Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<DDD/>"),
-            XmlObject.Factory.parse("<DDD><EEE><DDD><FFF/></DDD></EEE></DDD>"),
-            XmlObject.Factory.parse("<DDD><FFF/></DDD>"),
-        };
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
-
-        System.out.println("Test 4: " + ex4Simple);
-        XmlCursor x4 = xDoc.newCursor();
-        x4.selectPath(fixPath(ex4Simple));
-        //XPathCommon.display(x4);
-        XPathCommon.compare(x4, ex4Xml);
-        x4.dispose();
-    }
 
     @Test
-    public void testZvonExample13() throws Exception {
-        System.out.println("====== Example-13 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon13.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "//DDD/parent::*";
-
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB>"),
-
-            XmlObject.Factory.parse("<CCC><DDD/><EEE/></CCC>"),
-            XmlObject.Factory.parse(
-                "<CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC>"),
-            XmlObject.Factory.parse("<EEE><DDD><FFF/></DDD></EEE>")};
-
-        System.out.println("Test 1: " + ex1Simple);
+    public void zvonExample() throws IOException, XmlException {
+        XmlObject xDoc = XmlObject.Factory.parse(JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon"+dataset+".xml"));
         XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-    }
+        try {
+            x1.selectPath(xpath);
 
-    @Test
-    public void testZvonExample14() throws Exception {
-        System.out.println("====== Example-14 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon14.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/AAA/BBB/DDD/CCC/EEE/ancestor::*";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<AAA><BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB><CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC></AAA>"),
-            XmlObject.Factory.parse(
-                "<BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB>"),
-            XmlObject.Factory.parse("<DDD><CCC><DDD/><EEE/></CCC></DDD>"),
-            XmlObject.Factory.parse("<CCC><DDD/><EEE/></CCC>")
-        };
+            XmlObject[] exp = new XmlObject[expected.length];
+            for (int i = 0; i < expected.length; i++) {
+                exp[i] = XmlObject.Factory.parse(expected[i]);
+            }
 
-        String ex2Simple = "//FFF/ancestor::*";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<AAA><BBB><DDD><CCC><DDD/><EEE/></CCC></DDD></BBB><CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC></AAA>"),
-            XmlObject.Factory.parse(
-                "<CCC><DDD><EEE><DDD><FFF/></DDD></EEE></DDD></CCC>"),
-            XmlObject.Factory.parse("<DDD><EEE><DDD><FFF/></DDD></EEE></DDD>"),
-            XmlObject.Factory.parse("<EEE><DDD><FFF/></DDD></EEE>"),
-            XmlObject.Factory.parse("<DDD><FFF/></DDD>")
-        };
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-    }
-
-    @Test
-    public void testZvonExample15() throws Exception {
-        System.out.println("====== Example-15 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon15.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/AAA/BBB/following-sibling::*";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>"),
-            XmlObject.Factory.parse("<CCC><DDD/></CCC>")};
-        String ex2Simple = "//CCC/following-sibling::*";
-        XmlObject[] ex2Xml = new XmlObject[]{XmlObject.Factory.parse("<DDD/>"),
-                                             XmlObject.Factory.parse("<FFF/>"),
-                                             XmlObject.Factory.parse(
-                                                 "<FFF><GGG/></FFF>")};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-    }
-
-    @Test
-    public void testZvonExample16() throws Exception {
-        System.out.println("====== Example-16 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon16.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/AAA/XXX/preceding-sibling::*";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB><CCC/><DDD/></BBB>")};
-        String ex2Simple = "//CCC/preceding-sibling::*";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB><CCC/><DDD/></BBB>"),
-            XmlObject.Factory.parse(
-                "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>"),
-            XmlObject.Factory.parse("<EEE/>"),
-            XmlObject.Factory.parse("<DDD/>")};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-    }
-
-    @Test
-    public void testZvonExample17() throws Exception {
-        System.out.println("====== Example-17 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon17.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/AAA/XXX/following::*";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<CCC><DDD/></CCC>"),
-            XmlObject.Factory.parse("<DDD/>")};
-        String ex2Simple = "//ZZZ/following::*";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<FFF><GGG/></FFF>"),
-            XmlObject.Factory.parse("<GGG/>"),
-            XmlObject.Factory.parse(
-                "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>"),
-            XmlObject.Factory.parse(
-                "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>"),
-            XmlObject.Factory.parse("<EEE/>"),
-            XmlObject.Factory.parse("<DDD/>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<FFF/>"),
-            XmlObject.Factory.parse("<FFF><GGG/></FFF>"),
-            XmlObject.Factory.parse("<GGG/>"),
-            XmlObject.Factory.parse("<CCC><DDD/></CCC>"),
-            XmlObject.Factory.parse("<DDD/>")};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-    }
-
-    /**
-     * the preceding axis contains all nodes that are descendants of the root
-     * of the tree in which the context node is found, are not ancestors of
-     * the context node, and occur before the context node in document order
-     */
-    @Test
-    public void testZvonExample18() throws Exception {
-        System.out.println("====== Example-18 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon18.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/AAA/XXX/preceding::*";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB><CCC/><ZZZ><DDD/></ZZZ></BBB>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<ZZZ><DDD/></ZZZ>"),
-            XmlObject.Factory.parse("<DDD/>")
-        };
-
-        String ex2Simple = "//GGG/preceding::*";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB><CCC/><ZZZ><DDD/></ZZZ></BBB>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<ZZZ><DDD/></ZZZ>"),
-            XmlObject.Factory.parse("<DDD/>"),
-
-            XmlObject.Factory.parse("<EEE/>"),
-            XmlObject.Factory.parse("<DDD/>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<FFF/>")
-
-            /*XmlObject.Factory.parse(
-                                               "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>"),
-                                           XmlObject.Factory.parse(
-                                               "<CCC><DDD/></CCC>"),
-                                           XmlObject.Factory.parse(
-                                               "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>"),
-                                           XmlObject.Factory.parse("<DDD/>"),
-                                           */
-        };
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-    }
-
-    @Test
-    public void testZvonExample19() throws Exception {
-        System.out.println("====== Example-19 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon19.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "/AAA/XXX/descendant-or-self::*";
-
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>"),
-            XmlObject.Factory.parse(
-                "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>"),
-            XmlObject.Factory.parse("<EEE/>"),
-            XmlObject.Factory.parse("<DDD/>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<FFF/>"),
-            XmlObject.Factory.parse("<FFF><GGG/></FFF>"),
-            XmlObject.Factory.parse("<GGG/>")};
-        String ex2Simple = "//CCC/descendant-or-self::*";
-
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<CCC><DDD/></CCC>"),
-            XmlObject.Factory.parse("<DDD/>"),
-        };
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-    }
-
-    @Test
-    public void testZvonExample20() throws Exception {
-        System.out.println("====== Example-20 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon20.xml"));
-        XmlCursor xc = xDoc.newCursor();
-
-        String ex1Simple = "/AAA/XXX/DDD/EEE/ancestor-or-self::*";
-        XmlObject[] ex1Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<AAA><BBB><CCC/><ZZZ><DDD/></ZZZ></BBB><XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX><CCC><DDD/></CCC></AAA>"),
-            XmlObject.Factory.parse(
-                "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>"),
-            XmlObject.Factory.parse(
-                "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>"),
-            XmlObject.Factory.parse("<EEE/>"),
-        };
-        String ex2Simple = "//GGG/ancestor-or-self::*";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<AAA><BBB><CCC/><ZZZ><DDD/></ZZZ></BBB><XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX><CCC><DDD/></CCC></AAA>"),
-            XmlObject.Factory.parse(
-                "<XXX><DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD></XXX>"),
-            XmlObject.Factory.parse(
-                "<DDD><EEE/><DDD/><CCC/><FFF/><FFF><GGG/></FFF></DDD>"),
-            XmlObject.Factory.parse("<FFF><GGG/></FFF>"),
-            XmlObject.Factory.parse("<GGG/>"),
-        };
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-    }
-
-    @Test
-    public void testZvonExample21() throws Exception {
-        System.out.println("====== Example-21 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon21.xml"));
-        XmlCursor xc = xDoc.newCursor();
-        String ex1Simple = "//GGG/ancestor::*";
-        XmlObject[] ex1Xml = new XmlObject[]{
-
-            XmlObject.Factory.parse(
-                "<AAA><BBB><CCC/><ZZZ/></BBB><XXX><DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD></XXX><CCC><DDD/></CCC></AAA>"),
-            XmlObject.Factory.parse(
-                "<XXX><DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD></XXX>"),
-            XmlObject.Factory.parse(
-                "<DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD>"),
-            XmlObject.Factory.parse(
-                "<FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF>"),
-        };
-        String ex2Simple = "//GGG/descendant::*";
-        XmlObject[] ex2Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<JJJ><QQQ/></JJJ>"),
-            XmlObject.Factory.parse("<QQQ/>"),
-            XmlObject.Factory.parse("<JJJ/>")};
-        String ex3Simple = "//GGG/following::*";
-        XmlObject[] ex3Xml = new XmlObject[]{XmlObject.Factory.parse("<HHH/>"),
-                                             XmlObject.Factory.parse(
-                                                 "<CCC><DDD/></CCC>"),
-                                             XmlObject.Factory.parse("<DDD/>")};
-        String ex4Simple = "//GGG/preceding::*";
-        XmlObject[] ex4Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<BBB><CCC/><ZZZ/></BBB>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<ZZZ/>"),
-            XmlObject.Factory.parse("<EEE/>"),
-            XmlObject.Factory.parse("<HHH/>"),
-        };
-        String ex5Simple = "//GGG/self::*";
-        XmlObject[] ex5Xml = new XmlObject[]{
-            XmlObject.Factory.parse("<GGG><JJJ><QQQ/></JJJ><JJJ/></GGG>")};
-
-        String ex6Simple = "//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*";
-        XmlObject[] ex6Xml = new XmlObject[]{
-            XmlObject.Factory.parse(
-                "<AAA><BBB><CCC/><ZZZ/></BBB><XXX><DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD></XXX><CCC><DDD/></CCC></AAA>"),
-            XmlObject.Factory.parse("<BBB><CCC/><ZZZ/></BBB>"),
-            XmlObject.Factory.parse("<CCC/>"),
-            XmlObject.Factory.parse("<ZZZ/>"),
-            XmlObject.Factory.parse(
-                "<XXX><DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD></XXX>"),
-            XmlObject.Factory.parse(
-                "<DDD><EEE/><FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF></DDD>"),
-            XmlObject.Factory.parse("<EEE/>"),
-            XmlObject.Factory.parse(
-                "<FFF><HHH/><GGG><JJJ><QQQ/></JJJ><JJJ/></GGG><HHH/></FFF>"),
-            XmlObject.Factory.parse("<HHH/>"),
-            XmlObject.Factory.parse("<GGG><JJJ><QQQ/></JJJ><JJJ/></GGG>"),
-            XmlObject.Factory.parse("<JJJ><QQQ/></JJJ>"),
-            XmlObject.Factory.parse("<QQQ/>"),
-            XmlObject.Factory.parse("<JJJ/>"),
-            XmlObject.Factory.parse("<HHH/>"),
-            XmlObject.Factory.parse("<CCC><DDD/></CCC>"),
-            XmlObject.Factory.parse("<DDD/>"),
-        };
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
-
-        System.out.println("Test 4: " + ex4Simple);
-        XmlCursor x4 = xDoc.newCursor();
-        x4.selectPath(fixPath(ex4Simple));
-        int i = 0;
-        /*   System.out.println("****************HERE");
-
-           while (i < x4.getSelectionCount())
-           {
-               x4.toSelection(i++);
-               System.out.println(x4.getName() + ((i - 1) + ""));
-           }
-
-           System.out.println("****************SETS");
-           XPathCommon.display(x4);
-           //XPathCommon.display(ex4Xml);
-           System.out.println("**************END SETS");
-        */
-        XPathCommon.compare(x4, ex4Xml);
-        x4.dispose();
-
-
-        System.out.println("Test 5: " + ex5Simple);
-        XmlCursor x5 = xDoc.newCursor();
-        x5.selectPath(fixPath(ex5Simple));
-        //XPathCommon.display(x5);
-        XPathCommon.compare(x5, ex5Xml);
-        x5.dispose();
-
-        System.out.println("Test 6: " + ex6Simple);
-        XmlCursor x6 = xDoc.newCursor();
-        x6.selectPath(fixPath(ex6Simple));
-        //XPathCommon.display(x6);
-        XPathCommon.compare(x6, ex6Xml);
-        x6.dispose();
-    }
-
-    @Test
-    public void testZvonExample22() throws Exception {
-        System.out.println("====== Example-22 ==========");
-        XmlObject xDoc = XmlObject.Factory.parse(
-            JarUtil.getResourceFromJar("xbean/xmlcursor/xpath/zvon22.xml"));
-        XmlCursor xc = xDoc.newCursor();
-
-        String ex1Simple = "//BBB[position() mod 2 = 0 ]";
-        XmlObject[] ex1Xml = new XmlObject[]{XmlObject.Factory.parse("<BBB/>"),
-                                             XmlObject.Factory.parse("<BBB/>"),
-                                             XmlObject.Factory.parse("<BBB/>"),
-                                             XmlObject.Factory.parse("<BBB/>")};
-
-        String ex2Simple = "//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]";
-        XmlObject[] ex2Xml = new XmlObject[]{XmlObject.Factory.parse("<BBB/>"),
-                                             XmlObject.Factory.parse("<BBB/>")};
-
-        String ex3Simple = "//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]";
-        XmlObject[] ex3Xml = new XmlObject[]{XmlObject.Factory.parse("<CCC/>")};
-
-        System.out.println("Test 1: " + ex1Simple);
-        XmlCursor x1 = xDoc.newCursor();
-        x1.selectPath(fixPath(ex1Simple));
-        //XPathCommon.display(x1);
-        XPathCommon.compare(x1, ex1Xml);
-        x1.dispose();
-        System.out.println("Test 2: " + ex2Simple);
-        XmlCursor x2 = xDoc.newCursor();
-        x2.selectPath(fixPath(ex2Simple));
-        //XPathCommon.display(x2);
-        XPathCommon.compare(x2, ex2Xml);
-        x2.dispose();
-
-        System.out.println("Test 3: " + ex3Simple);
-        XmlCursor x3 = xDoc.newCursor();
-        x3.selectPath(fixPath(ex3Simple));
-        //XPathCommon.display(x3);
-        XPathCommon.compare(x3, ex3Xml);
-        x3.dispose();
+            XPathCommon.compare(x1, exp);
+        } finally {
+            x1.dispose();
+        }
     }
 }
diff --git a/test/src/xmlcursor/xpath/xbean_xpath/detailed/AxesTest.java b/test/src/xmlcursor/xpath/xbean_xpath/detailed/AxesTest.java
index 4cd11f8..4618bf1 100755
--- a/test/src/xmlcursor/xpath/xbean_xpath/detailed/AxesTest.java
+++ b/test/src/xmlcursor/xpath/xbean_xpath/detailed/AxesTest.java
@@ -35,13 +35,13 @@
  * namespace
  */
 public class AxesTest {
-    private String sXmlChild =
+    private final String sXmlChild =
         "<foo> <bar xmlns:pre=\"http://uri.com\" at0='val0'>" +
         "<pre:baz xmlns:baz='http://uri' baz:at0='val1'/>txt child</bar></foo>";
 
-    private XmlOptions options = new XmlOptions();
+    private final XmlOptions options = new XmlOptions();
 
-    private String sXmlDesc =
+    private final String sXmlDesc =
         "<foo> <foo xmlns:pre=\"http://uri.com\" at0='val0'>" +
         "<pre:baz xmlns:baz='http://uri' baz:at0='val1'/>txt child</foo></foo>";
 
@@ -98,6 +98,7 @@
         assertEquals(sExpected, c.xmlText());
     }
 
+    @Test
     public void testChildAxisDNE() throws XmlException {
         String sQuery1 = "$this/foo/./baz";
         XmlCursor c = XmlObject.Factory.parse(sXmlChild).newCursor();
diff --git a/test/src/xmlcursor/xquery/detailed/XQueryVariableBindingTest.java b/test/src/xmlcursor/xquery/detailed/XQueryVariableBindingTest.java
index eedd266..9a57318 100644
--- a/test/src/xmlcursor/xquery/detailed/XQueryVariableBindingTest.java
+++ b/test/src/xmlcursor/xquery/detailed/XQueryVariableBindingTest.java
@@ -33,8 +33,7 @@
         XBEAN_CASE_ROOT + P + "xmlcursor" + P + "xquery";

     public static File dir = new File(XQUERY_CASE_DIR);

 

-    private XmlCursor _testDocCursor1() throws Exception

-    {

+    private XmlCursor _testDocCursor1() throws Exception {

         String xml =

             "<elem1>" +

             "<elem11 id=\"123\">text11</elem11>" +

@@ -63,8 +62,7 @@
 

     /** test the automatic binding of $this to the current node: selectPath() */

     @Test

-    public void testThisVariable1() throws Exception

-    {

+    public void testThisVariable1() throws Exception {

         XmlCursor xc = _testDocCursor1();

         xc.toFirstChild(); //<elem1>

         xc.toFirstChild(); //<elem11>

@@ -77,8 +75,7 @@
     // this fails: see JIRA issue XMLBEANS-276

     /** test the binding of a variable to the current node: selectPath() */

     @Test

-    public void testCurrentNodeVariable1() throws Exception

-    {

+    public void testCurrentNodeVariable1() throws Exception {

         XmlCursor xc = _testDocCursor1();

         xc.toFirstChild();

         xc.toFirstChild();

@@ -92,23 +89,18 @@
         xc.dispose();

     }

 

-    private XmlCursor _testDocCursor2() throws Exception

-    {

+    private XmlCursor _testDocCursor2() throws Exception {

         File f = new File(dir, "employees.xml");

         XmlObject doc = XmlObject.Factory.parse(f);

-        XmlCursor xc = doc.newCursor();

-        return xc;

+        return doc.newCursor();

     }

 

-    public void _verifyQueryResult(XmlCursor qc)

-    {

+    public void _verifyQueryResult(XmlCursor qc) {

         System.out.println(qc.xmlText());

         assertTrue(qc.toFirstChild());

-        assertEquals("<phone location=\"work\">(425)555-5665</phone>", 

-                     qc.xmlText());

+        assertEquals("<phone location=\"work\">(425)555-5665</phone>", qc.xmlText());

         assertTrue(qc.toNextSibling());

-        assertEquals("<phone location=\"work\">(425)555-6897</phone>", 

-                     qc.xmlText());

+        assertEquals("<phone location=\"work\">(425)555-6897</phone>", qc.xmlText());

         assertFalse(qc.toNextSibling());

     }

 

@@ -117,7 +109,7 @@
     public void testThisVariable2() throws Exception

     {

         XmlCursor xc = _testDocCursor2();

-        xc.toNextToken();

+        // xc.toNextToken();

         String q =

             "for $e in $this/employees/employee " +

             "let $s := $e/address/state " +

@@ -131,10 +123,9 @@
 

     /** test the binding of a variable to the current node: execQuery() */

     @Test

-    public void testCurrentNodeVariable2() throws Exception

-    {

+    public void testCurrentNodeVariable2() throws Exception {

         XmlCursor xc = _testDocCursor2();

-        xc.toNextToken();

+        // xc.toNextToken();

         String q =

             "for $e in $cur/employees/employee " +

             "let $s := $e/address/state " +

@@ -150,18 +141,15 @@
         qc.dispose();

     }

 

-    private XmlObject[] _execute(XmlObject xo, Map m, String q)

-    {

+    private XmlObject[] _execute(XmlObject xo, Map m, String q) {

         XmlOptions opts = new XmlOptions();

         opts.setXqueryVariables(m);

-        XmlObject[] results = xo.execQuery(q, opts);

-        return results;

+        return xo.execQuery(q, opts);

     }

 

     /** test the binding of a variable to an XmlTokenSource using a map */

     @Test

-    public void testOneVariable() throws Exception

-    {

+    public void testOneVariable() throws Exception {

         File f = new File(dir, "bookstore.xml");

         XmlObject doc = XmlObject.Factory.parse(f);

         String q =

@@ -169,23 +157,20 @@
             "for $x in $rt/book " +

             "where $x/price > 30 " +

             "return $x/title";

-        Map m = new HashMap();

+        Map<String,Object> m = new HashMap<>();

         m.put("rt", doc.selectChildren("", "bookstore")[0]);

         XmlObject[] results = _execute(doc, m, q);

         assertNotNull(results);

         assertEquals(2, results.length);

-        assertEquals("<title lang=\"en\">XQuery Kick Start</title>",

-                     results[0].xmlText());

-        assertEquals("<title lang=\"en\">Learning XML</title>",

-                     results[1].xmlText());

+        assertEquals("<title lang=\"en\">XQuery Kick Start</title>", results[0].xmlText());

+        assertEquals("<title lang=\"en\">Learning XML</title>", results[1].xmlText());

     }

-    

+

     /** test the binding of multiple variables using a map;

         at the same time, test the binding of a variable to a String

      */

     @Test

-    public void testMultipleVariables() throws Exception

-    {

+    public void testMultipleVariables() throws Exception {

         File f = new File(dir, "bookstore.xml");

         XmlObject doc = XmlObject.Factory.parse(f);

         String q =

@@ -194,14 +179,13 @@
             "for $x in $rt/book " +

             "where $x[@category=$c] " +

             "return $x/title";

-        Map m = new HashMap();

+        Map<String,Object> m = new HashMap<>();

         m.put("rt", doc.selectChildren("", "bookstore")[0]);

         m.put("c", "CHILDREN");

         XmlObject[] results = _execute(doc, m, q);

         assertNotNull(results);

         assertEquals(1, results.length);

-        assertEquals("<title lang=\"en\">Harry Potter</title>",

-                     results[0].xmlText());

+        assertEquals("<title lang=\"en\">Harry Potter</title>", results[0].xmlText());

     }

 

 }

diff --git a/test/src/xmlobject/checkin/SelectChldAttTests.java b/test/src/xmlobject/checkin/SelectChldAttTests.java
index 6e9b32f..8cca0f6 100755
--- a/test/src/xmlobject/checkin/SelectChldAttTests.java
+++ b/test/src/xmlobject/checkin/SelectChldAttTests.java
@@ -76,14 +76,14 @@
 
         xos = doc.selectChildren(uri, "string");
         //print("2 selectChildren 'string' : ", xos);
-        assertTrue("2 selectChildren 'string' : ", verifyResult(xos, new String[]{"<xml-fragment>... some text ...</xml-fragment>"}));
+        assertTrue("2 selectChildren 'string' : ", verifyResult(xos, new String[]{"<xml-fragment> ... some text ... </xml-fragment>"}));
 
         // elemA
         xos = doc.selectChildren(new QName(uri, "elemA"));
         //print("3 selectChildren 'elemA' : ", xos);
         assertTrue("3 selectChildren 'elemA' : ",
             verifyResult(xos, new String[]{"<xml-fragment price=\"4.321\" xmlns:sel=\"" + uri + "\">\n" +
-                "  <sel:topLevelElement>this is wildcard bucket</sel:topLevelElement>\n" +
+                "  <sel:topLevelElement> this is wildcard bucket </sel:topLevelElement>\n" +
                 "</xml-fragment>"}));
 
         // select a known attribute
@@ -106,7 +106,7 @@
         //print("7     selectChildren set'##other' : " , xos[0].selectChildren(QNameSet.forWildcardNamespaceString("##other", uri)));
         assertTrue("7     selectChildren set'##other' : ",
             verifyResult(xos[0].selectChildren(QNameSet.forWildcardNamespaceString("##other", uri))
-                , new String[]{"<xml-fragment xmlns:p=\"uri:other_namespace\">element in #other namespace</xml-fragment>"}));
+                , new String[]{"<xml-fragment xmlns:p=\"uri:other_namespace\"> element in #other namespace </xml-fragment>"}));
         //print("8     selectAttributes set'##other' : ", xos[0].selectAttributes(QNameSet.forWildcardNamespaceString("##other", uri)));
         assertTrue("8     selectAttributes set'##other' : ",
             verifyResult(xos[0].selectAttributes(QNameSet.forWildcardNamespaceString("##other", uri)),
@@ -118,9 +118,9 @@
         //print("10    selectChildren set'##any' : " , xos[0].selectChildren(QNameSet.forWildcardNamespaceString("##any", uri)));
         assertTrue("10    selectChildren set'##any' : ",
             verifyResult(xos[0].selectChildren(QNameSet.forWildcardNamespaceString("##any", uri))
-                , new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\">element from typeC</xml-fragment>",
-                    "<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\">element in the 'any' bucket for typeExtendedC</xml-fragment>",
-                    "<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\">element from typeExtendedC</xml-fragment>"}));
+                , new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element from typeC </xml-fragment>",
+                    "<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element in the 'any' bucket for typeExtendedC </xml-fragment>",
+                    "<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element from typeExtendedC </xml-fragment>"}));
 
         // select elements in the any bucket by excluding the the known elements
         QNameSetBuilder qnsb = new QNameSetBuilder();
@@ -131,12 +131,12 @@
         //print("11a    selectChildren in the any bucket for typeExtendedC: " , xos[0].selectChildren(qnsb.toQNameSet()));
         assertTrue("11a    selectChildren in the any bucket for typeExtendedC: ",
             verifyResult(xos[0].selectChildren(qnsb.toQNameSet()),
-                new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\">element in the 'any' bucket for typeExtendedC</xml-fragment>"}));
+                new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element in the 'any' bucket for typeExtendedC </xml-fragment>"}));
 
         //print("11b    selectChildren in the any bucket for typeExtendedC: " , xos[0].selectChildren(TypeExtendedC.type.qnameSetForWildcardElements()));
         assertTrue("11b    selectChildren in the any bucket for typeExtendedC: ",
             verifyResult(xos[0].selectChildren(TypeExtendedC.type.qnameSetForWildcardElements()),
-                new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\">element in the 'any' bucket for typeExtendedC</xml-fragment>"}));
+                new String[]{"<xml-fragment xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:p=\"uri_other_namespace\"> element in the 'any' bucket for typeExtendedC </xml-fragment>"}));
 
         // select attributes in the any bucket by excluding the the known attributes
         qnsb = new QNameSetBuilder();
diff --git a/test/src/xmlobject/detailed/CopyTest.java b/test/src/xmlobject/detailed/CopyTest.java
index 7ef7430..7367b7d 100644
--- a/test/src/xmlobject/detailed/CopyTest.java
+++ b/test/src/xmlobject/detailed/CopyTest.java
@@ -25,7 +25,7 @@
     @Test

     public void testXobjTypeOnDomNodeCopy() throws Exception {

         XmlObject o = XmlObject.Factory.parse("<foo><a/></foo>");

-        String xobjOrgClassName = "org.apache.xmlbeans.impl.store.Xobj$DocumentXobj";

+        String xobjOrgClassName = "org.apache.xmlbeans.impl.store.DocumentXobj";

         assertEquals("Invalid Type!", o.getDomNode().getClass().getName(), xobjOrgClassName);

 

         XmlObject o2 = o.copy();

@@ -33,8 +33,8 @@
         System.out.println("DocXobj:" + xobjCopyClassName);

 

         // check for the expected type

-        assertEquals("Invalid Type!", "org.apache.xmlbeans.impl.store.Xobj$DocumentXobj", xobjOrgClassName);

-        assertEquals("Invalid Type!", "org.apache.xmlbeans.impl.store.Xobj$DocumentXobj", xobjCopyClassName);

+        assertEquals("Invalid Type!", "org.apache.xmlbeans.impl.store.DocumentXobj", xobjOrgClassName);

+        assertEquals("Invalid Type!", "org.apache.xmlbeans.impl.store.DocumentXobj", xobjCopyClassName);

     }

 

     // Test the same for a simple untyped XmlObject copy

@@ -46,7 +46,6 @@
         assertEquals("Invalid Type!", untypedXobjClass, o.getClass().getName());

 

         XmlObject o2 = o.copy();

-        String xobjClass = o2.getClass().getName();

         // type should be unchanged after the copy

         assertEquals("Invalid Type!", untypedXobjClass, o2.getClass().getName());

     }

diff --git a/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/checkin/NameCollisionTest.java b/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/checkin/NameCollisionTest.java
index 4c63aa4..dda71c4 100755
--- a/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/checkin/NameCollisionTest.java
+++ b/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/checkin/NameCollisionTest.java
@@ -23,53 +23,54 @@
 
 import org.apache.xmlbeans.XmlString;
 
-public class NameCollisionTest extends TestCase{
+public class NameCollisionTest extends TestCase {
 
-    public NameCollisionTest(String s){
+    public NameCollisionTest(String s) {
         super(s);
     }
 
-    public void test(){
-        CompanyDocument poDoc ;
+    public void test() {
+        CompanyDocument poDoc;
 
-              poDoc= CompanyDocument.Factory.newInstance();
-              CompanyType po=poDoc.addNewCompany();
+        poDoc = CompanyDocument.Factory.newInstance();
+        CompanyType po = poDoc.addNewCompany();
 
 
-              int LEN=20;
+        int LEN = 20;
 
-             StringBuffer sExpected=new StringBuffer();
-              sExpected.append("<com:company xmlns:com=" +
-                      "\"interfaceFeature/xbean/methodNameCollision/company\">" +
-                      "<departments>");
-             DepartmentType dept=po.addNewDepartments();
-             ConsultantType[] it= new ConsultantType[LEN];
-              for (int i=0; i < LEN; i++){
-                     it[i]=dept.addNewConsultant();
-                     XmlString s= XmlString.Factory.newInstance();
-                     it[i].setAge(50);
-                    it[i].setName4("BEAN Name"+i);
-                      sExpected.append("<consultant age=\"50\" name=\"BEAN Name"+i+"\"/>");
-              }
+        StringBuilder sExpected = new StringBuilder();
+        sExpected.append("<com:company xmlns:com=" +
+                "\"interfaceFeature/xbean/methodNameCollision/company\">" +
+                "<departments>");
+        DepartmentType dept = po.addNewDepartments();
+        ConsultantType[] it = new ConsultantType[LEN];
+        for (int i = 0; i < LEN; i++) {
+            it[i] = dept.addNewConsultant();
+            XmlString s = XmlString.Factory.newInstance();
+            it[i].setAge(50);
+            it[i].setName4("BEAN Name" + i);
+            sExpected.append("<consultant age=\"50\" name=\"BEAN Name" + i + "\"/>");
+        }
 
-            sExpected.append("</departments></com:company>");
+        sExpected.append("</departments></com:company>");
 
-            int[][] ints = new int[2][3];
-            for (int i = 0; i < ints.length; i++)
-                for (int j = 0; j < ints[i].length; j++)
-                    ints[i][j] = (i+1) * (j+1);
+        int[][] ints = new int[2][3];
+        for (int i = 0; i < ints.length; i++)
+            for (int j = 0; j < ints[i].length; j++)
+                ints[i][j] = (i + 1) * (j + 1);
 
-            IFoo.Inner inner = new IFoo.Inner() {
-                public String getValue() { return "inner value"; }
-            };
+        IFoo.Inner inner = new IFoo.Inner() {
+            public String getValue() {
+                return "inner value";
+            }
+        };
 
-             assertEquals( sExpected.toString(), poDoc.xmlText());
-             assertTrue( poDoc.validate() );
-             assertEquals("Name0", it[0].getName());
-             assertEquals("Name2: [1, 2, 3, ], [2, 4, 6, ], ",it[0].getName2(ints));
-             assertEquals("Name3: inner value",it[0].getName3(inner));
-            assertEquals("BEAN Name0",it[0].getName4());
-
+        assertEquals(sExpected.toString(), poDoc.xmlText());
+        assertTrue(poDoc.validate());
+        assertEquals("Name0", it[0].getName());
+        assertEquals("Name2: [1, 2, 3, ], [2, 4, 6, ], ", it[0].getName2(ints));
+        assertEquals("Name3: inner value", it[0].getName3(inner));
+        assertEquals("BEAN Name0", it[0].getName4());
 
 
     }
diff --git a/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/existing/FooHandler.java b/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/existing/FooHandler.java
index a6e239a..7a99230 100755
--- a/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/existing/FooHandler.java
+++ b/test/src/xmlobject/extensions/interfaceFeature/methodNameCollision/existing/FooHandler.java
@@ -24,7 +24,7 @@
     }
 
     public static String getName2(XmlObject xo, int[][] ints){
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("Name2: ");
         for (int i = 0; i < ints.length; i++)
         {
diff --git a/test/src/xmlobject/extensions/interfaceFeature/multInterfaces/checkin/MultInterfacesTest.java b/test/src/xmlobject/extensions/interfaceFeature/multInterfaces/checkin/MultInterfacesTest.java
index 34f47ff..48a1641 100755
--- a/test/src/xmlobject/extensions/interfaceFeature/multInterfaces/checkin/MultInterfacesTest.java
+++ b/test/src/xmlobject/extensions/interfaceFeature/multInterfaces/checkin/MultInterfacesTest.java
@@ -50,13 +50,13 @@
         items.setItemArray(it);
         po.setItems(items);
 
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append(
                 "<pur:purchaseOrder xmlns:pur=\"http://xbean.interface_feature/multInterfaces/PurchaseOrder\">");
 
         sb.append("<pur:items>");
 
-        StringBuffer sbContent = new StringBuffer();
+        StringBuilder sbContent = new StringBuilder();
         for (int i = 0; i < LEN; i++)
             sbContent.append("<pur:item><pur:USPrice>"+i+"</pur:USPrice></pur:item>");
 
@@ -74,7 +74,7 @@
 
         poDoc.setMinPrice((double)price);
 
-        sbContent = new StringBuffer();
+        sbContent = new StringBuilder();
         for (int i = 0; i < LEN; i++)
            if( i< price )
             sbContent.append("<pur:item><pur:USPrice>"+price+"</pur:USPrice></pur:item>");
diff --git a/test/src/xmlobject/extensions/interfaceFeature/readOnlyBean/checkin/ReadOnlyTest.java b/test/src/xmlobject/extensions/interfaceFeature/readOnlyBean/checkin/ReadOnlyTest.java
index 01410c8..c9399e4 100755
--- a/test/src/xmlobject/extensions/interfaceFeature/readOnlyBean/checkin/ReadOnlyTest.java
+++ b/test/src/xmlobject/extensions/interfaceFeature/readOnlyBean/checkin/ReadOnlyTest.java
@@ -15,44 +15,46 @@
 package xmlobject.extensions.interfaceFeature.readOnlyBean.checkin;
 
 
-import interfaceFeature.xbean.readOnlyBean.purchaseOrder.PurchaseOrderDocument ;
+import interfaceFeature.xbean.readOnlyBean.purchaseOrder.PurchaseOrderDocument;
 import interfaceFeature.xbean.readOnlyBean.purchaseOrder.PurchaseOrderType;
 import interfaceFeature.xbean.readOnlyBean.purchaseOrder.Items;
 
 
 import java.math.BigDecimal;
+
 import junit.framework.*;
 
-public class ReadOnlyTest extends TestCase{
+public class ReadOnlyTest extends TestCase {
 
 
-      public  ReadOnlyTest(String s){
-            super(s);
+    public ReadOnlyTest(String s) {
+        super(s);
+    }
+
+    public void test() {
+
+        PurchaseOrderDocument poDoc;
+
+        poDoc = PurchaseOrderDocument.Factory.newInstance();
+        PurchaseOrderType po = poDoc.addNewPurchaseOrder();
+        int LEN = 20;
+
+        Items.Item[] it = new Items.Item[LEN];
+        for (int i = 0; i < LEN; i++) {
+            it[i] = Items.Item.Factory.newInstance();
+            it[i].setUSPrice(new BigDecimal("" + 4));
         }
-    public void test(){
+        Items items = Items.Factory.newInstance();
+        items.setItemArray(it);
+        po.setItems(items);
 
-         PurchaseOrderDocument poDoc ;
-
-         poDoc= PurchaseOrderDocument.Factory.newInstance();
-         PurchaseOrderType po=poDoc.addNewPurchaseOrder();
-         int LEN=20;
-
-         Items.Item[] it= new Items.Item[LEN];
-         for (int i=0; i< LEN; i++){
-                it[i]=Items.Item.Factory.newInstance();
-                it[i].setUSPrice(new BigDecimal(""+ 4 ));
-         }
-         Items items= Items.Factory.newInstance();
-            items.setItemArray(it);
-         po.setItems(items);
-
-         StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append(
                 "<pur:purchaseOrder xmlns:pur=\"http://xbean.interface_feature/readOnlyBean/PurchaseOrder\">");
 
         sb.append("<pur:items>");
 
-        StringBuffer sbContent = new StringBuffer();
+        StringBuilder sbContent = new StringBuilder();
         for (int i = 0; i < LEN; i++)
             sbContent.append("<pur:item><pur:USPrice>4</pur:USPrice></pur:item>");
 
@@ -63,18 +65,18 @@
                 sbContent.toString() +
                 sb.subSequence(pos, sb.length());
 
-        assertEquals( sExpected, poDoc.xmlText());
+        assertEquals(sExpected, poDoc.xmlText());
 
-        try{
+        try {
             poDoc.setPrice(10);
 
-        }catch (Exception t){
+        } catch (Exception t) {
             t.printStackTrace(System.err);
             System.exit(-1);
         }
 
 
-       assertTrue ( !poDoc.validate() );
+        assertTrue(!poDoc.validate());
     }
-   
+
 }
diff --git a/test/src/xmlobject/extensions/prePostFeature/ValueRestriction/checkin/ValueRestrictionTest.java b/test/src/xmlobject/extensions/prePostFeature/ValueRestriction/checkin/ValueRestrictionTest.java
index c4ab0fe..e84b714 100755
--- a/test/src/xmlobject/extensions/prePostFeature/ValueRestriction/checkin/ValueRestrictionTest.java
+++ b/test/src/xmlobject/extensions/prePostFeature/ValueRestriction/checkin/ValueRestrictionTest.java
@@ -19,53 +19,54 @@
 import org.apache.xmlbeans.XmlString;
 
 
-public class ValueRestrictionTest extends TestCase{
+public class ValueRestrictionTest extends TestCase {
 
-      public  ValueRestrictionTest(String s){
-            super(s);
+    public ValueRestrictionTest(String s) {
+        super(s);
+    }
+
+    public void test() throws Exception {
+
+        CompanyDocument poDoc;
+
+        poDoc = CompanyDocument.Factory.newInstance();
+        CompanyType po = poDoc.addNewCompany();
+
+
+        int LEN = 20;
+
+        StringBuilder sExpected = new StringBuilder();
+        sExpected.append("<com:company xmlns:com=\"http://xbean.prePostFeature/ValueRestriction/company\"><departments>");
+        DepartmentType dept = po.addNewDepartments();
+        ConsultantType[] it = new ConsultantType[LEN];
+        for (int i = 0; i < LEN; i++) {
+            it[i] = dept.addNewConsultant();
+            XmlString s = XmlString.Factory.newInstance();
+            it[i].setAge(50);
+            sExpected.append("<consultant age=\"50\"/>");
         }
-    public void test() throws Exception{
 
-         CompanyDocument poDoc ;
+        sExpected.append("</departments></com:company>");
 
-         poDoc= CompanyDocument.Factory.newInstance();
-         CompanyType po=poDoc.addNewCompany();
+        assertEquals(sExpected.toString(), poDoc.xmlText());
+        assertTrue(poDoc.validate());
 
 
-         int LEN=20;
-
-        StringBuffer sExpected=new StringBuffer();
-         sExpected.append("<com:company xmlns:com=\"http://xbean.prePostFeature/ValueRestriction/company\"><departments>");
-        DepartmentType dept=po.addNewDepartments();
-        ConsultantType[] it= new ConsultantType[LEN];
-         for (int i=0; i < LEN; i++){
-                it[i]=dept.addNewConsultant();
-                XmlString s= XmlString.Factory.newInstance();
-                it[i].setAge(50);
-                 sExpected.append("<consultant age=\"50\"/>");
-         }
-
-       sExpected.append("</departments></com:company>");
-
-        assertEquals( sExpected.toString(), poDoc.xmlText());
-        assertTrue( poDoc.validate() );
+        xmlobject.extensions.prePostFeature.ValueRestriction.existing.SetterHandler.bReady = true;
 
 
-       xmlobject.extensions.prePostFeature.ValueRestriction.existing.SetterHandler.bReady=true;
+        for (int i = 0; i < LEN; i++) {
+            it[i].setAge(150);
+        }
 
+        assertEquals(sExpected.toString(), poDoc.xmlText());
+        assertTrue(poDoc.validate());
 
-         for (int i=0; i< LEN; i++){
-                it[i].setAge(150);
-         }
-
-        assertEquals( sExpected.toString(), poDoc.xmlText());
-        assertTrue( poDoc.validate() );
-
-        for (int i=0; i< LEN; i++){
-                it[i].setEmployeeAge(150);
-         }
-       assertTrue( sExpected.toString().equals(poDoc.xmlText()) );
-       assertTrue ( poDoc.validate() );
+        for (int i = 0; i < LEN; i++) {
+            it[i].setEmployeeAge(150);
+        }
+        assertTrue(sExpected.toString().equals(poDoc.xmlText()));
+        assertTrue(poDoc.validate());
     }
 
 }
diff --git a/test/src/xmlobject/usertype/multipleItems/checkin/AverageTest.java b/test/src/xmlobject/usertype/multipleItems/checkin/AverageTest.java
index f9cc8d3..76ca345 100644
--- a/test/src/xmlobject/usertype/multipleItems/checkin/AverageTest.java
+++ b/test/src/xmlobject/usertype/multipleItems/checkin/AverageTest.java
@@ -126,7 +126,7 @@
     @Test(expected = XmlValueOutOfRangeException.class)
     public void testBadInput() throws XmlException{
 
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("<com:company xmlns:com=\"http://xbean.usertype/multipleItems/company\">");
         sb.append("<departments><consultant name=\"Joe Smith\" age=\"100\">");
         sb.append("<room>000-AB</room><room>0001-AB</room><room>002-AB</room>");
diff --git a/test/src/xmltokensource/detailed/XmlTextTest.java b/test/src/xmltokensource/detailed/XmlTextTest.java
index 5aad39c..6c8bd15 100755
--- a/test/src/xmltokensource/detailed/XmlTextTest.java
+++ b/test/src/xmltokensource/detailed/XmlTextTest.java
@@ -65,7 +65,7 @@
         m_xc = m_xo.newCursor();
         m_map.put(XmlOptions.SAVE_PRETTY_PRINT, "");
         String lnSep = System.getProperty("line.separator");
-        assertEquals("<a>" + lnSep + "  <b>" + lnSep + "    <c>text</c>" + lnSep + "  </b>" + lnSep + "</a>", m_xc.xmlText(m_map));
+        assertEquals("<a>" + lnSep + "  <b>" + lnSep + "    <c> text </c>" + lnSep + "  </b>" + lnSep + "</a>", m_xc.xmlText(m_map));
     }
 
     @Test
@@ -75,7 +75,7 @@
         m_map.put(XmlOptions.SAVE_PRETTY_PRINT, "");
         m_map.put(XmlOptions.SAVE_PRETTY_PRINT_INDENT, new Integer(3));
         String lnSep = System.getProperty("line.separator");
-        assertEquals("<a>" + lnSep + "   <b>" + lnSep + "      <c>text</c>" + lnSep + "   </b>" + lnSep + "</a>", m_xc.xmlText(m_map));
+        assertEquals("<a>" + lnSep + "   <b>" + lnSep + "      <c> text </c>" + lnSep + "   </b>" + lnSep + "</a>", m_xc.xmlText(m_map));
     }
 
     @Test
@@ -83,7 +83,7 @@
         m_xc = XmlObject.Factory.parse("<a>  \n  <b>  \n    <c> text   </c>   \n  </b>  \n  </a>").newCursor();
         m_map.put(XmlOptions.SAVE_PRETTY_PRINT, "");
         m_map.put(XmlOptions.SAVE_PRETTY_PRINT_INDENT, new Integer(-1));
-        assertEquals("<a><b><c>text</c></b></a>", m_xc.xmlText(m_map));
+        assertEquals("<a><b><c> text   </c></b></a>", m_xc.xmlText(m_map));
     }
 
     @Test
diff --git a/test/tools/src/tools/JUnit/SimpleResultFormatter.java b/test/tools/src/tools/JUnit/SimpleResultFormatter.java
index be0be96..36da245 100755
--- a/test/tools/src/tools/JUnit/SimpleResultFormatter.java
+++ b/test/tools/src/tools/JUnit/SimpleResultFormatter.java
@@ -109,7 +109,7 @@
      */
     public void endTestSuite(JUnitTest suite) throws BuildException {
         String newLine = System.getProperty("line.separator");
-        StringBuffer sb = new StringBuffer("Testsuite: ");
+        StringBuilder sb = new StringBuilder("Testsuite: ");
         sb.append(suite.getName());
         sb.append(newLine);
         sb.append("Tests run: ");
diff --git a/test/tools/src/tools/JUnit/XmlResultFormatter.java b/test/tools/src/tools/JUnit/XmlResultFormatter.java
index 3c97e8f..133811a 100755
--- a/test/tools/src/tools/JUnit/XmlResultFormatter.java
+++ b/test/tools/src/tools/JUnit/XmlResultFormatter.java
@@ -316,7 +316,7 @@
             if (index < 0) index = exp.length();
             exo.setErrorname(exp.substring(0, index));
         }
-        StringBuffer output = new StringBuffer();
+        StringBuilder output = new StringBuilder();
         String eol = System.getProperty("line.separator");
         output.append("[STDOUT]").append(eol);
         output.append(rec.getSysout()).append(eol);
diff --git a/test/tools/src/tools/JUnit/XmlResultFormatterImpl.java b/test/tools/src/tools/JUnit/XmlResultFormatterImpl.java
index 88c2185..4d8bf66 100755
--- a/test/tools/src/tools/JUnit/XmlResultFormatterImpl.java
+++ b/test/tools/src/tools/JUnit/XmlResultFormatterImpl.java
@@ -529,7 +529,7 @@
             exo.setErrorname(exp.substring(0, index));
         }
 
-        StringBuffer output = new StringBuffer();
+        StringBuilder output = new StringBuilder();
         String eol = System.getProperty("line.separator");
         output.append("[STDOUT]").append(eol);
         output.append(rec.getSysout()).append(eol);
diff --git a/test/tools/src/tools/ant/BuildFileTest.java b/test/tools/src/tools/ant/BuildFileTest.java
index 9bd0ef8..0adb01f 100755
--- a/test/tools/src/tools/ant/BuildFileTest.java
+++ b/test/tools/src/tools/ant/BuildFileTest.java
@@ -74,10 +74,10 @@
 
     protected Project project;
 
-    private StringBuffer logBuffer;
-    private StringBuffer fullLogBuffer;
-    private StringBuffer outBuffer;
-    private StringBuffer errBuffer;
+    private StringBuilder logBuffer;
+    private StringBuilder fullLogBuffer;
+    private StringBuilder outBuffer;
+    private StringBuilder errBuffer;
     private BuildException buildException;
 
 
@@ -186,8 +186,8 @@
         return buildException;
     }
 
-    private String cleanBuffer(StringBuffer buffer) {
-        StringBuffer cleanedBuffer = new StringBuffer();
+    private String cleanBuffer(StringBuilder buffer) {
+        StringBuilder cleanedBuffer = new StringBuilder();
         boolean cr = false;
         for (int i = 0; i < buffer.length(); i++) {
             char ch = buffer.charAt(i);
@@ -215,8 +215,8 @@
      * @param  filename name of project file to run
      */
     protected void configureProject(String filename) throws BuildException {
-        logBuffer = new StringBuffer();
-        fullLogBuffer = new StringBuffer();
+        logBuffer = new StringBuilder();
+        fullLogBuffer = new StringBuilder();
         project = new Project();
         project.init();
         project.setUserProperty( "ant.file" , new File(filename).getAbsolutePath() );
@@ -236,14 +236,14 @@
         try {
             sysOut.flush();
             sysErr.flush();
-            outBuffer = new StringBuffer();
+            outBuffer = new StringBuilder();
             PrintStream out = new PrintStream(new AntOutputStream());
             System.setOut(out);
-            errBuffer = new StringBuffer();
+            errBuffer = new StringBuilder();
             PrintStream err = new PrintStream(new AntOutputStream());
             System.setErr(err);
-            logBuffer = new StringBuffer();
-            fullLogBuffer = new StringBuffer();
+            logBuffer = new StringBuilder();
+            fullLogBuffer = new StringBuilder();
             buildException = null;
             project.executeTarget(targetName);
         } finally {
diff --git a/test/tools/src/tools/util/Util.java b/test/tools/src/tools/util/Util.java
index 9dc132f..3b74fc9 100755
--- a/test/tools/src/tools/util/Util.java
+++ b/test/tools/src/tools/util/Util.java
@@ -78,7 +78,7 @@
     {
         try
         {
-            StringBuffer sb = new StringBuffer(_charBuffer.length);
+            StringBuilder sb = new StringBuilder(_charBuffer.length);
             int amount = 0;
 
             while (true)
@@ -736,7 +736,7 @@
             hexStringFromBytes(byte[] bytes)
     {
         String hex = "0123456789abcdef";
-        StringBuffer buf = new StringBuffer(2 * bytes.length);
+        StringBuilder buf = new StringBuilder(2 * bytes.length);
 
         for (int i = 0; i < bytes.length; i++)
         {
@@ -768,7 +768,7 @@
     public static String gobbleUpReader(Reader in)
             throws Exception
     {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         int c;
 
         while (-1 != (c = in.read()))
@@ -805,7 +805,7 @@
         int lenIn = sIn.length();
         int iIn;
 
-        StringBuffer outBuf = new StringBuffer(lenIn + lenIn / 4);  // Plenty of room for extra characters
+        StringBuilder outBuf = new StringBuilder(lenIn + lenIn / 4);  // Plenty of room for extra characters
         char c;
 
         for (iIn = 0; iIn < lenIn; ++iIn)
@@ -1054,7 +1054,7 @@
         if (map == null)
             return str;
 
-        StringBuffer result = new StringBuffer();
+        StringBuilder result = new StringBuilder();
 
         int pos = 0;
         int open = -1;
@@ -1126,7 +1126,7 @@
             return str;
 
         int last = 0;
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         Matcher m = p.matcher(str);
 
         while (m.find())
@@ -1165,7 +1165,7 @@
     public static String escapeProperty(String s)
     {
         int len = s.length();
-        StringBuffer buf = new StringBuffer(len * 2);
+        StringBuilder buf = new StringBuilder(len * 2);
 
         for (int i = 0; i < len; ++i)
         {
diff --git a/test/tools/src/tools/xml/XmlComparator.java b/test/tools/src/tools/xml/XmlComparator.java
index bed1b23..2a5d1ee 100755
--- a/test/tools/src/tools/xml/XmlComparator.java
+++ b/test/tools/src/tools/xml/XmlComparator.java
@@ -24,24 +24,24 @@
 {
     public static class Diagnostic
     {
-        private StringBuffer message = null;
+        private StringBuilder message = null;
 
         private void add(String s)
         {
-            if (message==null)
-                 message = new StringBuffer();
+            if (message == null)
+                 message = new StringBuilder();
 
             message.append(s).append("\n");
         }
 
         public boolean hasMessage()
         {
-            return message!=null;
+            return message != null;
         }
 
         public String toString()
         {
-            return (message==null ? null : message.toString());
+            return (message == null ? null : message.toString());
         }
 
         public static void add(Diagnostic diag, String s)
diff --git a/xkit/README.txt b/xkit/README.txt
index 619c15f..4273293 100644
--- a/xkit/README.txt
+++ b/xkit/README.txt
@@ -13,7 +13,7 @@
  *  limitations under the License.
  */
 
-XMLBeans Development Kit Version 2.5.0
+XMLBeans Development Kit Version 3.1.0
 
 
 Welcome to XMLBeans!
@@ -22,53 +22,29 @@
 Kit contents:
 
 (1) One copy of xbean.jar, which contains XMLBeans.
-    Should work on any JDK 1.4.x or 1.5.x.
+    Should work on any JDK 1.6.x or newer.
     ./lib/xbean.jar
 
-(2) One copy of jsr173_1.0_api.jar, which contains classes
-    needed to parse XML files for use with XMLBeans.
-    ./lib/jsr173_1.0_api.jar
-
-(3) One copy of resolver.jar from Apache xml-commons. See scomp
+(2) One copy of resolver.jar from Apache xml-commons. See scomp
     documentation for when it is needed.
     ./lib/resolver.jar
 
-(4) One copy of xbean_xpath jar. Contains the XPath and XQuery
-    "glue" code, only needed if XPath-XQuery functionality is
-    required.
-    ./lib/xbean_xpath.jar
-
-(5) One copy of xmlpublic.jar, containing all the public interfaces of
-    XMLBeans. (Classes included here are a subset of those included
-    in xbean.jar.)
-    ./lib/xmlpublic.jar
-
-(6) One copy of xmlbeans-qname.jar, contains javax.xml.namespace
-    QName.class and NamespaceContext.class. These classes were
-    introduced in the jdk since 1.5. This jar is necesary on classpath
-    only if using jdk 1.4.   
-    ./lib/xmlbeans-qname.jar
-
-(7) License information for XML Beans and included libraries
+(3) License information for XML Beans and included libraries
     ./LICENSE.txt
     ./NOTICE.txt
 
-(8) One folder full of command-line scripts, pointing to the
+(4) One folder full of command-line scripts, pointing to the
     useful main() functions in the JAR.
     ./bin
 
-(9) A copy of the plain javadoc tree for org.apache.xmlbeans.*
-    ./docs/reference
+(5) A copy of the plain javadoc tree for org.apache.xmlbeans.*
+    ./docs/javadocs
 
-(10) A preliminary collection of nicely formatted user-level
-    documentation HTML (includes reformatted and nicely
-    organized javadoc as well)
+(6) A preliminary collection of nicely formatted user-level
+    documentation HTML
     ./docs/guide
 
-(11) A few sample schemas
-    ./schemas
-
-(12) Samples that show the use of the XMLBeans API. (You'll
+(7) Samples that show the use of the XMLBeans API. (You'll
     also find more samples at the XMLBeans web site.)
     ./samples
 
@@ -76,7 +52,7 @@
 
 (1) Setup.
 
-    1. Make sure you have a JDK 1.4.x installed (or 1.5.x); that
+    1. Make sure you have a JDK 1.6.x or later installed; that
        java[.exe] is on your path and that JAVA_HOME/bin contains
        java[.exe], javac[.exe], and jar[.exe].
 
diff --git a/xkit/doap_XMLBeans.rdf b/xkit/doap_XMLBeans.rdf
index 304f740..e4bfa33 100644
--- a/xkit/doap_XMLBeans.rdf
+++ b/xkit/doap_XMLBeans.rdf
@@ -47,6 +47,20 @@
     <category rdf:resource="http://projects.apache.org/category/xml" />
     <release>
       <Version>
+        <name>XMLBeans v3.1.0</name>
+        <created>2019-03-22</created>
+        <revision>3.1.0</revision>
+      </Version>
+    </release>
+    <release>
+      <Version>
+        <name>XMLBeans v3.0.2</name>
+        <created>2018-10-28</created>
+        <revision>3.0.2</revision>
+      </Version>
+    </release>
+    <release>
+      <Version>
         <name>XMLBeans v3.0.1</name>
         <created>2018-08-24</created>
         <revision>3.0.1</revision>