diff --git a/build.xml b/build.xml
index f60478e..83d817f 100644
--- a/build.xml
+++ b/build.xml
@@ -332,6 +332,9 @@
         <replaceregexp match="^.*@deprecated.*\r?\n.*\r?\n" replace="" flags="gm">
             <fileset dir="build/bootstrap/generated-sources" includes="**/*.java"/>
         </replaceregexp>
+        <replaceregexp match='^(\s+).*type =[^\n]*\r?\n.*\((.*)\.class[^"]+"([^"]+)"[^"]+("[^"]+").*$' replace="\1org.apache.xmlbeans.impl.schema.XmlObjectFactory&lt;\2> Factory = new org.apache.xmlbeans.impl.schema.XmlObjectFactory&lt;>(\3.TypeSystemHolder.typeSystem, \4);&#10;\1org.apache.xmlbeans.SchemaType type = Factory.getType();" flags="gm">
+            <fileset dir="build/bootstrap/generated-sources" includes="**/*.java" excludes="**/impl/xb/*/impl/**"/>
+        </replaceregexp>
         <replace dir="build/bootstrap/generated-sources" token=" enumValue()" value=" getEnumValue()" includes="**/*.java"/>
         <replace dir="build/bootstrap/generated-sources" token=" set(org.apache.xmlbeans.StringEnumAbstractBase" value=" setEnumValue(org.apache.xmlbeans.StringEnumAbstractBase" includes="**/*.java"/>
         <replace dir="build/bootstrap/generated-sources" token="java.util.List list" value="java.util.List&lt;?&gt; list" includes="**/*.java"/>
@@ -382,8 +385,8 @@
 
         <schemaCompProd classpathref="oldschemas" dest="build"/>
 
-        <!-- delete old schema classes -->
-        <delete dir="build/classes/org/apache/xmlbeans/impl/xb"/>
+        <!-- delete old schema classes and classes referencing on them -->
+        <delete dir="build/classes/org/apache/xmlbeans" excludes="metadata/**"/>
     </target>
 
     <target name="compile" depends="process-resources" description="Compile sources and resources">
@@ -400,6 +403,8 @@
             <src refid="sources"/>
             <classpath path="${saxon.jar}"/>
             <classpath path="${slf4j-api.jar}"/>
+            <classpath path="${javaparser.core.jar}"/>
+            <classpath path="${ant.jar}"/>
         </javac>
 
         <javac release="9"
@@ -763,6 +768,7 @@
                 <exclude name="test/resources/xbean/dom/W3C/level2/core/files/**"/>
                 <exclude name="test/resources/xbean/xmlobject/soap-envelope.xsd"/>
                 <exclude name="test/resources/xbean/xmlobject/soap12-encoding.xsd"/>
+                <exclude name="test/resources/xbean/compile/scomp/partials/**"/>
             </fileset>
         </rat:report>
 
diff --git a/src/main/java/org/apache/xmlbeans/SchemaCodePrinter.java b/src/main/java/org/apache/xmlbeans/SchemaCodePrinter.java
index 67821e7..f04c322 100755
--- a/src/main/java/org/apache/xmlbeans/SchemaCodePrinter.java
+++ b/src/main/java/org/apache/xmlbeans/SchemaCodePrinter.java
@@ -24,8 +24,23 @@
  */
 
 public interface SchemaCodePrinter {
-    void printTypeImpl(Writer writer, SchemaType sType) throws IOException;
+    // implement a method of each pair ... otherwise a stackoverflow is inevitable ...
+    @Deprecated
+    default void printTypeImpl(Writer writer, SchemaType sType) throws IOException {
+        printTypeImpl(writer, sType, null);
+    }
 
-    void printType(Writer writer, SchemaType sType) throws IOException;
+    default void printTypeImpl(Writer writer, SchemaType sType, XmlOptions opt) throws IOException {
+        printTypeImpl(writer, sType);
+    }
+
+    @Deprecated
+    default void printType(Writer writer, SchemaType sType) throws IOException {
+        printType(writer, sType, null);
+    }
+
+    default void printType(Writer writer, SchemaType sType, XmlOptions opt) throws IOException {
+        printType(writer, sType);
+    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlAnySimpleType.java b/src/main/java/org/apache/xmlbeans/XmlAnySimpleType.java
index b4d8a01..95678af 100644
--- a/src/main/java/org/apache/xmlbeans/XmlAnySimpleType.java
+++ b/src/main/java/org/apache/xmlbeans/XmlAnySimpleType.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-1/#Simple_Type_Definition">xs:anySimpleType</a> type.
@@ -22,10 +24,11 @@
  * All simple types are convertible to {@link String}.
  */
 public interface XmlAnySimpleType extends XmlObject {
+    XmlObjectFactory<XmlAnySimpleType> Factory = new XmlObjectFactory<>("_BI_anySimpleType");
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_anySimpleType");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns the value as a {@link String}
@@ -36,134 +39,5 @@
      * Sets the value as a {@link String}
      **/
     void setStringValue(String s);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlAnySimpleType}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlAnySimpleType}
-         */
-        public static XmlAnySimpleType newInstance() {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlAnySimpleType}
-         */
-        public static XmlAnySimpleType newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlAnySimpleType} value
-         */
-        public static XmlAnySimpleType newValue(Object obj) {
-            return type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a String. For example: "<code>&lt;xml-fragment&gt;anything&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlAnySimpleType parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a String. For example: "<code>&lt;xml-fragment&gt;anything&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlAnySimpleType parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a File.
-         */
-        public static XmlAnySimpleType parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a File.
-         */
-        public static XmlAnySimpleType parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a URL.
-         */
-        public static XmlAnySimpleType parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a URL.
-         */
-        public static XmlAnySimpleType parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from an InputStream.
-         */
-        public static XmlAnySimpleType parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from an InputStream.
-         */
-        public static XmlAnySimpleType parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a Reader.
-         */
-        public static XmlAnySimpleType parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a Reader.
-         */
-        public static XmlAnySimpleType parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a DOM Node.
-         */
-        public static XmlAnySimpleType parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from a DOM Node.
-         */
-        public static XmlAnySimpleType parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from an XMLStreamReader.
-         */
-        public static XmlAnySimpleType parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnySimpleType} fragment from an XMLStreamReader.
-         */
-        public static XmlAnySimpleType parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlAnyURI.java b/src/main/java/org/apache/xmlbeans/XmlAnyURI.java
index 8fbe686..993c3e5 100644
--- a/src/main/java/org/apache/xmlbeans/XmlAnyURI.java
+++ b/src/main/java/org/apache/xmlbeans/XmlAnyURI.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#anyURI">xs:anyURI</a> type.
@@ -22,138 +24,11 @@
  * Convertible to {@link String}.
  */
 public interface XmlAnyURI extends XmlAnySimpleType {
+    XmlObjectFactory<XmlAnyURI> Factory = new XmlObjectFactory<>("_BI_anyURI");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_anyURI");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlAnyURI}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlAnyURI}
-         */
-        public static XmlAnyURI newInstance() {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlAnyURI}
-         */
-        public static XmlAnyURI newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlAnyURI} value
-         */
-        public static XmlAnyURI newValue(Object obj) {
-            return (XmlAnyURI) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a String. For example: "<code>&lt;xml-fragment&gt;http://www.w3.org/&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlAnyURI parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a String. For example: "<code>&lt;xml-fragment&gt;http://www.w3.org/&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlAnyURI parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a File.
-         */
-        public static XmlAnyURI parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a File.
-         */
-        public static XmlAnyURI parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a URL.
-         */
-        public static XmlAnyURI parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a URL.
-         */
-        public static XmlAnyURI parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from an InputStream.
-         */
-        public static XmlAnyURI parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from an InputStream.
-         */
-        public static XmlAnyURI parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a Reader.
-         */
-        public static XmlAnyURI parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a Reader.
-         */
-        public static XmlAnyURI parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a DOM Node.
-         */
-        public static XmlAnyURI parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from a DOM Node.
-         */
-        public static XmlAnyURI parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from an XMLStreamReader.
-         */
-        public static XmlAnyURI parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlAnyURI} fragment from an XMLStreamReader.
-         */
-        public static XmlAnyURI parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlBeans.java b/src/main/java/org/apache/xmlbeans/XmlBeans.java
index 79c056f..c8749c0 100644
--- a/src/main/java/org/apache/xmlbeans/XmlBeans.java
+++ b/src/main/java/org/apache/xmlbeans/XmlBeans.java
@@ -232,7 +232,7 @@
      * linking, and returns a unioned typeloader that is suitable for
      * creating instances.
      */
-    public static SchemaTypeLoader loadXsd(XmlObject[] schemas) throws XmlException {
+    public static SchemaTypeLoader loadXsd(XmlObject... schemas) throws XmlException {
         return loadXsd(schemas, null);
     }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlBoolean.java b/src/main/java/org/apache/xmlbeans/XmlBoolean.java
index 9d84b6f..b32cb4b 100644
--- a/src/main/java/org/apache/xmlbeans/XmlBoolean.java
+++ b/src/main/java/org/apache/xmlbeans/XmlBoolean.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#boolean">xs:boolean</a> type.
@@ -22,6 +24,8 @@
  * Naturally, convertible to Java boolean.
  */
 public interface XmlBoolean extends XmlAnySimpleType {
+    XmlObjectFactory<XmlBoolean> Factory = new XmlObjectFactory<>("_BI_boolean");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
@@ -36,134 +40,5 @@
      * Sets this value as a boolean
      */
     void setBooleanValue(boolean v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlBoolean}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlBoolean}
-         */
-        public static XmlBoolean newInstance() {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlBoolean}
-         */
-        public static XmlBoolean newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlBoolean} value
-         */
-        public static XmlBoolean newValue(Object obj) {
-            return (XmlBoolean) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a String. For example: "<code>&lt;xml-fragment&gt;true&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlBoolean parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a String. For example: "<code>&lt;xml-fragment&gt;true&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlBoolean parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a File.
-         */
-        public static XmlBoolean parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a File.
-         */
-        public static XmlBoolean parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a URL.
-         */
-        public static XmlBoolean parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a URL.
-         */
-        public static XmlBoolean parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from an InputStream.
-         */
-        public static XmlBoolean parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from an InputStream.
-         */
-        public static XmlBoolean parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a Reader.
-         */
-        public static XmlBoolean parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a Reader.
-         */
-        public static XmlBoolean parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a DOM Node.
-         */
-        public static XmlBoolean parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from a DOM Node.
-         */
-        public static XmlBoolean parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from an XMLStreamReader.
-         */
-        public static XmlBoolean parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlBoolean} fragment from an XMLStreamReader.
-         */
-        public static XmlBoolean parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlByte.java b/src/main/java/org/apache/xmlbeans/XmlByte.java
index 05093e6..dfa999b 100644
--- a/src/main/java/org/apache/xmlbeans/XmlByte.java
+++ b/src/main/java/org/apache/xmlbeans/XmlByte.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#byte">xs:byte</a> type.
@@ -22,10 +24,12 @@
  * Naturally, convertible to Java byte.
  */
 public interface XmlByte extends XmlShort {
+    XmlObjectFactory<XmlByte> Factory = new XmlObjectFactory<>("_BI_byte");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_byte");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a byte
@@ -36,134 +40,5 @@
      * Sets this value as a byte
      */
     void setByteValue(byte s);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlByte}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlByte}
-         */
-        static XmlByte newInstance() {
-            return (XmlByte) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlByte}
-         */
-        static XmlByte newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlByte) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlByte} value
-         */
-        static XmlByte newValue(Object obj) {
-            return (XmlByte) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123&lt;/xml-fragment&gt;</code>".
-         */
-        static XmlByte parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123&lt;/xml-fragment&gt;</code>".
-         */
-        static XmlByte parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a File.
-         */
-        static XmlByte parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a File.
-         */
-        static XmlByte parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a URL.
-         */
-        static XmlByte parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a URL.
-         */
-        static XmlByte parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from an InputStream.
-         */
-        static XmlByte parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from an InputStream.
-         */
-        static XmlByte parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a Reader.
-         */
-        static XmlByte parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a Reader.
-         */
-        static XmlByte parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a DOM Node.
-         */
-        static XmlByte parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from a DOM Node.
-         */
-        static XmlByte parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from an XMLStreamReader.
-         */
-        static XmlByte parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlByte} fragment from an XMLStreamReader.
-         */
-        static XmlByte parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlByte) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlCalendar.java b/src/main/java/org/apache/xmlbeans/XmlCalendar.java
index b450ba5..8720da7 100644
--- a/src/main/java/org/apache/xmlbeans/XmlCalendar.java
+++ b/src/main/java/org/apache/xmlbeans/XmlCalendar.java
@@ -15,11 +15,11 @@
 
 package org.apache.xmlbeans;
 
-import java.util.GregorianCalendar;
+import java.math.BigDecimal;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.TimeZone;
-import java.math.BigDecimal;
 
 /**
  * An XML Schema compatible subclass of {@link java.util.GregorianCalendar GregorianCalendar}.
@@ -56,8 +56,8 @@
  * from {@link GregorianCalendar}, which chooses 1970. The reason 0 is preferable
  * is that it is a leap year and so it permits the date --2-29 to be specified
  * stably. A different default year can be chosen via the static method
- * {@link #setDefaultYear(int) XmlCalendar.setDefaultYear()}, or by setting the 
- * system property "user.defaultyear". If you do change this value, you should 
+ * {@link #setDefaultYear(int) XmlCalendar.setDefaultYear()}, or by setting the
+ * system property "user.defaultyear". If you do change this value, you should
  * pick another leap year such as 2000 and avoid non-leap years such as 1900.
  * </li>
  * <li>
@@ -78,32 +78,32 @@
  * of information.
  * </li>
  * </ol>
- */ 
+ */
 public class XmlCalendar extends GregorianCalendar
 {
     /**
      * Constructs an XmlCalendar for a standard XML
      * schema formatted date string.
-     * 
+     *
      * The parser accepts any of the following formats:
-     * 
+     *
      * YYYY-MM-DDThh:mm:ss          - dateTime
      * YYYY-MM-DD                   - date
      *            hh:mm:ss          - time
      * YYYY                         - gYear
      *    --MM                      - gMonth
      *      ---DD                   - gDay
-     * 
+     *
      * The parser actually accepts all 16 combinations of subsets of
      * fields (Y, M, D, T) using the same scheme, even for combinations
      * that are not defined as types in the schema spec, such as
      * year, day, and time:
-     * 
+     *
      * YYYY--DDThh:mm:ss            - [everything but month specified]
-     * 
+     *
      * In the string, each field must be padded to its full width, for
      * example, January must be --01, not just --1.
-     * 
+     *
      * In particular, a year must be padded to at least four digits, so
      * "98" is not a valid year, although "1998" and "0098" are both valid
      * years, unambiguously 19 centuries separated from each other.  A year
@@ -115,34 +115,34 @@
      * or simple offsets from UTC in the range "-14:00" to "+14:00",
      * for example: "14:30:00-05:00" specifies 2:30 PM in the
      * afternoon at UTC-05:00, which is the same as EST.
-     * 
+     *
      * If a timezone is not specified, the default TimeZone is used.
-     */ 
+     */
     public XmlCalendar(String xmlSchemaDateString)
     {
         this(new GDate(xmlSchemaDateString)); // use GDate to parse
     }
-    
+
     /**
      * Constructs an XmlCalendar from a GDate.
-     * 
+     *
      * If the instance is not completed, you can round-trip to an
      * equivalent GDate by writing "new GDate(new XmlCalendar(gdate))".
      * However, if you access any of the unset fields of the calendar, all
      * the fields will be automatically filled in, so partial dates
      * without timezones or other fields will not round-trip after access.
-     */ 
+     */
     public XmlCalendar(GDateSpecification date)
     {
         this(GDate.timeZoneForGDate(date), date);
     }
-    
+
     private XmlCalendar(TimeZone tz, GDateSpecification date)
     {
         super(tz);
         setGregorianChange(_beginningOfTime); // proleptic
         clear();
-        
+
         if (date.hasYear())
         {
             int y = date.getYear(); // is never 0
@@ -176,10 +176,10 @@
             set(Calendar.DST_OFFSET, 0); // note!!  if we don't do this, then GregorianCalendar will pick up DST from the time zone
         }
     }
-    
+
     /**
      * Constructs an XmlCalendar from a Date.
-     * 
+     *
      * The default TimeZone is used for computing the various fields.
      */
     public XmlCalendar(Date date)
@@ -187,7 +187,7 @@
         this(TimeZone.getDefault(), new GDate(date));
         complete();
     }
-    
+
     /**
      * Constructs an XmlCalendar with the specified year, month, day,
      * hours, minutes, seconds, and optional fractional seconds, in
@@ -204,7 +204,7 @@
     {
         this(TimeZone.getDefault(), new GDate(year, month, day, hour, minute, second, fraction));
     }
-    
+
     /**
      * Constructs an XmlCalendar with the specified year, month, day,
      * hours, minutes, seconds, and optional fractional seconds, in
@@ -224,11 +224,11 @@
     {
         this(new GDate(year, month, day, hour, minute, second, fraction, tzSign, tzHour, tzMinute));
     }
-    
+
 
     /**
      * Gets the value for a given time field.
-     * 
+     *
      * Unlike the GregorianCalendar implementation, the get() does not
      * force a complete of all fields.  If you wish to force a completion
      * of all the fields, call getTime() first.
@@ -243,19 +243,19 @@
 
     /**
      * Constructs an empty instance with no fields set.
-     */ 
+     */
     public XmlCalendar()
     {
         setGregorianChange(_beginningOfTime); // proleptic
         clear();
     }
-    
+
     private static int defaultYear = Integer.MIN_VALUE;
-    private static final int DEFAULT_DEFAULT_YEAR = 0; 
-    
+    private static final int DEFAULT_DEFAULT_YEAR = 0;
+
     /**
      * Returns the default year that is used when no year is specified.
-     */ 
+     */
     public static int getDefaultYear()
     {
         if (defaultYear == Integer.MIN_VALUE)
@@ -275,19 +275,19 @@
         }
         return defaultYear;
     }
-    
+
     /**
      * Sets the default year to be used when no year is specified.
-     */ 
+     */
     public static void setDefaultYear(int year)
     {
         defaultYear = year;
     }
-    
+
     /**
      * Overrides GregorianCalendar.computeTime to apply a different
      * default year.  (It must be a leap year.)
-     */ 
+     */
     protected void computeTime()
     {
         boolean unsetYear = !isSet(YEAR);
@@ -303,9 +303,9 @@
                 clear(YEAR);
         }
     }
-        
-    private static Date _beginningOfTime = new Date(Long.MIN_VALUE);
-    
+
+    private static final Date _beginningOfTime = new Date(Long.MIN_VALUE);
+
     /**
      * Prints the XmlCalendar using a standard XML Schema
      * format, as described in XmlCalendar(String s).
diff --git a/src/main/java/org/apache/xmlbeans/XmlDate.java b/src/main/java/org/apache/xmlbeans/XmlDate.java
index 4314338..86ce6bd 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDate.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDate.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.Calendar;
 import java.util.Date;
 
@@ -29,10 +31,12 @@
  * @see GDate
  */
 public interface XmlDate extends XmlAnySimpleType {
+    XmlObjectFactory<XmlDate> Factory = new XmlObjectFactory<>("_BI_date");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_date");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link Calendar}
@@ -63,134 +67,5 @@
      * Sets this value as a {@link Date}
      */
     void setDateValue(Date d);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlDate}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlDate}
-         */
-        public static XmlDate newInstance() {
-            return (XmlDate) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlDate}
-         */
-        public static XmlDate newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlDate) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlDate} value
-         */
-        public static XmlDate newValue(Object obj) {
-            return (XmlDate) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a String. For example: "<code>&lt;xml-fragment&gt;2003-06-14&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDate parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a String. For example: "<code>&lt;xml-fragment&gt;2003-06-14&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDate parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a File.
-         */
-        public static XmlDate parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a File.
-         */
-        public static XmlDate parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a URL.
-         */
-        public static XmlDate parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a URL.
-         */
-        public static XmlDate parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from an InputStream.
-         */
-        public static XmlDate parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from an InputStream.
-         */
-        public static XmlDate parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a Reader.
-         */
-        public static XmlDate parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a Reader.
-         */
-        public static XmlDate parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a DOM Node.
-         */
-        public static XmlDate parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from a DOM Node.
-         */
-        public static XmlDate parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from an XMLStreamReader.
-         */
-        public static XmlDate parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDate} fragment from an XMLStreamReader.
-         */
-        public static XmlDate parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDate) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlDateTime.java b/src/main/java/org/apache/xmlbeans/XmlDateTime.java
index 8b58428..5b3123f 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDateTime.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDateTime.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.Calendar;
 import java.util.Date;
 
@@ -34,10 +36,12 @@
  * @see GDuration
  */
 public interface XmlDateTime extends XmlAnySimpleType {
+    XmlObjectFactory<XmlDateTime> Factory = new XmlObjectFactory<>("_BI_dateTime");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_dateTime");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link Calendar}
@@ -68,134 +72,5 @@
      * Sets this value as a {@link Date}
      */
     void setDateValue(Date d);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlDateTime}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlDateTime}
-         */
-        public static XmlDateTime newInstance() {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlDateTime}
-         */
-        public static XmlDateTime newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlDateTime} value
-         */
-        public static XmlDateTime newValue(Object obj) {
-            return (XmlDateTime) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a String. For example: "<code>&lt;xml-fragment&gt;2003-06-14T12:00:00&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDateTime parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a String. For example: "<code>&lt;xml-fragment&gt;2003-06-14T12:00:00&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDateTime parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a File.
-         */
-        public static XmlDateTime parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a File.
-         */
-        public static XmlDateTime parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a URL.
-         */
-        public static XmlDateTime parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a URL.
-         */
-        public static XmlDateTime parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from an InputStream.
-         */
-        public static XmlDateTime parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from an InputStream.
-         */
-        public static XmlDateTime parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a Reader.
-         */
-        public static XmlDateTime parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a Reader.
-         */
-        public static XmlDateTime parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a DOM Node.
-         */
-        public static XmlDateTime parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from a DOM Node.
-         */
-        public static XmlDateTime parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from an XMLStreamReader.
-         */
-        public static XmlDateTime parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDateTime} fragment from an XMLStreamReader.
-         */
-        public static XmlDateTime parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlDecimal.java b/src/main/java/org/apache/xmlbeans/XmlDecimal.java
index 21d38d7..5fe37cb 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDecimal.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDecimal.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.math.BigDecimal;
 
 /**
@@ -24,10 +26,12 @@
  * Convertible to {@link BigDecimal}.
  */
 public interface XmlDecimal extends XmlAnySimpleType {
+    XmlObjectFactory<XmlDecimal> Factory = new XmlObjectFactory<>("_BI_decimal");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_decimal");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link BigDecimal}
@@ -38,134 +42,5 @@
      * Sets this value as a {@link BigDecimal}
      */
     void setBigDecimalValue(BigDecimal bd);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlDecimal}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlDecimal}
-         */
-        public static XmlDecimal newInstance() {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlDecimal}
-         */
-        public static XmlDecimal newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlDecimal} value
-         */
-        public static XmlDecimal newValue(Object obj) {
-            return (XmlDecimal) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234.56789&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDecimal parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234.56789&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDecimal parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a File.
-         */
-        public static XmlDecimal parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a File.
-         */
-        public static XmlDecimal parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a URL.
-         */
-        public static XmlDecimal parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a URL.
-         */
-        public static XmlDecimal parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from an InputStream.
-         */
-        public static XmlDecimal parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from an InputStream.
-         */
-        public static XmlDecimal parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a Reader.
-         */
-        public static XmlDecimal parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a Reader.
-         */
-        public static XmlDecimal parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a DOM Node.
-         */
-        public static XmlDecimal parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from a DOM Node.
-         */
-        public static XmlDecimal parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from an XMLStreamReader.
-         */
-        public static XmlDecimal parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDecimal} fragment from an XMLStreamReader.
-         */
-        public static XmlDecimal parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlDouble.java b/src/main/java/org/apache/xmlbeans/XmlDouble.java
index 4d17298..24ebe2a 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDouble.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDouble.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#double">xs:double</a> type.
@@ -22,10 +24,12 @@
  * Naturally, convertible to a Java double.
  */
 public interface XmlDouble extends XmlAnySimpleType {
+    XmlObjectFactory<XmlDouble> Factory = new XmlObjectFactory<>("_BI_double");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_double");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a double
@@ -36,134 +40,5 @@
      * Sets this value as a double
      */
     void setDoubleValue(double v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlDouble}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlDouble}
-         */
-        public static XmlDouble newInstance() {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlDouble}
-         */
-        public static XmlDouble newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlDouble} value
-         */
-        public static XmlDouble newValue(Object obj) {
-            return (XmlDouble) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123.34e+57&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDouble parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123.34e+57&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDouble parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a File.
-         */
-        public static XmlDouble parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a File.
-         */
-        public static XmlDouble parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a URL.
-         */
-        public static XmlDouble parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a URL.
-         */
-        public static XmlDouble parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from an InputStream.
-         */
-        public static XmlDouble parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from an InputStream.
-         */
-        public static XmlDouble parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a Reader.
-         */
-        public static XmlDouble parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a Reader.
-         */
-        public static XmlDouble parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a DOM Node.
-         */
-        public static XmlDouble parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from a DOM Node.
-         */
-        public static XmlDouble parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from an XMLStreamReader.
-         */
-        public static XmlDouble parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDouble} fragment from an XMLStreamReader.
-         */
-        public static XmlDouble parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlDuration.java b/src/main/java/org/apache/xmlbeans/XmlDuration.java
index 02241df..c366919 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDuration.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDuration.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#duration">xs:duration</a> type.
@@ -24,10 +26,12 @@
  * @see GDuration
  */
 public interface XmlDuration extends XmlAnySimpleType {
+    XmlObjectFactory<XmlDuration> Factory = new XmlObjectFactory<>("_BI_duration");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_duration");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link GDuration}
@@ -38,134 +42,5 @@
      * Sets this value as a {@link GDuration}
      */
     void setGDurationValue(GDuration gd);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlDuration}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlDuration}
-         */
-        public static XmlDuration newInstance() {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlDuration}
-         */
-        public static XmlDuration newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlDuration} value
-         */
-        public static XmlDuration newValue(Object obj) {
-            return (XmlDuration) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a String. For example: "<code>&lt;xml-fragment&gt;P1Y2MT2H&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDuration parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a String. For example: "<code>&lt;xml-fragment&gt;P1Y2MT2H&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlDuration parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a File.
-         */
-        public static XmlDuration parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a File.
-         */
-        public static XmlDuration parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a URL.
-         */
-        public static XmlDuration parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a URL.
-         */
-        public static XmlDuration parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from an InputStream.
-         */
-        public static XmlDuration parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from an InputStream.
-         */
-        public static XmlDuration parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a Reader.
-         */
-        public static XmlDuration parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a Reader.
-         */
-        public static XmlDuration parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a DOM Node.
-         */
-        public static XmlDuration parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from a DOM Node.
-         */
-        public static XmlDuration parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from an XMLStreamReader.
-         */
-        public static XmlDuration parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlDuration} fragment from an XMLStreamReader.
-         */
-        public static XmlDuration parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlENTITIES.java b/src/main/java/org/apache/xmlbeans/XmlENTITIES.java
index 4f037bc..310dc94 100644
--- a/src/main/java/org/apache/xmlbeans/XmlENTITIES.java
+++ b/src/main/java/org/apache/xmlbeans/XmlENTITIES.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.List;
 
 
@@ -26,10 +28,12 @@
  * A list type.
  */
 public interface XmlENTITIES extends XmlAnySimpleType {
+    XmlObjectFactory<XmlENTITIES> Factory = new XmlObjectFactory<>("_BI_ENTITIES");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_ENTITIES");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns the value as a {@link List} of {@link String} values
@@ -45,134 +49,5 @@
      * Sets the value as a {@link List}
      */
     void setListValue(List<?> l);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlENTITIES}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlENTITIES}
-         */
-        public static XmlENTITIES newInstance() {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlENTITIES}
-         */
-        public static XmlENTITIES newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlENTITIES} value
-         */
-        public static XmlENTITIES newValue(Object obj) {
-            return (XmlENTITIES) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a String.
-         */
-        public static XmlENTITIES parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a String.
-         */
-        public static XmlENTITIES parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a File.
-         */
-        public static XmlENTITIES parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a File.
-         */
-        public static XmlENTITIES parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a URL.
-         */
-        public static XmlENTITIES parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a URL.
-         */
-        public static XmlENTITIES parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from an InputStream.
-         */
-        public static XmlENTITIES parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from an InputStream.
-         */
-        public static XmlENTITIES parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a Reader.
-         */
-        public static XmlENTITIES parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a Reader.
-         */
-        public static XmlENTITIES parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a DOM Node.
-         */
-        public static XmlENTITIES parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from a DOM Node.
-         */
-        public static XmlENTITIES parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from an XMLStreamReader.
-         */
-        public static XmlENTITIES parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITIES} fragment from an XMLStreamReader.
-         */
-        public static XmlENTITIES parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlENTITY.java b/src/main/java/org/apache/xmlbeans/XmlENTITY.java
index 955812e..9bf7aca 100644
--- a/src/main/java/org/apache/xmlbeans/XmlENTITY.java
+++ b/src/main/java/org/apache/xmlbeans/XmlENTITY.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#ENTITY">xs:ENTITY</a> type.
@@ -22,138 +24,11 @@
  * Convertible to {@link String}.
  */
 public interface XmlENTITY extends XmlNCName {
+    XmlObjectFactory<XmlENTITY> Factory = new XmlObjectFactory<>("_BI_ENTITY");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_ENTITY");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlENTITY}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlENTITY}
-         */
-        public static XmlENTITY newInstance() {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlENTITY}
-         */
-        public static XmlENTITY newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlENTITY} value
-         */
-        public static XmlENTITY newValue(Object obj) {
-            return (XmlENTITY) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a String.
-         */
-        public static XmlENTITY parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a String.
-         */
-        public static XmlENTITY parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a File.
-         */
-        public static XmlENTITY parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a File.
-         */
-        public static XmlENTITY parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a URL.
-         */
-        public static XmlENTITY parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a URL.
-         */
-        public static XmlENTITY parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from an InputStream.
-         */
-        public static XmlENTITY parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from an InputStream.
-         */
-        public static XmlENTITY parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a Reader.
-         */
-        public static XmlENTITY parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a Reader.
-         */
-        public static XmlENTITY parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a DOM Node.
-         */
-        public static XmlENTITY parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from a DOM Node.
-         */
-        public static XmlENTITY parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from an XMLStreamReader.
-         */
-        public static XmlENTITY parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlENTITY} fragment from an XMLStreamReader.
-         */
-        public static XmlENTITY parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlFloat.java b/src/main/java/org/apache/xmlbeans/XmlFloat.java
index a100bc2..f4e2ad5 100644
--- a/src/main/java/org/apache/xmlbeans/XmlFloat.java
+++ b/src/main/java/org/apache/xmlbeans/XmlFloat.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#float">xs:float</a> type.
@@ -22,10 +24,12 @@
  * Naturally, convertible to a Java float.
  */
 public interface XmlFloat extends XmlAnySimpleType {
+    XmlObjectFactory<XmlFloat> Factory = new XmlObjectFactory<>("_BI_float");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_float");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a float
@@ -36,134 +40,5 @@
      * Sets this value as a float
      */
     void setFloatValue(float v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlFloat}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlFloat}
-         */
-        public static XmlFloat newInstance() {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlFloat}
-         */
-        public static XmlFloat newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlFloat} value
-         */
-        public static XmlFloat newValue(Object obj) {
-            return (XmlFloat) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a String. For example: "<code>&lt;xml-fragment&gt;12.34e+5&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlFloat parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a String. For example: "<code>&lt;xml-fragment&gt;12.34e+5&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlFloat parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a File.
-         */
-        public static XmlFloat parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a File.
-         */
-        public static XmlFloat parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a URL.
-         */
-        public static XmlFloat parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a URL.
-         */
-        public static XmlFloat parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from an InputStream.
-         */
-        public static XmlFloat parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from an InputStream.
-         */
-        public static XmlFloat parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a Reader.
-         */
-        public static XmlFloat parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a Reader.
-         */
-        public static XmlFloat parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a DOM Node.
-         */
-        public static XmlFloat parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from a DOM Node.
-         */
-        public static XmlFloat parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from an XMLStreamReader.
-         */
-        public static XmlFloat parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlFloat} fragment from an XMLStreamReader.
-         */
-        public static XmlFloat parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlGDay.java b/src/main/java/org/apache/xmlbeans/XmlGDay.java
index 09effa7..1322ce5 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGDay.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGDay.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.Calendar;
 
 
@@ -29,10 +31,12 @@
  * @see GDate
  */
 public interface XmlGDay extends XmlAnySimpleType {
+    XmlObjectFactory<XmlGDay> Factory = new XmlObjectFactory<>("_BI_gDay");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gDay");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link Calendar}
@@ -63,134 +67,5 @@
      * Sets this value as an int from 1-31
      */
     void setIntValue(int v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlGDay}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlGDay}
-         */
-        public static XmlGDay newInstance() {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlGDay}
-         */
-        public static XmlGDay newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlGDay} value
-         */
-        public static XmlGDay newValue(Object obj) {
-            return (XmlGDay) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a String. For example: "<code>&lt;xml-fragment&gt;---14&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGDay parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a String. For example: "<code>&lt;xml-fragment&gt;---14&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGDay parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a File.
-         */
-        public static XmlGDay parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a File.
-         */
-        public static XmlGDay parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a URL.
-         */
-        public static XmlGDay parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a URL.
-         */
-        public static XmlGDay parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from an InputStream.
-         */
-        public static XmlGDay parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from an InputStream.
-         */
-        public static XmlGDay parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a Reader.
-         */
-        public static XmlGDay parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a Reader.
-         */
-        public static XmlGDay parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a DOM Node.
-         */
-        public static XmlGDay parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from a DOM Node.
-         */
-        public static XmlGDay parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from an XMLStreamReader.
-         */
-        public static XmlGDay parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGDay} fragment from an XMLStreamReader.
-         */
-        public static XmlGDay parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlGMonth.java b/src/main/java/org/apache/xmlbeans/XmlGMonth.java
index bb44425..8b8a09c 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGMonth.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGMonth.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.Calendar;
 
 
@@ -29,10 +31,12 @@
  * @see GDate
  */
 public interface XmlGMonth extends XmlAnySimpleType {
+    XmlObjectFactory<XmlGMonth> Factory = new XmlObjectFactory<>("_BI_gMonth");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gMonth");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link Calendar}
@@ -63,134 +67,5 @@
      * Sets this value as an int from 1-12
      */
     void setIntValue(int v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlGMonth}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlGMonth}
-         */
-        public static XmlGMonth newInstance() {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlGMonth}
-         */
-        public static XmlGMonth newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlGMonth} value
-         */
-        public static XmlGMonth newValue(Object obj) {
-            return (XmlGMonth) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a String. For example: "<code>&lt;xml-fragment&gt;--06&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGMonth parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a String. For example: "<code>&lt;xml-fragment&gt;--06&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGMonth parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a File.
-         */
-        public static XmlGMonth parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a File.
-         */
-        public static XmlGMonth parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a URL.
-         */
-        public static XmlGMonth parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a URL.
-         */
-        public static XmlGMonth parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from an InputStream.
-         */
-        public static XmlGMonth parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from an InputStream.
-         */
-        public static XmlGMonth parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a Reader.
-         */
-        public static XmlGMonth parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a Reader.
-         */
-        public static XmlGMonth parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a DOM Node.
-         */
-        public static XmlGMonth parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from a DOM Node.
-         */
-        public static XmlGMonth parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from an XMLStreamReader.
-         */
-        public static XmlGMonth parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonth} fragment from an XMLStreamReader.
-         */
-        public static XmlGMonth parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlGMonthDay.java b/src/main/java/org/apache/xmlbeans/XmlGMonthDay.java
index 0ceaeb3..3dbdc03 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGMonthDay.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGMonthDay.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.Calendar;
 
 
@@ -29,10 +31,12 @@
  * @see GDate
  */
 public interface XmlGMonthDay extends XmlAnySimpleType {
+    XmlObjectFactory<XmlGMonthDay> Factory = new XmlObjectFactory<>("_BI_gMonthDay");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gMonthDay");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link Calendar}
@@ -53,134 +57,5 @@
      * Sets this value as a {@link GDateSpecification}
      */
     void setGDateValue(GDate gd);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlGMonthDay}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlGMonthDay}
-         */
-        public static XmlGMonthDay newInstance() {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlGMonthDay}
-         */
-        public static XmlGMonthDay newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlGMonthDay} value
-         */
-        public static XmlGMonthDay newValue(Object obj) {
-            return (XmlGMonthDay) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a String. For example: "<code>&lt;xml-fragment&gt;--06-14&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGMonthDay parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a String. For example: "<code>&lt;xml-fragment&gt;--06-14&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGMonthDay parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a File.
-         */
-        public static XmlGMonthDay parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a File.
-         */
-        public static XmlGMonthDay parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a URL.
-         */
-        public static XmlGMonthDay parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a URL.
-         */
-        public static XmlGMonthDay parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from an InputStream.
-         */
-        public static XmlGMonthDay parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from an InputStream.
-         */
-        public static XmlGMonthDay parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a Reader.
-         */
-        public static XmlGMonthDay parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a Reader.
-         */
-        public static XmlGMonthDay parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a DOM Node.
-         */
-        public static XmlGMonthDay parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from a DOM Node.
-         */
-        public static XmlGMonthDay parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from an XMLStreamReader.
-         */
-        public static XmlGMonthDay parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGMonthDay} fragment from an XMLStreamReader.
-         */
-        public static XmlGMonthDay parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlGYear.java b/src/main/java/org/apache/xmlbeans/XmlGYear.java
index 6ae72b8..9edc752 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGYear.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGYear.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.Calendar;
 
 
@@ -29,10 +31,12 @@
  * @see GDate
  */
 public interface XmlGYear extends XmlAnySimpleType {
+    XmlObjectFactory<XmlGYear> Factory = new XmlObjectFactory<>("_BI_gYear");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gYear");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link Calendar}
@@ -63,134 +67,5 @@
      * Sets this value as an int from 1-31
      */
     void setIntValue(int v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlGYear}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlGYear}
-         */
-        public static XmlGYear newInstance() {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlGYear}
-         */
-        public static XmlGYear newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlGYear} value
-         */
-        public static XmlGYear newValue(Object obj) {
-            return (XmlGYear) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a String. For example: "<code>&lt;xml-fragment&gt;2003&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGYear parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a String. For example: "<code>&lt;xml-fragment&gt;2003&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGYear parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a File.
-         */
-        public static XmlGYear parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a File.
-         */
-        public static XmlGYear parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a URL.
-         */
-        public static XmlGYear parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a URL.
-         */
-        public static XmlGYear parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from an InputStream.
-         */
-        public static XmlGYear parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from an InputStream.
-         */
-        public static XmlGYear parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a Reader.
-         */
-        public static XmlGYear parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a Reader.
-         */
-        public static XmlGYear parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a DOM Node.
-         */
-        public static XmlGYear parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from a DOM Node.
-         */
-        public static XmlGYear parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from an XMLStreamReader.
-         */
-        public static XmlGYear parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYear} fragment from an XMLStreamReader.
-         */
-        public static XmlGYear parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlGYearMonth.java b/src/main/java/org/apache/xmlbeans/XmlGYearMonth.java
index 8e318ce..d4bf2cd 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGYearMonth.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGYearMonth.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.Calendar;
 
 
@@ -29,10 +31,12 @@
  * @see GDate
  */
 public interface XmlGYearMonth extends XmlAnySimpleType {
+    XmlObjectFactory<XmlGYearMonth> Factory = new XmlObjectFactory<>("_BI_gYearMonth");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gYearMonth");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link Calendar}
@@ -53,134 +57,5 @@
      * Sets this value as a {@link GDateSpecification}
      */
     void setGDateValue(GDate gd);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlGYearMonth}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlGYearMonth}
-         */
-        public static XmlGYearMonth newInstance() {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlGYearMonth}
-         */
-        public static XmlGYearMonth newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlGYearMonth} value
-         */
-        public static XmlGYearMonth newValue(Object obj) {
-            return (XmlGYearMonth) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a String. For example: "<code>&lt;xml-fragment&gt;2003-06&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGYearMonth parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a String. For example: "<code>&lt;xml-fragment&gt;2003-06&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlGYearMonth parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a File.
-         */
-        public static XmlGYearMonth parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a File.
-         */
-        public static XmlGYearMonth parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a URL.
-         */
-        public static XmlGYearMonth parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a URL.
-         */
-        public static XmlGYearMonth parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from an InputStream.
-         */
-        public static XmlGYearMonth parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from an InputStream.
-         */
-        public static XmlGYearMonth parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a Reader.
-         */
-        public static XmlGYearMonth parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a Reader.
-         */
-        public static XmlGYearMonth parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a DOM Node.
-         */
-        public static XmlGYearMonth parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from a DOM Node.
-         */
-        public static XmlGYearMonth parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from an XMLStreamReader.
-         */
-        public static XmlGYearMonth parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlGYearMonth} fragment from an XMLStreamReader.
-         */
-        public static XmlGYearMonth parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlHexBinary.java b/src/main/java/org/apache/xmlbeans/XmlHexBinary.java
index acc9487..2db41ef 100644
--- a/src/main/java/org/apache/xmlbeans/XmlHexBinary.java
+++ b/src/main/java/org/apache/xmlbeans/XmlHexBinary.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#hexBinary">xs:hexBinary</a> type.
@@ -22,10 +24,12 @@
  * Convertible to a byte array.
  */
 public interface XmlHexBinary extends XmlAnySimpleType {
+    XmlObjectFactory<XmlHexBinary> Factory = new XmlObjectFactory<>("_BI_hexBinary");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_hexBinary");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a byte array.
@@ -36,135 +40,5 @@
      * Sets this value as a byte array.
      */
     void setByteArrayValue(byte[] ba);
-
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlHexBinary}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlHexBinary}
-         */
-        public static XmlHexBinary newInstance() {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlHexBinary}
-         */
-        public static XmlHexBinary newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlHexBinary} value
-         */
-        public static XmlHexBinary newValue(Object obj) {
-            return (XmlHexBinary) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a String. For example: "<code>&lt;xml-fragment&gt;68656c6c6f&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlHexBinary parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a String. For example: "<code>&lt;xml-fragment&gt;68656c6c6f&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlHexBinary parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a File.
-         */
-        public static XmlHexBinary parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a File.
-         */
-        public static XmlHexBinary parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a URL.
-         */
-        public static XmlHexBinary parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a URL.
-         */
-        public static XmlHexBinary parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from an InputStream.
-         */
-        public static XmlHexBinary parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from an InputStream.
-         */
-        public static XmlHexBinary parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a Reader.
-         */
-        public static XmlHexBinary parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a Reader.
-         */
-        public static XmlHexBinary parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a DOM Node.
-         */
-        public static XmlHexBinary parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from a DOM Node.
-         */
-        public static XmlHexBinary parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from an XMLStreamReader.
-         */
-        public static XmlHexBinary parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlHexBinary} fragment from an XMLStreamReader.
-         */
-        public static XmlHexBinary parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlID.java b/src/main/java/org/apache/xmlbeans/XmlID.java
index ef56e1c..c5ea415 100644
--- a/src/main/java/org/apache/xmlbeans/XmlID.java
+++ b/src/main/java/org/apache/xmlbeans/XmlID.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#ID">xs:ID</a> type.
@@ -25,138 +27,11 @@
  * Convertible to a {@link String}.
  */
 public interface XmlID extends XmlNCName {
+    XmlObjectFactory<XmlID> Factory = new XmlObjectFactory<>("_BI_ID");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_ID");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlID}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlID}
-         */
-        public static XmlID newInstance() {
-            return (XmlID) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlID}
-         */
-        public static XmlID newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlID) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlID} value
-         */
-        public static XmlID newValue(Object obj) {
-            return (XmlID) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a String. For example: "<code>&lt;xml-fragment&gt;n1&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlID parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a String. For example: "<code>&lt;xml-fragment&gt;n1&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlID parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a File.
-         */
-        public static XmlID parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a File.
-         */
-        public static XmlID parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a URL.
-         */
-        public static XmlID parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a URL.
-         */
-        public static XmlID parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from an InputStream.
-         */
-        public static XmlID parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from an InputStream.
-         */
-        public static XmlID parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a Reader.
-         */
-        public static XmlID parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a Reader.
-         */
-        public static XmlID parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a DOM Node.
-         */
-        public static XmlID parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from a DOM Node.
-         */
-        public static XmlID parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from an XMLStreamReader.
-         */
-        public static XmlID parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlID} fragment from an XMLStreamReader.
-         */
-        public static XmlID parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlID) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlIDREF.java b/src/main/java/org/apache/xmlbeans/XmlIDREF.java
index 5d5f99f..aed62b3 100644
--- a/src/main/java/org/apache/xmlbeans/XmlIDREF.java
+++ b/src/main/java/org/apache/xmlbeans/XmlIDREF.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#IDREF">xs:IDREF</a> type.
@@ -26,138 +28,11 @@
  * Convertible to a {@link String}.
  */
 public interface XmlIDREF extends XmlNCName {
+    XmlObjectFactory<XmlIDREF> Factory = new XmlObjectFactory<>("_BI_IDREF");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_IDREF");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlIDREF}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlIDREF}
-         */
-        public static XmlIDREF newInstance() {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlIDREF}
-         */
-        public static XmlIDREF newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlIDREF} value
-         */
-        public static XmlIDREF newValue(Object obj) {
-            return (XmlIDREF) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a String.
-         */
-        public static XmlIDREF parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a String.
-         */
-        public static XmlIDREF parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a File.
-         */
-        public static XmlIDREF parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a File.
-         */
-        public static XmlIDREF parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a URL.
-         */
-        public static XmlIDREF parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a URL.
-         */
-        public static XmlIDREF parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from an InputStream.
-         */
-        public static XmlIDREF parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from an InputStream.
-         */
-        public static XmlIDREF parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a Reader.
-         */
-        public static XmlIDREF parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a Reader.
-         */
-        public static XmlIDREF parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a DOM Node.
-         */
-        public static XmlIDREF parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from a DOM Node.
-         */
-        public static XmlIDREF parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from an XMLStreamReader.
-         */
-        public static XmlIDREF parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREF} fragment from an XMLStreamReader.
-         */
-        public static XmlIDREF parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlIDREFS.java b/src/main/java/org/apache/xmlbeans/XmlIDREFS.java
index 71592bd..ab850e3 100644
--- a/src/main/java/org/apache/xmlbeans/XmlIDREFS.java
+++ b/src/main/java/org/apache/xmlbeans/XmlIDREFS.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.List;
 
 
@@ -30,10 +32,12 @@
  * Convertible to a {@link List}.
  */
 public interface XmlIDREFS extends XmlAnySimpleType {
+    XmlObjectFactory<XmlIDREFS> Factory = new XmlObjectFactory<>("_BI_IDREFS");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_IDREFS");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns the value as a {@link List} of {@link String} values
@@ -49,134 +53,5 @@
      * Sets the value as a {@link List}
      */
     void setListValue(List<?> l);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlIDREFS}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlIDREFS}
-         */
-        public static XmlIDREFS newInstance() {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlIDREFS}
-         */
-        public static XmlIDREFS newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlIDREFS} value
-         */
-        public static XmlIDREFS newValue(Object obj) {
-            return (XmlIDREFS) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a String.
-         */
-        public static XmlIDREFS parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a String.
-         */
-        public static XmlIDREFS parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a File.
-         */
-        public static XmlIDREFS parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a File.
-         */
-        public static XmlIDREFS parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a URL.
-         */
-        public static XmlIDREFS parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a URL.
-         */
-        public static XmlIDREFS parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from an InputStream.
-         */
-        public static XmlIDREFS parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from an InputStream.
-         */
-        public static XmlIDREFS parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a Reader.
-         */
-        public static XmlIDREFS parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a Reader.
-         */
-        public static XmlIDREFS parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a DOM Node.
-         */
-        public static XmlIDREFS parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from a DOM Node.
-         */
-        public static XmlIDREFS parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from an XMLStreamReader.
-         */
-        public static XmlIDREFS parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlIDREFS} fragment from an XMLStreamReader.
-         */
-        public static XmlIDREFS parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlInt.java b/src/main/java/org/apache/xmlbeans/XmlInt.java
index 0052fe7..b73a27d 100644
--- a/src/main/java/org/apache/xmlbeans/XmlInt.java
+++ b/src/main/java/org/apache/xmlbeans/XmlInt.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#int">xs:int</a> type.
@@ -23,10 +25,12 @@
  * Naturally, convertible to a Java int.
  */
 public interface XmlInt extends XmlLong {
+    XmlObjectFactory<XmlInt> Factory = new XmlObjectFactory<>("_BI_int");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_int");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as an int
@@ -37,134 +41,5 @@
      * Sets this value as an int
      */
     void setIntValue(int v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlInt}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlInt}
-         */
-        public static XmlInt newInstance() {
-            return (XmlInt) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlInt}
-         */
-        public static XmlInt newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlInt) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlInt} value
-         */
-        public static XmlInt newValue(Object obj) {
-            return (XmlInt) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlInt parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlInt parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a File.
-         */
-        public static XmlInt parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a File.
-         */
-        public static XmlInt parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a URL.
-         */
-        public static XmlInt parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a URL.
-         */
-        public static XmlInt parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from an InputStream.
-         */
-        public static XmlInt parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from an InputStream.
-         */
-        public static XmlInt parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a Reader.
-         */
-        public static XmlInt parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a Reader.
-         */
-        public static XmlInt parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a DOM Node.
-         */
-        public static XmlInt parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from a DOM Node.
-         */
-        public static XmlInt parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from an XMLStreamReader.
-         */
-        public static XmlInt parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInt} fragment from an XMLStreamReader.
-         */
-        public static XmlInt parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlInt) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlInteger.java b/src/main/java/org/apache/xmlbeans/XmlInteger.java
index 93fed93..7384385 100644
--- a/src/main/java/org/apache/xmlbeans/XmlInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlInteger.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.math.BigInteger;
 
 /**
@@ -29,10 +31,12 @@
  * Convertible to a Java {@link BigInteger}.
  */
 public interface XmlInteger extends XmlDecimal {
+    XmlObjectFactory<XmlInteger> Factory = new XmlObjectFactory<>("_BI_integer");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_integer");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link BigInteger}
@@ -43,134 +47,5 @@
      * Sets this value as a {@link BigInteger}
      */
     void setBigIntegerValue(BigInteger bi);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlInteger}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlInteger}
-         */
-        public static XmlInteger newInstance() {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlInteger}
-         */
-        public static XmlInteger newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlInteger} value
-         */
-        public static XmlInteger newValue(Object obj) {
-            return (XmlInteger) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlInteger parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlInteger parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a File.
-         */
-        public static XmlInteger parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a File.
-         */
-        public static XmlInteger parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a URL.
-         */
-        public static XmlInteger parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a URL.
-         */
-        public static XmlInteger parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from an InputStream.
-         */
-        public static XmlInteger parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from an InputStream.
-         */
-        public static XmlInteger parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a Reader.
-         */
-        public static XmlInteger parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a Reader.
-         */
-        public static XmlInteger parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a DOM Node.
-         */
-        public static XmlInteger parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from a DOM Node.
-         */
-        public static XmlInteger parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlInteger parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlInteger parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlLanguage.java b/src/main/java/org/apache/xmlbeans/XmlLanguage.java
index b936311..1a4bb71 100644
--- a/src/main/java/org/apache/xmlbeans/XmlLanguage.java
+++ b/src/main/java/org/apache/xmlbeans/XmlLanguage.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#language">xs:language</a> type.
@@ -24,138 +26,11 @@
  * Convertible to a Java {@link String}.
  */
 public interface XmlLanguage extends XmlToken {
+    XmlObjectFactory<XmlLanguage> Factory = new XmlObjectFactory<>("_BI_language");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_language");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlLanguage}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlLanguage}
-         */
-        public static XmlLanguage newInstance() {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlLanguage}
-         */
-        public static XmlLanguage newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlLanguage} value
-         */
-        public static XmlLanguage newValue(Object obj) {
-            return (XmlLanguage) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a String. For example: "<code>&lt;xml-fragment&gt;en-us&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlLanguage parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a String. For example: "<code>&lt;xml-fragment&gt;en-us&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlLanguage parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a File.
-         */
-        public static XmlLanguage parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a File.
-         */
-        public static XmlLanguage parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a URL.
-         */
-        public static XmlLanguage parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a URL.
-         */
-        public static XmlLanguage parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from an InputStream.
-         */
-        public static XmlLanguage parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from an InputStream.
-         */
-        public static XmlLanguage parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a Reader.
-         */
-        public static XmlLanguage parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a Reader.
-         */
-        public static XmlLanguage parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a DOM Node.
-         */
-        public static XmlLanguage parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from a DOM Node.
-         */
-        public static XmlLanguage parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from an XMLStreamReader.
-         */
-        public static XmlLanguage parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLanguage} fragment from an XMLStreamReader.
-         */
-        public static XmlLanguage parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlLong.java b/src/main/java/org/apache/xmlbeans/XmlLong.java
index 0a9bce8..b8e5d89 100644
--- a/src/main/java/org/apache/xmlbeans/XmlLong.java
+++ b/src/main/java/org/apache/xmlbeans/XmlLong.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#long">xs:long</a> type.
@@ -23,10 +25,12 @@
  * Naturally, convertible to a Java long.
  */
 public interface XmlLong extends XmlInteger {
+    XmlObjectFactory<XmlLong> Factory = new XmlObjectFactory<>("_BI_long");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_long");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a long
@@ -37,134 +41,5 @@
      * Sets this value as a long
      */
     void setLongValue(long v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlLong}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlLong}
-         */
-        public static XmlLong newInstance() {
-            return (XmlLong) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlLong}
-         */
-        public static XmlLong newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlLong) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlLong} value
-         */
-        public static XmlLong newValue(Object obj) {
-            return (XmlLong) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123456789&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlLong parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123456789&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlLong parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a File.
-         */
-        public static XmlLong parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a File.
-         */
-        public static XmlLong parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a URL.
-         */
-        public static XmlLong parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a URL.
-         */
-        public static XmlLong parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from an InputStream.
-         */
-        public static XmlLong parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from an InputStream.
-         */
-        public static XmlLong parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a Reader.
-         */
-        public static XmlLong parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a Reader.
-         */
-        public static XmlLong parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a DOM Node.
-         */
-        public static XmlLong parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from a DOM Node.
-         */
-        public static XmlLong parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from an XMLStreamReader.
-         */
-        public static XmlLong parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlLong} fragment from an XMLStreamReader.
-         */
-        public static XmlLong parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlLong) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNCName.java b/src/main/java/org/apache/xmlbeans/XmlNCName.java
index 4f52fca..7894e7b 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNCName.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNCName.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#Name">xs:Name</a> type.
@@ -28,138 +30,11 @@
  * Convertible to {@link String}.
  */
 public interface XmlNCName extends XmlName {
+    XmlObjectFactory<XmlNCName> Factory = new XmlObjectFactory<>("_BI_NCName");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NCName");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlNCName}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlNCName}
-         */
-        public static XmlNCName newInstance() {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlNCName}
-         */
-        public static XmlNCName newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlNCName} value
-         */
-        public static XmlNCName newValue(Object obj) {
-            return (XmlNCName) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a String. For example: "<code>&lt;xml-fragment&gt;My-Name&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNCName parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a String. For example: "<code>&lt;xml-fragment&gt;My-Name&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNCName parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a File.
-         */
-        public static XmlNCName parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a File.
-         */
-        public static XmlNCName parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a URL.
-         */
-        public static XmlNCName parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a URL.
-         */
-        public static XmlNCName parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from an InputStream.
-         */
-        public static XmlNCName parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from an InputStream.
-         */
-        public static XmlNCName parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a Reader.
-         */
-        public static XmlNCName parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a Reader.
-         */
-        public static XmlNCName parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a DOM Node.
-         */
-        public static XmlNCName parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from a DOM Node.
-         */
-        public static XmlNCName parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from an XMLStreamReader.
-         */
-        public static XmlNCName parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNCName} fragment from an XMLStreamReader.
-         */
-        public static XmlNCName parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNMTOKEN.java b/src/main/java/org/apache/xmlbeans/XmlNMTOKEN.java
index dfccff4..712bfae 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNMTOKEN.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNMTOKEN.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#NMTOKEN">xs:NMTOKEN</a> type.
@@ -27,138 +29,11 @@
  * Convertible to {@link String}.
  */
 public interface XmlNMTOKEN extends XmlToken {
+    XmlObjectFactory<XmlNMTOKEN> Factory = new XmlObjectFactory<>("_BI_NMTOKEN");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NMTOKEN");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlNMTOKEN}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlNMTOKEN}
-         */
-        public static XmlNMTOKEN newInstance() {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlNMTOKEN}
-         */
-        public static XmlNMTOKEN newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlNMTOKEN} value
-         */
-        public static XmlNMTOKEN newValue(Object obj) {
-            return (XmlNMTOKEN) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a String. For example: "<code>&lt;xml-fragment&gt;sample-1.2&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNMTOKEN parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a String. For example: "<code>&lt;xml-fragment&gt;sample-1.2&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNMTOKEN parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a File.
-         */
-        public static XmlNMTOKEN parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a File.
-         */
-        public static XmlNMTOKEN parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a URL.
-         */
-        public static XmlNMTOKEN parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a URL.
-         */
-        public static XmlNMTOKEN parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from an InputStream.
-         */
-        public static XmlNMTOKEN parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from an InputStream.
-         */
-        public static XmlNMTOKEN parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a Reader.
-         */
-        public static XmlNMTOKEN parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a Reader.
-         */
-        public static XmlNMTOKEN parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a DOM Node.
-         */
-        public static XmlNMTOKEN parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from a DOM Node.
-         */
-        public static XmlNMTOKEN parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from an XMLStreamReader.
-         */
-        public static XmlNMTOKEN parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKEN} fragment from an XMLStreamReader.
-         */
-        public static XmlNMTOKEN parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNMTOKENS.java b/src/main/java/org/apache/xmlbeans/XmlNMTOKENS.java
index 9cf6fbb..df8d746 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNMTOKENS.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNMTOKENS.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.List;
 
 
@@ -26,10 +28,12 @@
  * Convertible to {@link List}.
  */
 public interface XmlNMTOKENS extends XmlAnySimpleType {
+    XmlObjectFactory<XmlNMTOKENS> Factory = new XmlObjectFactory<>("_BI_NMTOKENS");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NMTOKENS");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns the value as a {@link List} of {@link String} values
@@ -45,134 +49,5 @@
      * Sets the value as a {@link List}
      */
     void setListValue(List<?> l);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlNMTOKENS}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlNMTOKENS}
-         */
-        public static XmlNMTOKENS newInstance() {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlNMTOKENS}
-         */
-        public static XmlNMTOKENS newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlNMTOKENS} value
-         */
-        public static XmlNMTOKENS newValue(Object obj) {
-            return (XmlNMTOKENS) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a String. For example: "<code>&lt;xml-fragment&gt;sample-1.1 sample-1.2 sample-1.3&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNMTOKENS parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a String. For example: "<code>&lt;xml-fragment&gt;sample-1.1 sample-1.2 sample-1.3&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNMTOKENS parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a File.
-         */
-        public static XmlNMTOKENS parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a File.
-         */
-        public static XmlNMTOKENS parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a URL.
-         */
-        public static XmlNMTOKENS parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a URL.
-         */
-        public static XmlNMTOKENS parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from an InputStream.
-         */
-        public static XmlNMTOKENS parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from an InputStream.
-         */
-        public static XmlNMTOKENS parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a Reader.
-         */
-        public static XmlNMTOKENS parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a Reader.
-         */
-        public static XmlNMTOKENS parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a DOM Node.
-         */
-        public static XmlNMTOKENS parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from a DOM Node.
-         */
-        public static XmlNMTOKENS parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from an XMLStreamReader.
-         */
-        public static XmlNMTOKENS parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNMTOKENS} fragment from an XMLStreamReader.
-         */
-        public static XmlNMTOKENS parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNOTATION.java b/src/main/java/org/apache/xmlbeans/XmlNOTATION.java
index 6b56eaa..bd6132d 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNOTATION.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNOTATION.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#NOTATION">xs:NOTATION</a> type.
@@ -26,138 +28,11 @@
  * Convertible to {@link String}.
  */
 public interface XmlNOTATION extends XmlAnySimpleType {
+    XmlObjectFactory<XmlNOTATION> Factory = new XmlObjectFactory<>("_BI_NOTATION");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NOTATION");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlNOTATION}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlNOTATION}
-         */
-        public static XmlNOTATION newInstance() {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlNOTATION}
-         */
-        public static XmlNOTATION newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlNOTATION} value
-         */
-        public static XmlNOTATION newValue(Object obj) {
-            return (XmlNOTATION) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a String.
-         */
-        public static XmlNOTATION parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a String.
-         */
-        public static XmlNOTATION parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a File.
-         */
-        public static XmlNOTATION parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a File.
-         */
-        public static XmlNOTATION parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a URL.
-         */
-        public static XmlNOTATION parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a URL.
-         */
-        public static XmlNOTATION parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from an InputStream.
-         */
-        public static XmlNOTATION parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from an InputStream.
-         */
-        public static XmlNOTATION parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a Reader.
-         */
-        public static XmlNOTATION parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a Reader.
-         */
-        public static XmlNOTATION parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a DOM Node.
-         */
-        public static XmlNOTATION parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from a DOM Node.
-         */
-        public static XmlNOTATION parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from an XMLStreamReader.
-         */
-        public static XmlNOTATION parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNOTATION} fragment from an XMLStreamReader.
-         */
-        public static XmlNOTATION parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlName.java b/src/main/java/org/apache/xmlbeans/XmlName.java
index 1bd945d..b0c5ea2 100644
--- a/src/main/java/org/apache/xmlbeans/XmlName.java
+++ b/src/main/java/org/apache/xmlbeans/XmlName.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#Name">xs:Name</a> type.
@@ -28,138 +30,11 @@
  * Convertible to {@link String}.
  */
 public interface XmlName extends XmlToken {
+    XmlObjectFactory<XmlName> Factory = new XmlObjectFactory<>("_BI_Name");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_Name");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlName}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlName}
-         */
-        public static XmlName newInstance() {
-            return (XmlName) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlName}
-         */
-        public static XmlName newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlName) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlName} value
-         */
-        public static XmlName newValue(Object obj) {
-            return (XmlName) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a String. For example: "<code>&lt;xml-fragment&gt;My:Name&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlName parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a String. For example: "<code>&lt;xml-fragment&gt;My:Name&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlName parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a File.
-         */
-        public static XmlName parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a File.
-         */
-        public static XmlName parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a URL.
-         */
-        public static XmlName parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a URL.
-         */
-        public static XmlName parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from an InputStream.
-         */
-        public static XmlName parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from an InputStream.
-         */
-        public static XmlName parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a Reader.
-         */
-        public static XmlName parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a Reader.
-         */
-        public static XmlName parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a DOM Node.
-         */
-        public static XmlName parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from a DOM Node.
-         */
-        public static XmlName parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from an XMLStreamReader.
-         */
-        public static XmlName parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlName} fragment from an XMLStreamReader.
-         */
-        public static XmlName parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlName) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNegativeInteger.java b/src/main/java/org/apache/xmlbeans/XmlNegativeInteger.java
index ee7aa7c..21af253 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNegativeInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNegativeInteger.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#negativeInteger">xs:negativeInteger</a> type.
@@ -25,138 +27,11 @@
  * Convertible to {@link java.math.BigInteger}.
  */
 public interface XmlNegativeInteger extends XmlNonPositiveInteger {
+    XmlObjectFactory<XmlNegativeInteger> Factory = new XmlObjectFactory<>("_BI_negativeInteger");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_negativeInteger");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlNegativeInteger}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlNegativeInteger}
-         */
-        public static XmlNegativeInteger newInstance() {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlNegativeInteger}
-         */
-        public static XmlNegativeInteger newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlNegativeInteger} value
-         */
-        public static XmlNegativeInteger newValue(Object obj) {
-            return (XmlNegativeInteger) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;-1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNegativeInteger parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;-1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNegativeInteger parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a File.
-         */
-        public static XmlNegativeInteger parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a File.
-         */
-        public static XmlNegativeInteger parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a URL.
-         */
-        public static XmlNegativeInteger parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a URL.
-         */
-        public static XmlNegativeInteger parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from an InputStream.
-         */
-        public static XmlNegativeInteger parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from an InputStream.
-         */
-        public static XmlNegativeInteger parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a Reader.
-         */
-        public static XmlNegativeInteger parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a Reader.
-         */
-        public static XmlNegativeInteger parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a DOM Node.
-         */
-        public static XmlNegativeInteger parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from a DOM Node.
-         */
-        public static XmlNegativeInteger parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlNegativeInteger parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNegativeInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlNegativeInteger parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNonNegativeInteger.java b/src/main/java/org/apache/xmlbeans/XmlNonNegativeInteger.java
index 0179f4e..8d5de22 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNonNegativeInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNonNegativeInteger.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#nonNegativeInteger">xs:nonNegativeInteger</a> type.
@@ -25,138 +27,11 @@
  * Convertible to {@link java.math.BigInteger}.
  */
 public interface XmlNonNegativeInteger extends XmlInteger {
+    XmlObjectFactory<XmlNonNegativeInteger> Factory = new XmlObjectFactory<>("_BI_nonNegativeInteger");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_nonNegativeInteger");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlNonNegativeInteger}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlNonNegativeInteger}
-         */
-        public static XmlNonNegativeInteger newInstance() {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlNonNegativeInteger}
-         */
-        public static XmlNonNegativeInteger newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlNonNegativeInteger} value
-         */
-        public static XmlNonNegativeInteger newValue(Object obj) {
-            return (XmlNonNegativeInteger) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNonNegativeInteger parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNonNegativeInteger parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a File.
-         */
-        public static XmlNonNegativeInteger parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a File.
-         */
-        public static XmlNonNegativeInteger parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a URL.
-         */
-        public static XmlNonNegativeInteger parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a URL.
-         */
-        public static XmlNonNegativeInteger parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from an InputStream.
-         */
-        public static XmlNonNegativeInteger parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from an InputStream.
-         */
-        public static XmlNonNegativeInteger parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a Reader.
-         */
-        public static XmlNonNegativeInteger parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a Reader.
-         */
-        public static XmlNonNegativeInteger parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a DOM Node.
-         */
-        public static XmlNonNegativeInteger parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from a DOM Node.
-         */
-        public static XmlNonNegativeInteger parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlNonNegativeInteger parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonNegativeInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlNonNegativeInteger parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNonPositiveInteger.java b/src/main/java/org/apache/xmlbeans/XmlNonPositiveInteger.java
index 6333e88..d17997a 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNonPositiveInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNonPositiveInteger.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#nonPositiveInteger">xs:nonPositiveInteger</a> type.
@@ -25,138 +27,11 @@
  * Convertible to {@link java.math.BigInteger}.
  */
 public interface XmlNonPositiveInteger extends XmlInteger {
+    XmlObjectFactory<XmlNonPositiveInteger> Factory = new XmlObjectFactory<>("_BI_nonPositiveInteger");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_nonPositiveInteger");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlNonPositiveInteger}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlNonPositiveInteger}
-         */
-        public static XmlNonPositiveInteger newInstance() {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlNonPositiveInteger}
-         */
-        public static XmlNonPositiveInteger newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlNonPositiveInteger} value
-         */
-        public static XmlNonPositiveInteger newValue(Object obj) {
-            return (XmlNonPositiveInteger) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;-1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNonPositiveInteger parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;-1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNonPositiveInteger parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a File.
-         */
-        public static XmlNonPositiveInteger parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a File.
-         */
-        public static XmlNonPositiveInteger parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a URL.
-         */
-        public static XmlNonPositiveInteger parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a URL.
-         */
-        public static XmlNonPositiveInteger parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from an InputStream.
-         */
-        public static XmlNonPositiveInteger parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from an InputStream.
-         */
-        public static XmlNonPositiveInteger parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a Reader.
-         */
-        public static XmlNonPositiveInteger parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a Reader.
-         */
-        public static XmlNonPositiveInteger parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a DOM Node.
-         */
-        public static XmlNonPositiveInteger parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from a DOM Node.
-         */
-        public static XmlNonPositiveInteger parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlNonPositiveInteger parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNonPositiveInteger} fragment from an  XMLStreamReader.
-         */
-        public static XmlNonPositiveInteger parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNormalizedString.java b/src/main/java/org/apache/xmlbeans/XmlNormalizedString.java
index 98fe1c5..fd223cc 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNormalizedString.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNormalizedString.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#normalizedString">xs:normalizedString</a> type.
@@ -32,138 +34,11 @@
  * whitespace-normalized value is returned.
  */
 public interface XmlNormalizedString extends XmlString {
+    XmlObjectFactory<XmlNormalizedString> Factory = new XmlObjectFactory<>("_BI_normalizedString");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_normalizedString");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlNormalizedString}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlNormalizedString}
-         */
-        public static XmlNormalizedString newInstance() {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlNormalizedString}
-         */
-        public static XmlNormalizedString newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlNormalizedString} value
-         */
-        public static XmlNormalizedString newValue(Object obj) {
-            return (XmlNormalizedString) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a String. For example: "<code>&lt;xml-fragment&gt; string to normalize &lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNormalizedString parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a String. For example: "<code>&lt;xml-fragment&gt; string to normalize &lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlNormalizedString parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a File.
-         */
-        public static XmlNormalizedString parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a File.
-         */
-        public static XmlNormalizedString parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a URL.
-         */
-        public static XmlNormalizedString parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a URL.
-         */
-        public static XmlNormalizedString parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from an InputStream.
-         */
-        public static XmlNormalizedString parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from an InputStream.
-         */
-        public static XmlNormalizedString parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a Reader.
-         */
-        public static XmlNormalizedString parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a Reader.
-         */
-        public static XmlNormalizedString parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a DOM Node.
-         */
-        public static XmlNormalizedString parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from a DOM Node.
-         */
-        public static XmlNormalizedString parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from an XMLStreamReader.
-         */
-        public static XmlNormalizedString parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlNormalizedString} fragment from an XMLStreamReader.
-         */
-        public static XmlNormalizedString parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlObject.java b/src/main/java/org/apache/xmlbeans/XmlObject.java
index d99f151..97bbeaf 100644
--- a/src/main/java/org/apache/xmlbeans/XmlObject.java
+++ b/src/main/java/org/apache/xmlbeans/XmlObject.java
@@ -15,15 +15,10 @@
 
 package org.apache.xmlbeans;
 
-import org.w3c.dom.DOMImplementation;
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
 import org.w3c.dom.Node;
 
 import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
 
 /**
  * Corresponds to the XML Schema
@@ -40,7 +35,7 @@
  * <p>
  * <ul>
  * <li>Every XML Bean class has an inner Factory class for creating and parsing
- *     instances, including XmlObject. Use {@link XmlObject.Factory} itself
+ *     instances, including XmlObject. Use {@link XmlObjectFactory} itself
  *     to produce untyped XML trees or XML trees that implement specific
  *     subtypes of XmlObject depending on a recognized root document element.
  *     If you depend on the automatic type inference, you will want to understand
@@ -53,8 +48,8 @@
  *     an XML document, you will want to understand the inner contents
  *     versus outer container issues described below.
  * <li>It is also simple to copy an XmlObject instance to or from a standard
- *     DOM tree or SAX stream.  Use {@link XmlObject.Factory#parse(Node)},
- *     for example, to load from DOM; use {@link XmlObject.Factory#newXmlSaxHandler}
+ *     DOM tree or SAX stream.  Use {@link XmlObjectFactory#parse(Node)},
+ *     for example, to load from DOM; use {@link XmlObjectFactory#newXmlSaxHandler}
  *     to load from SAX; use {@link #newDomNode()} to save to DOM; and use
  *     {@link #save(org.xml.sax.ContentHandler, org.xml.sax.ext.LexicalHandler)}
  *     to save to SAX.
@@ -72,7 +67,7 @@
  *     the current element or attribute.)
  * </ul>
  * <p>
- * Type inference.  When using {@link XmlObject.Factory} to parse XML documents,
+ * Type inference.  When using {@link XmlObjectFactory} to parse XML documents,
  * the actual document type is not {@link XmlObject#type} itself, but a subtype
  * based on the contents of the parsed document.  If the parsed document
  * contains a recognized root document element, then the actual type of the
@@ -113,7 +108,7 @@
  * which is saved by default.
  * <p>
  * Reading and writing fragments. When reading or writing the contents of a
- * whole XML document, the standard XML reprentation for a document is used.
+ * whole XML document, the standard XML representation for a document is used.
  * However, there is no standard concrete XML representation for "just the
  * contents" of an interior element or attribute. So when one is needed,
  * the tag &lt;xml-fragment&gt; is used to wrap the contents.  This tag is used
@@ -130,10 +125,12 @@
  * with future versions of XMLBeans that add additional methods on XmlObject.
  */
 public interface XmlObject extends XmlTokenSource {
+    XmlObjectFactory<XmlObject> Factory = new XmlObjectFactory<>("_BI_anyType");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_anyType");
+    SchemaType type = Factory.getType();
 
     /**
      * @return The schema type for this instance. This is a permanent,
@@ -148,7 +145,7 @@
      * tree.
      *
      * @return true if the contents of this object are valid
-     * accoring to schemaType().
+     * according to schemaType().
      */
     boolean validate();
 
@@ -187,7 +184,7 @@
      * @param options An object that implements the {@link java.util.Collection
      *                Collection} interface.
      * @return true if the contents of this object are valid
-     * accoring to schemaType().
+     * according to schemaType().
      */
     boolean validate(XmlOptions options);
 
@@ -196,7 +193,7 @@
      * <p>
      * <p>
      * The path must be a relative path, where "." represents the
-     * element or attribute containg this XmlObject, and it must select
+     * element or attribute containing this XmlObject, and it must select
      * only other elements or attributes.  If a non-element or non-attribute
      * is selected, an unchecked exception is thrown.
      * <p>
@@ -364,7 +361,7 @@
      * In order for the operation to succeed, several conditions must hold:
      * <ul><li> the container of this type must be an element </li>
      * <li> a global element with the name <code>newName</code> must exist
-     * and must be in the substition group of the containing element </li>
+     * and must be in the substitution group of the containing element </li>
      * <li> the <code>newType</code> type must be consistent with the declared
      * type of the new element </li></ul>
      * <p>
@@ -440,7 +437,7 @@
      * not copied.
      * <p>
      * Note: The result object will be in the same synchronization domain as the source,
-     * and additional synchronization is required for concurent access.
+     * and additional synchronization is required for concurrent access.
      * To use a different synchronization domain use setCopyUseNewSynchronizationDomain
      * option with copy(XmlOptions) method.
      *
@@ -457,7 +454,7 @@
      * not copied.
      * <p>
      * Note: The result object will be in the same synchronization domain as the source,
-     * and additional synchronization is required for concurent access.
+     * and additional synchronization is required for concurrent access.
      * To use a different synchronization domain use setCopyUseNewSynchronizationDomain
      * option when creating the original XmlObject.
      *
@@ -470,7 +467,7 @@
      * (which are distinguished by equals(obj) == false) may of
      * course have equal values (valueEquals(obj) == true).
      * <p>
-     * Usually this method can be treated as an ordinary equvalence
+     * Usually this method can be treated as an ordinary equivalence
      * relation, but actually it is not is not transitive.
      * Here is a precise specification:
      * <p>
@@ -501,7 +498,7 @@
     int valueHashCode();
 
     /**
-     * Impelements the Comparable interface by comparing two simple
+     * Implements the Comparable interface by comparing two simple
      * xml values based on their standard XML schema ordering.
      * Throws a ClassCastException if no standard ordering applies,
      * or if the two values are incomparable within a partial order.
@@ -520,22 +517,22 @@
     /**
      * LESS_THAN is -1. See {@link #compareValue}.
      */
-    static final int LESS_THAN = -1;
+    int LESS_THAN = -1;
 
     /**
      * EQUAL is 0. See {@link #compareValue}.
      */
-    static final int EQUAL = 0;
+    int EQUAL = 0;
 
     /**
      * GREATER_THAN is 1. See {@link #compareValue}.
      */
-    static final int GREATER_THAN = 1;
+    int GREATER_THAN = 1;
 
     /**
      * NOT_EQUAL is 2. See {@link #compareValue}.
      */
-    static final int NOT_EQUAL = 2;
+    int NOT_EQUAL = 2;
 
     /**
      * Selects the contents of the children elements with the given name.
@@ -590,283 +587,4 @@
      * @see QNameSetBuilder for creating sets of qnames
      */
     XmlObject[] selectAttributes(QNameSet attributeNameSet);
-
-    /**
-     * Static factory class for creating new instances.  Note that if
-     * a type can be inferred from the XML being loaded (for example,
-     * by recognizing the document element QName), then the instance
-     * returned by a factory will have the inferred type.  Otherwise
-     * the Factory will returned an untyped document.
-     */
-    final class Factory {
-        /**
-         * Creates a new, completely empty instance.
-         */
-        public static XmlObject newInstance() {
-            return XmlBeans.getContextTypeLoader().newInstance(null, null);
-        }
-
-        /**
-         * <p>Creates a new, completely empty instance, specifying options
-         * for the root element's document type and/or whether to validate
-         * value facets as they are set.</p>
-         * <p>
-         * Use the <em>options</em> parameter to specify the following:</p>
-         *
-         * <table>
-         * <tr><th>To specify this</th><th>Use this method</th></tr>
-         * <tr>
-         *  <td>The document type for the root element.</td>
-         *  <td>{@link XmlOptions#setDocumentType}</td>
-         * </tr>
-         * <tr>
-         *  <td>Whether value facets should be checked as they are set.</td>
-         *  <td>{@link XmlOptions#setValidateOnSet}</td>
-         * </tr>
-         * </table>
-         *
-         * @param options Options specifying root document type and/or value facet
-         *                checking.
-         * @return A new, empty instance of XmlObject.</li>
-         */
-        public static XmlObject newInstance(XmlOptions options) {
-            return XmlBeans.getContextTypeLoader().newInstance(null, options);
-        }
-
-        /**
-         * Creates a new immutable value.
-         */
-        /**
-         * Creates an immutable {@link XmlObject} value
-         */
-        public static XmlObject newValue(Object obj) {
-            return type.newValue(obj);
-        }
-
-        /**
-         * Parses the given {@link String} as XML.
-         */
-        public static XmlObject parse(String xmlAsString) throws XmlException {
-            return XmlBeans.getContextTypeLoader().parse(xmlAsString, null, null);
-        }
-
-        /**
-         * Parses the given {@link String} as XML.
-         * <p>
-         * Use the <em>options</em> parameter to specify the following:</p>
-         *
-         * <table>
-         * <tr><th>To specify this</th><th>Use this method</th></tr>
-         * <tr>
-         *  <td>The document type for the root element.</td>
-         *  <td>{@link XmlOptions#setDocumentType}</td>
-         * </tr>
-         * <tr>
-         *  <td>To place line number annotations in the store when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadLineNumbers}</td>
-         * </tr>
-         * <tr>
-         *  <td>To replace the document element with the specified QName when parsing.</td>
-         *  <td>{@link XmlOptions#setLoadReplaceDocumentElement}</td>
-         * </tr>
-         * <tr>
-         *  <td>To strip all insignificant whitespace when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadStripWhitespace}</td>
-         * </tr>
-         * <tr>
-         *  <td>To strip all comments when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadStripComments}</td>
-         * </tr>
-         * <tr>
-         *  <td>To strip all processing instructions when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadStripProcinsts}</td>
-         * </tr>
-         * <tr>
-         *  <td>A map of namespace URI substitutions to use when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadSubstituteNamespaces}</td>
-         * </tr>
-         * <tr>
-         *  <td>Additional namespace mappings to be added when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadAdditionalNamespaces}</td>
-         * </tr>
-         * <tr>
-         *  <td>To trim the underlying XML text buffer immediately after parsing
-         *  a document, resulting in a smaller memory footprint.</td>
-         *  <td>{@link XmlOptions#setLoadTrimTextBuffer}</td>
-         * </tr>
-         * </table>
-         *
-         * @param xmlAsString The string to parse.
-         * @param options     Options as specified.
-         * @return A new instance containing the specified XML.
-         */
-        public static XmlObject parse(String xmlAsString, XmlOptions options) throws XmlException {
-            return XmlBeans.getContextTypeLoader().parse(xmlAsString, null, options);
-        }
-
-        /**
-         * Parses the given {@link File} as XML.
-         */
-        public static XmlObject parse(File file) throws XmlException, IOException {
-            return XmlBeans.getContextTypeLoader().parse(file, null, null);
-        }
-
-        /**
-         * Parses the given {@link File} as XML.
-         */
-        public static XmlObject parse(File file, XmlOptions options) throws XmlException, IOException {
-            return XmlBeans.getContextTypeLoader().parse(file, null, options);
-        }
-
-        /**
-         * Downloads the given {@link java.net.URL} as XML.
-         */
-        public static XmlObject parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return XmlBeans.getContextTypeLoader().parse(u, null, null);
-        }
-
-        /**
-         * Downloads the given {@link java.net.URL} as XML.
-         */
-        public static XmlObject parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return XmlBeans.getContextTypeLoader().parse(u, null, options);
-        }
-
-        /**
-         * Decodes and parses the given {@link InputStream} as XML.
-         */
-        public static XmlObject parse(InputStream is) throws XmlException, IOException {
-            return XmlBeans.getContextTypeLoader().parse(is, null, null);
-        }
-
-        /**
-         * Decodes and parses the given {@link XMLStreamReader} as XML.
-         */
-        public static XmlObject parse(XMLStreamReader xsr) throws XmlException {
-            return XmlBeans.getContextTypeLoader().parse(xsr, null, null);
-        }
-
-        /**
-         * Decodes and parses the given {@link InputStream} as XML.
-         * <p>
-         * Use the <em>options</em> parameter to specify the following:</p>
-         *
-         * <table>
-         * <tr><th>To specify this</th><th>Use this method</th></tr>
-         * <tr>
-         *  <td>The character encoding to use when parsing or writing a document.</td>
-         *  <td>{@link XmlOptions#setCharacterEncoding}</td>
-         * </tr>
-         * <tr>
-         *  <td>The document type for the root element.</td>
-         *  <td>{@link XmlOptions#setDocumentType}</td>
-         * </tr>
-         * <tr>
-         *  <td>Place line number annotations in the store when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadLineNumbers}</td>
-         * </tr>
-         * <tr>
-         *  <td>Replace the document element with the specified QName when parsing.</td>
-         *  <td>{@link XmlOptions#setLoadReplaceDocumentElement}</td>
-         * </tr>
-         * <tr>
-         *  <td>Strip all insignificant whitespace when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadStripWhitespace}</td>
-         * </tr>
-         * <tr>
-         *  <td>Strip all comments when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadStripComments}</td>
-         * </tr>
-         * <tr>
-         *  <td>Strip all processing instructions when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadStripProcinsts}</td>
-         * </tr>
-         * <tr>
-         *  <td>Set a map of namespace URI substitutions to use when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadSubstituteNamespaces}</td>
-         * </tr>
-         * <tr>
-         *  <td>Set additional namespace mappings to be added when parsing a document.</td>
-         *  <td>{@link XmlOptions#setLoadAdditionalNamespaces}</td>
-         * </tr>
-         * <tr>
-         *  <td>Trim the underlying XML text buffer immediately after parsing
-         *  a document, resulting in a smaller memory footprint.</td>
-         *  <td>{@link XmlOptions#setLoadTrimTextBuffer}</td>
-         * </tr>
-         * </table>
-         */
-        public static XmlObject parse(InputStream is, XmlOptions options) throws XmlException, IOException {
-            return XmlBeans.getContextTypeLoader().parse(is, null, options);
-        }
-
-        /**
-         * Parses the given {@link XMLStreamReader} as XML.
-         */
-        public static XmlObject parse(XMLStreamReader xsr, XmlOptions options) throws XmlException {
-            return XmlBeans.getContextTypeLoader().parse(xsr, null, options);
-        }
-
-        /**
-         * Parses the given {@link Reader} as XML.
-         */
-        public static XmlObject parse(Reader r) throws XmlException, IOException {
-            return XmlBeans.getContextTypeLoader().parse(r, null, null);
-        }
-
-        /**
-         * Parses the given {@link Reader} as XML.
-         */
-        public static XmlObject parse(Reader r, XmlOptions options) throws XmlException, IOException {
-            return XmlBeans.getContextTypeLoader().parse(r, null, options);
-        }
-
-        /**
-         * Converts the given DOM {@link Node} into an XmlObject.
-         */
-        public static XmlObject parse(Node node) throws XmlException {
-            return XmlBeans.getContextTypeLoader().parse(node, null, null);
-        }
-
-        /**
-         * Converts the given DOM {@link Node} into an XmlObject.
-         */
-        public static XmlObject parse(Node node, XmlOptions options) throws XmlException {
-            return XmlBeans.getContextTypeLoader().parse(node, null, options);
-        }
-
-        /**
-         * Returns an {@link XmlSaxHandler} that can load an XmlObject from SAX events.
-         */
-        public static XmlSaxHandler newXmlSaxHandler() {
-            return XmlBeans.getContextTypeLoader().newXmlSaxHandler(null, null);
-        }
-
-        /**
-         * Returns an {@link XmlSaxHandler} that can load an XmlObject from SAX events.
-         */
-        public static XmlSaxHandler newXmlSaxHandler(XmlOptions options) {
-            return XmlBeans.getContextTypeLoader().newXmlSaxHandler(null, options);
-        }
-
-        /**
-         * Creates a new DOMImplementation object
-         */
-        public static DOMImplementation newDomImplementation() {
-            return XmlBeans.getContextTypeLoader().newDomImplementation(null);
-        }
-
-        /**
-         * Creates a new DOMImplementation object, taking options
-         */
-        public static DOMImplementation newDomImplementation(XmlOptions options) {
-            return XmlBeans.getContextTypeLoader().newDomImplementation(options);
-        }
-
-        /**
-         * Instances cannot be created.
-         */
-        private Factory() {
-        }
-    }
 }
diff --git a/src/main/java/org/apache/xmlbeans/XmlOptions.java b/src/main/java/org/apache/xmlbeans/XmlOptions.java
index ff6b2e5..7fd8ed6 100644
--- a/src/main/java/org/apache/xmlbeans/XmlOptions.java
+++ b/src/main/java/org/apache/xmlbeans/XmlOptions.java
@@ -133,6 +133,7 @@
         COMPILE_DOWNLOAD_URLS,
         COMPILE_MDEF_NAMESPACES,
         COMPILE_PARTIAL_TYPESYSTEM,
+        COMPILE_PARTIAL_METHODS,
         VALIDATE_ON_SET,
         VALIDATE_TREAT_LAX_AS_SKIP,
         VALIDATE_STRICT,
@@ -1390,6 +1391,33 @@
         return flag != null && flag;
     }
 
+    public enum BeanMethod {
+        GET, XGET, IS_SET, IS_NIL, IS_NIL_IDX, SET, SET_NIL, SET_NIL_IDX, XSET, UNSET,
+        GET_ARRAY, XGET_ARRAY, GET_IDX, XGET_IDX, XSET_ARRAY, XSET_IDX,
+        SIZE_OF_ARRAY, SET_ARRAY, SET_IDX,
+        INSERT_IDX, INSERT_NEW_IDX,
+        ADD, ADD_NEW, REMOVE_IDX,
+        GET_LIST, XGET_LIST, SET_LIST,
+        INSTANCE_TYPE
+    }
+
+    /**
+     * @return the list of methods to be generated in the XmlBean or {@code null} for all
+     */
+    @SuppressWarnings("unchecked")
+    public Set<BeanMethod> getCompilePartialMethod() {
+        return (Set<BeanMethod>)get(XmlOptionsKeys.COMPILE_PARTIAL_METHODS);
+    }
+
+    public void setCompilePartialMethod(Set<BeanMethod> list) {
+        if (list == null || list.isEmpty()) {
+            remove(XmlOptionsKeys.COMPILE_PARTIAL_METHODS);
+        } else {
+            set(XmlOptionsKeys.COMPILE_PARTIAL_METHODS, list);
+        }
+    }
+
+
     /**
      * If passed null, returns an empty options object.  Otherwise, returns its argument.
      */
diff --git a/src/main/java/org/apache/xmlbeans/XmlPositiveInteger.java b/src/main/java/org/apache/xmlbeans/XmlPositiveInteger.java
index cfa2679..6dc6f27 100644
--- a/src/main/java/org/apache/xmlbeans/XmlPositiveInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlPositiveInteger.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#positiveInteger">xs:positiveInteger</a> type.
@@ -25,138 +27,11 @@
  * Convertible to {@link java.math.BigInteger}.
  */
 public interface XmlPositiveInteger extends XmlNonNegativeInteger {
+    XmlObjectFactory<XmlPositiveInteger> Factory = new XmlObjectFactory<>("_BI_positiveInteger");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_positiveInteger");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlPositiveInteger}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlPositiveInteger}
-         */
-        public static XmlPositiveInteger newInstance() {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlPositiveInteger}
-         */
-        public static XmlPositiveInteger newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlPositiveInteger} value
-         */
-        public static XmlPositiveInteger newValue(Object obj) {
-            return (XmlPositiveInteger) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlPositiveInteger parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567890&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlPositiveInteger parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a File.
-         */
-        public static XmlPositiveInteger parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a File.
-         */
-        public static XmlPositiveInteger parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a URL.
-         */
-        public static XmlPositiveInteger parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a URL.
-         */
-        public static XmlPositiveInteger parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from an InputStream.
-         */
-        public static XmlPositiveInteger parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from an InputStream.
-         */
-        public static XmlPositiveInteger parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a Reader.
-         */
-        public static XmlPositiveInteger parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a Reader.
-         */
-        public static XmlPositiveInteger parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a DOM Node.
-         */
-        public static XmlPositiveInteger parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from a DOM Node.
-         */
-        public static XmlPositiveInteger parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlPositiveInteger parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlPositiveInteger} fragment from an XMLStreamReader.
-         */
-        public static XmlPositiveInteger parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlQName.java b/src/main/java/org/apache/xmlbeans/XmlQName.java
index 7c648c5..eab901f 100644
--- a/src/main/java/org/apache/xmlbeans/XmlQName.java
+++ b/src/main/java/org/apache/xmlbeans/XmlQName.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import javax.xml.namespace.QName;
 
 
@@ -32,10 +34,12 @@
  * Convertible to {@link javax.xml.namespace.QName}.
  */
 public interface XmlQName extends XmlAnySimpleType {
+    XmlObjectFactory<XmlQName> Factory = new XmlObjectFactory<>("_BI_QName");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_QName");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link QName}
@@ -46,134 +50,5 @@
      * Sets this value as a {@link QName}
      */
     void setQNameValue(QName name);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlQName}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlQName}
-         */
-        public static XmlQName newInstance() {
-            return (XmlQName) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlQName}
-         */
-        public static XmlQName newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlQName) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlQName} value
-         */
-        public static XmlQName newValue(Object obj) {
-            return (XmlQName) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a String. For example: "<code>&lt;xml-fragment xmlns:x="http://openuri.org/"&gt;x:sample&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlQName parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a String. For example: "<code>&lt;xml-fragment xmlns:x="http://openuri.org/"&gt;x:sample&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlQName parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a File.
-         */
-        public static XmlQName parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a File.
-         */
-        public static XmlQName parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a URL.
-         */
-        public static XmlQName parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a URL.
-         */
-        public static XmlQName parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from an InputStream.
-         */
-        public static XmlQName parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from an InputStream.
-         */
-        public static XmlQName parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a Reader.
-         */
-        public static XmlQName parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a Reader.
-         */
-        public static XmlQName parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a DOM Node.
-         */
-        public static XmlQName parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from a DOM Node.
-         */
-        public static XmlQName parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from an XMLStreamReader.
-         */
-        public static XmlQName parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlQName} fragment from an XMLStreamReader.
-         */
-        public static XmlQName parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlQName) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlShort.java b/src/main/java/org/apache/xmlbeans/XmlShort.java
index 45b362d..726783e 100644
--- a/src/main/java/org/apache/xmlbeans/XmlShort.java
+++ b/src/main/java/org/apache/xmlbeans/XmlShort.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#short">xs:short</a> type.
@@ -23,10 +25,12 @@
  * Naturally, convertible to a Java short.
  */
 public interface XmlShort extends XmlInt {
+    XmlObjectFactory<XmlShort> Factory = new XmlObjectFactory<>("_BI_short");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_short");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a short
@@ -37,134 +41,5 @@
      * Sets this value as a short
      */
     void setShortValue(short s);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlShort}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlShort}
-         */
-        public static XmlShort newInstance() {
-            return (XmlShort) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlShort}
-         */
-        public static XmlShort newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlShort) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlShort} value
-         */
-        public static XmlShort newValue(Object obj) {
-            return (XmlShort) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a String. For example: "<code>&lt;xml-fragment&gt;12345&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlShort parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a String. For example: "<code>&lt;xml-fragment&gt;12345&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlShort parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a File.
-         */
-        public static XmlShort parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a File.
-         */
-        public static XmlShort parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a URL.
-         */
-        public static XmlShort parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a URL.
-         */
-        public static XmlShort parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from an InputStream.
-         */
-        public static XmlShort parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from an InputStream.
-         */
-        public static XmlShort parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a Reader.
-         */
-        public static XmlShort parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a Reader.
-         */
-        public static XmlShort parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a DOM Node.
-         */
-        public static XmlShort parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from a DOM Node.
-         */
-        public static XmlShort parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from an XMLStreamReader.
-         */
-        public static XmlShort parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlShort} fragment from an XMLStreamReader.
-         */
-        public static XmlShort parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlShort) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlString.java b/src/main/java/org/apache/xmlbeans/XmlString.java
index b05a72e..efdf168 100644
--- a/src/main/java/org/apache/xmlbeans/XmlString.java
+++ b/src/main/java/org/apache/xmlbeans/XmlString.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#string">xs:string</a> type.
@@ -32,138 +34,11 @@
  * Convertible to {@link String}.
  */
 public interface XmlString extends XmlAnySimpleType {
+    XmlObjectFactory<XmlString> Factory = new XmlObjectFactory<>("_BI_string");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_string");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlString}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlString}
-         */
-        public static XmlString newInstance() {
-            return (XmlString) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlString}
-         */
-        public static XmlString newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlString) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlString} value
-         */
-        public static XmlString newValue(Object obj) {
-            return (XmlString) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a String. For example: "<code>&lt;xml-fragment&gt; arbitrary string &lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlString parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a String. For example: "<code>&lt;xml-fragment&gt; arbitrary string &lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlString parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a File.
-         */
-        public static XmlString parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a File.
-         */
-        public static XmlString parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a URL.
-         */
-        public static XmlString parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a URL.
-         */
-        public static XmlString parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from an InputStream.
-         */
-        public static XmlString parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from an InputStream.
-         */
-        public static XmlString parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a Reader.
-         */
-        public static XmlString parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a Reader.
-         */
-        public static XmlString parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a DOM Node.
-         */
-        public static XmlString parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from a DOM Node.
-         */
-        public static XmlString parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from an XMLStreamReader.
-         */
-        public static XmlString parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlString} fragment from an XMLStreamReader.
-         */
-        public static XmlString parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlString) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlTime.java b/src/main/java/org/apache/xmlbeans/XmlTime.java
index c3a1aeb..8d43c3c 100644
--- a/src/main/java/org/apache/xmlbeans/XmlTime.java
+++ b/src/main/java/org/apache/xmlbeans/XmlTime.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.util.Calendar;
 
 
@@ -29,10 +31,12 @@
  * @see GDate
  */
 public interface XmlTime extends XmlAnySimpleType {
+    XmlObjectFactory<XmlTime> Factory = new XmlObjectFactory<>("_BI_time");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_time");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a {@link Calendar}
@@ -53,134 +57,5 @@
      * Sets this value as a {@link GDateSpecification}
      */
     void setGDateValue(GDate gd);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlTime}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlTime}
-         */
-        public static XmlTime newInstance() {
-            return (XmlTime) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlTime}
-         */
-        public static XmlTime newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlTime) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlTime} value
-         */
-        public static XmlTime newValue(Object obj) {
-            return (XmlTime) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a String. For example: "<code>&lt;xml-fragment&gt;12:00:00&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlTime parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a String. For example: "<code>&lt;xml-fragment&gt;12:00:00&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlTime parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a File.
-         */
-        public static XmlTime parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a File.
-         */
-        public static XmlTime parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a URL.
-         */
-        public static XmlTime parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a URL.
-         */
-        public static XmlTime parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from an InputStream.
-         */
-        public static XmlTime parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from an InputStream.
-         */
-        public static XmlTime parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a Reader.
-         */
-        public static XmlTime parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a Reader.
-         */
-        public static XmlTime parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a DOM Node.
-         */
-        public static XmlTime parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from a DOM Node.
-         */
-        public static XmlTime parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from an XMLStreamReader.
-         */
-        public static XmlTime parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlTime} fragment from an XMLStreamReader.
-         */
-        public static XmlTime parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlTime) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlToken.java b/src/main/java/org/apache/xmlbeans/XmlToken.java
index f209dd1..c2a93fe 100644
--- a/src/main/java/org/apache/xmlbeans/XmlToken.java
+++ b/src/main/java/org/apache/xmlbeans/XmlToken.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#token">xs:token</a> type.
@@ -36,138 +38,11 @@
  * Convertible to {@link String}.
  */
 public interface XmlToken extends XmlNormalizedString {
+    XmlObjectFactory<XmlToken> Factory = new XmlObjectFactory<>("_BI_token");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_token");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlToken}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlToken}
-         */
-        public static XmlToken newInstance() {
-            return (XmlToken) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlToken}
-         */
-        public static XmlToken newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlToken) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlToken} value
-         */
-        public static XmlToken newValue(Object obj) {
-            return (XmlToken) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a String. For example: "<code>&lt;xml-fragment&gt;string to collapse&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlToken parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a String. For example: "<code>&lt;xml-fragment&gt;string to collapse&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlToken parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a File.
-         */
-        public static XmlToken parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a File.
-         */
-        public static XmlToken parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a URL.
-         */
-        public static XmlToken parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a URL.
-         */
-        public static XmlToken parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from an InputStream.
-         */
-        public static XmlToken parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from an InputStream.
-         */
-        public static XmlToken parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a Reader.
-         */
-        public static XmlToken parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a Reader.
-         */
-        public static XmlToken parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a DOM Node.
-         */
-        public static XmlToken parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from a DOM Node.
-         */
-        public static XmlToken parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from an XMLStreamReader.
-         */
-        public static XmlToken parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlToken} fragment from an XMLStreamReader.
-         */
-        public static XmlToken parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlToken) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlUnsignedByte.java b/src/main/java/org/apache/xmlbeans/XmlUnsignedByte.java
index 32f3e67..1f2fee2 100644
--- a/src/main/java/org/apache/xmlbeans/XmlUnsignedByte.java
+++ b/src/main/java/org/apache/xmlbeans/XmlUnsignedByte.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#unsignedByte">xs:unsignedByte</a> type.
@@ -25,10 +27,12 @@
  * As suggested by JAXB, convertible to Java short.
  */
 public interface XmlUnsignedByte extends XmlUnsignedShort {
+    XmlObjectFactory<XmlUnsignedByte> Factory = new XmlObjectFactory<>("_BI_unsignedByte");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedByte");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a short
@@ -39,135 +43,5 @@
      * Sets this value as a short
      */
     void setShortValue(short s);
-
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlUnsignedByte}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlUnsignedByte}
-         */
-        public static XmlUnsignedByte newInstance() {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlUnsignedByte}
-         */
-        public static XmlUnsignedByte newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlUnsignedByte} value
-         */
-        public static XmlUnsignedByte newValue(Object obj) {
-            return (XmlUnsignedByte) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlUnsignedByte parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlUnsignedByte parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a File.
-         */
-        public static XmlUnsignedByte parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a File.
-         */
-        public static XmlUnsignedByte parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a URL.
-         */
-        public static XmlUnsignedByte parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a URL.
-         */
-        public static XmlUnsignedByte parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from an InputStream.
-         */
-        public static XmlUnsignedByte parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from an InputStream.
-         */
-        public static XmlUnsignedByte parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a Reader.
-         */
-        public static XmlUnsignedByte parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a Reader.
-         */
-        public static XmlUnsignedByte parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a DOM Node.
-         */
-        public static XmlUnsignedByte parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from a DOM Node.
-         */
-        public static XmlUnsignedByte parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from an XMLStreamReader.
-         */
-        public static XmlUnsignedByte parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedByte} fragment from an XMLStreamReader.
-         */
-        public static XmlUnsignedByte parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlUnsignedInt.java b/src/main/java/org/apache/xmlbeans/XmlUnsignedInt.java
index d1869e0..fc3597c 100644
--- a/src/main/java/org/apache/xmlbeans/XmlUnsignedInt.java
+++ b/src/main/java/org/apache/xmlbeans/XmlUnsignedInt.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#unsignedInt">xs:unsignedInt</a> type.
@@ -25,10 +27,12 @@
  * Convertible to Java long.
  */
 public interface XmlUnsignedInt extends XmlUnsignedLong {
+    XmlObjectFactory<XmlUnsignedInt> Factory = new XmlObjectFactory<>("_BI_unsignedInt");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedInt");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as a long
@@ -39,134 +43,5 @@
      * Sets this value as a long
      */
     void setLongValue(long v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlUnsignedInt}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlUnsignedInt}
-         */
-        public static XmlUnsignedInt newInstance() {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlUnsignedInt}
-         */
-        public static XmlUnsignedInt newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlUnsignedInt} value
-         */
-        public static XmlUnsignedInt newValue(Object obj) {
-            return (XmlUnsignedInt) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlUnsignedInt parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a String. For example: "<code>&lt;xml-fragment&gt;1234567&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlUnsignedInt parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a File.
-         */
-        public static XmlUnsignedInt parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a File.
-         */
-        public static XmlUnsignedInt parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a URL.
-         */
-        public static XmlUnsignedInt parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a URL.
-         */
-        public static XmlUnsignedInt parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from an InputStream.
-         */
-        public static XmlUnsignedInt parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from an InputStream.
-         */
-        public static XmlUnsignedInt parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a Reader.
-         */
-        public static XmlUnsignedInt parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a Reader.
-         */
-        public static XmlUnsignedInt parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a DOM Node.
-         */
-        public static XmlUnsignedInt parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from a DOM Node.
-         */
-        public static XmlUnsignedInt parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from an XMLStreamReader.
-         */
-        public static XmlUnsignedInt parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedInt} fragment from an XMLStreamReader.
-         */
-        public static XmlUnsignedInt parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlUnsignedLong.java b/src/main/java/org/apache/xmlbeans/XmlUnsignedLong.java
index 8b55954..dcdc83e 100644
--- a/src/main/java/org/apache/xmlbeans/XmlUnsignedLong.java
+++ b/src/main/java/org/apache/xmlbeans/XmlUnsignedLong.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 import java.math.BigInteger;
 
 
@@ -28,138 +30,11 @@
  * Convertible to {@link BigInteger}.
  */
 public interface XmlUnsignedLong extends XmlNonNegativeInteger {
+    XmlObjectFactory<XmlUnsignedLong> Factory = new XmlObjectFactory<>("_BI_unsignedLong");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedLong");
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlUnsignedLong}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlUnsignedLong}
-         */
-        public static XmlUnsignedLong newInstance() {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlUnsignedLong}
-         */
-        public static XmlUnsignedLong newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlUnsignedLong} value
-         */
-        public static XmlUnsignedLong newValue(Object obj) {
-            return (XmlUnsignedLong) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123456789&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlUnsignedLong parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a String. For example: "<code>&lt;xml-fragment&gt;123456789&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlUnsignedLong parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a File.
-         */
-        public static XmlUnsignedLong parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a File.
-         */
-        public static XmlUnsignedLong parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a URL.
-         */
-        public static XmlUnsignedLong parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a URL.
-         */
-        public static XmlUnsignedLong parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from an InputStream.
-         */
-        public static XmlUnsignedLong parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from an InputStream.
-         */
-        public static XmlUnsignedLong parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a Reader.
-         */
-        public static XmlUnsignedLong parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a Reader.
-         */
-        public static XmlUnsignedLong parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a DOM Node.
-         */
-        public static XmlUnsignedLong parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from a DOM Node.
-         */
-        public static XmlUnsignedLong parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from an XMLStreamReader.
-         */
-        public static XmlUnsignedLong parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedLong} fragment from an XMLStreamReader.
-         */
-        public static XmlUnsignedLong parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
+    SchemaType type = Factory.getType();
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlUnsignedShort.java b/src/main/java/org/apache/xmlbeans/XmlUnsignedShort.java
index 05c21dc..dfbcb3e 100644
--- a/src/main/java/org/apache/xmlbeans/XmlUnsignedShort.java
+++ b/src/main/java/org/apache/xmlbeans/XmlUnsignedShort.java
@@ -15,6 +15,8 @@
 
 package org.apache.xmlbeans;
 
+import org.apache.xmlbeans.impl.schema.XmlObjectFactory;
+
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#unsignedShort">xs:unsignedShort</a> type.
@@ -25,10 +27,12 @@
  * Convertible to a Java int.
  */
 public interface XmlUnsignedShort extends XmlUnsignedInt {
+    XmlObjectFactory<XmlUnsignedShort> Factory = new XmlObjectFactory<>("_BI_unsignedShort");
+
     /**
      * The constant {@link SchemaType} object representing this schema type.
      */
-    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedShort");
+    SchemaType type = Factory.getType();
 
     /**
      * Returns this value as an int
@@ -39,134 +43,5 @@
      * Sets this value as an int
      */
     void setIntValue(int v);
-
-    /**
-     * A class with methods for creating instances
-     * of {@link XmlUnsignedShort}.
-     */
-    final class Factory {
-        /**
-         * Creates an empty instance of {@link XmlUnsignedShort}
-         */
-        public static XmlUnsignedShort newInstance() {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().newInstance(type, null);
-        }
-
-        /**
-         * Creates an empty instance of {@link XmlUnsignedShort}
-         */
-        public static XmlUnsignedShort newInstance(org.apache.xmlbeans.XmlOptions options) {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().newInstance(type, options);
-        }
-
-        /**
-         * Creates an immutable {@link XmlUnsignedShort} value
-         */
-        public static XmlUnsignedShort newValue(Object obj) {
-            return (XmlUnsignedShort) type.newValue(obj);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a String. For example: "<code>&lt;xml-fragment&gt;12345&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlUnsignedShort parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(s, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a String. For example: "<code>&lt;xml-fragment&gt;12345&lt;/xml-fragment&gt;</code>".
-         */
-        public static XmlUnsignedShort parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(s, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a File.
-         */
-        public static XmlUnsignedShort parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(f, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a File.
-         */
-        public static XmlUnsignedShort parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(f, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a URL.
-         */
-        public static XmlUnsignedShort parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(u, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a URL.
-         */
-        public static XmlUnsignedShort parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(u, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from an InputStream.
-         */
-        public static XmlUnsignedShort parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(is, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from an InputStream.
-         */
-        public static XmlUnsignedShort parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(is, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a Reader.
-         */
-        public static XmlUnsignedShort parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(r, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a Reader.
-         */
-        public static XmlUnsignedShort parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(r, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a DOM Node.
-         */
-        public static XmlUnsignedShort parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(node, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from a DOM Node.
-         */
-        public static XmlUnsignedShort parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(node, type, options);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from an XMLStreamReader.
-         */
-        public static XmlUnsignedShort parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
-        }
-
-        /**
-         * Parses a {@link XmlUnsignedShort} fragment from an XMLStreamReader.
-         */
-        public static XmlUnsignedShort parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
-        }
-
-        private Factory() {
-            // No instance of this class allowed
-        }
-    }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/AbstractDocumentFactory.java b/src/main/java/org/apache/xmlbeans/impl/schema/AbstractDocumentFactory.java
new file mode 100644
index 0000000..5fd80c5
--- /dev/null
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/AbstractDocumentFactory.java
@@ -0,0 +1,97 @@
+/*   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.schema;
+
+import org.apache.xmlbeans.SchemaTypeSystem;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlOptions;
+import org.w3c.dom.Node;
+
+import javax.xml.stream.XMLStreamReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.net.URL;
+
+@SuppressWarnings("unchecked")
+public class AbstractDocumentFactory<T> extends ElementFactory<T> {
+    public AbstractDocumentFactory(SchemaTypeSystem typeSystem, String typeHandle) {
+        super(typeSystem, typeHandle);
+    }
+
+    /**
+     * @param xmlAsString the string value to parse
+     */
+    public T parse(String xmlAsString) throws XmlException {
+        return (T) getTypeLoader().parse(xmlAsString, getType(), null);
+    }
+
+    public T parse(String xmlAsString, XmlOptions options) throws XmlException {
+        return (T) getTypeLoader().parse(xmlAsString, getType(), options);
+    }
+
+    /**
+     * @param file the file from which to load an xml document
+     */
+    public T parse(File file) throws XmlException, IOException {
+        return (T) getTypeLoader().parse(file, getType(), null);
+    }
+
+    public T parse(File file, XmlOptions options) throws XmlException, IOException {
+        return (T) getTypeLoader().parse(file, getType(), options);
+    }
+
+    public T parse(URL u) throws XmlException, IOException {
+        return (T) getTypeLoader().parse(u, getType(), null);
+    }
+
+    public T parse(URL u, XmlOptions options) throws XmlException, IOException {
+        return (T) getTypeLoader().parse(u, getType(), options);
+    }
+
+    public T parse(InputStream is) throws XmlException, IOException {
+        return (T) getTypeLoader().parse(is, getType(), null);
+    }
+
+    public T parse(InputStream is, XmlOptions options) throws XmlException, IOException {
+        return (T) getTypeLoader().parse(is, getType(), options);
+    }
+
+    public T parse(Reader r) throws XmlException, IOException {
+        return (T) getTypeLoader().parse(r, getType(), null);
+    }
+
+    public T parse(Reader r, XmlOptions options) throws XmlException, IOException {
+        return (T) getTypeLoader().parse(r, getType(), options);
+    }
+
+    public T parse(XMLStreamReader sr) throws XmlException {
+        return (T) getTypeLoader().parse(sr, getType(), null);
+    }
+
+    public T parse(XMLStreamReader sr, XmlOptions options) throws XmlException {
+        return (T) getTypeLoader().parse(sr, getType(), options);
+    }
+
+    public T parse(Node node) throws XmlException {
+        return (T) getTypeLoader().parse(node, getType(), null);
+    }
+
+    public T parse(Node node, XmlOptions options) throws XmlException {
+        return (T) getTypeLoader().parse(node, getType(), options);
+    }
+}
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/DocumentFactory.java b/src/main/java/org/apache/xmlbeans/impl/schema/DocumentFactory.java
new file mode 100644
index 0000000..50eace7
--- /dev/null
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/DocumentFactory.java
@@ -0,0 +1,34 @@
+/*   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.schema;
+
+import org.apache.xmlbeans.SchemaTypeSystem;
+
+@SuppressWarnings("unchecked")
+public class DocumentFactory<T> extends AbstractDocumentFactory<T> {
+    public DocumentFactory(SchemaTypeSystem typeSystem, String typeHandle) {
+        super(typeSystem, typeHandle);
+    }
+
+    public T newInstance() {
+        return (T) getTypeLoader().newInstance(getType(), null);
+    }
+
+
+    public T newInstance(org.apache.xmlbeans.XmlOptions options) {
+        return (T) getTypeLoader().newInstance(getType(), options);
+    }
+}
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/ElementFactory.java b/src/main/java/org/apache/xmlbeans/impl/schema/ElementFactory.java
new file mode 100644
index 0000000..cf0ebc3
--- /dev/null
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/ElementFactory.java
@@ -0,0 +1,47 @@
+/*   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.schema;
+
+import org.apache.xmlbeans.SchemaType;
+import org.apache.xmlbeans.SchemaTypeSystem;
+import org.apache.xmlbeans.XmlOptions;
+
+@SuppressWarnings("unchecked")
+public class ElementFactory<T> {
+    private final SchemaType type;
+    private final SchemaTypeSystem typeSystem;
+
+    public ElementFactory(SchemaTypeSystem typeSystem, String typeHandle) {
+        this.typeSystem = typeSystem;
+        this.type = (SchemaType)typeSystem.resolveHandle(typeHandle);
+    }
+
+    public SchemaType getType() {
+        return type;
+    }
+
+    public SchemaTypeSystem getTypeLoader() {
+        return typeSystem;
+    }
+
+    public T newInstance() {
+        return (T) getTypeLoader().newInstance(type, null);
+    }
+
+    public T newInstance(XmlOptions options) {
+        return (T) getTypeLoader().newInstance(type, options);
+    }
+}
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
index 10318c4..aa5c756 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
@@ -16,6 +16,7 @@
 package org.apache.xmlbeans.impl.schema;
 
 import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.XmlOptions.BeanMethod;
 import org.apache.xmlbeans.impl.common.NameUtil;
 
 import javax.xml.namespace.QName;
@@ -30,36 +31,14 @@
  * Prints the java code for a single schema type
  */
 public final class SchemaTypeCodePrinter implements SchemaCodePrinter {
-    Writer _writer;
-    int _indent;
 
+    static final String INDEX_CLASSNAME = "TypeSystemHolder";
+    private static final String MAX_SPACES = "                                        ";
+    private static final int INDENT_INCREMENT = 4;
 
-    static final String LINE_SEPARATOR =
-        SystemProperties.getProperty("line.separator") == null
-            ? "\n"
-            : SystemProperties.getProperty("line.separator");
-
-    static final String MAX_SPACES = "                                        ";
-    static final int INDENT_INCREMENT = 4;
-
-    public static final String INDEX_CLASSNAME = "TypeSystemHolder";
-
-    public static void printTypeImpl(Writer writer, SchemaType sType,
-                                     XmlOptions opt)
-        throws IOException {
-        getPrinter(opt).printTypeImpl(writer, sType);
-    }
-
-    public static void printType(Writer writer, SchemaType sType,
-                                 XmlOptions opt)
-        throws IOException {
-        getPrinter(opt).printType(writer, sType);
-    }
-
-    private static SchemaCodePrinter getPrinter(XmlOptions opt) {
-        SchemaCodePrinter printer = opt == null ? null : opt.getSchemaCodePrinter();
-        return printer == null ? new SchemaTypeCodePrinter() : printer;
-    }
+    private Writer _writer;
+    private int _indent;
+    private XmlOptions opt;
 
     public SchemaTypeCodePrinter() {
         _indent = 0;
@@ -73,27 +52,33 @@
         _indent -= INDENT_INCREMENT;
     }
 
+    void emit(String s, BeanMethod method) throws IOException {
+        Set<BeanMethod> partMet = opt == null ? null : opt.getCompilePartialMethod();
+        if ((partMet == null || partMet.contains(method))) {
+            emit(s);
+        }
+    }
+
     void emit(String s) throws IOException {
-        int indent = _indent;
+        if (!s.trim().isEmpty()) {
+            int indent = _indent;
 
-        if (indent > MAX_SPACES.length() / 2) {
-            indent = MAX_SPACES.length() / 4 + indent / 2;
+            if (indent > MAX_SPACES.length() / 2) {
+                indent = MAX_SPACES.length() / 4 + indent / 2;
+            }
+
+            if (indent > MAX_SPACES.length()) {
+                indent = MAX_SPACES.length();
+            }
+
+            _writer.write(MAX_SPACES.substring(0, indent));
         }
-
-        if (indent > MAX_SPACES.length()) {
-            indent = MAX_SPACES.length();
-        }
-
-        _writer.write(MAX_SPACES.substring(0, indent));
         try {
             _writer.write(s);
         } catch (CharacterCodingException cce) {
             _writer.write(makeSafe(s));
         }
-        _writer.write(LINE_SEPARATOR);
-
-        // System.out.print(MAX_SPACES.substring(0, indent));
-        // System.out.println(s);
+        _writer.write(System.lineSeparator());
     }
 
     private static String makeSafe(String s) {
@@ -134,20 +119,32 @@
         return result.toString();
     }
 
-    public void printType(Writer writer, SchemaType sType) throws IOException {
+    @Override
+    public void printType(Writer writer, SchemaType sType, XmlOptions opt) throws IOException {
+        this.opt = opt;
         _writer = writer;
         printTopComment(sType);
         printPackage(sType, true);
         emit("");
+        emit("import "+ElementFactory.class.getName()+";");
+        emit("import " + AbstractDocumentFactory.class.getName() + ";");
+        emit("import " + DocumentFactory.class.getName() + ";");
+        emit("import " + SimpleTypeFactory.class.getName() + ";");
+        emit("");
         printInnerType(sType, sType.getTypeSystem());
         _writer.flush();
     }
 
-    public void printTypeImpl(Writer writer, SchemaType sType)
-        throws IOException {
+    @Override
+    public void printTypeImpl(Writer writer, SchemaType sType, XmlOptions opt) throws IOException {
+        this.opt = opt;
         _writer = writer;
         printTopComment(sType);
         printPackage(sType, false);
+        emit("");
+        emit("import javax.xml.namespace.QName;");
+        emit("import org.apache.xmlbeans.QNameSet;");
+        emit("");
         printInnerTypeImpl(sType, sType.getTypeSystem(), false);
     }
 
@@ -252,10 +249,29 @@
     }
 
     void printStaticTypeDeclaration(SchemaType sType, SchemaTypeSystem system) throws IOException {
-        emit("org.apache.xmlbeans.SchemaType type = (org.apache.xmlbeans.SchemaType)");
-        indent();
-        emit("Factory.getTypeLoader().resolveHandle(\"" + ((SchemaTypeSystemImpl) system).handleForType(sType) + "\");");
-        outdent();
+        // Only need full factories for top-level types
+        Class<?> factoryClass;
+        if (sType.isAnonymousType() && !sType.isDocumentType() && !sType.isAttributeType()) {
+            factoryClass = ElementFactory.class;
+        } else if (sType.isSimpleType()) {
+            factoryClass = SimpleTypeFactory.class;
+        } else if (sType.isAbstract()) {
+            factoryClass = AbstractDocumentFactory.class;
+        } else {
+            factoryClass = DocumentFactory.class;
+        }
+
+        String factoryName = factoryClass.getSimpleName();
+
+        String fullName = sType.getFullJavaName().replace('$', '.');
+        String sysName = sType.getTypeSystem().getName();
+
+
+        emit(factoryName + "<" + fullName + "> Factory = new " + factoryName +
+             "<>(" + sysName + ".TypeSystemHolder.typeSystem, \"" + ((SchemaTypeSystemImpl) system).handleForType(sType) + "\");"
+         );
+        emit("org.apache.xmlbeans.SchemaType type = Factory.getType();");
+        emit("");
     }
 
     void printInnerType(SchemaType sType, SchemaTypeSystem system) throws IOException {
@@ -279,32 +295,10 @@
             SchemaProperty[] props = getDerivedProperties(sType);
 
             for (SchemaProperty prop : props) {
-                printPropertyGetters(
-                    prop.getName(),
-                    prop.isAttribute(),
-                    prop.getJavaPropertyName(),
-                    prop.getJavaTypeCode(),
-                    javaTypeForProperty(prop),
-                    xmlTypeForProperty(prop),
-                    prop.hasNillable() != SchemaProperty.NEVER,
-                    prop.extendsJavaOption(),
-                    prop.extendsJavaArray(),
-                    prop.extendsJavaSingleton()
-                );
+                printPropertyGetters(prop);
 
                 if (!prop.isReadOnly()) {
-                    printPropertySetters(
-                        prop.getName(),
-                        prop.isAttribute(),
-                        prop.getJavaPropertyName(),
-                        prop.getJavaTypeCode(),
-                        javaTypeForProperty(prop),
-                        xmlTypeForProperty(prop),
-                        prop.hasNillable() != SchemaProperty.NEVER,
-                        prop.extendsJavaOption(),
-                        prop.extendsJavaArray(),
-                        prop.extendsJavaSingleton()
-                    );
+                    printPropertySetters(prop);
                 }
             }
 
@@ -312,119 +306,9 @@
 
         printNestedInnerTypes(sType, system);
 
-        printFactory(sType);
-
         endBlock();
     }
 
-    void printFactory(SchemaType sType) throws IOException {
-        // Only need full factories for top-level types
-        boolean fullFactory = true;
-        if (sType.isAnonymousType() && !sType.isDocumentType() && !sType.isAttributeType()) {
-            fullFactory = false;
-        }
-
-        String fullName = sType.getFullJavaName().replace('$', '.');
-
-        emit("");
-        emit("/**");
-        emit(" * A factory class with static methods for creating instances");
-        emit(" * of this type.");
-        emit(" */");
-        emit("");
-        // BUGBUG - Can I use the name loader here?  could it be a
-        // nested type name?  It is lower case!
-        emit("final class Factory");
-        emit("{");
-        indent();
-
-        emit("private static synchronized " + sType.getTypeSystem().getName() + ".TypeSystemHolder getTypeLoader() {");
-        emit("  return " + sType.getTypeSystem().getName() + ".TypeSystemHolder.typeSystem;");
-        emit("}");
-        emit("");
-
-        if (sType.isSimpleType()) {
-            emit("public static " + fullName + " newValue(java.lang.Object obj) {");
-            emit("  return (" + fullName + ") type.newValue( obj ); }");
-            emit("");
-        }
-
-        // Only need newInstance() for non-abstract types
-        if (!sType.isAbstract()) {
-            emit("public static " + fullName + " newInstance() {");
-            emit("  return (" + fullName + ") getTypeLoader().newInstance( type, null ); }");
-            emit("");
-
-            emit("public static " + fullName + " newInstance(org.apache.xmlbeans.XmlOptions options) {");
-            emit("  return (" + fullName + ") getTypeLoader().newInstance( type, options ); }");
-            emit("");
-        }
-
-        if (fullFactory) {
-            emit("/** @param xmlAsString the string value to parse */");
-            emit("public static " + fullName + " parse(java.lang.String xmlAsString) throws org.apache.xmlbeans.XmlException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( xmlAsString, type, null ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(java.lang.String xmlAsString, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( xmlAsString, type, options ); }");
-            emit("");
-
-            emit("/** @param file the file from which to load an xml document */");
-            emit("public static " + fullName + " parse(java.io.File file) throws org.apache.xmlbeans.XmlException, java.io.IOException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( file, type, null ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(java.io.File file, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( file, type, options ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( u, type, null ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( u, type, options ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( is, type, null ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( is, type, options ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( r, type, null ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( r, type, options ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(javax.xml.stream.XMLStreamReader sr) throws org.apache.xmlbeans.XmlException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( sr, type, null ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(javax.xml.stream.XMLStreamReader sr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( sr, type, options ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( node, type, null ); }");
-            emit("");
-
-            emit("public static " + fullName + " parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( node, type, options ); }");
-            emit("");
-        }
-
-        emit("private Factory() { } // No instance of this class allowed");
-        outdent();
-        emit("}");
-    }
-
     void printNestedInnerTypes(SchemaType sType, SchemaTypeSystem system) throws IOException {
         boolean redefinition = sType.getName() != null &&
                                sType.getName().equals(sType.getBaseType().getName());
@@ -497,32 +381,6 @@
 
         String baseInterface = findJavaType(sType.getBaseType());
 
-        /*
-        StringBuffer specializedInterfaces = new StringBuffer();
-
-        if (sType.getSimpleVariety() == SchemaType.ATOMIC &&
-            sType.getPrimitiveType().getBuiltinTypeCode() == SchemaType.BTC_DECIMAL)
-        {
-            int bits = sType.getDecimalSize();
-            if (bits == SchemaType.SIZE_BIG_INTEGER)
-                specializedInterfaces.append(", org.apache.xmlbeans.BigIntegerValue");
-            if (bits == SchemaType.SIZE_LONG)
-                specializedInterfaces.append(", org.apache.xmlbeans.LongValue");
-            if (bits <= SchemaType.SIZE_INT)
-                specializedInterfaces.append(", org.apache.xmlbeans.IntValue");
-        }
-        if (sType.getSimpleVariety() == SchemaType.LIST)
-            specializedInterfaces.append(", org.apache.xmlbeans.ListValue");
-
-        if (sType.getSimpleVariety() == SchemaType.UNION)
-        {
-            SchemaType ctype = sType.getUnionCommonBaseType();
-            String javaTypeHolder = javaTypeHolderForType(ctype);
-            if (javaTypeHolder != null)
-                specializedInterfaces.append(", " + javaTypeHolder);
-        }
-        */
-
         emit("public interface " + shortName + " extends " + baseInterface + getExtensionInterfaces(sType));
         emit("{");
         indent();
@@ -561,29 +419,35 @@
             int bits = sType.getDecimalSize();
             int parentBits = sType.getBaseType().getDecimalSize();
             if (bits != parentBits || sType.getBaseType().getFullJavaName() == null) {
-                if (bits == SchemaType.SIZE_BIG_INTEGER) {
-                    emit("java.math.BigInteger getBigIntegerValue();");
-                    emit("void setBigIntegerValue(java.math.BigInteger bi);");
-                } else if (bits == SchemaType.SIZE_LONG) {
-                    emit("long getLongValue();");
-                    emit("void setLongValue(long l);");
-                } else if (bits == SchemaType.SIZE_INT) {
-                    emit("int getIntValue();");
-                    emit("void setIntValue(int i);");
-                } else if (bits == SchemaType.SIZE_SHORT) {
-                    emit("short getShortValue();");
-                    emit("void setShortValue(short s);");
-                } else if (bits == SchemaType.SIZE_BYTE) {
-                    emit("byte getByteValue();");
-                    emit("void setByteValue(byte b);");
+                switch (bits) {
+                    case SchemaType.SIZE_BIG_INTEGER:
+                        emit("java.math.BigInteger getBigIntegerValue();", BeanMethod.GET);
+                        emit("void setBigIntegerValue(java.math.BigInteger bi);", BeanMethod.SET);
+                        break;
+                    case SchemaType.SIZE_LONG:
+                        emit("long getLongValue();", BeanMethod.GET);
+                        emit("void setLongValue(long l);", BeanMethod.SET);
+                        break;
+                    case SchemaType.SIZE_INT:
+                        emit("int getIntValue();", BeanMethod.GET);
+                        emit("void setIntValue(int i);", BeanMethod.SET);
+                        break;
+                    case SchemaType.SIZE_SHORT:
+                        emit("short getShortValue();", BeanMethod.GET);
+                        emit("void setShortValue(short s);", BeanMethod.SET);
+                        break;
+                    case SchemaType.SIZE_BYTE:
+                        emit("byte getByteValue();", BeanMethod.GET);
+                        emit("void setByteValue(byte b);", BeanMethod.SET);
+                        break;
                 }
             }
         }
 
         if (sType.getSimpleVariety() == SchemaType.UNION) {
-            emit("java.lang.Object getObjectValue();");
-            emit("void setObjectValue(java.lang.Object val);");
-            emit("org.apache.xmlbeans.SchemaType instanceType();");
+            emit("java.lang.Object getObjectValue();", BeanMethod.GET);
+            emit("void setObjectValue(java.lang.Object val);", BeanMethod.SET);
+            emit("org.apache.xmlbeans.SchemaType instanceType();", BeanMethod.INSTANCE_TYPE);
             SchemaType ctype = sType.getUnionCommonBaseType();
             if (ctype != null && ctype.getSimpleVariety() != SchemaType.UNION) {
                 emitSpecializedAccessors(ctype);
@@ -591,9 +455,9 @@
         }
 
         if (sType.getSimpleVariety() == SchemaType.LIST) {
-            emit("java.util.List getListValue();");
-            emit("java.util.List xgetListValue();");
-            emit("void setListValue(java.util.List<?> list);");
+            emit("java.util.List getListValue();", BeanMethod.GET_LIST);
+            emit("java.util.List xgetListValue();", BeanMethod.XGET_LIST);
+            emit("void setListValue(java.util.List<?> list);", BeanMethod.SET_LIST);
         }
     }
 
@@ -607,6 +471,13 @@
         emit("}");
     }
 
+    void printJavaDoc(String sentence, BeanMethod method) throws IOException {
+        Set<BeanMethod> partMet = opt == null ? null : opt.getCompilePartialMethod();
+        if ((partMet == null || partMet.contains(method))) {
+            printJavaDoc(sentence);
+        }
+    }
+
     void printJavaDoc(String sentence) throws IOException {
         emit("");
         emit("/**");
@@ -660,8 +531,8 @@
 
         if (!hasBase) {
             emit("");
-            emit("org.apache.xmlbeans.StringEnumAbstractBase getEnumValue();");
-            emit("void setEnumValue(org.apache.xmlbeans.StringEnumAbstractBase e);");
+            emit("org.apache.xmlbeans.StringEnumAbstractBase getEnumValue();", BeanMethod.GET);
+            emit("void setEnumValue(org.apache.xmlbeans.StringEnumAbstractBase e);", BeanMethod.SET);
         }
 
         emit("");
@@ -885,33 +756,35 @@
         }
     }
 
-    void printPropertyGetters(QName qName, boolean isAttr,
-                              String propertyName, int javaType,
-                              String type, String xtype,
-                              boolean nillable, boolean optional,
-                              boolean several, boolean singleton)
-        throws IOException {
-        String propdesc = "\"" + qName.getLocalPart() + "\"" + (isAttr ? " attribute" : " element");
+    void printPropertyGetters(SchemaProperty prop) throws IOException {
+        String propertyName = prop.getJavaPropertyName();
+        int javaType = prop.getJavaTypeCode();
+        String type = javaTypeForProperty(prop);
+        String xtype = xmlTypeForProperty(prop);
+        boolean nillable = prop.hasNillable() != SchemaProperty.NEVER;
+        boolean several = prop.extendsJavaArray();
+
+        String propdesc = "\"" + prop.getName().getLocalPart() + "\"" + (prop.isAttribute() ? " attribute" : " element");
         boolean xmltype = (javaType == SchemaProperty.XML_OBJECT);
 
-        if (singleton) {
-            printJavaDoc((several ? "Gets first " : "Gets the ") + propdesc);
-            emit(type + " get" + propertyName + "();");
+        if (prop.extendsJavaSingleton()) {
+            printJavaDoc((several ? "Gets first " : "Gets the ") + propdesc, BeanMethod.GET);
+            emit(type + " get" + propertyName + "();", BeanMethod.GET);
 
             if (!xmltype) {
-                printJavaDoc((several ? "Gets (as xml) first " : "Gets (as xml) the ") + propdesc);
-                emit(xtype + " xget" + propertyName + "();");
+                printJavaDoc((several ? "Gets (as xml) first " : "Gets (as xml) the ") + propdesc, BeanMethod.XGET);
+                emit(xtype + " xget" + propertyName + "();", BeanMethod.XGET);
             }
 
             if (nillable) {
-                printJavaDoc((several ? "Tests for nil first " : "Tests for nil ") + propdesc);
-                emit("boolean isNil" + propertyName + "();");
+                printJavaDoc((several ? "Tests for nil first " : "Tests for nil ") + propdesc, BeanMethod.IS_NIL);
+                emit("boolean isNil" + propertyName + "();", BeanMethod.IS_NIL);
             }
         }
 
-        if (optional) {
-            printJavaDoc((several ? "True if has at least one " : "True if has ") + propdesc);
-            emit("boolean isSet" + propertyName + "();");
+        if (prop.extendsJavaOption()) {
+            printJavaDoc((several ? "True if has at least one " : "True if has ") + propdesc, BeanMethod.IS_SET);
+            emit("boolean isSet" + propertyName + "();", BeanMethod.IS_SET);
         }
 
         if (several) {
@@ -922,41 +795,48 @@
                 wrappedType = javaWrappedType(javaType);
             }
 
-            printJavaDoc("Gets a List of " + propdesc + "s");
-            emit("java.util.List<" + wrappedType + "> get" + propertyName + "List();");
+            printJavaDoc("Gets a List of " + propdesc + "s", BeanMethod.GET_LIST);
+            emit("java.util.List<" + wrappedType + "> get" + propertyName + "List();", BeanMethod.GET_LIST);
 
-            printJavaDoc("Gets array of all " + propdesc + "s");
-            emit(type + "[] get" + arrayName + "();");
+            printJavaDoc("Gets array of all " + propdesc + "s", BeanMethod.GET_ARRAY);
+            emit(type + "[] get" + arrayName + "();", BeanMethod.GET_ARRAY);
 
-            printJavaDoc("Gets ith " + propdesc);
-            emit(type + " get" + arrayName + "(int i);");
+            printJavaDoc("Gets ith " + propdesc, BeanMethod.GET_IDX);
+            emit(type + " get" + arrayName + "(int i);", BeanMethod.GET_IDX);
 
             if (!xmltype) {
-                printJavaDoc("Gets (as xml) a List of " + propdesc + "s");
-                emit("java.util.List<" + xtype + "> xget" + propertyName + "List();");
+                printJavaDoc("Gets (as xml) a List of " + propdesc + "s", BeanMethod.XGET_LIST);
+                emit("java.util.List<" + xtype + "> xget" + propertyName + "List();", BeanMethod.XGET_LIST);
 
-                printJavaDoc("Gets (as xml) array of all " + propdesc + "s");
-                emit(xtype + "[] xget" + arrayName + "();");
+                printJavaDoc("Gets (as xml) array of all " + propdesc + "s", BeanMethod.XGET_ARRAY);
+                emit(xtype + "[] xget" + arrayName + "();", BeanMethod.XGET_ARRAY);
 
-                printJavaDoc("Gets (as xml) ith " + propdesc);
-                emit(xtype + " xget" + arrayName + "(int i);");
+                printJavaDoc("Gets (as xml) ith " + propdesc, BeanMethod.XGET_IDX);
+                emit(xtype + " xget" + arrayName + "(int i);", BeanMethod.XGET_IDX);
             }
 
             if (nillable) {
-                printJavaDoc("Tests for nil ith " + propdesc);
-                emit("boolean isNil" + arrayName + "(int i);");
+                printJavaDoc("Tests for nil ith " + propdesc, BeanMethod.IS_NIL_IDX);
+                emit("boolean isNil" + arrayName + "(int i);", BeanMethod.IS_NIL_IDX);
             }
 
-            printJavaDoc("Returns number of " + propdesc);
-            emit("int sizeOf" + arrayName + "();");
+            printJavaDoc("Returns number of " + propdesc, BeanMethod.SIZE_OF_ARRAY);
+            emit("int sizeOf" + arrayName + "();", BeanMethod.SIZE_OF_ARRAY);
         }
     }
 
-    void printPropertySetters(QName qName, boolean isAttr,
-                              String propertyName, int javaType, String type, String xtype,
-                              boolean nillable, boolean optional,
-                              boolean several, boolean singleton)
-        throws IOException {
+    void printPropertySetters(SchemaProperty prop) throws IOException {
+        QName qName = prop.getName();
+        boolean isAttr = prop.isAttribute();
+        String propertyName = prop.getJavaPropertyName();
+        int javaType = prop.getJavaTypeCode();
+        String type = javaTypeForProperty(prop);
+        String xtype = xmlTypeForProperty(prop);
+        boolean nillable = prop.hasNillable() != SchemaProperty.NEVER;
+        boolean optional = prop.extendsJavaOption();
+        boolean several = prop.extendsJavaArray();
+        boolean singleton = prop.extendsJavaSingleton();
+
         String safeVarName = NameUtil.nonJavaKeyword(NameUtil.lowerCamelCase(propertyName));
         if (safeVarName.equals("i")) {
             safeVarName = "iValue";
@@ -966,68 +846,68 @@
         String propdesc = "\"" + qName.getLocalPart() + "\"" + (isAttr ? " attribute" : " element");
 
         if (singleton) {
-            printJavaDoc((several ? "Sets first " : "Sets the ") + propdesc);
-            emit("void set" + propertyName + "(" + type + " " + safeVarName + ");");
+            printJavaDoc((several ? "Sets first " : "Sets the ") + propdesc, BeanMethod.SET);
+            emit("void set" + propertyName + "(" + type + " " + safeVarName + ");", BeanMethod.SET);
 
             if (!xmltype) {
-                printJavaDoc((several ? "Sets (as xml) first " : "Sets (as xml) the ") + propdesc);
-                emit("void xset" + propertyName + "(" + xtype + " " + safeVarName + ");");
+                printJavaDoc((several ? "Sets (as xml) first " : "Sets (as xml) the ") + propdesc, BeanMethod.XSET);
+                emit("void xset" + propertyName + "(" + xtype + " " + safeVarName + ");", BeanMethod.XSET);
             }
 
             if (xmltype && !several) {
-                printJavaDoc("Appends and returns a new empty " + propdesc);
-                emit(xtype + " addNew" + propertyName + "();");
+                printJavaDoc("Appends and returns a new empty " + propdesc, BeanMethod.ADD_NEW);
+                emit(xtype + " addNew" + propertyName + "();", BeanMethod.ADD_NEW);
             }
 
             if (nillable) {
-                printJavaDoc((several ? "Nils the first " : "Nils the ") + propdesc);
-                emit("void setNil" + propertyName + "();");
+                printJavaDoc((several ? "Nils the first " : "Nils the ") + propdesc, BeanMethod.SET_NIL);
+                emit("void setNil" + propertyName + "();", BeanMethod.SET_NIL);
             }
         }
 
         if (optional) {
-            printJavaDoc((several ? "Removes first " : "Unsets the ") + propdesc);
-            emit("void unset" + propertyName + "();");
+            printJavaDoc((several ? "Removes first " : "Unsets the ") + propdesc, BeanMethod.UNSET);
+            emit("void unset" + propertyName + "();", BeanMethod.UNSET);
         }
 
         if (several) {
             String arrayName = propertyName + "Array";
 
-            printJavaDoc("Sets array of all " + propdesc);
-            emit("void set" + arrayName + "(" + type + "[] " + safeVarName + "Array);");
+            printJavaDoc("Sets array of all " + propdesc, BeanMethod.SET_ARRAY);
+            emit("void set" + arrayName + "(" + type + "[] " + safeVarName + "Array);", BeanMethod.SET_ARRAY);
 
-            printJavaDoc("Sets ith " + propdesc);
-            emit("void set" + arrayName + "(int i, " + type + " " + safeVarName + ");");
+            printJavaDoc("Sets ith " + propdesc, BeanMethod.SET_IDX);
+            emit("void set" + arrayName + "(int i, " + type + " " + safeVarName + ");", BeanMethod.SET_IDX);
 
             if (!xmltype) {
-                printJavaDoc("Sets (as xml) array of all " + propdesc);
-                emit("void xset" + arrayName + "(" + xtype + "[] " + safeVarName + "Array);");
+                printJavaDoc("Sets (as xml) array of all " + propdesc, BeanMethod.XSET_ARRAY);
+                emit("void xset" + arrayName + "(" + xtype + "[] " + safeVarName + "Array);", BeanMethod.XSET_ARRAY);
 
-                printJavaDoc("Sets (as xml) ith " + propdesc);
-                emit("void xset" + arrayName + "(int i, " + xtype + " " + safeVarName + ");");
+                printJavaDoc("Sets (as xml) ith " + propdesc, BeanMethod.XSET_IDX);
+                emit("void xset" + arrayName + "(int i, " + xtype + " " + safeVarName + ");", BeanMethod.XSET_IDX);
             }
 
             if (nillable) {
-                printJavaDoc("Nils the ith " + propdesc);
-                emit("void setNil" + arrayName + "(int i);");
+                printJavaDoc("Nils the ith " + propdesc, BeanMethod.SET_NIL_IDX);
+                emit("void setNil" + arrayName + "(int i);", BeanMethod.SET_NIL_IDX);
             }
 
             if (!xmltype) {
-                printJavaDoc("Inserts the value as the ith " + propdesc);
-                emit("void insert" + propertyName + "(int i, " + type + " " + safeVarName + ");");
+                printJavaDoc("Inserts the value as the ith " + propdesc, BeanMethod.INSERT_IDX);
+                emit("void insert" + propertyName + "(int i, " + type + " " + safeVarName + ");", BeanMethod.INSERT_IDX);
 
-                printJavaDoc("Appends the value as the last " + propdesc);
-                emit("void add" + propertyName + "(" + type + " " + safeVarName + ");");
+                printJavaDoc("Appends the value as the last " + propdesc, BeanMethod.ADD);
+                emit("void add" + propertyName + "(" + type + " " + safeVarName + ");", BeanMethod.ADD);
             }
 
-            printJavaDoc("Inserts and returns a new empty value (as xml) as the ith " + propdesc);
-            emit(xtype + " insertNew" + propertyName + "(int i);");
+            printJavaDoc("Inserts and returns a new empty value (as xml) as the ith " + propdesc, BeanMethod.INSERT_NEW_IDX);
+            emit(xtype + " insertNew" + propertyName + "(int i);", BeanMethod.INSERT_NEW_IDX);
 
-            printJavaDoc("Appends and returns a new empty value (as xml) as the last " + propdesc);
-            emit(xtype + " addNew" + propertyName + "();");
+            printJavaDoc("Appends and returns a new empty value (as xml) as the last " + propdesc, BeanMethod.ADD_NEW);
+            emit(xtype + " addNew" + propertyName + "();", BeanMethod.ADD_NEW);
 
-            printJavaDoc("Removes the ith " + propdesc);
-            emit("void remove" + propertyName + "(int i);");
+            printJavaDoc("Removes the ith " + propdesc, BeanMethod.REMOVE_IDX);
+            emit("void remove" + propertyName + "(int i);", BeanMethod.REMOVE_IDX);
         }
     }
 
@@ -1219,332 +1099,331 @@
     }
 
     void printJGetArrayValue(int javaType, String type, SchemaTypeImpl stype, String setIdentifier) throws IOException {
+        String em;
         switch (javaType) {
             case SchemaProperty.XML_OBJECT:
-                emit("return getXmlObjectArray(" + setIdentifier + ", new " + type + "[0]);");
+                em ="XmlObjectArray(#ID#, new " + type + "[0]);";
                 break;
 
             case SchemaProperty.JAVA_ENUM:
-                emit("return getEnumArray(" + setIdentifier + ", " + type + "[]::new);");
+                em = "EnumArray(#ID#, " + type + "[]::new);";
                 break;
 
             case SchemaProperty.JAVA_BOOLEAN:
-                emit("return getBooleanArray(" + setIdentifier + ");");
+                em = "BooleanArray(#ID#);";
                 break;
 
             case SchemaProperty.JAVA_FLOAT:
-                emit("return getFloatArray(" + setIdentifier + ");");
+                em = "FloatArray(#ID#);";
                 break;
 
             case SchemaProperty.JAVA_DOUBLE:
-                emit("return getDoubleArray(" + setIdentifier + ");");
+                em = "DoubleArray(#ID#);";
                 break;
 
             case SchemaProperty.JAVA_BYTE:
-                emit("return getByteArray(" + setIdentifier + ");");
+                em = "ByteArray(#ID#);";
                 break;
 
             case SchemaProperty.JAVA_SHORT:
-                emit("return getShortArray(" + setIdentifier + ");");
+                em = "ShortArray(#ID#);";
                 break;
 
             case SchemaProperty.JAVA_INT:
-                emit("return getIntArray(" + setIdentifier + ");");
+                em = "IntArray(#ID#);";
                 break;
 
             case SchemaProperty.JAVA_LONG:
-                emit("return getLongArray(" + setIdentifier + ");");
+                em = "LongArray(#ID#);";
                 break;
 
             case SchemaProperty.JAVA_BIG_DECIMAL:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getBigDecimalValue, java.math.BigDecimal[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getBigDecimalValue, java.math.BigDecimal[]::new);";
                 break;
 
             case SchemaProperty.JAVA_BIG_INTEGER:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getBigIntegerValue, java.math.BigInteger[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getBigIntegerValue, java.math.BigInteger[]::new);";
                 break;
 
             case SchemaProperty.JAVA_STRING:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getStringValue, String[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getStringValue, String[]::new);";
                 break;
 
             case SchemaProperty.JAVA_BYTE_ARRAY:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getByteArrayValue, byte[][]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getByteArrayValue, byte[][]::new);";
                 break;
 
             case SchemaProperty.JAVA_CALENDAR:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getCalendarValue, java.util.Calendar[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getCalendarValue, java.util.Calendar[]::new);";
                 break;
 
             case SchemaProperty.JAVA_DATE:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getDateValue, java.util.Date[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getDateValue, java.util.Date[]::new);";
                 break;
 
             case SchemaProperty.JAVA_GDATE:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getGDateValue, org.apache.xmlbeans.GDate[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getGDateValue, org.apache.xmlbeans.GDate[]::new);";
                 break;
 
             case SchemaProperty.JAVA_GDURATION:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getGDurationValue, org.apache.xmlbeans.GDuration[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getGDurationValue, org.apache.xmlbeans.GDuration[]::new);";
                 break;
 
             case SchemaProperty.JAVA_QNAME:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getQNameValue, javax.xml.namespace.QName[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getQNameValue, javax.xml.namespace.QName[]::new);";
                 break;
 
             case SchemaProperty.JAVA_LIST:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getListValue, java.util.List[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getListValue, java.util.List[]::new);";
                 break;
 
             case SchemaProperty.JAVA_OBJECT:
-                emit("return getObjectArray(" + setIdentifier + ", org.apache.xmlbeans.SimpleValue::getObjectValue, java.util.Object[]::new);");
+                em = "ObjectArray(#ID#, org.apache.xmlbeans.SimpleValue::getObjectValue, java.util.Object[]::new);";
                 break;
 
             case SchemaProperty.JAVA_USER:
                 // TOOD: replace lambda with method reference
-                emit("return getObjectArray(" + setIdentifier + ", e -> " + getUserTypeStaticHandlerMethod(false, stype) + "(e), " + stype.getUserTypeName() + "[]::new);");
+                em = "ObjectArray(#ID#, e -> " + getUserTypeStaticHandlerMethod(false, stype) + "(e), " + stype.getUserTypeName() + "[]::new);";
                 break;
 
             default:
                 throw new IllegalStateException();
         }
+        emit("return get" +em.replace("#ID#", setIdentifier), BeanMethod.GET_ARRAY);
     }
 
     void printJGetValue(int javaType, String type, SchemaTypeImpl stype) throws IOException {
+        String em;
         switch (javaType) {
             case SchemaProperty.XML_OBJECT:
-                emit("return target;");
+                em = "target";
                 break;
 
             case SchemaProperty.JAVA_BOOLEAN:
-                emit("return target.getBooleanValue();");
+                em = "target.getBooleanValue()";
                 break;
 
             case SchemaProperty.JAVA_FLOAT:
-                emit("return target.getFloatValue();");
+                em = "target.getFloatValue()";
                 break;
 
             case SchemaProperty.JAVA_DOUBLE:
-                emit("return target.getDoubleValue();");
+                em = "target.getDoubleValue()";
                 break;
 
             case SchemaProperty.JAVA_BYTE:
-                emit("return target.getByteValue();");
+                em = "target.getByteValue()";
                 break;
 
             case SchemaProperty.JAVA_SHORT:
-                emit("return target.getShortValue();");
+                em = "target.getShortValue()";
                 break;
 
             case SchemaProperty.JAVA_INT:
-                emit("return target.getIntValue();");
+                em = "target.getIntValue()";
                 break;
 
             case SchemaProperty.JAVA_LONG:
-                emit("return target.getLongValue();");
+                em = "target.getLongValue()";
                 break;
 
             case SchemaProperty.JAVA_BIG_DECIMAL:
-                emit("return target.getBigDecimalValue();");
+                em = "target.getBigDecimalValue()";
                 break;
 
             case SchemaProperty.JAVA_BIG_INTEGER:
-                emit("return target.getBigIntegerValue();");
+                em = "target.getBigIntegerValue()";
                 break;
 
             case SchemaProperty.JAVA_STRING:
-                emit("return target.getStringValue();");
+                em = "target.getStringValue()";
                 break;
 
             case SchemaProperty.JAVA_BYTE_ARRAY:
-                emit("return target.getByteArrayValue();");
+                em = "target.getByteArrayValue()";
                 break;
 
             case SchemaProperty.JAVA_GDATE:
-                emit("return target.getGDateValue();");
+                em = "target.getGDateValue()";
                 break;
 
             case SchemaProperty.JAVA_GDURATION:
-                emit("return target.getGDurationValue();");
+                em = "target.getGDurationValue()";
                 break;
 
             case SchemaProperty.JAVA_CALENDAR:
-                emit("return target.getCalendarValue();");
+                em = "target.getCalendarValue()";
                 break;
 
             case SchemaProperty.JAVA_DATE:
-                emit("return target.getDateValue();");
+                em = "target.getDateValue()";
                 break;
 
             case SchemaProperty.JAVA_QNAME:
-                emit("return target.getQNameValue();");
+                em = "target.getQNameValue()";
                 break;
 
             case SchemaProperty.JAVA_LIST:
-                emit("return target.getListValue();");
+                em = "target.getListValue()";
                 break;
 
             case SchemaProperty.JAVA_ENUM:
-                emit("return (" + type + ")target.getEnumValue();");
+                em = "(" + type + ")target.getEnumValue()";
                 break;
 
             case SchemaProperty.JAVA_OBJECT:
-                emit("return target.getObjectValue();");
+                em = "target.getObjectValue()";
                 break;
 
             case SchemaProperty.JAVA_USER:
-                emit("return " + getUserTypeStaticHandlerMethod(false, stype)
-                     + "(target);");
+                em = getUserTypeStaticHandlerMethod(false, stype) + "(target)";
                 break;
 
             default:
                 throw new IllegalStateException();
         }
+        emit("return " + em + ";");
     }
 
     void printJSetValue(int javaType, String safeVarName, SchemaTypeImpl stype) throws IOException {
+        String em;
         switch (javaType) {
             case SchemaProperty.XML_OBJECT:
-                emit("target.set(" + safeVarName + ");");
+                em = "target.set(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_BOOLEAN:
-                emit("target.setBooleanValue(" + safeVarName + ");");
+                em = "target.setBooleanValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_FLOAT:
-                emit("target.setFloatValue(" + safeVarName + ");");
+                em = "target.setFloatValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_DOUBLE:
-                emit("target.setDoubleValue(" + safeVarName + ");");
+                em = "target.setDoubleValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_BYTE:
-                emit("target.setByteValue(" + safeVarName + ");");
+                em = "target.setByteValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_SHORT:
-                emit("target.setShortValue(" + safeVarName + ");");
+                em = "target.setShortValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_INT:
-                emit("target.setIntValue(" + safeVarName + ");");
+                em = "target.setIntValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_LONG:
-                emit("target.setLongValue(" + safeVarName + ");");
+                em = "target.setLongValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_BIG_DECIMAL:
-                emit("target.setBigDecimalValue(" + safeVarName + ");");
+                em = "target.setBigDecimalValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_BIG_INTEGER:
-                emit("target.setBigIntegerValue(" + safeVarName + ");");
+                em = "target.setBigIntegerValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_STRING:
-                emit("target.setStringValue(" + safeVarName + ");");
+                em = "target.setStringValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_BYTE_ARRAY:
-                emit("target.setByteArrayValue(" + safeVarName + ");");
+                em = "target.setByteArrayValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_GDATE:
-                emit("target.setGDateValue(" + safeVarName + ");");
+                em = "target.setGDateValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_GDURATION:
-                emit("target.setGDurationValue(" + safeVarName + ");");
+                em = "target.setGDurationValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_CALENDAR:
-                emit("target.setCalendarValue(" + safeVarName + ");");
+                em = "target.setCalendarValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_DATE:
-                emit("target.setDateValue(" + safeVarName + ");");
+                em = "target.setDateValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_QNAME:
-                emit("target.setQNameValue(" + safeVarName + ");");
+                em = "target.setQNameValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_LIST:
-                emit("target.setListValue(" + safeVarName + ");");
+                em = "target.setListValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_ENUM:
-                emit("target.setEnumValue(" + safeVarName + ");");
+                em = "target.setEnumValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_OBJECT:
-                emit("target.setObjectValue(" + safeVarName + ");");
+                em = "target.setObjectValue(#VARNAME#)";
                 break;
 
             case SchemaProperty.JAVA_USER:
-                emit(getUserTypeStaticHandlerMethod(true, stype)
-                     + "(" + safeVarName + ", target);");
+                em = getUserTypeStaticHandlerMethod(true, stype) + "(#VARNAME#, target)";
                 break;
 
             default:
                 throw new IllegalStateException();
         }
+        emit(em.replace("#VARNAME#", safeVarName) + ";");
     }
 
-    String getIdentifier(Map<QName, String[]> qNameMap, QName qName) {
-        return qNameMap.get(qName)[0];
+    String getIdentifier(Map<QName, Integer> qnameMap, QName qName) {
+        return "PROPERTY_QNAME[" + qnameMap.get(qName) + "]";
     }
 
-    String getSetIdentifier(Map<QName, String[]> qNameMap, QName qName) {
-        String[] identifiers = qNameMap.get(qName);
-        return identifiers[1] == null ? identifiers[0] : identifiers[1];
+    String getSetIdentifier(Map<QName, Integer> qnameMap, QName qName, Map<QName, Integer> qsetMap) {
+        Integer ord = qsetMap.get(qName);
+        return ord == null ? getIdentifier(qnameMap, qName) : "PROPERTY_QSET["+ ord + "]";
     }
 
-    Map<QName, String[]> printStaticFields(SchemaProperty[] properties) throws IOException {
-        final Map<QName, String[]> results = new HashMap<>();
+    void printStaticFields(SchemaProperty[] properties, Map<QName, Integer> qnameMap, Map<QName, Integer> qsetMap) throws IOException {
+        if (properties.length == 0) {
+            return;
+        }
 
+        int countQSet = 0;
         emit("");
-        for (int i = 0; i < properties.length; i++) {
-            final String[] identifiers = new String[2];
-            final SchemaProperty prop = properties[i];
+        emit("private static final QName[] PROPERTY_QNAME = {");
+        indent();
+        for (SchemaProperty prop : properties) {
             final QName name = prop.getName();
-            results.put(name, identifiers);
-            final String javaName = prop.getJavaPropertyName();
-            identifiers[0] = (javaName + "$" + (i * 2)).toUpperCase(Locale.ROOT);
-            final String uriString = "\"" + name.getNamespaceURI() + "\"";
+            qnameMap.put(name, qnameMap.size());
+            emit("new QName(\"" + name.getNamespaceURI() + "\", \"" + name.getLocalPart() + "\"),");
+            countQSet = Math.max(countQSet, (prop.acceptedNames() == null ? 0 : prop.acceptedNames().length));
+        }
+        outdent();
+        emit("};");
+        emit("");
 
-            emit("private static final javax.xml.namespace.QName " + identifiers[0] +
-                 " = ");
-            indent();
-            emit("new javax.xml.namespace.QName(" +
-                 uriString + ", \"" + name.getLocalPart() + "\");");
-            outdent();
-
-            if (properties[i].acceptedNames() != null) {
-                final QName[] qnames = properties[i].acceptedNames();
-
-                if (qnames.length > 1) {
-                    identifiers[1] = (javaName + "$" + (i * 2 + 1)).toUpperCase(Locale.ROOT);
-
-                    emit("private static final org.apache.xmlbeans.QNameSet " + identifiers[1] +
-                         " = org.apache.xmlbeans.QNameSet.forArray( new javax.xml.namespace.QName[] { ");
+        if (countQSet > 1) {
+            emit("private static final QNameSet[] PROPERTY_QSET = {");
+            for (SchemaProperty prop : properties) {
+                final QName name = prop.getName();
+                final QName[] qnames = prop.acceptedNames();
+                if (qnames != null && qnames.length > 1) {
+                    qsetMap.put(name, qsetMap.size());
+                    emit("QNameSet.forArray( new QName[] { ");
                     indent();
                     for (QName qname : qnames) {
-                        emit("new javax.xml.namespace.QName(\"" + qname.getNamespaceURI() +
-                             "\", \"" + qname.getLocalPart() + "\"),");
+                        emit("new QName(\"" + qname.getNamespaceURI() + "\", \"" + qname.getLocalPart() + "\"),");
                     }
-
                     outdent();
-
-                    emit("});");
+                    emit("}),");
                 }
             }
+            emit("};");
         }
-        emit("");
-        return results;
     }
 
     void emitImplementationPreamble() throws IOException {
@@ -1664,9 +1543,6 @@
                 emit("throw new IndexOutOfBoundsException();");
                 break;
 
-            case NOTHING:
-                break;
-
             default:
                 assert false : "Bad behaviour type: " + nullBehaviour;
         }
@@ -1674,123 +1550,110 @@
         endBlock();
     }
 
-    void printListGetter15Impl(String parentJavaName,
-                               String propdesc, String propertyName,
-                               String wrappedType,
-                               boolean xmltype, boolean xget)
-        throws IOException {
-        String arrayName = propertyName + "Array";
-        String listName = propertyName + "List";
-        String parentThis = parentJavaName + ".this.";
+    void printListGetterImpl(String propdesc, String propertyName, String wrappedType, boolean xmltype, boolean xget)
+    throws IOException {
+        Set<BeanMethod> bmList = (opt == null) ? null : opt.getCompilePartialMethod();
+        if (bmList != null && !bmList.contains(xget ? BeanMethod.XGET_LIST : BeanMethod.GET_LIST)) {
+            return;
+        }
 
-        String xgetMethod = (xget ? "x" : "") + "get";
-        String xsetMethod = (xget ? "x" : "") + "set";
+        String arrayName = propertyName + "Array";
 
         printJavaDoc("Gets " + (xget ? "(as xml) " : "") + "a List of " + propdesc + "s");
-
-        emit("public java.util.List<" + wrappedType + "> " + xgetMethod + listName + "() {");
+        emit("@Override");
+        emit("public java.util.List<" + wrappedType + "> " + (xget ? "xget" : "get") + propertyName + "List() {");
         startBlock();
 
-        emit("final class " + listName + " extends java.util.AbstractList<" + wrappedType + "> {");
-        startBlock();
-
-        // Object get(i)
-        emit("@Override");
-        emit("public " + wrappedType + " get(int i)");
-        emit("    { return " + parentThis + xgetMethod + arrayName + "(i); }");
-        emit("");
-
-        // Object set(i, o)
-        emit("@Override");
-        emit("public " + wrappedType + " set(int i, " + wrappedType + " o) {");
-        startBlock();
-        emit(wrappedType + " old = " + parentThis + xgetMethod + arrayName + "(i);");
-        emit(parentThis + xsetMethod + arrayName + "(i, o);");
-        emit("return old;");
-        endBlock();
-        emit("");
-
-        // void add(i, o)
-        emit("@Override");
-        emit("public void add(int i, " + wrappedType + " o)");
-        if (xmltype || xget) {
-            emit("    { " + parentThis + "insertNew" + propertyName + "(i).set(o); }");
-        } else {
-            emit("    { " + parentThis + "insert" + propertyName + "(i, o); }");
-        }
-        emit("");
-
-        // Object remove(i)
-        emit("@Override");
-        emit("public " + wrappedType + " remove(int i) {");
-        startBlock();
-        emit(wrappedType + " old = " + parentThis + xgetMethod + arrayName + "(i);");
-        emit(parentThis + "remove" + propertyName + "(i);");
-        emit("return old;");
-        endBlock();
-        emit("");
-
-        // int size()
-        emit("@Override");
-        emit("public int size()");
-        emit("    { return " + parentThis + "sizeOf" + arrayName + "(); }");
-        emit("");
-
-        endBlock();
-
-        emit("");
-
         emitImplementationPreamble();
 
-        emit("return new " + listName + "();");
+        emit("return new org.apache.xmlbeans.impl.values.JavaList" + ((xmltype || xget) ? "Xml" : "") + "Object<>(");
+        indent();
+        if (bmList == null || bmList.contains(xget ? BeanMethod.XGET_IDX : BeanMethod.GET_IDX)) {
+            emit("this::" + (xget ? "xget" : "get") + arrayName + ",");
+        } else {
+            emit("null,");
+        }
+        if (bmList == null || bmList.contains(xget ? BeanMethod.XSET_IDX : BeanMethod.SET_IDX)) {
+            emit("this::" + (xget ? "xset" : "set") + arrayName + ",");
+        } else {
+            emit("null,");
+        }
+        if (bmList == null || bmList.contains((xmltype || xget) ? BeanMethod.INSERT_NEW_IDX : BeanMethod.INSERT_IDX)) {
+            emit("this::insert" + ((xmltype || xget) ? "New" : "") + propertyName + ",");
+        } else {
+            emit("null,");
+        }
+        if (bmList == null || bmList.contains(BeanMethod.REMOVE_IDX)) {
+            emit("this::remove" + propertyName + ",");
+        } else {
+            emit("null,");
+        }
+        if (bmList == null || bmList.contains(BeanMethod.SIZE_OF_ARRAY)) {
+            emit("this::sizeOf" + arrayName);
+        } else {
+            emit("null");
+        }
+        outdent();
+        emit(");");
 
         emitImplementationPostamble();
         endBlock();
     }
 
-    void printGetterImpls(String parentJavaName,
-                          SchemaProperty prop, QName qName, boolean isAttr, String propertyName,
-                          int javaType, String type, String xtype, boolean nillable,
-                          boolean optional, boolean several, boolean singleton,
-                          boolean isunion,
-                          String identifier, String setIdentifier)
-        throws IOException {
+    void printGetterImpls(SchemaProperty prop, Map<QName, Integer> qnameMap, Map<QName, Integer> qsetMap)
+    throws IOException {
+        final QName qName = prop.getName();
+        final String identifier = getIdentifier(qnameMap, qName);
+        final String setIdentifier = getSetIdentifier(qnameMap, qName, qsetMap);
+        final boolean several = prop.extendsJavaArray();
+        final boolean nillable = prop.hasNillable() != SchemaProperty.NEVER;
+        final String type = javaTypeForProperty(prop);
+        final String xtype = xmlTypeForProperty(prop);
+        final int javaType = prop.getJavaTypeCode();
+        final boolean isAttr = prop.isAttribute();
+        final String propertyName = prop.getJavaPropertyName();
+
         String propdesc = "\"" + qName.getLocalPart() + "\"" + (isAttr ? " attribute" : " element");
         boolean xmltype = (javaType == SchemaProperty.XML_OBJECT);
-        String jtargetType = (isunion || !xmltype) ? "org.apache.xmlbeans.SimpleValue" : xtype;
+        String jtargetType = (xmlTypeForPropertyIsUnion(prop) || !xmltype) ? "org.apache.xmlbeans.SimpleValue" : xtype;
 
-        if (singleton) {
-            // Value getProp()
-            printJavaDoc((several ? "Gets first " : "Gets the ") + propdesc);
-            emit("public " + type + " get" + propertyName + "() {");
-            startBlock();
-            emitImplementationPreamble();
+        Set<BeanMethod> bmList = (opt == null) ? null : opt.getCompilePartialMethod();
 
-            emitGetTarget(setIdentifier, identifier, isAttr, "0", NOTHING, jtargetType);
 
-            if (isAttr && (prop.hasDefault() == SchemaProperty.CONSISTENTLY ||
-                           prop.hasFixed() == SchemaProperty.CONSISTENTLY)) {
+        if (prop.extendsJavaSingleton()) {
+            if (bmList == null || bmList.contains(BeanMethod.GET)) {
+                // Value getProp()
+                printJavaDoc((several ? "Gets first " : "Gets the ") + propdesc);
+                emit("@Override");
+                emit("public " + type + " get" + propertyName + "() {");
+                startBlock();
+                emitImplementationPreamble();
+
+                emitGetTarget(setIdentifier, identifier, isAttr, "0", NOTHING, jtargetType);
+
+                if (isAttr && (prop.hasDefault() == SchemaProperty.CONSISTENTLY ||
+                               prop.hasFixed() == SchemaProperty.CONSISTENTLY)) {
+                    emit("if (target == null) {");
+                    startBlock();
+                    makeAttributeDefaultValue(jtargetType, prop, identifier);
+                    endBlock();
+                }
                 emit("if (target == null) {");
                 startBlock();
-                makeAttributeDefaultValue(jtargetType, prop, identifier);
+                makeMissingValue(javaType);
+                endBlock();
+
+                printJGetValue(javaType, type, (SchemaTypeImpl) prop.getType());
+
+                emitImplementationPostamble();
+
                 endBlock();
             }
-            emit("if (target == null) {");
-            startBlock();
-            makeMissingValue(javaType);
-            endBlock();
 
-
-            printJGetValue(javaType, type, (SchemaTypeImpl) prop.getType());
-
-
-            emitImplementationPostamble();
-
-            endBlock();
-
-            if (!xmltype) {
+            if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XGET))) {
                 // Value xgetProp()
                 printJavaDoc((several ? "Gets (as xml) first " : "Gets (as xml) the ") + propdesc);
+                emit("@Override");
                 emit("public " + xtype + " xget" + propertyName + "() {");
                 startBlock();
                 emitImplementationPreamble();
@@ -1809,9 +1672,10 @@
                 endBlock();
             }
 
-            if (nillable) {
+            if (nillable && (bmList == null || bmList.contains(BeanMethod.IS_NIL))) {
                 // boolean isNilProp()
                 printJavaDoc((several ? "Tests for nil first " : "Tests for nil ") + propdesc);
+                emit("@Override");
                 emit("public boolean isNil" + propertyName + "() {");
                 startBlock();
                 emitImplementationPreamble();
@@ -1824,9 +1688,10 @@
             }
         }
 
-        if (optional) {
+        if (prop.extendsJavaOption() && (bmList == null || bmList.contains(BeanMethod.IS_SET))) {
             // boolean isSetProp()
             printJavaDoc((several ? "True if has at least one " : "True if has ") + propdesc);
+            emit("@Override");
             emit("public boolean isSet" + propertyName + "() {");
 
             startBlock();
@@ -1852,41 +1717,53 @@
                 wrappedType = javaWrappedType(javaType);
             }
 
-            printListGetter15Impl(parentJavaName, propdesc, propertyName, wrappedType, xmltype, false);
+            printListGetterImpl(propdesc, propertyName, wrappedType, xmltype, false);
 
-            // Value[] getProp()
-            printJavaDoc("Gets array of all " + propdesc + "s");
-            emit("public " + type + "[] get" + arrayName + "() {");
-            startBlock();
+            if (bmList == null || bmList.contains(BeanMethod.GET_ARRAY)) {
+                // Value[] getProp()
+                printJavaDoc("Gets array of all " + propdesc + "s");
+                emit("@Override");
+                emit("public " + type + "[] get" + arrayName + "() {");
+                startBlock();
 
-            printJGetArrayValue(javaType, type, (SchemaTypeImpl) prop.getType(), setIdentifier);
+                printJGetArrayValue(javaType, type, (SchemaTypeImpl) prop.getType(), setIdentifier);
 
-            endBlock();
+                endBlock();
+            }
 
-            // Value getProp(int i)
-            printJavaDoc("Gets ith " + propdesc);
-            emit("public " + type + " get" + arrayName + "(int i) {");
-            startBlock();
-            emitImplementationPreamble();
+            if (bmList == null || bmList.contains(BeanMethod.GET_IDX)) {
+                // Value getProp(int i)
+                printJavaDoc("Gets ith " + propdesc);
+                emit("@Override");
+                emit("public " + type + " get" + arrayName + "(int i) {");
+                startBlock();
+                emitImplementationPreamble();
 
-            emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, jtargetType);
-            printJGetValue(javaType, type, (SchemaTypeImpl) prop.getType());
+                emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, jtargetType);
+                printJGetValue(javaType, type, (SchemaTypeImpl) prop.getType());
 
-            emitImplementationPostamble();
-            endBlock();
+                emitImplementationPostamble();
+                endBlock();
+            }
 
             if (!xmltype) {
-                printListGetter15Impl(parentJavaName, propdesc, propertyName, xtype, false, true);
+                printListGetterImpl(propdesc, propertyName, xtype, false, true);
+            }
 
+            if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XGET_ARRAY))) {
                 // Value[] xgetProp()
                 printJavaDoc("Gets (as xml) array of all " + propdesc + "s");
+                emit("@Override");
                 emit("public " + xtype + "[] xget" + arrayName + "() {");
                 startBlock();
                 emit("return xgetArray(" + setIdentifier + ", " + xtype + "[]::new);");
                 endBlock();
+            }
 
+            if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XGET_IDX))) {
                 // Value xgetProp(int i)
                 printJavaDoc("Gets (as xml) ith " + propdesc);
+                emit("@Override");
                 emit("public " + xtype + " xget" + arrayName + "(int i) {");
                 startBlock();
                 emitImplementationPreamble();
@@ -1894,12 +1771,12 @@
                 emit("return target;");
                 emitImplementationPostamble();
                 endBlock();
-
             }
 
-            if (nillable) {
+            if (nillable && (bmList == null || bmList.contains(BeanMethod.IS_NIL_IDX))) {
                 // boolean isNil(int i);
                 printJavaDoc("Tests for nil ith " + propdesc);
+                emit("@Override");
                 emit("public boolean isNil" + arrayName + "(int i) {");
                 startBlock();
                 emitImplementationPreamble();
@@ -1910,54 +1787,70 @@
             }
 
             // int countProp();
-            printJavaDoc("Returns number of " + propdesc);
-            emit("public int sizeOf" + arrayName + "() {");
-            startBlock();
-            emitImplementationPreamble();
-            emit("return get_store().count_elements(" + setIdentifier + ");");
-            emitImplementationPostamble();
-            endBlock();
+            if (bmList == null || bmList.contains(BeanMethod.SIZE_OF_ARRAY)) {
+                printJavaDoc("Returns number of " + propdesc);
+                emit("@Override");
+                emit("public int sizeOf" + arrayName + "() {");
+                startBlock();
+                emitImplementationPreamble();
+                emit("return get_store().count_elements(" + setIdentifier + ");");
+                emitImplementationPostamble();
+                endBlock();
+            }
         }
     }
 
-    void printSetterImpls(QName qName, SchemaProperty prop, boolean isAttr,
-                          String propertyName, int javaType, String type, String xtype,
-                          boolean nillable, boolean optional, boolean several, boolean singleton,
-                          boolean isunion, String identifier, String setIdentifier, SchemaType sType)
-        throws IOException {
+    void printSetterImpls(SchemaProperty prop, Map<QName, Integer> qnameMap, Map<QName, Integer> qsetMap, SchemaType sType)
+    throws IOException {
+        final QName qName = prop.getName();
+        final String identifier = getIdentifier(qnameMap, qName);
+        final String setIdentifier = getSetIdentifier(qnameMap, qName, qsetMap);
+        final boolean several = prop.extendsJavaArray();
+        final boolean nillable = prop.hasNillable() != SchemaProperty.NEVER;
+        final String type = javaTypeForProperty(prop);
+        final String xtype = xmlTypeForProperty(prop);
+        final int javaType = prop.getJavaTypeCode();
+        final boolean isAttr = prop.isAttribute();
+        final String propertyName = prop.getJavaPropertyName();
+        Set<BeanMethod> bmList = (opt == null) ? null : opt.getCompilePartialMethod();
+
         String safeVarName = NameUtil.nonJavaKeyword(NameUtil.lowerCamelCase(propertyName));
         safeVarName = NameUtil.nonExtraKeyword(safeVarName);
 
         boolean xmltype = (javaType == SchemaProperty.XML_OBJECT);
         boolean isobj = (javaType == SchemaProperty.JAVA_OBJECT);
         boolean isSubstGroup = !Objects.equals(identifier, setIdentifier);
-        String jtargetType = (isunion || !xmltype) ? "org.apache.xmlbeans.SimpleValue" : xtype;
+        String jtargetType = (xmlTypeForPropertyIsUnion(prop) || !xmltype) ? "org.apache.xmlbeans.SimpleValue" : xtype;
 
         String propdesc = "\"" + qName.getLocalPart() + "\"" + (isAttr ? " attribute" : " element");
 
-        if (singleton) {
-            // void setProp(Value v);
-            printJavaDoc((several ? "Sets first " : "Sets the ") + propdesc);
-            emit("public void set" + propertyName + "(" + type + " " + safeVarName + ") {");
-            startBlock();
-            if (xmltype && !isSubstGroup && !isAttr) {
-                emitPre(sType, PrePostExtension.OPERATION_SET, identifier, false, several ? "0" : "-1");
-                emit("generatedSetterHelperImpl(" + safeVarName + ", " + setIdentifier + ", 0, " +
-                     "org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_SINGLETON);");
-                emitPost(sType, PrePostExtension.OPERATION_SET, identifier, false, several ? "0" : "-1");
-            } else {
-                emitImplementationPreamble();
-                emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
-                emitGetTarget(setIdentifier, identifier, isAttr, "0", ADD_NEW_VALUE, jtargetType);
-                printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
-                emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
-                emitImplementationPostamble();
+        if (prop.extendsJavaSingleton()) {
+            if (bmList == null || bmList.contains(BeanMethod.SET)) {
+                // void setProp(Value v);
+                printJavaDoc((several ? "Sets first " : "Sets the ") + propdesc);
+                emit("@Override");
+                emit("public void set" + propertyName + "(" + type + " " + safeVarName + ") {");
+                startBlock();
+                if (xmltype && !isSubstGroup && !isAttr) {
+                    emitPre(sType, PrePostExtension.OPERATION_SET, identifier, false, several ? "0" : "-1");
+                    emit("generatedSetterHelperImpl(" + safeVarName + ", " + setIdentifier + ", 0, " +
+                         "org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_SINGLETON);");
+                    emitPost(sType, PrePostExtension.OPERATION_SET, identifier, false, several ? "0" : "-1");
+                } else {
+                    emitImplementationPreamble();
+                    emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
+                    emitGetTarget(setIdentifier, identifier, isAttr, "0", ADD_NEW_VALUE, jtargetType);
+                    printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
+                    emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
+                    emitImplementationPostamble();
+                }
+                endBlock();
             }
-            endBlock();
 
-            if (!xmltype) {
+            if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XSET))) {
                 // void xsetProp(Value v)
                 printJavaDoc((several ? "Sets (as xml) first " : "Sets (as xml) the ") + propdesc);
+                emit("@Override");
                 emit("public void xset" + propertyName + "(" + xtype + " " + safeVarName + ") {");
                 startBlock();
                 emitImplementationPreamble();
@@ -1970,9 +1863,10 @@
 
             }
 
-            if (xmltype && !several) {
+            if (xmltype && !several && (bmList == null || bmList.contains(BeanMethod.ADD_NEW))) {
                 // Value addNewProp()
                 printJavaDoc("Appends and returns a new empty " + propdesc);
+                emit("@Override");
                 emit("public " + xtype + " addNew" + propertyName + "() {");
                 startBlock();
                 emitImplementationPreamble();
@@ -1985,8 +1879,9 @@
                 endBlock();
             }
 
-            if (nillable) {
+            if (nillable && (bmList == null || bmList.contains(BeanMethod.SET_NIL))) {
                 printJavaDoc((several ? "Nils the first " : "Nils the ") + propdesc);
+                emit("@Override");
                 emit("public void setNil" + propertyName + "() {");
                 startBlock();
                 emitImplementationPreamble();
@@ -1999,8 +1894,9 @@
             }
         }
 
-        if (optional) {
+        if (prop.extendsJavaOption() && (bmList == null || bmList.contains(BeanMethod.UNSET))) {
             printJavaDoc((several ? "Removes first " : "Unsets the ") + propdesc);
+            emit("@Override");
             emit("public void unset" + propertyName + "() {");
             startBlock();
             emitImplementationPreamble();
@@ -2018,92 +1914,100 @@
         if (several) {
             String arrayName = propertyName + "Array";
 
-            if (xmltype) {
-                printJavaDoc("Sets array of all " + propdesc + "  WARNING: This method is not atomicaly synchronized.");
-                emit("public void set" + arrayName + "(" + type + "[] " + safeVarName + "Array) {");
-                startBlock();
-                // do not use synchronize (monitor()) {  and GlobalLock inside  } !!! deadlock
-                //emitImplementationPreamble();
-                emit("check_orphaned();");
-                emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
+            if (bmList == null || bmList.contains(BeanMethod.SET_ARRAY)) {
+                if (xmltype) {
+                    printJavaDoc("Sets array of all " + propdesc + "  WARNING: This method is not atomicaly synchronized.");
+                    emit("@Override");
+                    emit("public void set" + arrayName + "(" + type + "[] " + safeVarName + "Array) {");
+                    startBlock();
+                    // do not use synchronize (monitor()) {  and GlobalLock inside  } !!! deadlock
+                    //emitImplementationPreamble();
+                    emit("check_orphaned();");
+                    emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
 
-                if (isobj) {
-                    if (!isSubstGroup) {
-                        emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
+                    if (isobj) {
+                        if (!isSubstGroup) {
+                            emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
+                        } else {
+                            emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
+                        }
                     } else {
-                        emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
+                        if (!isSubstGroup) {
+                            emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
+                        } else {
+                            emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
+                        }
                     }
+
+                    emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
+                    //emitImplementationPostamble();  to avoid deadlock
+                    endBlock();
                 } else {
-                    if (!isSubstGroup) {
-                        emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
-                    } else {
-                        emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
-                    }
-                }
+                    printJavaDoc("Sets array of all " + propdesc);
+                    emit("@Override");
+                    emit("public void set" + arrayName + "(" + type + "[] " + safeVarName + "Array) {");
+                    startBlock();
+                    emitImplementationPreamble();
+                    emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
 
-                emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
-                //emitImplementationPostamble();  to avoid deadlock
-                endBlock();
-            } else {
-                printJavaDoc("Sets array of all " + propdesc);
-                emit("public void set" + arrayName + "(" + type + "[] " + safeVarName + "Array) {");
+                    if (isobj) {
+                        if (!isSubstGroup) {
+                            emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
+                        } else {
+                            emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
+                        }
+                    } else if (prop.getJavaTypeCode() == SchemaProperty.JAVA_USER) {
+                        if (!isSubstGroup) {
+                            emit("org.apache.xmlbeans.SimpleValue[] dests = arraySetterHelper(" + safeVarName + "Array.length" + ", " + identifier + ");");
+                            emit("for ( int i = 0 ; i < dests.length ; i++ ) {");
+                            emit("    " + getUserTypeStaticHandlerMethod(true, (SchemaTypeImpl) prop.getType())
+                                 + "(" + safeVarName + "Array[i], dests[i]);");
+                            emit("}");
+                        } else {
+                            emit("org.apache.xmlbeans.SimpleValue[] dests = arraySetterHelper(" + safeVarName + "Array.length" + ", " + identifier + ", " + setIdentifier + ");");
+                            emit("for ( int i = 0 ; i < dests.length ; i++ ) {");
+                            emit("    " + getUserTypeStaticHandlerMethod(true, (SchemaTypeImpl) prop.getType())
+                                 + "(" + safeVarName + "Array[i], dests[i]);");
+                            emit("}");
+                        }
+                    } else {
+                        if (!isSubstGroup) {
+                            emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
+                        } else {
+                            emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
+                        }
+                    }
+
+                    emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
+                    emitImplementationPostamble();
+                    endBlock();
+                }
+            }
+
+            if (bmList == null || bmList.contains(BeanMethod.SET_IDX)) {
+                printJavaDoc("Sets ith " + propdesc);
+                emit("@Override");
+                emit("public void set" + arrayName + "(int i, " + type + " " + safeVarName + ") {");
                 startBlock();
-                emitImplementationPreamble();
-                emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
-
-                if (isobj) {
-                    if (!isSubstGroup) {
-                        emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
-                    } else {
-                        emit("unionArraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
-                    }
-                } else if (prop.getJavaTypeCode() == SchemaProperty.JAVA_USER) {
-                    if (!isSubstGroup) {
-                        emit("org.apache.xmlbeans.SimpleValue[] dests = arraySetterHelper(" + safeVarName + "Array.length" + ", " + identifier + ");");
-                        emit("for ( int i = 0 ; i < dests.length ; i++ ) {");
-                        emit("    " + getUserTypeStaticHandlerMethod(true, (SchemaTypeImpl) prop.getType())
-                             + "(" + safeVarName + "Array[i], dests[i]);");
-                        emit("}");
-                    } else {
-                        emit("org.apache.xmlbeans.SimpleValue[] dests = arraySetterHelper(" + safeVarName + "Array.length" + ", " + identifier + ", " + setIdentifier + ");");
-                        emit("for ( int i = 0 ; i < dests.length ; i++ ) {");
-                        emit("    " + getUserTypeStaticHandlerMethod(true, (SchemaTypeImpl) prop.getType())
-                             + "(" + safeVarName + "Array[i], dests[i]);");
-                        emit("}");
-                    }
+                if (xmltype && !isSubstGroup) {
+                    emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
+                    emit("generatedSetterHelperImpl(" + safeVarName + ", " + setIdentifier + ", i, " +
+                         "org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_ARRAYITEM);");
+                    emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
                 } else {
-                    if (!isSubstGroup) {
-                        emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ");");
-                    } else {
-                        emit("arraySetterHelper(" + safeVarName + "Array" + ", " + identifier + ", " + setIdentifier + ");");
-                    }
+                    emitImplementationPreamble();
+                    emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
+                    emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, jtargetType);
+                    printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
+                    emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
+                    emitImplementationPostamble();
                 }
-
-                emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
-                emitImplementationPostamble();
                 endBlock();
             }
 
-            printJavaDoc("Sets ith " + propdesc);
-            emit("public void set" + arrayName + "(int i, " + type + " " + safeVarName + ") {");
-            startBlock();
-            if (xmltype && !isSubstGroup) {
-                emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
-                emit("generatedSetterHelperImpl(" + safeVarName + ", " + setIdentifier + ", i, " +
-                     "org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_ARRAYITEM);");
-                emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
-            } else {
-                emitImplementationPreamble();
-                emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
-                emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, jtargetType);
-                printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
-                emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, "i");
-                emitImplementationPostamble();
-            }
-            endBlock();
-
-            if (!xmltype) {
+            if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XSET_ARRAY))) {
                 printJavaDoc("Sets (as xml) array of all " + propdesc);
+                emit("@Override");
                 emit("public void xset" + arrayName + "(" + xtype + "[]" + safeVarName + "Array) {");
                 startBlock();
                 emitImplementationPreamble();
@@ -2112,8 +2016,11 @@
                 emitPost(sType, PrePostExtension.OPERATION_SET, identifier, isAttr);
                 emitImplementationPostamble();
                 endBlock();
+            }
 
+            if (!xmltype && (bmList == null || bmList.contains(BeanMethod.XSET_IDX))) {
                 printJavaDoc("Sets (as xml) ith " + propdesc);
+                emit("@Override");
                 emit("public void xset" + arrayName + "(int i, " + xtype + " " + safeVarName + ") {");
                 startBlock();
                 emitImplementationPreamble();
@@ -2125,8 +2032,9 @@
                 endBlock();
             }
 
-            if (nillable) {
+            if (nillable && (bmList == null || bmList.contains(BeanMethod.SET_NIL_IDX))) {
                 printJavaDoc("Nils the ith " + propdesc);
+                emit("@Override");
                 emit("public void setNil" + arrayName + "(int i) {");
                 startBlock();
                 emitImplementationPreamble();
@@ -2138,8 +2046,9 @@
                 endBlock();
             }
 
-            if (!xmltype) {
+            if (!xmltype && (bmList == null || bmList.contains(BeanMethod.INSERT_IDX))) {
                 printJavaDoc("Inserts the value as the ith " + propdesc);
+                emit("@Override");
                 emit("public void insert" + propertyName + "(int i, " + type + " " + safeVarName + ") {");
                 startBlock();
                 emitImplementationPreamble();
@@ -2158,8 +2067,11 @@
                 emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
                 emitImplementationPostamble();
                 endBlock();
+            }
 
+            if (!xmltype && (bmList == null || bmList.contains(BeanMethod.ADD))) {
                 printJavaDoc("Appends the value as the last " + propdesc);
+                emit("@Override");
                 emit("public void add" + propertyName + "(" + type + " " + safeVarName + ") {");
                 startBlock();
                 emitImplementationPreamble();
@@ -2172,48 +2084,94 @@
                 endBlock();
             }
 
-            printJavaDoc("Inserts and returns a new empty value (as xml) as the ith " + propdesc);
-            emit("public " + xtype + " insertNew" + propertyName + "(int i) {");
-            startBlock();
-            emitImplementationPreamble();
-            emit(xtype + " target = null;");
-            emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
-            if (!isSubstGroup) {
-                emit("target = (" + xtype + ")get_store().insert_element_user(" + identifier + ", i);");
-            } else // This is a subst group case
-            {
-                emit("target = (" + xtype + ")get_store().insert_element_user(" +
-                     setIdentifier + ", " + identifier + ", i);");
+            if (bmList == null || bmList.contains(BeanMethod.INSERT_NEW_IDX)) {
+                printJavaDoc("Inserts and returns a new empty value (as xml) as the ith " + propdesc);
+                emit("@Override");
+                emit("public " + xtype + " insertNew" + propertyName + "(int i) {");
+                startBlock();
+                emitImplementationPreamble();
+                emit(xtype + " target = null;");
+                emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
+                if (!isSubstGroup) {
+                    emit("target = (" + xtype + ")get_store().insert_element_user(" + identifier + ", i);");
+                } else // This is a subst group case
+                {
+                    emit("target = (" + xtype + ")get_store().insert_element_user(" +
+                         setIdentifier + ", " + identifier + ", i);");
+                }
+                emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
+                emit("return target;");
+                emitImplementationPostamble();
+                endBlock();
             }
-            emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
-            emit("return target;");
-            emitImplementationPostamble();
-            endBlock();
 
-            printJavaDoc("Appends and returns a new empty value (as xml) as the last " + propdesc);
-            emit("public " + xtype + " addNew" + propertyName + "() {");
-            startBlock();
-            emitImplementationPreamble();
-            emit(xtype + " target = null;");
-            emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
-            emitAddTarget(identifier, isAttr, xtype);
-            emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
-            emit("return target;");
-            emitImplementationPostamble();
-            endBlock();
+            if (bmList == null || bmList.contains(BeanMethod.ADD_NEW)) {
+                printJavaDoc("Appends and returns a new empty value (as xml) as the last " + propdesc);
+                emit("@Override");
+                emit("public " + xtype + " addNew" + propertyName + "() {");
+                startBlock();
+                emitImplementationPreamble();
+                emit(xtype + " target = null;");
+                emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
+                emitAddTarget(identifier, isAttr, xtype);
+                emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
+                emit("return target;");
+                emitImplementationPostamble();
+                endBlock();
+            }
 
-            printJavaDoc("Removes the ith " + propdesc);
-            emit("public void remove" + propertyName + "(int i) {");
-            startBlock();
-            emitImplementationPreamble();
-            emitPre(sType, PrePostExtension.OPERATION_REMOVE, identifier, isAttr, "i");
-            emit("get_store().remove_element(" + setIdentifier + ", i);");
-            emitPost(sType, PrePostExtension.OPERATION_REMOVE, identifier, isAttr, "i");
-            emitImplementationPostamble();
-            endBlock();
+            if (bmList == null || bmList.contains(BeanMethod.REMOVE_IDX)) {
+                printJavaDoc("Removes the ith " + propdesc);
+                emit("@Override");
+                emit("public void remove" + propertyName + "(int i) {");
+                startBlock();
+                emitImplementationPreamble();
+                emitPre(sType, PrePostExtension.OPERATION_REMOVE, identifier, isAttr, "i");
+                emit("get_store().remove_element(" + setIdentifier + ", i);");
+                emitPost(sType, PrePostExtension.OPERATION_REMOVE, identifier, isAttr, "i");
+                emitImplementationPostamble();
+                endBlock();
+            }
         }
     }
 
+    SchemaProperty[] getSchemaProperties(SchemaType sType) {
+        if (sType.getContentType() != SchemaType.SIMPLE_CONTENT) {
+            // complex content type implementations derive from base type impls
+            // so derived property impls can be reused
+            return getDerivedProperties(sType);
+        }
+
+        // simple content types impls derive directly from "holder" impls
+        // in order to handle the case (for ints or string enums e.g.) where
+        // there is a simple type restriction.  So property getters need to
+        // be implemented "from scratch" for each derived complex type
+        // Moreover, attribute or element properties can be removed via restriction,
+        // but we still need to implement them because this class is supposed to
+        // also implement all the interfaces
+        SchemaType baseType = sType.getBaseType();
+        List<SchemaProperty> extraProperties = null;
+        while (!baseType.isSimpleType() && !baseType.isBuiltinType()) {
+            for (SchemaProperty baseProperty : baseType.getDerivedProperties()) {
+                if (!(baseProperty.isAttribute() && sType.getAttributeProperty(baseProperty.getName()) != null)) {
+                    if (extraProperties == null) {
+                        extraProperties = new ArrayList<>();
+                    }
+                    extraProperties.add(baseProperty);
+                }
+            }
+            baseType = baseType.getBaseType();
+        }
+
+        SchemaProperty[] properties = sType.getProperties();
+        if (extraProperties == null) {
+            return properties;
+        }
+
+        Collections.addAll(extraProperties, properties);
+        return extraProperties.toArray(new SchemaProperty[0]);
+    }
+
     void printInnerTypeImpl(
         SchemaType sType, SchemaTypeSystem system, boolean isInner) throws IOException {
         String shortName = sType.getShortJavaImplName();
@@ -2227,86 +2185,16 @@
         printExtensionImplMethods(sType);
 
         if (!sType.isSimpleType()) {
-            SchemaProperty[] properties;
-
-            if (sType.getContentType() == SchemaType.SIMPLE_CONTENT) {
-                // simple content types impls derive directly from "holder" impls
-                // in order to handle the case (for ints or string enums e.g.) where
-                // there is a simple type restriction.  So property getters need to
-                // be implemented "from scratch" for each derived complex type
-                // Moreover, attribute or element properties can be removed via restriction,
-                // but we still need to implement them because this class is supposed to
-                // also implement all the interfaces
-                SchemaType baseType = sType.getBaseType();
-                List<SchemaProperty> extraProperties = null;
-                while (!baseType.isSimpleType() && !baseType.isBuiltinType()) {
-                    SchemaProperty[] baseProperties = baseType.getDerivedProperties();
-                    for (SchemaProperty baseProperty : baseProperties) {
-                        if (!(baseProperty.isAttribute() &&
-                              sType.getAttributeProperty(baseProperty.getName()) != null)) {
-                            if (extraProperties == null) {
-                                extraProperties = new ArrayList<>();
-                            }
-                            extraProperties.add(baseProperty);
-                        }
-                    }
-                    baseType = baseType.getBaseType();
-                }
-
-                properties = sType.getProperties();
-                if (extraProperties != null) {
-                    Collections.addAll(extraProperties, properties);
-                    properties = extraProperties.toArray(new SchemaProperty[0]);
-                }
-            } else {
-                // complex content type implementations derive from base type impls
-                // so derived property impls can be reused
-
-                properties = getDerivedProperties(sType);
-            }
-
-            Map<QName, String[]> qNameMap = printStaticFields(properties);
+            SchemaProperty[] properties = getSchemaProperties(sType);
+            Map<QName, Integer> qnameMap = new HashMap<>();
+            Map<QName, Integer> qsetMap = new HashMap<>();
+            printStaticFields(properties, qnameMap, qsetMap);
 
             for (SchemaProperty prop : properties) {
-                QName name = prop.getName();
-                String xmlType = xmlTypeForProperty(prop);
-
-                printGetterImpls(
-                    shortName,
-                    prop,
-                    name,
-                    prop.isAttribute(),
-                    prop.getJavaPropertyName(),
-                    prop.getJavaTypeCode(),
-                    javaTypeForProperty(prop),
-                    xmlType,
-                    prop.hasNillable() != SchemaProperty.NEVER,
-                    prop.extendsJavaOption(),
-                    prop.extendsJavaArray(),
-                    prop.extendsJavaSingleton(),
-                    xmlTypeForPropertyIsUnion(prop),
-                    getIdentifier(qNameMap, name),
-                    getSetIdentifier(qNameMap, name)
-                );
+                printGetterImpls(prop, qnameMap, qsetMap);
 
                 if (!prop.isReadOnly()) {
-                    printSetterImpls(
-                        name,
-                        prop,
-                        prop.isAttribute(),
-                        prop.getJavaPropertyName(),
-                        prop.getJavaTypeCode(),
-                        javaTypeForProperty(prop),
-                        xmlType,
-                        prop.hasNillable() != SchemaProperty.NEVER,
-                        prop.extendsJavaOption(),
-                        prop.extendsJavaArray(),
-                        prop.extendsJavaSingleton(),
-                        xmlTypeForPropertyIsUnion(prop),
-                        getIdentifier(qNameMap, name),
-                        getSetIdentifier(qNameMap, name),
-                        sType
-                    );
+                    printSetterImpls(prop, qnameMap, qsetMap, sType);
                 }
             }
         }
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeSystemCompiler.java b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeSystemCompiler.java
index 3a512be..66748c6 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeSystemCompiler.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeSystemCompiler.java
@@ -380,9 +380,14 @@
 
             String fjn = type.getFullJavaName();
 
+            SchemaCodePrinter printer = (options == null) ? null : options.getSchemaCodePrinter();
+            if (printer == null) {
+                printer = new SchemaTypeCodePrinter();
+            }
+
             try (Writer writer = filer.createSourceFile(fjn)) {
                 // Generate interface class
-                SchemaTypeCodePrinter.printType(writer, type, options);
+                printer.printType(writer, type, options);
             } catch (IOException e) {
                 System.err.println("IO Error " + e);
                 success = false;
@@ -392,7 +397,7 @@
 
             try (Writer writer = filer.createSourceFile(fjn)) {
                 // Generate Implementation class
-                SchemaTypeCodePrinter.printTypeImpl(writer, type, options);
+                printer.printTypeImpl(writer, type, options);
             } catch (IOException e) {
                 System.err.println("IO Error " + e);
                 success = false;
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/SimpleTypeFactory.java b/src/main/java/org/apache/xmlbeans/impl/schema/SimpleTypeFactory.java
new file mode 100644
index 0000000..51d8814
--- /dev/null
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SimpleTypeFactory.java
@@ -0,0 +1,29 @@
+/*   Copyright 2017, 2018 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.schema;
+
+import org.apache.xmlbeans.SchemaTypeSystem;
+
+@SuppressWarnings("unchecked")
+public class SimpleTypeFactory<T> extends ElementFactory<T> {
+    public SimpleTypeFactory(SchemaTypeSystem typeSystem, String typeHandle) {
+        super(typeSystem, typeHandle);
+    }
+
+    public T newValue(java.lang.Object obj) {
+        return (T) getType().newValue(obj);
+    }
+}
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/XmlObjectFactory.java b/src/main/java/org/apache/xmlbeans/impl/schema/XmlObjectFactory.java
new file mode 100644
index 0000000..9fe396c
--- /dev/null
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/XmlObjectFactory.java
@@ -0,0 +1,332 @@
+/*   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.schema;
+
+import org.apache.xmlbeans.*;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Node;
+
+import javax.xml.stream.XMLStreamReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+/**
+ * Factory class for creating new instances.  Note that if
+ * a type can be inferred from the XML being loaded (for example,
+ * by recognizing the document element QName), then the instance
+ * returned by a factory will have the inferred type.  Otherwise
+ * the Factory will returned an untyped document.
+ */
+@SuppressWarnings("unchecked")
+public class XmlObjectFactory<T> extends DocumentFactory<T> {
+    // anytype needs to be handled different while parsing - opposed to specific instances
+    private final boolean isAnyType;
+
+    public XmlObjectFactory(String typeHandle) {
+        this(XmlBeans.getBuiltinTypeSystem(), typeHandle);
+    }
+
+    /**
+     * This constructor is only used as a workaround for bootstrapping the XML schemas - don't use it!
+     */
+    public XmlObjectFactory(SchemaTypeSystem typeSystem, String typeHandle) {
+        super(typeSystem, typeHandle);
+        isAnyType = "_BI_anyType".equals(typeHandle);
+    }
+
+    /**
+     * Creates a new, completely empty instance.
+     */
+    @Override
+    public T newInstance() {
+        return (T)XmlBeans.getContextTypeLoader().newInstance(getInnerType(), null);
+    }
+
+    /**
+     * <p>Creates a new, completely empty instance, specifying options
+     * for the root element's document type and/or whether to validate
+     * value facets as they are set.</p>
+     * <p>
+     * Use the <em>options</em> parameter to specify the following:</p>
+     *
+     * <table>
+     * <tr><th>To specify this</th><th>Use this method</th></tr>
+     * <tr>
+     *  <td>The document type for the root element.</td>
+     *  <td>{@link XmlOptions#setDocumentType}</td>
+     * </tr>
+     * <tr>
+     *  <td>Whether value facets should be checked as they are set.</td>
+     *  <td>{@link XmlOptions#setValidateOnSet}</td>
+     * </tr>
+     * </table>
+     *
+     * @param options Options specifying root document type and/or value facet
+     *                checking.
+     * @return A new, empty instance of XmlObject.</li>
+     */
+    @Override
+    public T newInstance(XmlOptions options) {
+        return (T)XmlBeans.getContextTypeLoader().newInstance(getInnerType(), options);
+    }
+
+    /**
+     * Creates an immutable {@link XmlObject} value
+     */
+    public T newValue(Object obj) {
+        return (T)getType().newValue(obj);
+    }
+
+    /**
+     * Parses the given {@link String} as XML.
+     */
+    @Override
+    public T parse(String xmlAsString) throws XmlException {
+        return (T)XmlBeans.getContextTypeLoader().parse(xmlAsString, getInnerType(), null);
+    }
+
+    /**
+     * Parses the given {@link String} as XML.
+     * <p>
+     * Use the <em>options</em> parameter to specify the following:</p>
+     *
+     * <table>
+     * <tr><th>To specify this</th><th>Use this method</th></tr>
+     * <tr>
+     *  <td>The document type for the root element.</td>
+     *  <td>{@link XmlOptions#setDocumentType}</td>
+     * </tr>
+     * <tr>
+     *  <td>To place line number annotations in the store when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadLineNumbers}</td>
+     * </tr>
+     * <tr>
+     *  <td>To replace the document element with the specified QName when parsing.</td>
+     *  <td>{@link XmlOptions#setLoadReplaceDocumentElement}</td>
+     * </tr>
+     * <tr>
+     *  <td>To strip all insignificant whitespace when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadStripWhitespace}</td>
+     * </tr>
+     * <tr>
+     *  <td>To strip all comments when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadStripComments}</td>
+     * </tr>
+     * <tr>
+     *  <td>To strip all processing instructions when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadStripProcinsts}</td>
+     * </tr>
+     * <tr>
+     *  <td>A map of namespace URI substitutions to use when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadSubstituteNamespaces}</td>
+     * </tr>
+     * <tr>
+     *  <td>Additional namespace mappings to be added when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadAdditionalNamespaces}</td>
+     * </tr>
+     * <tr>
+     *  <td>To trim the underlying XML text buffer immediately after parsing
+     *  a document, resulting in a smaller memory footprint.</td>
+     *  <td>{@link XmlOptions#setLoadTrimTextBuffer}</td>
+     * </tr>
+     * </table>
+     *
+     * @param xmlAsString The string to parse.
+     * @param options     Options as specified.
+     * @return A new instance containing the specified XML.
+     */
+    @Override
+    public T parse(String xmlAsString, XmlOptions options) throws XmlException {
+        return (T)XmlBeans.getContextTypeLoader().parse(xmlAsString, getInnerType(), options);
+    }
+
+    /**
+     * Parses the given {@link File} as XML.
+     */
+    @Override
+    public T parse(File file) throws XmlException, IOException {
+        return (T)XmlBeans.getContextTypeLoader().parse(file, getInnerType(), null);
+    }
+
+    /**
+     * Parses the given {@link File} as XML.
+     */
+    @Override
+    public T parse(File file, XmlOptions options) throws XmlException, IOException {
+        return (T)XmlBeans.getContextTypeLoader().parse(file, getInnerType(), options);
+    }
+
+    /**
+     * Downloads the given {@link java.net.URL} as XML.
+     */
+    @Override
+    public T parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
+        return (T)XmlBeans.getContextTypeLoader().parse(u, getInnerType(), null);
+    }
+
+    /**
+     * Downloads the given {@link java.net.URL} as XML.
+     */
+    @Override
+    public T parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
+        return (T)XmlBeans.getContextTypeLoader().parse(u, getInnerType(), options);
+    }
+
+    /**
+     * Decodes and parses the given {@link InputStream} as XML.
+     */
+    @Override
+    public T parse(InputStream is) throws XmlException, IOException {
+        return (T)XmlBeans.getContextTypeLoader().parse(is, getInnerType(), null);
+    }
+
+    /**
+     * Decodes and parses the given {@link XMLStreamReader} as XML.
+     */
+    @Override
+    public T parse(XMLStreamReader xsr) throws XmlException {
+        return (T)XmlBeans.getContextTypeLoader().parse(xsr, getInnerType(), null);
+    }
+
+    /**
+     * Decodes and parses the given {@link InputStream} as XML.
+     * <p>
+     * Use the <em>options</em> parameter to specify the following:</p>
+     *
+     * <table>
+     * <tr><th>To specify this</th><th>Use this method</th></tr>
+     * <tr>
+     *  <td>The character encoding to use when parsing or writing a document.</td>
+     *  <td>{@link XmlOptions#setCharacterEncoding}</td>
+     * </tr>
+     * <tr>
+     *  <td>The document type for the root element.</td>
+     *  <td>{@link XmlOptions#setDocumentType}</td>
+     * </tr>
+     * <tr>
+     *  <td>Place line number annotations in the store when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadLineNumbers}</td>
+     * </tr>
+     * <tr>
+     *  <td>Replace the document element with the specified QName when parsing.</td>
+     *  <td>{@link XmlOptions#setLoadReplaceDocumentElement}</td>
+     * </tr>
+     * <tr>
+     *  <td>Strip all insignificant whitespace when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadStripWhitespace}</td>
+     * </tr>
+     * <tr>
+     *  <td>Strip all comments when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadStripComments}</td>
+     * </tr>
+     * <tr>
+     *  <td>Strip all processing instructions when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadStripProcinsts}</td>
+     * </tr>
+     * <tr>
+     *  <td>Set a map of namespace URI substitutions to use when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadSubstituteNamespaces}</td>
+     * </tr>
+     * <tr>
+     *  <td>Set additional namespace mappings to be added when parsing a document.</td>
+     *  <td>{@link XmlOptions#setLoadAdditionalNamespaces}</td>
+     * </tr>
+     * <tr>
+     *  <td>Trim the underlying XML text buffer immediately after parsing
+     *  a document, resulting in a smaller memory footprint.</td>
+     *  <td>{@link XmlOptions#setLoadTrimTextBuffer}</td>
+     * </tr>
+     * </table>
+     */
+    @Override
+    public T parse(InputStream is, XmlOptions options) throws XmlException, IOException {
+        return (T)XmlBeans.getContextTypeLoader().parse(is, getInnerType(), options);
+    }
+
+    /**
+     * Parses the given {@link XMLStreamReader} as XML.
+     */
+    @Override
+    public T parse(XMLStreamReader xsr, XmlOptions options) throws XmlException {
+        return (T)XmlBeans.getContextTypeLoader().parse(xsr, getInnerType(), options);
+    }
+
+    /**
+     * Parses the given {@link Reader} as XML.
+     */
+    @Override
+    public T parse(Reader r) throws XmlException, IOException {
+        return (T)XmlBeans.getContextTypeLoader().parse(r, getInnerType(), null);
+    }
+
+    /**
+     * Parses the given {@link Reader} as XML.
+     */
+    @Override
+    public T parse(Reader r, XmlOptions options) throws XmlException, IOException {
+        return (T)XmlBeans.getContextTypeLoader().parse(r, getInnerType(), options);
+    }
+
+    /**
+     * Converts the given DOM {@link Node} into an XmlObject.
+     */
+    @Override
+    public T parse(Node node) throws XmlException {
+        return (T)XmlBeans.getContextTypeLoader().parse(node, getInnerType(), null);
+    }
+
+    /**
+     * Converts the given DOM {@link Node} into an XmlObject.
+     */
+    @Override
+    public T parse(Node node, XmlOptions options) throws XmlException {
+        return (T)XmlBeans.getContextTypeLoader().parse(node, getInnerType(), options);
+    }
+
+    /**
+     * Returns an {@link XmlSaxHandler} that can load an XmlObject from SAX events.
+     */
+    public XmlSaxHandler newXmlSaxHandler() {
+        return XmlBeans.getContextTypeLoader().newXmlSaxHandler(getInnerType(), null);
+    }
+
+    /**
+     * Returns an {@link XmlSaxHandler} that can load an XmlObject from SAX events.
+     */
+    public XmlSaxHandler newXmlSaxHandler(XmlOptions options) {
+        return XmlBeans.getContextTypeLoader().newXmlSaxHandler(getInnerType(), options);
+    }
+
+    /**
+     * Creates a new DOMImplementation object
+     */
+    public DOMImplementation newDomImplementation() {
+        return XmlBeans.getContextTypeLoader().newDomImplementation(null);
+    }
+
+    /**
+     * Creates a new DOMImplementation object, taking options
+     */
+    public DOMImplementation newDomImplementation(XmlOptions options) {
+        return XmlBeans.getContextTypeLoader().newDomImplementation(options);
+    }
+
+    private SchemaType getInnerType() {
+        return isAnyType ? null : getType();
+    }
+}
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/Parameters.java b/src/main/java/org/apache/xmlbeans/impl/tool/Parameters.java
new file mode 100644
index 0000000..ec2a6ea
--- /dev/null
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/Parameters.java
@@ -0,0 +1,328 @@
+/*   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.tool;
+
+import org.apache.xmlbeans.SchemaCodePrinter;
+import org.apache.xmlbeans.XmlError;
+import org.apache.xmlbeans.XmlOptions;
+import org.xml.sax.EntityResolver;
+
+import java.io.File;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+public class Parameters {
+    private File baseDir;
+    private File[] xsdFiles;
+    private File[] wsdlFiles;
+    private File[] javaFiles;
+    private File[] configFiles;
+    private URL[] urlFiles;
+    private File[] classpath;
+    private File outputJar;
+    private String name;
+    private File srcDir;
+    private File classesDir;
+    private String memoryInitialSize;
+    private String memoryMaximumSize;
+    private String compiler;
+    private boolean nojavac;
+    private boolean quiet;
+    private boolean verbose;
+    private boolean download;
+    private Collection<XmlError> errorListener;
+    private boolean noUpa;
+    private boolean noPvr;
+    private boolean noAnn;
+    private boolean noVDoc;
+    private boolean noExt;
+    private boolean debug;
+    private boolean incrementalSrcGen;
+    private String repackage;
+    private List<Extension> extensions = Collections.emptyList();
+    private Set<String> mdefNamespaces = Collections.emptySet();
+    private String catalogFile;
+    private SchemaCodePrinter schemaCodePrinter;
+    private EntityResolver entityResolver;
+    private Set<XmlOptions.BeanMethod> partialMethods = Collections.emptySet();
+
+    public File getBaseDir() {
+        return baseDir;
+    }
+
+    public void setBaseDir(File baseDir) {
+        this.baseDir = baseDir;
+    }
+
+    public File[] getXsdFiles() {
+        return xsdFiles;
+    }
+
+    public void setXsdFiles(File... xsdFiles) {
+        this.xsdFiles = xsdFiles;
+    }
+
+    public File[] getWsdlFiles() {
+        return wsdlFiles;
+    }
+
+    public void setWsdlFiles(File[] wsdlFiles) {
+        this.wsdlFiles = wsdlFiles;
+    }
+
+    public File[] getJavaFiles() {
+        return javaFiles;
+    }
+
+    public void setJavaFiles(File[] javaFiles) {
+        this.javaFiles = javaFiles;
+    }
+
+    public File[] getConfigFiles() {
+        return configFiles;
+    }
+
+    public void setConfigFiles(File[] configFiles) {
+        this.configFiles = configFiles;
+    }
+
+    public URL[] getUrlFiles() {
+        return urlFiles;
+    }
+
+    public void setUrlFiles(URL[] urlFiles) {
+        this.urlFiles = urlFiles;
+    }
+
+    public File[] getClasspath() {
+        return classpath;
+    }
+
+    public void setClasspath(File[] classpath) {
+        this.classpath = classpath;
+    }
+
+    public File getOutputJar() {
+        return outputJar;
+    }
+
+    public void setOutputJar(File outputJar) {
+        this.outputJar = outputJar;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public File getSrcDir() {
+        return srcDir;
+    }
+
+    public void setSrcDir(File srcDir) {
+        this.srcDir = srcDir;
+    }
+
+    public File getClassesDir() {
+        return classesDir;
+    }
+
+    public void setClassesDir(File classesDir) {
+        this.classesDir = classesDir;
+    }
+
+    public boolean isNojavac() {
+        return nojavac;
+    }
+
+    public void setNojavac(boolean nojavac) {
+        this.nojavac = nojavac;
+    }
+
+    public boolean isQuiet() {
+        return quiet;
+    }
+
+    public void setQuiet(boolean quiet) {
+        this.quiet = quiet;
+    }
+
+    public boolean isVerbose() {
+        return verbose;
+    }
+
+    public void setVerbose(boolean verbose) {
+        this.verbose = verbose;
+    }
+
+    public boolean isDownload() {
+        return download;
+    }
+
+    public void setDownload(boolean download) {
+        this.download = download;
+    }
+
+    public boolean isNoUpa() {
+        return noUpa;
+    }
+
+    public void setNoUpa(boolean noUpa) {
+        this.noUpa = noUpa;
+    }
+
+    public boolean isNoPvr() {
+        return noPvr;
+    }
+
+    public void setNoPvr(boolean noPvr) {
+        this.noPvr = noPvr;
+    }
+
+    public boolean isNoAnn() {
+        return noAnn;
+    }
+
+    public void setNoAnn(boolean noAnn) {
+        this.noAnn = noAnn;
+    }
+
+    public boolean isNoVDoc() {
+        return noVDoc;
+    }
+
+    public void setNoVDoc(boolean newNoVDoc) {
+        this.noVDoc = newNoVDoc;
+    }
+
+    public boolean isNoExt() {
+        return noExt;
+    }
+
+    public void setNoExt(boolean newNoExt) {
+        this.noExt = newNoExt;
+    }
+
+    public boolean isIncrementalSrcGen() {
+        return incrementalSrcGen;
+    }
+
+    public void setIncrementalSrcGen(boolean incrSrcGen) {
+        this.incrementalSrcGen = incrSrcGen;
+    }
+
+    public boolean isDebug() {
+        return debug;
+    }
+
+    public void setDebug(boolean debug) {
+        this.debug = debug;
+    }
+
+    public String getMemoryInitialSize() {
+        return memoryInitialSize;
+    }
+
+    public void setMemoryInitialSize(String memoryInitialSize) {
+        this.memoryInitialSize = memoryInitialSize;
+    }
+
+    public String getMemoryMaximumSize() {
+        return memoryMaximumSize;
+    }
+
+    public void setMemoryMaximumSize(String memoryMaximumSize) {
+        this.memoryMaximumSize = memoryMaximumSize;
+    }
+
+    public String getCompiler() {
+        return compiler;
+    }
+
+    public void setCompiler(String compiler) {
+        this.compiler = compiler;
+    }
+
+    public Collection<XmlError> getErrorListener() {
+        return errorListener;
+    }
+
+    public void setErrorListener(Collection<XmlError> errorListener) {
+        this.errorListener = errorListener;
+    }
+
+    public String getRepackage() {
+        return repackage;
+    }
+
+    public void setRepackage(String newRepackage) {
+        repackage = newRepackage;
+    }
+
+    public List<Extension> getExtensions() {
+        return extensions;
+    }
+
+    public void setExtensions(List<Extension> extensions) {
+        this.extensions = extensions;
+    }
+
+    public Set<String> getMdefNamespaces() {
+        return mdefNamespaces;
+    }
+
+    public void setMdefNamespaces(Set<String> mdefNamespaces) {
+        this.mdefNamespaces = mdefNamespaces;
+    }
+
+    public String getCatalogFile() {
+        return catalogFile;
+    }
+
+    public void setCatalogFile(String catalogPropFile) {
+        this.catalogFile = catalogPropFile;
+    }
+
+    public SchemaCodePrinter getSchemaCodePrinter() {
+        return schemaCodePrinter;
+    }
+
+    public void setSchemaCodePrinter(SchemaCodePrinter schemaCodePrinter) {
+        this.schemaCodePrinter = schemaCodePrinter;
+    }
+
+    public EntityResolver getEntityResolver() {
+        return entityResolver;
+    }
+
+    public void setEntityResolver(EntityResolver entityResolver) {
+        this.entityResolver = entityResolver;
+    }
+
+    public Set<XmlOptions.BeanMethod> getPartialMethods() {
+        return partialMethods;
+    }
+
+    public void setPartialMethods(Set<XmlOptions.BeanMethod> partialMethods) {
+        this.partialMethods = partialMethods;
+    }
+}
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java b/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
index 0ab9824..164c1c1 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
@@ -16,6 +16,7 @@
 package org.apache.xmlbeans.impl.tool;
 
 import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.XmlOptions.BeanMethod;
 import org.apache.xmlbeans.impl.common.*;
 import org.apache.xmlbeans.impl.config.BindingConfigImpl;
 import org.apache.xmlbeans.impl.repackage.Repackager;
@@ -62,6 +63,8 @@
         System.out.println("    -license - prints license information");
         System.out.println("    -allowmdef \"[ns] [ns] [ns]\" - ignores multiple defs in given namespaces (use ##local for no-namespace)");
         System.out.println("    -catalog [file] -  catalog file for org.apache.xml.resolver.tools.CatalogResolver. (Note: needs resolver.jar from http://xml.apache.org/commons/components/resolver/index.html)");
+        System.out.println("    -partialMethods [list] -  comma separated list of bean methods to be generated. Use \"-\" to negate and \"ALL\" for all." );
+        System.out.println("                              processed left-to-right, e.g. \"ALL,-GET_LIST\" exclude java.util.List getters - see XmlOptions.BeanMethod" );
         /* Undocumented feature - pass in one schema compiler extension and related parameters
         System.out.println("    -repackage - repackage specification");
         System.out.println("    -extension - registers a schema compiler extension");
@@ -111,6 +114,8 @@
         opts.add("extensionParms");
         opts.add("allowmdef");
         opts.add("catalog");
+        opts.add("partialMethods");
+
         CommandLine cl = new CommandLine(args, flags, opts);
 
         if (cl.getOpt("h") != null || cl.getOpt("help") != null || cl.getOpt("usage") != null) {
@@ -298,6 +303,8 @@
 
         String catString = cl.getOpt("catalog");
 
+        String partialMethods = cl.getOpt("partialMethods");
+
         Parameters params = new Parameters();
         params.setBaseDir(baseDir);
         params.setXsdFiles(xsdFiles);
@@ -329,7 +336,7 @@
         params.setMdefNamespaces(mdefNamespaces);
         params.setCatalogFile(catString);
         params.setSchemaCodePrinter(codePrinter);
-
+        params.setPartialMethods(parsePartialMethods(partialMethods));
         boolean result = compile(params);
 
         if (tempdir != null) {
@@ -343,297 +350,6 @@
         System.exit(0);
     }
 
-    public static class Parameters {
-        private File baseDir;
-        private File[] xsdFiles;
-        private File[] wsdlFiles;
-        private File[] javaFiles;
-        private File[] configFiles;
-        private URL[] urlFiles;
-        private File[] classpath;
-        private File outputJar;
-        private String name;
-        private File srcDir;
-        private File classesDir;
-        private String memoryInitialSize;
-        private String memoryMaximumSize;
-        private String compiler;
-        private boolean nojavac;
-        private boolean quiet;
-        private boolean verbose;
-        private boolean download;
-        private Collection<XmlError> errorListener;
-        private boolean noUpa;
-        private boolean noPvr;
-        private boolean noAnn;
-        private boolean noVDoc;
-        private boolean noExt;
-        private boolean debug;
-        private boolean incrementalSrcGen;
-        private String repackage;
-        private List<Extension> extensions = Collections.emptyList();
-        private Set<String> mdefNamespaces = Collections.emptySet();
-        private String catalogFile;
-        private SchemaCodePrinter schemaCodePrinter;
-        private EntityResolver entityResolver;
-
-        public File getBaseDir() {
-            return baseDir;
-        }
-
-        public void setBaseDir(File baseDir) {
-            this.baseDir = baseDir;
-        }
-
-        public File[] getXsdFiles() {
-            return xsdFiles;
-        }
-
-        public void setXsdFiles(File[] xsdFiles) {
-            this.xsdFiles = xsdFiles;
-        }
-
-        public File[] getWsdlFiles() {
-            return wsdlFiles;
-        }
-
-        public void setWsdlFiles(File[] wsdlFiles) {
-            this.wsdlFiles = wsdlFiles;
-        }
-
-        public File[] getJavaFiles() {
-            return javaFiles;
-        }
-
-        public void setJavaFiles(File[] javaFiles) {
-            this.javaFiles = javaFiles;
-        }
-
-        public File[] getConfigFiles() {
-            return configFiles;
-        }
-
-        public void setConfigFiles(File[] configFiles) {
-            this.configFiles = configFiles;
-        }
-
-        public URL[] getUrlFiles() {
-            return urlFiles;
-        }
-
-        public void setUrlFiles(URL[] urlFiles) {
-            this.urlFiles = urlFiles;
-        }
-
-        public File[] getClasspath() {
-            return classpath;
-        }
-
-        public void setClasspath(File[] classpath) {
-            this.classpath = classpath;
-        }
-
-        public File getOutputJar() {
-            return outputJar;
-        }
-
-        public void setOutputJar(File outputJar) {
-            this.outputJar = outputJar;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(String name) {
-            this.name = name;
-        }
-
-        public File getSrcDir() {
-            return srcDir;
-        }
-
-        public void setSrcDir(File srcDir) {
-            this.srcDir = srcDir;
-        }
-
-        public File getClassesDir() {
-            return classesDir;
-        }
-
-        public void setClassesDir(File classesDir) {
-            this.classesDir = classesDir;
-        }
-
-        public boolean isNojavac() {
-            return nojavac;
-        }
-
-        public void setNojavac(boolean nojavac) {
-            this.nojavac = nojavac;
-        }
-
-        public boolean isQuiet() {
-            return quiet;
-        }
-
-        public void setQuiet(boolean quiet) {
-            this.quiet = quiet;
-        }
-
-        public boolean isVerbose() {
-            return verbose;
-        }
-
-        public void setVerbose(boolean verbose) {
-            this.verbose = verbose;
-        }
-
-        public boolean isDownload() {
-            return download;
-        }
-
-        public void setDownload(boolean download) {
-            this.download = download;
-        }
-
-        public boolean isNoUpa() {
-            return noUpa;
-        }
-
-        public void setNoUpa(boolean noUpa) {
-            this.noUpa = noUpa;
-        }
-
-        public boolean isNoPvr() {
-            return noPvr;
-        }
-
-        public void setNoPvr(boolean noPvr) {
-            this.noPvr = noPvr;
-        }
-
-        public boolean isNoAnn() {
-            return noAnn;
-        }
-
-        public void setNoAnn(boolean noAnn) {
-            this.noAnn = noAnn;
-        }
-
-        public boolean isNoVDoc() {
-            return noVDoc;
-        }
-
-        public void setNoVDoc(boolean newNoVDoc) {
-            this.noVDoc = newNoVDoc;
-        }
-
-        public boolean isNoExt() {
-            return noExt;
-        }
-
-        public void setNoExt(boolean newNoExt) {
-            this.noExt = newNoExt;
-        }
-
-        public boolean isIncrementalSrcGen() {
-            return incrementalSrcGen;
-        }
-
-        public void setIncrementalSrcGen(boolean incrSrcGen) {
-            this.incrementalSrcGen = incrSrcGen;
-        }
-
-        public boolean isDebug() {
-            return debug;
-        }
-
-        public void setDebug(boolean debug) {
-            this.debug = debug;
-        }
-
-        public String getMemoryInitialSize() {
-            return memoryInitialSize;
-        }
-
-        public void setMemoryInitialSize(String memoryInitialSize) {
-            this.memoryInitialSize = memoryInitialSize;
-        }
-
-        public String getMemoryMaximumSize() {
-            return memoryMaximumSize;
-        }
-
-        public void setMemoryMaximumSize(String memoryMaximumSize) {
-            this.memoryMaximumSize = memoryMaximumSize;
-        }
-
-        public String getCompiler() {
-            return compiler;
-        }
-
-        public void setCompiler(String compiler) {
-            this.compiler = compiler;
-        }
-
-        public Collection<XmlError> getErrorListener() {
-            return errorListener;
-        }
-
-        public void setErrorListener(Collection<XmlError> errorListener) {
-            this.errorListener = errorListener;
-        }
-
-        public String getRepackage() {
-            return repackage;
-        }
-
-        public void setRepackage(String newRepackage) {
-            repackage = newRepackage;
-        }
-
-        public List<Extension> getExtensions() {
-            return extensions;
-        }
-
-        public void setExtensions(List<Extension> extensions) {
-            this.extensions = extensions;
-        }
-
-        public Set<String> getMdefNamespaces() {
-            return mdefNamespaces;
-        }
-
-        public void setMdefNamespaces(Set<String> mdefNamespaces) {
-            this.mdefNamespaces = mdefNamespaces;
-        }
-
-        public String getCatalogFile() {
-            return catalogFile;
-        }
-
-        public void setCatalogFile(String catalogPropFile) {
-            this.catalogFile = catalogPropFile;
-        }
-
-        public SchemaCodePrinter getSchemaCodePrinter() {
-            return schemaCodePrinter;
-        }
-
-        public void setSchemaCodePrinter(SchemaCodePrinter schemaCodePrinter) {
-            this.schemaCodePrinter = schemaCodePrinter;
-        }
-
-        public EntityResolver getEntityResolver() {
-            return entityResolver;
-        }
-
-        public void setEntityResolver(EntityResolver entityResolver) {
-            this.entityResolver = entityResolver;
-        }
-    }
-
     private static SchemaTypeSystem loadTypeSystem(String name, File[] xsdFiles, File[] wsdlFiles, URL[] urlFiles, File[] configFiles,
                                                    File[] javaFiles, ResourceLoader cpResourceLoader,
                                                    boolean download, boolean noUpa, boolean noPvr, boolean noAnn, boolean noVDoc, boolean noExt,
@@ -894,6 +610,7 @@
         boolean noExt = params.isNoExt();
         boolean incrSrcGen = params.isIncrementalSrcGen();
         Collection<XmlError> outerErrorListener = params.getErrorListener();
+        Set<BeanMethod> partialMethods = params.getPartialMethods();
 
         String repackage = params.getRepackage();
 
@@ -968,6 +685,7 @@
             if (codePrinter != null) {
                 options.setSchemaCodePrinter(codePrinter);
             }
+            options.setCompilePartialMethod(partialMethods);
 
             // save .xsb files
             system.save(filer);
@@ -1035,6 +753,26 @@
         return result;
     }
 
+    static Set<BeanMethod> parsePartialMethods(String partialMethods) {
+        final Set<BeanMethod> beanMethods = new HashSet<>();
+        if (partialMethods != null) {
+            for (String pm : partialMethods.split(",")) {
+                if ("ALL".equals(pm)) {
+                    beanMethods.addAll(Arrays.asList(BeanMethod.values()));
+                    continue;
+                }
+                boolean neg = pm.startsWith("-");
+                BeanMethod bm = BeanMethod.valueOf(pm.substring(neg ? 1 : 0));
+                if (neg) {
+                    beanMethods.remove(bm);
+                } else {
+                    beanMethods.add(bm);
+                }
+            }
+        }
+        return beanMethods.isEmpty() ? null : beanMethods;
+    }
+
     private static void runExtensions(List<Extension> extensions, SchemaTypeSystem system, File classesDir) {
         if (extensions != null && extensions.size() > 0) {
             SchemaCompilerExtension sce;
diff --git a/src/main/java/org/apache/xmlbeans/impl/tool/XMLBean.java b/src/main/java/org/apache/xmlbeans/impl/tool/XMLBean.java
index 337a47a..ecb4d82 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/XMLBean.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/XMLBean.java
@@ -25,6 +25,7 @@
 import org.apache.tools.ant.types.Path;
 import org.apache.tools.ant.types.Reference;
 import org.apache.xmlbeans.XmlError;
+import org.apache.xmlbeans.XmlOptions;
 import org.apache.xmlbeans.impl.common.IOUtil;
 
 import java.io.File;
@@ -82,7 +83,8 @@
         memoryInitialSize,
         memoryMaximumSize,
         catalog,
-        repackage;
+        repackage,
+        partialMethods;
 
     private final List<Extension> extensions = new ArrayList<>();
 
@@ -203,7 +205,7 @@
             }
 
             // generate the source
-            SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+            Parameters params = new Parameters();
             params.setBaseDir(theBasedir);
             params.setXsdFiles(xsdArray);
             params.setWsdlFiles(wsdlArray);
@@ -229,6 +231,7 @@
             params.setNoVDoc(novdoc);
             params.setNoExt(noext);
             params.setRepackage(repackage);
+            params.setPartialMethods(SchemaCompiler.parsePartialMethods(partialMethods));
             success = SchemaCompiler.compile(params);
 
             if (success && !srconly) {
@@ -764,6 +767,20 @@
         this.repackage = repackage;
     }
 
+    public String getPartialMethods() {
+        return partialMethods;
+    }
+
+    /**
+     * Comma separated list of bean methods to be generated. Use "-" to negate and "ALL" for all.
+     * processed left-to-right, e.g. "ALL,-GET_LIST" exclude java.util.List getters
+     *
+     * @see XmlOptions.BeanMethod
+     */
+    public void setPartialMethods(String partialMethods) {
+        this.partialMethods = partialMethods;
+    }
+
     private static URI uriFromFile(File f) {
         if (f == null) {
             return null;
diff --git a/src/main/java/org/apache/xmlbeans/impl/values/JavaListObject.java b/src/main/java/org/apache/xmlbeans/impl/values/JavaListObject.java
new file mode 100644
index 0000000..15d8809
--- /dev/null
+++ b/src/main/java/org/apache/xmlbeans/impl/values/JavaListObject.java
@@ -0,0 +1,89 @@
+/*   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.values;
+
+import java.util.AbstractList;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+public class JavaListObject<T> extends AbstractList<T> {
+    private final Function<Integer,T> getter;
+    private final BiConsumer<Integer,T> setter;
+    private final BiConsumer<Integer,T> adder;
+    private final Consumer<Integer> remover;
+    private final Supplier<Integer> sizer;
+
+    public JavaListObject(
+        Function<Integer,T> getter,
+        BiConsumer<Integer,T> setter,
+        BiConsumer<Integer,T> adder,
+        Consumer<Integer> remover,
+        Supplier<Integer> sizer
+    ) {
+        this.getter = getter;
+        this.setter = setter;
+        this.adder = adder;
+        this.remover = remover;
+        this.sizer = sizer;
+    }
+
+
+    @Override
+    public T get(int index) {
+        if (getter == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no getter method available");
+        }
+        return getter.apply(index);
+    }
+
+    @Override
+    public T set(int index, T element) {
+        if (setter == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no setter method available");
+        }
+        T old = get(index);
+        setter.accept(index, element);
+        return old;
+    }
+
+    @Override
+    public void add(int index, T t) {
+        if (adder == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no add method available");
+        }
+        adder.accept(index, t);
+    }
+
+    @Override
+    public T remove(int index) {
+        if (remover == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no remove method available");
+        }
+        T old = get(index);
+        remover.accept(index);
+        return old;
+    }
+
+    @Override
+    public int size() {
+        if (sizer == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no size-of method available");
+        }
+        return sizer.get();
+    }
+}
diff --git a/src/main/java/org/apache/xmlbeans/impl/values/JavaListXmlObject.java b/src/main/java/org/apache/xmlbeans/impl/values/JavaListXmlObject.java
new file mode 100644
index 0000000..5d0b9c1
--- /dev/null
+++ b/src/main/java/org/apache/xmlbeans/impl/values/JavaListXmlObject.java
@@ -0,0 +1,91 @@
+/*   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.values;
+
+import org.apache.xmlbeans.XmlObject;
+
+import java.util.AbstractList;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+public class JavaListXmlObject<T extends XmlObject> extends AbstractList<T> {
+    private final Function<Integer,T> getter;
+    private final BiConsumer<Integer,T> setter;
+    private final Function<Integer,T> adder;
+    private final Consumer<Integer> remover;
+    private final Supplier<Integer> sizer;
+
+    public JavaListXmlObject(
+        Function<Integer,T> getter,
+        BiConsumer<Integer,T> setter,
+        Function<Integer,T> adder,
+        Consumer<Integer> remover,
+        Supplier<Integer> sizer
+    ) {
+        this.getter = getter;
+        this.setter = setter;
+        this.adder = adder;
+        this.remover = remover;
+        this.sizer = sizer;
+    }
+
+
+    @Override
+    public T get(int index) {
+        if (getter == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no getter available");
+        }
+        return getter.apply(index);
+    }
+
+    @Override
+    public T set(int index, T element) {
+        if (setter == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no setter available");
+        }
+        T old = get(index);
+        setter.accept(index, element);
+        return old;
+    }
+
+    @Override
+    public void add(int index, T t) {
+        if (adder == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no add method available");
+        }
+        adder.apply(index).set(t);
+    }
+
+    @Override
+    public T remove(int index) {
+        if (remover == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no remove method available");
+        }
+        T old = get(index);
+        remover.accept(index);
+        return old;
+    }
+
+    @Override
+    public int size() {
+        if (sizer == null) {
+            throw new IllegalStateException("XmlBean generated using partial methods - no size-of method available");
+        }
+        return sizer.get();
+    }
+}
diff --git a/src/main/multimodule/java9/module-info.class b/src/main/multimodule/java9/module-info.class
index af3876f..836fbf5 100644
--- a/src/main/multimodule/java9/module-info.class
+++ b/src/main/multimodule/java9/module-info.class
Binary files differ
diff --git a/src/test/java/compile/scomp/checkin/CompilationTests.java b/src/test/java/compile/scomp/checkin/CompilationTests.java
index 4d294af..c4e5bdc 100644
--- a/src/test/java/compile/scomp/checkin/CompilationTests.java
+++ b/src/test/java/compile/scomp/checkin/CompilationTests.java
@@ -15,14 +15,12 @@
 
 package compile.scomp.checkin;
 
-import common.Common;
 import compile.scomp.common.CompileCommon;
 import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.XmlOptions.BeanMethod;
 import org.apache.xmlbeans.impl.common.QNameHelper;
-import org.apache.xmlbeans.impl.tool.CodeGenUtil;
-import org.apache.xmlbeans.impl.tool.Diff;
-import org.apache.xmlbeans.impl.tool.SchemaCodeGenerator;
-import org.apache.xmlbeans.impl.tool.SchemaCompiler;
+import org.apache.xmlbeans.impl.tool.*;
+import org.apache.xmlbeans.impl.util.FilerImpl;
 import org.apache.xmlbeans.impl.xb.xsdschema.SchemaDocument;
 import org.apache.xmlbeans.impl.xb.xsdschema.TopLevelComplexType;
 import org.junit.Assert;
@@ -35,262 +33,30 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+import java.util.stream.Stream;
 
 import static common.Common.getRootFile;
+import static java.util.Collections.singletonList;
 import static org.junit.Assert.*;
 
 
+@SuppressWarnings({"SpellCheckingInspection", "ResultOfMethodCallIgnored"})
 public class CompilationTests {
-    @Test
-    public void testJ2EE() throws Throwable {
-        deltree(xbeanOutput("compile/scomp/j2ee"));
-        // First, compile schema
-        File srcdir = xbeanOutput("compile/scomp/j2ee/j2eeconfigxml/src");
-        File classesdir = xbeanOutput("compile/scomp/j2ee/j2eeconfigxml/classes");
-        File outputjar = xbeanOutput("compile/scomp/j2ee/j2eeconfigxml.jar");
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
-        params.setXsdFiles(new File[]{
-            xbeanCase("j2ee/application-client_1_4.xsd"),
-            xbeanCase("j2ee/application_1_4.xsd"),
-            xbeanCase("j2ee/connector_1_5.xsd"),
-            xbeanCase("j2ee/ejb-jar_2_1.xsd"),
-            xbeanCase("j2ee/j2ee_1_4.xsd"),
-            xbeanCase("j2ee/jsp_2_0.xsd"),
-            xbeanCase("j2ee/web-app_2_4.xsd"),
-            xbeanCase("j2ee/XML.xsd")
-        });
-        params.setSrcDir(srcdir);
-        params.setClassesDir(classesdir);
-        params.setOutputJar(outputjar);
-        params.setMdefNamespaces(Collections.singleton("http://java.sun.com/xml/ns/j2ee"));
-        List errors = new ArrayList();
-        params.setErrorListener(errors);
-        boolean result = SchemaCompiler.compile(params);
-        StringWriter message = new StringWriter();
-        if (!result)
-            dumpErrors(errors, new PrintWriter(message));
-        assertTrue("Build failed:" + message, result);
-        assertTrue("Cannot find " + outputjar, outputjar.exists());
-    }
+    private static final File fwroot = new File(getRootFile());
 
-    @Test
-    public void testIncrementalCompilation() throws Throwable {
-        File[] files = new File[]{
-            xbeanCase("incr/incr1.xsd"),
-            xbeanCase("incr/incr3.xsd"),
-            xbeanCase("incr/incr4.xsd"),
-            xbeanCase("incr/incr2.xsd"),
-            xbeanCase("incr/incr2-1.xsd")
-        };
-        int n = files.length;
-        SchemaDocument.Schema[] schemas = new SchemaDocument.Schema[n - 1];
-        SchemaTypeSystem system;
-        deltree(xbeanOutput("compile/scomp/incr"));
-        File out = xbeanOutput("compile/scomp/incr/out");
-        File outincr = xbeanOutput("compile/scomp/incr/outincr");
-
-        for (int i = 0; i < n - 2; i++)
-            schemas[i] = SchemaDocument.Factory.parse(files[i]).getSchema();
-        // Compile incrementally
-        // Initial compile
-        schemas[n - 2] = SchemaDocument.Factory.parse(files[n - 2]).getSchema();
-        List errors = new ArrayList();
-        XmlOptions options = (new XmlOptions()).setErrorListener(errors);
-        SchemaTypeSystem builtin = XmlBeans.getBuiltinTypeSystem();
-        system = XmlBeans.compileXsd(schemas, builtin, options);
-        Assert.assertNotNull("Compilation failed during inititial compile.", system);
-        System.out.println("-= Initial Compile =-");
-
-        for (int i = 0; i < system.globalTypes().length; i++) {
-            System.out.println("[" + i + "]-" + system.globalTypes()[i].getName());
-        }
-        for (int i = 0; i < system.globalAttributes().length; i++) {
-            System.out.println("[" + i + "]-" + system.globalAttributes()[i].getName());
-        }
-        for (int i = 0; i < system.globalElements().length; i++) {
-            System.out.println("[" + i + "]=" + system.globalElements()[i].getName());
-        }
-
-        // Incremental compile
-        String url = schemas[n - 2].documentProperties().getSourceName();
-        SchemaDocument.Schema[] schemas1 = new SchemaDocument.Schema[1];
-        schemas1[0] = SchemaDocument.Factory.parse(files[n - 1]).getSchema();
-        schemas1[0].documentProperties().setSourceName(url);
-        errors.clear();
-        system = XmlBeans.compileXsd(system, schemas1, builtin, options);
-        Assert.assertNotNull("Compilation failed during incremental compile.", system);
-        SchemaCodeGenerator.saveTypeSystem(system, outincr, null, null, null);
-        System.out.println("-= Incremental Compile =-");
-        for (int i = 0; i < system.globalTypes().length; i++) {
-            System.out.println("[" + i + "]-" + system.globalTypes()[i].getName());
-        }
-        for (int i = 0; i < system.globalAttributes().length; i++) {
-            System.out.println("[" + i + "]-" + system.globalAttributes()[i].getName());
-        }
-        for (int i = 0; i < system.globalElements().length; i++) {
-            System.out.println("[" + i + "]=" + system.globalElements()[i].getName());
-        }
-        // Now compile non-incrementally for the purpose of comparing the result
-        errors.clear();
-        schemas[n - 2] = schemas1[0];
-        system = XmlBeans.compileXsd(schemas, builtin, options);
-        Assert.assertNotNull("Compilation failed during reference compile.", system);
-        SchemaCodeGenerator.saveTypeSystem(system, out, null, null, null);
-
-        System.out.println("-= Sanity Compile =-");
-        for (int i = 0; i < system.globalTypes().length; i++) {
-            System.out.println("[" + i + "]-" + system.globalTypes()[i].getName());
-        }
-        for (int i = 0; i < system.globalAttributes().length; i++) {
-            System.out.println("[" + i + "]-" + system.globalAttributes()[i].getName());
-        }
-        for (int i = 0; i < system.globalElements().length; i++) {
-            System.out.println("[" + i + "]=" + system.globalElements()[i].getName());
-        }
-
-        // Compare the results
-        String oldPropValue = System.getProperty("xmlbeans.diff.diffIndex");
-        System.setProperty("xmlbeans.diff.diffIndex", "false");
-        errors.clear();
-        Diff.dirsAsTypeSystems(out, outincr, errors);
-        System.setProperty("xmlbeans.diff.diffIndex", oldPropValue == null ? "true" : oldPropValue);
-        if (errors.size() > 0) {
-            StringWriter message = new StringWriter();
-            for (int i = 0; i < errors.size(); i++)
-                message.write(((String) errors.get(i)) + "\n");
-            fail("Differences encountered:" + message);
-        }
-
-    }
-
-    @Test
-    public void testSchemaBookmarks() throws Throwable {
-        File srcSchema = xbeanCase("../../simple/person/person.xsd");
-        // Parse
-        SchemaDocument.Schema parsed = SchemaDocument.Factory.parse(srcSchema).getSchema();
-        // Navigate to the type definition
-        TopLevelComplexType[] cTypes = parsed.getComplexTypeArray();
-        boolean found = false;
-        int i;
-        for (i = 0; i < cTypes.length; i++)
-            if ("person".equals(cTypes[i].getName())) {
-                found = true;
-                break;
-            }
-        assertTrue("Could not find the \"person\" complex type", found);
-        // Set the bookmark
-        SchemaBookmark sb = new SchemaBookmark("MyBookmark");
-        cTypes[i].newCursor().setBookmark(sb);
-        // Compile it into STS
-        SchemaTypeSystem sts = XmlBeans.compileXsd(new XmlObject[]{parsed},
-            XmlBeans.getBuiltinTypeSystem(), null);
-        Assert.assertNotNull("Could not compile person.xsd", sts);
-        SchemaType personType = sts.findType(QNameHelper.forLNS("person", "http://openuri.org/mytest"));
-        Assert.assertNotNull("Could not find the \"person\" schema type", personType);
-        // Check that the bookmark made it through
-        Object val = personType.getUserData();
-        Assert.assertNotNull("Schema user data not found!", val);
-        Assert.assertEquals("MyBookmark", val);
-    }
-
-    @Test
-    public void testSimple() throws Throwable {
-        deltree(xbeanOutput("compile/scomp/simple"));
-        // First, compile schema
-
-        // First, compile schema
-        File inputfile1 = xbeanCase("../../simple/person/person.xsd");
-        File inputfile2 = xbeanCase("../../simple/person/simplec.xsd");
-
-        File srcdir = xbeanOutput("simple/simpletypes/src");
+    //location of files under "cases folder"
+    private static final String fileLocation = CompileCommon.fileLocation;
+    private static final File outputroot = new File(fwroot, "build/test/output");
 
 
-        File classesdir = xbeanOutput("compile/scomp/simple/simpletypes/classes");
-        File outputjar = xbeanOutput("compile/scomp/simple/simpletypes.jar");
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
-        params.setXsdFiles(new File[]{inputfile1, inputfile2});
-        params.setSrcDir(srcdir);
-        params.setClassesDir(classesdir);
-        params.setOutputJar(outputjar);
-        assertTrue("Build failed", SchemaCompiler.compile(params));
-
-        // Then, compile java classes
-        File javasrc = new File(CompileCommon.fileLocation+"/simple");
-        File javaclasses = xbeanOutput("compile/scomp/simple/javaclasses");
-        javaclasses.mkdirs();
-        List<File> testcp = new ArrayList<File>(Arrays.asList(CodeGenUtil.systemClasspath()));
-        testcp.add(outputjar);
-        CodeGenUtil.externalCompile(Arrays.asList(javasrc), javaclasses, testcp.toArray(new File[0]), true);
-
-        // Then run the test
-        URLClassLoader childcl = new URLClassLoader(new URL[]{outputjar.toURI().toURL()}, CompilationTests.class.getClassLoader());
-        Class<?> cl = childcl.loadClass("scomp.simple.SimplePersonTest");
-        Result result = JUnitCore.runClasses(cl);
-        assertEquals(0, result.getFailureCount());
-    }
-
-    @Test
-    @Ignore
-    public void testDownload() throws Throwable {
-        deltree(xbeanOutput("compile/scomp/include"));
-
-        {
-            // First, compile schema without download and verify failure
-            File srcdir = xbeanOutput("compile/scomp/include/shouldfail/src");
-            File classesdir = xbeanOutput("compile/scomp/include/shouldfail/classes");
-            File outputjar = xbeanOutput("compile/scomp/include/shouldfail.jar");
-            SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
-            params.setXsdFiles(new File[]{
-                xbeanCase("compile/scomp/j2ee/j2ee_1_4.xsd")
-            });
-            params.setSrcDir(srcdir);
-            params.setClassesDir(classesdir);
-            params.setOutputJar(outputjar);
-            assertTrue("Build should have failed", !SchemaCompiler.compile(params));
-            assertTrue("Should not have created " + outputjar, !outputjar.exists());
-        }
-
-        {
-            // now turn on download and verify success
-            File srcdir = xbeanOutput("compile/scomp/include/shouldsucceed/src");
-            File classesdir = xbeanOutput("compile/scomp/include/shouldsucceed/classes");
-            File outputjar = xbeanOutput("compile/scomp/include/shouldsucceed.jar");
-            SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
-            params.setDownload(true);
-            params.setXsdFiles(new File[]{
-                xbeanCase("compile/scomp/j2ee/j2ee_1_4.xsd")
-            });
-            params.setSrcDir(srcdir);
-            params.setClassesDir(classesdir);
-            params.setOutputJar(outputjar);
-            assertTrue("Build failed", SchemaCompiler.compile(params));
-            assertTrue("Cannout find " + outputjar, outputjar.exists());
-        }
-    }
-
-    @Test
-    public void testPricequote() throws Throwable {
-        deltree(xbeanOutput("compile/scomp/pricequote"));
-        // First, compile schema
-        File srcdir = xbeanOutput("compile/scomp/pricequote/src");
-        File classesdir = xbeanOutput("compile/scomp/pricequote/classes");
-        File outputjar = xbeanOutput("compile/scomp/pricequote/pricequote.jar");
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
-        params.setXsdFiles(new File[]{xbeanCase("pricequote/PriceQuote.xsd")});
-        params.setSrcDir(srcdir);
-        params.setClassesDir(classesdir);
-        params.setOutputJar(outputjar);
-        assertTrue("Build failed " + fwroot, SchemaCompiler.compile(params));
-        assertTrue("Cannout find " + outputjar, outputjar.exists());
-    }
-
-    private static String[] invalidSchemas = {
+    private static final String[] invalidSchemas = {
         "<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'>\n" +
         "  <xs:complexType name='base' final='extension'/>\n" +
         "  <xs:complexType name='ext'>\n" +
@@ -366,51 +132,312 @@
         "</xs:schema>\n",
     };
 
+
     @Test
-    public void testFinal() throws Throwable {
-        SchemaDocument[] schemas = new SchemaDocument[invalidSchemas.length];
+    public void testJ2EE() {
+        deltree(xbeanOutput("compile/scomp/j2ee"));
+        // First, compile schema
+        File srcdir = xbeanOutput("compile/scomp/j2ee/j2eeconfigxml/src");
+        File classesdir = xbeanOutput("compile/scomp/j2ee/j2eeconfigxml/classes");
+        File outputjar = xbeanOutput("compile/scomp/j2ee/j2eeconfigxml.jar");
+        Parameters params = new Parameters();
+        params.setXsdFiles(
+            xbeanCase("j2ee/application-client_1_4.xsd"),
+            xbeanCase("j2ee/application_1_4.xsd"),
+            xbeanCase("j2ee/connector_1_5.xsd"),
+            xbeanCase("j2ee/ejb-jar_2_1.xsd"),
+            xbeanCase("j2ee/j2ee_1_4.xsd"),
+            xbeanCase("j2ee/jsp_2_0.xsd"),
+            xbeanCase("j2ee/web-app_2_4.xsd"),
+            xbeanCase("j2ee/XML.xsd"));
+        params.setSrcDir(srcdir);
+        params.setClassesDir(classesdir);
+        params.setOutputJar(outputjar);
+        params.setMdefNamespaces(Collections.singleton("http://java.sun.com/xml/ns/j2ee"));
+        List<XmlError> errors = new ArrayList<>();
+        params.setErrorListener(errors);
+        boolean result = SchemaCompiler.compile(params);
+        StringWriter message = new StringWriter();
+        if (!result)
+            dumpErrors(errors, new PrintWriter(message));
+        assertTrue("Build failed:" + message, result);
+        assertTrue("Cannot find " + outputjar, outputjar.exists());
+    }
 
-        // Parse the invalid schema files
-        for (int i = 0; i < invalidSchemas.length; i++)
-            schemas[i] = SchemaDocument.Factory.parse(invalidSchemas[i]);
+    @Test
+    public void testIncrementalCompilation() throws IOException, XmlException {
+        File[] files = new File[]{
+            xbeanCase("incr/incr1.xsd"),
+            xbeanCase("incr/incr3.xsd"),
+            xbeanCase("incr/incr4.xsd"),
+            xbeanCase("incr/incr2.xsd"),
+            xbeanCase("incr/incr2-1.xsd")
+        };
+        int n = files.length;
+        SchemaDocument.Schema[] schemas = new SchemaDocument.Schema[n - 1];
+        SchemaTypeSystem system;
+        deltree(xbeanOutput("compile/scomp/incr"));
+        File out = xbeanOutput("compile/scomp/incr/out");
+        File outincr = xbeanOutput("compile/scomp/incr/outincr");
 
-        // Now compile the invalid schemas, test that they fail
-        for (int i = 0; i < schemas.length; i++) {
-            try {
-                XmlBeans.loadXsd(new XmlObject[]{schemas[i]});
-                fail("Schema should have failed to compile:\n" + invalidSchemas[i]);
-            } catch (XmlException success) {
-            }
+        for (int i = 0; i < n - 2; i++)
+            schemas[i] = SchemaDocument.Factory.parse(files[i]).getSchema();
+        // Compile incrementally
+        // Initial compile
+        schemas[n - 2] = SchemaDocument.Factory.parse(files[n - 2]).getSchema();
+        List<XmlError> errors = new ArrayList<>();
+        XmlOptions options = (new XmlOptions()).setErrorListener(errors);
+        SchemaTypeSystem builtin = XmlBeans.getBuiltinTypeSystem();
+        system = XmlBeans.compileXsd(schemas, builtin, options);
+        Assert.assertNotNull("Compilation failed during inititial compile.", system);
+        System.out.println("-= Initial Compile =-");
+
+        for (int i = 0; i < system.globalTypes().length; i++) {
+            System.out.println("[" + i + "]-" + system.globalTypes()[i].getName());
+        }
+        for (int i = 0; i < system.globalAttributes().length; i++) {
+            System.out.println("[" + i + "]-" + system.globalAttributes()[i].getName());
+        }
+        for (int i = 0; i < system.globalElements().length; i++) {
+            System.out.println("[" + i + "]=" + system.globalElements()[i].getName());
         }
 
-        // Parse the valid schema files
-        schemas = new SchemaDocument[validSchemas.length];
-        for (int i = 0; i < validSchemas.length; i++)
-            schemas[i] = SchemaDocument.Factory.parse(validSchemas[i]);
+        // Incremental compile
+        String url = schemas[n - 2].documentProperties().getSourceName();
+        SchemaDocument.Schema[] schemas1 = new SchemaDocument.Schema[1];
+        schemas1[0] = SchemaDocument.Factory.parse(files[n - 1]).getSchema();
+        schemas1[0].documentProperties().setSourceName(url);
+        errors.clear();
+        system = XmlBeans.compileXsd(system, schemas1, builtin, options);
+        Assert.assertNotNull("Compilation failed during incremental compile.", system);
+        SchemaCodeGenerator.saveTypeSystem(system, outincr, null, null, null);
+        System.out.println("-= Incremental Compile =-");
+        for (int i = 0; i < system.globalTypes().length; i++) {
+            System.out.println("[" + i + "]-" + system.globalTypes()[i].getName());
+        }
+        for (int i = 0; i < system.globalAttributes().length; i++) {
+            System.out.println("[" + i + "]-" + system.globalAttributes()[i].getName());
+        }
+        for (int i = 0; i < system.globalElements().length; i++) {
+            System.out.println("[" + i + "]=" + system.globalElements()[i].getName());
+        }
+        // Now compile non-incrementally for the purpose of comparing the result
+        errors.clear();
+        schemas[n - 2] = schemas1[0];
+        system = XmlBeans.compileXsd(schemas, builtin, options);
+        Assert.assertNotNull("Compilation failed during reference compile.", system);
+        Filer filer = new FilerImpl(out, null, null, false, false);
+        system.save(filer);
 
-        // Compile the valid schemas. They should not fail
-        for (int i = 0; i < schemas.length; i++) {
-            try {
-                XmlBeans.loadXsd(new XmlObject[]{schemas[i]});
-            } catch (XmlException fail) {
-                fail("Failed to compile schema:\n" + validSchemas[i]);
+        System.out.println("-= Sanity Compile =-");
+        for (int i = 0; i < system.globalTypes().length; i++) {
+            System.out.println("[" + i + "]-" + system.globalTypes()[i].getName());
+        }
+        for (int i = 0; i < system.globalAttributes().length; i++) {
+            System.out.println("[" + i + "]-" + system.globalAttributes()[i].getName());
+        }
+        for (int i = 0; i < system.globalElements().length; i++) {
+            System.out.println("[" + i + "]=" + system.globalElements()[i].getName());
+        }
+
+        // Compare the results
+        String oldPropValue = System.getProperty("xmlbeans.diff.diffIndex");
+        System.setProperty("xmlbeans.diff.diffIndex", "false");
+        errors.clear();
+        List<String> diffs = new ArrayList<>();
+        Diff.dirsAsTypeSystems(out, outincr, diffs);
+        System.setProperty("xmlbeans.diff.diffIndex", oldPropValue == null ? "true" : oldPropValue);
+        assertEquals("Differences encountered:" + String.join("\n", diffs), 0, diffs.size());
+    }
+
+    @Test
+    public void testSchemaBookmarks() throws XmlException, IOException {
+        File srcSchema = xbeanCase("../../simple/person/person.xsd");
+        // Parse
+        SchemaDocument.Schema parsed = SchemaDocument.Factory.parse(srcSchema).getSchema();
+        // Navigate to the type definition
+        TopLevelComplexType[] cTypes = parsed.getComplexTypeArray();
+        boolean found = false;
+        int i;
+        for (i = 0; i < cTypes.length; i++)
+            if ("person".equals(cTypes[i].getName())) {
+                found = true;
+                break;
+            }
+        assertTrue("Could not find the \"person\" complex type", found);
+        // Set the bookmark
+        SchemaBookmark sb = new SchemaBookmark("MyBookmark");
+        cTypes[i].newCursor().setBookmark(sb);
+        // Compile it into STS
+        SchemaTypeSystem sts = XmlBeans.compileXsd(new XmlObject[]{parsed},
+            XmlBeans.getBuiltinTypeSystem(), null);
+        Assert.assertNotNull("Could not compile person.xsd", sts);
+        SchemaType personType = sts.findType(QNameHelper.forLNS("person", "http://openuri.org/mytest"));
+        Assert.assertNotNull("Could not find the \"person\" schema type", personType);
+        // Check that the bookmark made it through
+        Object val = personType.getUserData();
+        Assert.assertNotNull("Schema user data not found!", val);
+        Assert.assertEquals("MyBookmark", val);
+    }
+
+    @Test
+    public void testSimple() throws MalformedURLException, ClassNotFoundException {
+        deltree(xbeanOutput("compile/scomp/simple"));
+        // First, compile schema
+
+        // First, compile schema
+        File inputfile1 = xbeanCase("../../simple/person/person.xsd");
+        File inputfile2 = xbeanCase("../../simple/person/simplec.xsd");
+
+        File srcdir = xbeanOutput("simple/simpletypes/src");
+
+
+        File classesdir = xbeanOutput("compile/scomp/simple/simpletypes/classes");
+        File outputjar = xbeanOutput("compile/scomp/simple/simpletypes.jar");
+        Parameters params = new Parameters();
+        params.setXsdFiles(inputfile1, inputfile2);
+        params.setSrcDir(srcdir);
+        params.setClassesDir(classesdir);
+        params.setOutputJar(outputjar);
+        assertTrue("Build failed", SchemaCompiler.compile(params));
+
+        // Then, compile java classes
+        File javasrc = new File(CompileCommon.fileLocation+"/simple");
+        File javaclasses = xbeanOutput("compile/scomp/simple/javaclasses");
+        javaclasses.mkdirs();
+        File[] testcp = Stream.concat(Stream.of(CodeGenUtil.systemClasspath()), Stream.of(outputjar)).toArray(File[]::new);
+        CodeGenUtil.externalCompile(singletonList(javasrc), javaclasses, testcp, true);
+
+        // Then run the test
+        URLClassLoader childcl = new URLClassLoader(new URL[]{outputjar.toURI().toURL()}, CompilationTests.class.getClassLoader());
+        Class<?> cl = childcl.loadClass("scomp.simple.SimplePersonTest");
+        Result result = JUnitCore.runClasses(cl);
+        assertEquals(0, result.getFailureCount());
+    }
+
+    @Test
+    @Ignore
+    public void testDownload() {
+        deltree(xbeanOutput("compile/scomp/include"));
+
+        {
+            // First, compile schema without download and verify failure
+            File srcdir = xbeanOutput("compile/scomp/include/shouldfail/src");
+            File classesdir = xbeanOutput("compile/scomp/include/shouldfail/classes");
+            File outputjar = xbeanOutput("compile/scomp/include/shouldfail.jar");
+            Parameters params = new Parameters();
+            params.setXsdFiles(xbeanCase("compile/scomp/j2ee/j2ee_1_4.xsd"));
+            params.setSrcDir(srcdir);
+            params.setClassesDir(classesdir);
+            params.setOutputJar(outputjar);
+            assertFalse("Build should have failed", SchemaCompiler.compile(params));
+            assertFalse("Should not have created " + outputjar, outputjar.exists());
+        }
+
+        {
+            // now turn on download and verify success
+            File srcdir = xbeanOutput("compile/scomp/include/shouldsucceed/src");
+            File classesdir = xbeanOutput("compile/scomp/include/shouldsucceed/classes");
+            File outputjar = xbeanOutput("compile/scomp/include/shouldsucceed.jar");
+            Parameters params = new Parameters();
+            params.setDownload(true);
+            params.setXsdFiles(xbeanCase("compile/scomp/j2ee/j2ee_1_4.xsd"));
+            params.setSrcDir(srcdir);
+            params.setClassesDir(classesdir);
+            params.setOutputJar(outputjar);
+            assertTrue("Build failed", SchemaCompiler.compile(params));
+            assertTrue("Cannout find " + outputjar, outputjar.exists());
+        }
+    }
+
+    @Test
+    public void testPricequote() {
+        deltree(xbeanOutput("compile/scomp/pricequote"));
+        // First, compile schema
+        File srcdir = xbeanOutput("compile/scomp/pricequote/src");
+        File classesdir = xbeanOutput("compile/scomp/pricequote/classes");
+        File outputjar = xbeanOutput("compile/scomp/pricequote/pricequote.jar");
+        Parameters params = new Parameters();
+        params.setXsdFiles(xbeanCase("pricequote/PriceQuote.xsd"));
+        params.setSrcDir(srcdir);
+        params.setClassesDir(classesdir);
+        params.setOutputJar(outputjar);
+        assertTrue("Build failed " + fwroot, SchemaCompiler.compile(params));
+        assertTrue("Cannout find " + outputjar, outputjar.exists());
+    }
+
+    @Test
+    public void testInvalid() throws XmlException {
+        for (String schemaFile : invalidSchemas) {
+            // Parse the invalid schema files
+            SchemaDocument schema = SchemaDocument.Factory.parse(schemaFile);
+            // Now compile the invalid schemas, test that they fail
+            assertThrows("Schema should have failed to compile:\n" + schemaFile, XmlException.class,
+                () -> XmlBeans.loadXsd(schema));
+        }
+    }
+
+    @Test
+    public void testValid() throws XmlException {
+        for (String schemaFile : validSchemas) {
+            // Parse the valid schema files
+            SchemaDocument schema = SchemaDocument.Factory.parse(schemaFile);
+            // Compile the valid schemas. They should not fail
+            SchemaTypeLoader xs = XmlBeans.loadXsd(schema);
+            assertNotNull(xs);
+        }
+    }
+
+    @Test
+    public void partials() throws InterruptedException, IOException {
+        String[] files = {"partials/RootDocument.java", "partials/impl/RootDocumentImpl.java"};
+        String[] templ = new String[files.length];
+        for (int i=0; i<files.length; i++) {
+            Path p = xbeanCase(files[i]).toPath();
+            templ[i] = new String(Files.readAllBytes(p), StandardCharsets.UTF_8);
+        }
+
+        deltree(xbeanOutput("compile/scomp/partials"));
+        File srcdir = xbeanOutput("compile/scomp/partials/src");
+        File classesdir = xbeanOutput("compile/scomp/partials/classes");
+        File outputjar = xbeanOutput("compile/scomp/partials/partialMethods.jar");
+        Parameters params = new Parameters();
+        params.setXsdFiles(xbeanCase("partials/partialMethods.xsd"));
+        params.setSrcDir(srcdir);
+        params.setClassesDir(classesdir);
+        params.setOutputJar(outputjar);
+        params.setName("Partials");
+
+        // exclude each bean method and compare with the template with that method excluded too
+        for (BeanMethod removeMethod : BeanMethod.values()) {
+            Set<BeanMethod> partialMethods = new HashSet<>(Arrays.asList(BeanMethod.values()));
+            partialMethods.remove(removeMethod);
+            params.setPartialMethods(partialMethods);
+            SchemaCompiler.compile(params);
+
+            for (int i=0; i<files.length; i++) {
+                Path p = new File(srcdir, files[i]).toPath();
+                String act = new String(Files.readAllBytes(p), StandardCharsets.UTF_8);
+                String exp = templ[i];
+                // remove marker + content
+                exp = exp.replaceAll("(?m)^.*<" + removeMethod + ">(?s).+?</" + removeMethod + ">$\\n", "");
+                // activate alternative content
+                exp = exp.replaceAll("(?m)^.*//.*</?" + removeMethod + "_ELSE>$\\n", "");
+                // remove other alternative content
+                exp = exp.replaceAll("(?m)^.*<[^>]+_ELSE>(?s).+?</[^>]+_ELSE>$\\n", "");
+                // remove unused markers
+                exp = exp.replaceAll("(?m)^.*//.*<.*>$\\n", "");
+                assertEquals(files[i] + " - " + removeMethod + " failed", exp, act);
             }
         }
     }
 
+
     //TESTENV:
 
-    private static final File fwroot = new File(getRootFile());
-    private static final File caseroot = new File(Common.getCaseLocation());
-
-    //location of files under "cases folder"
-    private static final String fileLocation = CompileCommon.fileLocation;
-    private static final File outputroot = new File(fwroot, "build/test/output");
-
-    private static void dumpErrors(List errors, PrintWriter out) {
+    private static void dumpErrors(List<XmlError> errors, PrintWriter out) {
         // Display the errors
-        for (int i = 0; i < errors.size(); i++) {
-            XmlError error = (XmlError) errors.get(i);
+        for (XmlError error : errors) {
             if (error.getSeverity() == XmlError.SEVERITY_ERROR)
                 out.println(error.toString());
         }
@@ -427,29 +454,31 @@
         return result;
     }
 
-    private static void deltree(File dir)
-        throws InterruptedException {
-        if (dir.exists()) {
-            if (dir.isDirectory()) {
-                String[] list = dir.list();
-                for (int i = 0; i < list.length; i++)
-                    deltree(new File(dir, list[i]));
-            }
-            if (!dir.delete()) {
-                for (int i = 0; i < 5; i++) {
-                    try {
-                        System.out.println("Sleep 1s and try do delete it again: " + dir.getCanonicalPath());
-                    } catch (IOException e) {
-                        e.printStackTrace(System.out);
-                    }
-                    Thread.currentThread().sleep(1000);
-                    if (dir.delete())
-                        return;
-                }
+    private static void deltree(File dir) {
+        if (!dir.exists()) {
+            return;
+        }
 
-                if (!dir.delete())
-                    throw new IllegalStateException("Could not delete " + dir);
+        if (dir.isDirectory()) {
+            String[] list = dir.list();
+            if (list != null) {
+                for (String s : list) {
+                    deltree(new File(dir, s));
+                }
             }
         }
+
+        for (int i = 0; i < 5; i++) {
+            if (dir.delete()) {
+                return;
+            }
+            try {
+                System.out.println("Sleep 1s and try do delete it again: " + dir.getCanonicalPath());
+                Thread.sleep(1000);
+            } catch (InterruptedException|IOException ignored) {
+            }
+        }
+
+        throw new IllegalStateException("Could not delete " + dir);
     }
 }
diff --git a/src/test/java/compile/scomp/common/CompileTestBase.java b/src/test/java/compile/scomp/common/CompileTestBase.java
index 0acb25a..d011391 100644
--- a/src/test/java/compile/scomp/common/CompileTestBase.java
+++ b/src/test/java/compile/scomp/common/CompileTestBase.java
@@ -16,6 +16,7 @@
 
 import org.apache.xmlbeans.*;
 import org.apache.xmlbeans.impl.tool.Diff;
+import org.apache.xmlbeans.impl.tool.Parameters;
 import org.apache.xmlbeans.impl.tool.SchemaCodeGenerator;
 import org.apache.xmlbeans.impl.tool.SchemaCompiler;
 import org.apache.xmlbeans.impl.xb.xsdschema.SchemaDocument;
@@ -109,23 +110,23 @@
         return fList;
     }
 
-    protected SchemaCompiler.Parameters getCompilerParams() {
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+    protected Parameters getCompilerParams() {
+        Parameters params = new Parameters();
         params.setDownload(true);
         params.setVerbose(true);
         return params;
     }
 
 
-    protected SchemaCompiler.Parameters getIncrCompilerParams() {
-        SchemaCompiler.Parameters params = getCompilerParams();
+    protected Parameters getIncrCompilerParams() {
+        Parameters params = getCompilerParams();
         params.setIncrementalSrcGen(true);
         return params;
     }
 
     protected boolean runCompiler(File[] schemas, String srcDir,
                                   String classesDir, String outputDir,
-                                  SchemaCompiler.Parameters params) {
+                                  Parameters params) {
 
         File srcdir = xbeanOutput(srcDir);
         File classesdir = xbeanOutput(classesDir);
diff --git a/src/test/java/compile/scomp/detailed/SchemaCompilerTests.java b/src/test/java/compile/scomp/detailed/SchemaCompilerTests.java
index e69f473..b39a389 100644
--- a/src/test/java/compile/scomp/detailed/SchemaCompilerTests.java
+++ b/src/test/java/compile/scomp/detailed/SchemaCompilerTests.java
@@ -15,6 +15,7 @@
 package compile.scomp.detailed;
 
 import common.Common;
+import org.apache.xmlbeans.impl.tool.Parameters;
 import org.apache.xmlbeans.impl.tool.SchemaCompiler;
 import org.junit.Test;
 
@@ -41,7 +42,7 @@
                               String testName)
     {
         List errors = new ArrayList();
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(xsdFiles);
         params.setErrorListener(errors);
         params.setSrcDir(new File(schemaCompOutputDirPath + outputDirName + P + "src"));
@@ -57,7 +58,7 @@
     public void testUnionRedefine()
     {
         File[] xsdFiles =
-            new File[] { new File(scompTestFilesRoot + "union_initial.xsd"), 
+            new File[] { new File(scompTestFilesRoot + "union_initial.xsd"),
                          new File(scompTestFilesRoot + "union_redefine.xsd") };
         String outputDirName = "unionred";
         String testname = "testUnionRedefine";
@@ -70,7 +71,7 @@
     @Test
     public void testEnumerationRedefine1()
     {
-        File[] xsdFiles = 
+        File[] xsdFiles =
             new File[] { new File(scompTestFilesRoot + "enum1.xsd_"),
                          new File(scompTestFilesRoot + "enum1_redefine.xsd_") };
         String outputDirName = "enumRedef1";
@@ -84,7 +85,7 @@
     @Test
     public void testEnumerationRedefine2()
     {
-        File[] xsdFiles = 
+        File[] xsdFiles =
             new File[] { new File(scompTestFilesRoot + "enum2.xsd_"),
                          new File(scompTestFilesRoot + "enum2_redefine.xsd_") };
         String outputDirName = "enumRedef2";
@@ -98,7 +99,7 @@
     @Test
     public void testEnumerationRedefine3()
     {
-        File[] xsdFiles = 
+        File[] xsdFiles =
             new File[] { new File(scompTestFilesRoot + "enum1.xsd_"),
                          new File(scompTestFilesRoot + "enum3.xsd_"),
                          new File(scompTestFilesRoot + "enum3_redefine.xsd_") };
@@ -126,7 +127,7 @@
         String outputDirName = "methodsColide_jira205";
 
         List errors = new ArrayList();
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(xsdFiles);
         params.setConfigFiles(configFiles);
         params.setJavaFiles(javaFiles);
@@ -155,7 +156,7 @@
         String outputDirName = "noExt";
 
         List errors = new ArrayList();
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(xsdFiles);
         params.setConfigFiles(configFiles);
         // no java files, if noExt flag doesn't work should fail for not finding the java files  params.setJavaFiles(javaFiles);
diff --git a/src/test/java/misc/detailed/JiraRegression151_200Test.java b/src/test/java/misc/detailed/JiraRegression151_200Test.java
index ff9bffb..fe546fc 100644
--- a/src/test/java/misc/detailed/JiraRegression151_200Test.java
+++ b/src/test/java/misc/detailed/JiraRegression151_200Test.java
@@ -19,6 +19,7 @@
 import net.eads.space.scoexml.test.TestExponentDocument;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
+import org.apache.xmlbeans.impl.tool.Parameters;
 import org.apache.xmlbeans.impl.tool.SchemaCompiler;
 import org.junit.Test;
 
@@ -91,7 +92,7 @@
         List errors = new ArrayList();
 
         // compile with nopvr, goes thro fine
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(new File[]{new File(scompTestFilesRoot + "xmlbeans_184_vdx_data_V1.04.xsd_")});
         params.setErrorListener(errors);
         params.setSrcDir(schemaCompSrcDir);
diff --git a/src/test/java/misc/detailed/JiraRegression1_50Test.java b/src/test/java/misc/detailed/JiraRegression1_50Test.java
index 30b3f1e..2e16997 100644
--- a/src/test/java/misc/detailed/JiraRegression1_50Test.java
+++ b/src/test/java/misc/detailed/JiraRegression1_50Test.java
@@ -16,6 +16,7 @@
 
 import misc.common.JiraTestBase;
 import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.impl.tool.Parameters;
 import org.apache.xmlbeans.impl.tool.SchemaCompiler;
 import org.apache.xmlbeans.impl.xb.xsdschema.SchemaDocument;
 import org.junit.Ignore;
@@ -74,7 +75,7 @@
     public void test_jira_xmlbeans04() {
         List errors = new ArrayList();
 
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(new File[]{new File(scompTestFilesRoot + "xmlbeans_04.xsd_")});
         params.setErrorListener(errors);
         params.setSrcDir(schemaCompSrcDir);
@@ -260,7 +261,7 @@
     public void test_jira_xmlbeans34() throws Exception {
         List errors = new ArrayList();
 
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(new File[]{new File(scompTestFilesRoot + "xmlbeans_34b.xsd_")});
         params.setErrorListener(errors);
         params.setSrcDir(schemaCompSrcDir);
@@ -437,7 +438,7 @@
     */
     public void test_jira_xmlbeans49() {
         List errors = new ArrayList();
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(new File[]{new File(scompTestFilesRoot + "xmlbeans_49.xsd_")});
         params.setErrorListener(errors);
         params.setSrcDir(schemaCompSrcDir);
diff --git a/src/test/java/misc/detailed/JiraRegression50_100Test.java b/src/test/java/misc/detailed/JiraRegression50_100Test.java
index 8507713..7a490e3 100644
--- a/src/test/java/misc/detailed/JiraRegression50_100Test.java
+++ b/src/test/java/misc/detailed/JiraRegression50_100Test.java
@@ -22,6 +22,7 @@
 import net.orthogony.xml.sample.structure.ChildType;
 import org.apache.beehive.netui.tools.testrecorder.x2004.session.RecorderSessionDocument;
 import org.apache.xmlbeans.*;
+import org.apache.xmlbeans.impl.tool.Parameters;
 import org.apache.xmlbeans.impl.tool.SchemaCompiler;
 import org.apache.xmlbeans.impl.xb.xmlconfig.ConfigDocument;
 import org.junit.Assert;
@@ -90,7 +91,7 @@
     public void test_jira_xmlbeans54() throws Exception {
         List errors = new ArrayList();
 
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(new File[]{new File(scompTestFilesRoot + "xmlbeans_54.xsd_")});
         params.setErrorListener(errors);
         params.setSrcDir(schemaCompSrcDir);
@@ -165,7 +166,7 @@
         File classDir = new File(outputDir + P + "classes");
         classDir.mkdirs();
 
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(new File[]{new File(JIRA_CASES + "xmlbeans_57.xml")});
         params.setErrorListener(errorList);
         params.setSrcDir(srcDir);
@@ -204,7 +205,7 @@
     @Ignore("the url doesn't exist anymore ...")
     public void test_jira_xmlbeans58() throws Exception {
         List errors = new ArrayList();
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
 
         // old url has been retired
         //params.setUrlFiles(new URL[]{new URL("http://devresource.hp.com/drc/specifications/wsrf/interfaces/WS-BrokeredNotification-1-0.wsdl")});
@@ -237,7 +238,7 @@
         File classDir = new File(outputDir + P + "classes");
         classDir.mkdirs();
 
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setWsdlFiles(new File[]{new File(JIRA_CASES + "xmlbeans_62.xml")});
         params.setErrorListener(errorList);
         params.setSrcDir(srcDir);
@@ -582,7 +583,7 @@
     @Test
     public void test_jira_xmlbeans88() throws Exception {
         List errors = new ArrayList();
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
 
         params.setUrlFiles(new URL[]{new URL("http://developer.ebay.com/webservices/latest/eBaySvc.wsdl")});
         params.setErrorListener(errors);
diff --git a/src/test/java/misc/detailed/JiraRegressionSchemaCompilerTest.java b/src/test/java/misc/detailed/JiraRegressionSchemaCompilerTest.java
index 1ccfef2..772902d 100644
--- a/src/test/java/misc/detailed/JiraRegressionSchemaCompilerTest.java
+++ b/src/test/java/misc/detailed/JiraRegressionSchemaCompilerTest.java
@@ -16,6 +16,7 @@
 
 import misc.common.JiraTestBase;
 import org.apache.xmlbeans.XmlError;
+import org.apache.xmlbeans.impl.tool.Parameters;
 import org.apache.xmlbeans.impl.tool.SchemaCompiler;
 import org.junit.Test;
 
@@ -34,7 +35,7 @@
     {
         System.out.println(xsdFiles[0].getAbsolutePath());
         List errors = new ArrayList();
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(xsdFiles);
         params.setErrorListener(errors);
         params.setSrcDir(new File(schemaCompOutputDirPath + outputDirName + P + "src"));
@@ -80,7 +81,7 @@
     @Test
     public void test_jira_xmlbeans239()
     {
-        /* complexType with complexContent extending base type with 
+        /* complexType with complexContent extending base type with
            simpleContent is valid */
         File[] xsdFiles =
             new File[] { new File(scompTestFilesRoot + "xmlbeans_239a.xsd_") };
diff --git a/src/test/java/misc/detailed/JiraRegressionTest101_150.java b/src/test/java/misc/detailed/JiraRegressionTest101_150.java
index 23d7fc4..7d26fae 100644
--- a/src/test/java/misc/detailed/JiraRegressionTest101_150.java
+++ b/src/test/java/misc/detailed/JiraRegressionTest101_150.java
@@ -18,6 +18,7 @@
 import misc.common.JiraTestBase;
 import org.apache.xmlbeans.XmlError;
 import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.impl.tool.Parameters;
 import org.apache.xmlbeans.impl.tool.SchemaCompiler;
 import org.junit.Test;
 
@@ -39,7 +40,7 @@
     @Test
     public void test_jira_xmlbeans102a() throws Exception{
         // set the parameters similar to those in the bug
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setXsdFiles(new File[]{new File(JIRA_CASES + "xmlbeans_102.xsd")});
         params.setOutputJar(new File(outputroot+P+"xmlbeans_102.jar"));
         File outputDir = new File(outputroot + P + "xmlbeans_102");
@@ -62,7 +63,7 @@
     public void test_jira_xmlbeans102b() {
         //Assert.fail("test_jira_xmlbeans102: Infinite loop after completion of parsing" );
 
-        SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
+        Parameters params = new Parameters();
         params.setOutputJar(new File(schemaCompOutputDirPath + "jira102.jar"));
         params.setClassesDir(schemaCompClassesDir);
 
diff --git a/src/test/resources/xbean/compile/scomp/partials/RootDocument.java b/src/test/resources/xbean/compile/scomp/partials/RootDocument.java
new file mode 100644
index 0000000..e53fa21
--- /dev/null
+++ b/src/test/resources/xbean/compile/scomp/partials/RootDocument.java
@@ -0,0 +1,340 @@
+/*
+ * An XML document type.
+ * Localname: root
+ * Namespace: partials
+ * Java type: partials.RootDocument
+ *
+ * Automatically generated - do not modify.
+ */
+package partials;
+
+import org.apache.xmlbeans.impl.schema.ElementFactory;
+import org.apache.xmlbeans.impl.schema.AbstractDocumentFactory;
+import org.apache.xmlbeans.impl.schema.DocumentFactory;
+import org.apache.xmlbeans.impl.schema.SimpleTypeFactory;
+
+
+/**
+ * A document containing one root(@partials) element.
+ *
+ * This is a complex type.
+ */
+public interface RootDocument extends org.apache.xmlbeans.XmlObject
+{
+    DocumentFactory<partials.RootDocument> Factory = new DocumentFactory<>(org.apache.xmlbeans.metadata.system.Partials.TypeSystemHolder.typeSystem, "rootc8d7doctype");
+    org.apache.xmlbeans.SchemaType type = Factory.getType();
+
+// <GET>
+
+    /**
+     * Gets the "root" element
+     */
+    partials.RootDocument.Root getRoot();
+// </GET>
+// <SET>
+
+    /**
+     * Sets the "root" element
+     */
+    void setRoot(partials.RootDocument.Root root);
+// </SET>
+// <ADD_NEW>
+
+    /**
+     * Appends and returns a new empty "root" element
+     */
+    partials.RootDocument.Root addNewRoot();
+// </ADD_NEW>
+
+    /**
+     * An XML root(@partials).
+     *
+     * This is a complex type.
+     */
+    public interface Root extends org.apache.xmlbeans.XmlObject
+    {
+        ElementFactory<partials.RootDocument.Root> Factory = new ElementFactory<>(org.apache.xmlbeans.metadata.system.Partials.TypeSystemHolder.typeSystem, "root8a55elemtype");
+        org.apache.xmlbeans.SchemaType type = Factory.getType();
+
+// <GET>
+
+        /**
+         * Gets the "single" element
+         */
+        java.math.BigDecimal getSingle();
+// </GET>
+// <XGET>
+
+        /**
+         * Gets (as xml) the "single" element
+         */
+        org.apache.xmlbeans.XmlDecimal xgetSingle();
+// </XGET>
+// <IS_NIL>
+
+        /**
+         * Tests for nil "single" element
+         */
+        boolean isNilSingle();
+// </IS_NIL>
+// <IS_SET>
+
+        /**
+         * True if has "single" element
+         */
+        boolean isSetSingle();
+// </IS_SET>
+// <SET>
+
+        /**
+         * Sets the "single" element
+         */
+        void setSingle(java.math.BigDecimal single);
+// </SET>
+// <XSET>
+
+        /**
+         * Sets (as xml) the "single" element
+         */
+        void xsetSingle(org.apache.xmlbeans.XmlDecimal single);
+// </XSET>
+// <SET_NIL>
+
+        /**
+         * Nils the "single" element
+         */
+        void setNilSingle();
+// </SET_NIL>
+// <UNSET>
+
+        /**
+         * Unsets the "single" element
+         */
+        void unsetSingle();
+// </UNSET>
+// <GET>
+
+        /**
+         * Gets the "complex" element
+         */
+        partials.XmlBeanchen getComplex();
+// </GET>
+// <IS_SET>
+
+        /**
+         * True if has "complex" element
+         */
+        boolean isSetComplex();
+// </IS_SET>
+// <SET>
+
+        /**
+         * Sets the "complex" element
+         */
+        void setComplex(partials.XmlBeanchen complex);
+// </SET>
+// <ADD_NEW>
+
+        /**
+         * Appends and returns a new empty "complex" element
+         */
+        partials.XmlBeanchen addNewComplex();
+// </ADD_NEW>
+// <UNSET>
+
+        /**
+         * Unsets the "complex" element
+         */
+        void unsetComplex();
+// </UNSET>
+// <GET_LIST>
+
+        /**
+         * Gets a List of "primitiveList" elements
+         */
+        java.util.List<java.math.BigDecimal> getPrimitiveListList();
+// </GET_LIST>
+// <GET_ARRAY>
+
+        /**
+         * Gets array of all "primitiveList" elements
+         */
+        java.math.BigDecimal[] getPrimitiveListArray();
+// </GET_ARRAY>
+// <GET_IDX>
+
+        /**
+         * Gets ith "primitiveList" element
+         */
+        java.math.BigDecimal getPrimitiveListArray(int i);
+// </GET_IDX>
+// <XGET_LIST>
+
+        /**
+         * Gets (as xml) a List of "primitiveList" elements
+         */
+        java.util.List<org.apache.xmlbeans.XmlDecimal> xgetPrimitiveListList();
+// </XGET_LIST>
+// <XGET_ARRAY>
+
+        /**
+         * Gets (as xml) array of all "primitiveList" elements
+         */
+        org.apache.xmlbeans.XmlDecimal[] xgetPrimitiveListArray();
+// </XGET_ARRAY>
+// <XGET_IDX>
+
+        /**
+         * Gets (as xml) ith "primitiveList" element
+         */
+        org.apache.xmlbeans.XmlDecimal xgetPrimitiveListArray(int i);
+// </XGET_IDX>
+// <IS_NIL_IDX>
+
+        /**
+         * Tests for nil ith "primitiveList" element
+         */
+        boolean isNilPrimitiveListArray(int i);
+// </IS_NIL_IDX>
+// <SIZE_OF_ARRAY>
+
+        /**
+         * Returns number of "primitiveList" element
+         */
+        int sizeOfPrimitiveListArray();
+// </SIZE_OF_ARRAY>
+// <SET_ARRAY>
+
+        /**
+         * Sets array of all "primitiveList" element
+         */
+        void setPrimitiveListArray(java.math.BigDecimal[] primitiveListArray);
+// </SET_ARRAY>
+// <SET_IDX>
+
+        /**
+         * Sets ith "primitiveList" element
+         */
+        void setPrimitiveListArray(int i, java.math.BigDecimal primitiveList);
+// </SET_IDX>
+// <XSET_ARRAY>
+
+        /**
+         * Sets (as xml) array of all "primitiveList" element
+         */
+        void xsetPrimitiveListArray(org.apache.xmlbeans.XmlDecimal[] primitiveListArray);
+// </XSET_ARRAY>
+// <XSET_IDX>
+
+        /**
+         * Sets (as xml) ith "primitiveList" element
+         */
+        void xsetPrimitiveListArray(int i, org.apache.xmlbeans.XmlDecimal primitiveList);
+// </XSET_IDX>
+// <SET_NIL_IDX>
+
+        /**
+         * Nils the ith "primitiveList" element
+         */
+        void setNilPrimitiveListArray(int i);
+// </SET_NIL_IDX>
+// <INSERT_IDX>
+
+        /**
+         * Inserts the value as the ith "primitiveList" element
+         */
+        void insertPrimitiveList(int i, java.math.BigDecimal primitiveList);
+// </INSERT_IDX>
+// <ADD>
+
+        /**
+         * Appends the value as the last "primitiveList" element
+         */
+        void addPrimitiveList(java.math.BigDecimal primitiveList);
+// </ADD>
+// <INSERT_NEW_IDX>
+
+        /**
+         * Inserts and returns a new empty value (as xml) as the ith "primitiveList" element
+         */
+        org.apache.xmlbeans.XmlDecimal insertNewPrimitiveList(int i);
+// </INSERT_NEW_IDX>
+// <ADD_NEW>
+
+        /**
+         * Appends and returns a new empty value (as xml) as the last "primitiveList" element
+         */
+        org.apache.xmlbeans.XmlDecimal addNewPrimitiveList();
+// </ADD_NEW>
+// <REMOVE_IDX>
+
+        /**
+         * Removes the ith "primitiveList" element
+         */
+        void removePrimitiveList(int i);
+// </REMOVE_IDX>
+// <GET_LIST>
+
+        /**
+         * Gets a List of "complexList" elements
+         */
+        java.util.List<partials.XmlBeanchen> getComplexListList();
+// </GET_LIST>
+// <GET_ARRAY>
+
+        /**
+         * Gets array of all "complexList" elements
+         */
+        partials.XmlBeanchen[] getComplexListArray();
+// </GET_ARRAY>
+// <GET_IDX>
+
+        /**
+         * Gets ith "complexList" element
+         */
+        partials.XmlBeanchen getComplexListArray(int i);
+// </GET_IDX>
+// <SIZE_OF_ARRAY>
+
+        /**
+         * Returns number of "complexList" element
+         */
+        int sizeOfComplexListArray();
+// </SIZE_OF_ARRAY>
+// <SET_ARRAY>
+
+        /**
+         * Sets array of all "complexList" element
+         */
+        void setComplexListArray(partials.XmlBeanchen[] complexListArray);
+// </SET_ARRAY>
+// <SET_IDX>
+
+        /**
+         * Sets ith "complexList" element
+         */
+        void setComplexListArray(int i, partials.XmlBeanchen complexList);
+// </SET_IDX>
+// <INSERT_NEW_IDX>
+
+        /**
+         * Inserts and returns a new empty value (as xml) as the ith "complexList" element
+         */
+        partials.XmlBeanchen insertNewComplexList(int i);
+// </INSERT_NEW_IDX>
+// <ADD_NEW>
+
+        /**
+         * Appends and returns a new empty value (as xml) as the last "complexList" element
+         */
+        partials.XmlBeanchen addNewComplexList();
+// </ADD_NEW>
+// <REMOVE_IDX>
+
+        /**
+         * Removes the ith "complexList" element
+         */
+        void removeComplexList(int i);
+// </REMOVE_IDX>
+    }
+}
diff --git a/src/test/resources/xbean/compile/scomp/partials/impl/RootDocumentImpl.java b/src/test/resources/xbean/compile/scomp/partials/impl/RootDocumentImpl.java
new file mode 100644
index 0000000..dec9860
--- /dev/null
+++ b/src/test/resources/xbean/compile/scomp/partials/impl/RootDocumentImpl.java
@@ -0,0 +1,804 @@
+/*
+ * An XML document type.
+ * Localname: root
+ * Namespace: partials
+ * Java type: partials.RootDocument
+ *
+ * Automatically generated - do not modify.
+ */
+package partials.impl;
+
+import javax.xml.namespace.QName;
+import org.apache.xmlbeans.QNameSet;
+
+/**
+ * A document containing one root(@partials) element.
+ *
+ * This is a complex type.
+ */
+public class RootDocumentImpl extends org.apache.xmlbeans.impl.values.XmlComplexContentImpl implements partials.RootDocument {
+    private static final long serialVersionUID = 1L;
+
+    public RootDocumentImpl(org.apache.xmlbeans.SchemaType sType) {
+        super(sType);
+    }
+
+    private static final QName[] PROPERTY_QNAME = {
+        new QName("partials", "root"),
+    };
+
+// <GET>
+
+    /**
+     * Gets the "root" element
+     */
+    @Override
+    public partials.RootDocument.Root getRoot() {
+        synchronized (monitor())
+        {
+            check_orphaned();
+            partials.RootDocument.Root target = null;
+            target = (partials.RootDocument.Root)get_store().find_element_user(PROPERTY_QNAME[0], 0);
+            if (target == null) {
+                return null;
+            }
+            return target;
+        }
+    }
+// </GET>
+// <SET>
+
+    /**
+     * Sets the "root" element
+     */
+    @Override
+    public void setRoot(partials.RootDocument.Root root) {
+        generatedSetterHelperImpl(root, PROPERTY_QNAME[0], 0, org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_SINGLETON);
+    }
+// </SET>
+// <ADD_NEW>
+
+    /**
+     * Appends and returns a new empty "root" element
+     */
+    @Override
+    public partials.RootDocument.Root addNewRoot() {
+        synchronized (monitor())
+        {
+            check_orphaned();
+            partials.RootDocument.Root target = null;
+            target = (partials.RootDocument.Root)get_store().add_element_user(PROPERTY_QNAME[0]);
+            return target;
+        }
+    }
+// </ADD_NEW>
+    /**
+     * An XML root(@partials).
+     *
+     * This is a complex type.
+     */
+    public static class RootImpl extends org.apache.xmlbeans.impl.values.XmlComplexContentImpl implements partials.RootDocument.Root {
+        private static final long serialVersionUID = 1L;
+
+        public RootImpl(org.apache.xmlbeans.SchemaType sType) {
+            super(sType);
+        }
+
+        private static final QName[] PROPERTY_QNAME = {
+            new QName("partials", "single"),
+            new QName("partials", "complex"),
+            new QName("partials", "primitiveList"),
+            new QName("partials", "complexList"),
+        };
+
+// <GET>
+
+        /**
+         * Gets the "single" element
+         */
+        @Override
+        public java.math.BigDecimal getSingle() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.SimpleValue target = null;
+                target = (org.apache.xmlbeans.SimpleValue)get_store().find_element_user(PROPERTY_QNAME[0], 0);
+                if (target == null) {
+                    return null;
+                }
+                return target.getBigDecimalValue();
+            }
+        }
+// </GET>
+// <XGET>
+
+        /**
+         * Gets (as xml) the "single" element
+         */
+        @Override
+        public org.apache.xmlbeans.XmlDecimal xgetSingle() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[0], 0);
+                return target;
+            }
+        }
+// </XGET>
+// <IS_NIL>
+
+        /**
+         * Tests for nil "single" element
+         */
+        @Override
+        public boolean isNilSingle() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[0], 0);
+                if (target == null) return false;
+                return target.isNil();
+            }
+        }
+// </IS_NIL>
+// <IS_SET>
+
+        /**
+         * True if has "single" element
+         */
+        @Override
+        public boolean isSetSingle() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                return get_store().count_elements(PROPERTY_QNAME[0]) != 0;
+            }
+        }
+// </IS_SET>
+// <SET>
+
+        /**
+         * Sets the "single" element
+         */
+        @Override
+        public void setSingle(java.math.BigDecimal single) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.SimpleValue target = null;
+                target = (org.apache.xmlbeans.SimpleValue)get_store().find_element_user(PROPERTY_QNAME[0], 0);
+                if (target == null) {
+                    target = (org.apache.xmlbeans.SimpleValue)get_store().add_element_user(PROPERTY_QNAME[0]);
+                }
+                target.setBigDecimalValue(single);
+            }
+        }
+// </SET>
+// <XSET>
+
+        /**
+         * Sets (as xml) the "single" element
+         */
+        @Override
+        public void xsetSingle(org.apache.xmlbeans.XmlDecimal single) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[0], 0);
+                if (target == null) {
+                    target = (org.apache.xmlbeans.XmlDecimal)get_store().add_element_user(PROPERTY_QNAME[0]);
+                }
+                target.set(single);
+            }
+        }
+// </XSET>
+// <SET_NIL>
+
+        /**
+         * Nils the "single" element
+         */
+        @Override
+        public void setNilSingle() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[0], 0);
+                if (target == null) {
+                    target = (org.apache.xmlbeans.XmlDecimal)get_store().add_element_user(PROPERTY_QNAME[0]);
+                }
+                target.setNil();
+            }
+        }
+// </SET_NIL>
+// <UNSET>
+
+        /**
+         * Unsets the "single" element
+         */
+        @Override
+        public void unsetSingle() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                get_store().remove_element(PROPERTY_QNAME[0], 0);
+            }
+        }
+// </UNSET>
+// <GET>
+
+        /**
+         * Gets the "complex" element
+         */
+        @Override
+        public partials.XmlBeanchen getComplex() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                partials.XmlBeanchen target = null;
+                target = (partials.XmlBeanchen)get_store().find_element_user(PROPERTY_QNAME[1], 0);
+                if (target == null) {
+                    return null;
+                }
+                return target;
+            }
+        }
+// </GET>
+// <IS_SET>
+
+        /**
+         * True if has "complex" element
+         */
+        @Override
+        public boolean isSetComplex() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                return get_store().count_elements(PROPERTY_QNAME[1]) != 0;
+            }
+        }
+// </IS_SET>
+// <SET>
+
+        /**
+         * Sets the "complex" element
+         */
+        @Override
+        public void setComplex(partials.XmlBeanchen complex) {
+            generatedSetterHelperImpl(complex, PROPERTY_QNAME[1], 0, org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_SINGLETON);
+        }
+// </SET>
+// <ADD_NEW>
+
+        /**
+         * Appends and returns a new empty "complex" element
+         */
+        @Override
+        public partials.XmlBeanchen addNewComplex() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                partials.XmlBeanchen target = null;
+                target = (partials.XmlBeanchen)get_store().add_element_user(PROPERTY_QNAME[1]);
+                return target;
+            }
+        }
+// </ADD_NEW>
+// <UNSET>
+
+        /**
+         * Unsets the "complex" element
+         */
+        @Override
+        public void unsetComplex() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                get_store().remove_element(PROPERTY_QNAME[1], 0);
+            }
+        }
+// </UNSET>
+// <GET_LIST>
+
+        /**
+         * Gets a List of "primitiveList" elements
+         */
+        @Override
+        public java.util.List<java.math.BigDecimal> getPrimitiveListList() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                return new org.apache.xmlbeans.impl.values.JavaListObject<>(
+// <GET_IDX>
+                    this::getPrimitiveListArray,
+// </GET_IDX>
+// <GET_IDX_ELSE>
+                    null,
+// </GET_IDX_ELSE>
+// <SET_IDX>
+                    this::setPrimitiveListArray,
+// </SET_IDX>
+// <SET_IDX_ELSE>
+                    null,
+// </SET_IDX_ELSE>
+// <INSERT_IDX>
+                    this::insertPrimitiveList,
+// </INSERT_IDX>
+// <INSERT_IDX_ELSE>
+                    null,
+// </INSERT_IDX_ELSE>
+// <REMOVE_IDX>
+                    this::removePrimitiveList,
+// </REMOVE_IDX>
+// <REMOVE_IDX_ELSE>
+                    null,
+// </REMOVE_IDX_ELSE>
+// <SIZE_OF_ARRAY>
+                    this::sizeOfPrimitiveListArray
+// </SIZE_OF_ARRAY>
+// <SIZE_OF_ARRAY_ELSE>
+                    null
+// </SIZE_OF_ARRAY_ELSE>
+                );
+            }
+        }
+// </GET_LIST>
+// <GET_ARRAY>
+
+        /**
+         * Gets array of all "primitiveList" elements
+         */
+        @Override
+        public java.math.BigDecimal[] getPrimitiveListArray() {
+            return getObjectArray(PROPERTY_QNAME[2], org.apache.xmlbeans.SimpleValue::getBigDecimalValue, java.math.BigDecimal[]::new);
+        }
+// </GET_ARRAY>
+// <GET_IDX>
+
+        /**
+         * Gets ith "primitiveList" element
+         */
+        @Override
+        public java.math.BigDecimal getPrimitiveListArray(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.SimpleValue target = null;
+                target = (org.apache.xmlbeans.SimpleValue)get_store().find_element_user(PROPERTY_QNAME[2], i);
+                if (target == null) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return target.getBigDecimalValue();
+            }
+        }
+// </GET_IDX>
+// <XGET_LIST>
+
+        /**
+         * Gets (as xml) a List of "primitiveList" elements
+         */
+        @Override
+        public java.util.List<org.apache.xmlbeans.XmlDecimal> xgetPrimitiveListList() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                return new org.apache.xmlbeans.impl.values.JavaListXmlObject<>(
+// <XGET_IDX>
+                    this::xgetPrimitiveListArray,
+// </XGET_IDX>
+// <XGET_IDX_ELSE>
+                    null,
+// </XGET_IDX_ELSE>
+// <XSET_IDX>
+                    this::xsetPrimitiveListArray,
+// </XSET_IDX>
+// <XSET_IDX_ELSE>
+                    null,
+// </XSET_IDX_ELSE>
+// <INSERT_NEW_IDX>
+                    this::insertNewPrimitiveList,
+// </INSERT_NEW_IDX>
+// <INSERT_NEW_IDX_ELSE>
+                    null,
+// </INSERT_NEW_IDX_ELSE>
+// <REMOVE_IDX>
+                    this::removePrimitiveList,
+// </REMOVE_IDX>
+// <REMOVE_IDX_ELSE>
+                    null,
+// </REMOVE_IDX_ELSE>
+// <SIZE_OF_ARRAY>
+                    this::sizeOfPrimitiveListArray
+// </SIZE_OF_ARRAY>
+// <SIZE_OF_ARRAY_ELSE>
+                    null
+// </SIZE_OF_ARRAY_ELSE>
+                );
+            }
+        }
+// </XGET_LIST>
+// <XGET_ARRAY>
+
+        /**
+         * Gets (as xml) array of all "primitiveList" elements
+         */
+        @Override
+        public org.apache.xmlbeans.XmlDecimal[] xgetPrimitiveListArray() {
+            return xgetArray(PROPERTY_QNAME[2], org.apache.xmlbeans.XmlDecimal[]::new);
+        }
+// </XGET_ARRAY>
+// <XGET_IDX>
+
+        /**
+         * Gets (as xml) ith "primitiveList" element
+         */
+        @Override
+        public org.apache.xmlbeans.XmlDecimal xgetPrimitiveListArray(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[2], i);
+                if (target == null) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return target;
+            }
+        }
+// </XGET_IDX>
+// <IS_NIL_IDX>
+
+        /**
+         * Tests for nil ith "primitiveList" element
+         */
+        @Override
+        public boolean isNilPrimitiveListArray(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[2], i);
+                if (target == null) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return target.isNil();
+            }
+        }
+// </IS_NIL_IDX>
+// <SIZE_OF_ARRAY>
+
+        /**
+         * Returns number of "primitiveList" element
+         */
+        @Override
+        public int sizeOfPrimitiveListArray() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                return get_store().count_elements(PROPERTY_QNAME[2]);
+            }
+        }
+// </SIZE_OF_ARRAY>
+// <SET_ARRAY>
+
+        /**
+         * Sets array of all "primitiveList" element
+         */
+        @Override
+        public void setPrimitiveListArray(java.math.BigDecimal[] primitiveListArray) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                arraySetterHelper(primitiveListArray, PROPERTY_QNAME[2]);
+            }
+        }
+// </SET_ARRAY>
+// <SET_IDX>
+
+        /**
+         * Sets ith "primitiveList" element
+         */
+        @Override
+        public void setPrimitiveListArray(int i, java.math.BigDecimal primitiveList) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.SimpleValue target = null;
+                target = (org.apache.xmlbeans.SimpleValue)get_store().find_element_user(PROPERTY_QNAME[2], i);
+                if (target == null) {
+                    throw new IndexOutOfBoundsException();
+                }
+                target.setBigDecimalValue(primitiveList);
+            }
+        }
+// </SET_IDX>
+// <XSET_ARRAY>
+
+        /**
+         * Sets (as xml) array of all "primitiveList" element
+         */
+        @Override
+        public void xsetPrimitiveListArray(org.apache.xmlbeans.XmlDecimal[]primitiveListArray) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                arraySetterHelper(primitiveListArray, PROPERTY_QNAME[2]);
+            }
+        }
+// </XSET_ARRAY>
+// <XSET_IDX>
+
+        /**
+         * Sets (as xml) ith "primitiveList" element
+         */
+        @Override
+        public void xsetPrimitiveListArray(int i, org.apache.xmlbeans.XmlDecimal primitiveList) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[2], i);
+                if (target == null) {
+                    throw new IndexOutOfBoundsException();
+                }
+                target.set(primitiveList);
+            }
+        }
+// </XSET_IDX>
+// <SET_NIL_IDX>
+
+        /**
+         * Nils the ith "primitiveList" element
+         */
+        @Override
+        public void setNilPrimitiveListArray(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[2], i);
+                if (target == null) {
+                    throw new IndexOutOfBoundsException();
+                }
+                target.setNil();
+            }
+        }
+// </SET_NIL_IDX>
+// <INSERT_IDX>
+
+        /**
+         * Inserts the value as the ith "primitiveList" element
+         */
+        @Override
+        public void insertPrimitiveList(int i, java.math.BigDecimal primitiveList) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.SimpleValue target = 
+                    (org.apache.xmlbeans.SimpleValue)get_store().insert_element_user(PROPERTY_QNAME[2], i);
+                target.setBigDecimalValue(primitiveList);
+            }
+        }
+// </INSERT_IDX>
+// <ADD>
+
+        /**
+         * Appends the value as the last "primitiveList" element
+         */
+        @Override
+        public void addPrimitiveList(java.math.BigDecimal primitiveList) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.SimpleValue target = null;
+                target = (org.apache.xmlbeans.SimpleValue)get_store().add_element_user(PROPERTY_QNAME[2]);
+                target.setBigDecimalValue(primitiveList);
+            }
+        }
+// </ADD>
+// <INSERT_NEW_IDX>
+
+        /**
+         * Inserts and returns a new empty value (as xml) as the ith "primitiveList" element
+         */
+        @Override
+        public org.apache.xmlbeans.XmlDecimal insertNewPrimitiveList(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().insert_element_user(PROPERTY_QNAME[2], i);
+                return target;
+            }
+        }
+// </INSERT_NEW_IDX>
+// <ADD_NEW>
+
+        /**
+         * Appends and returns a new empty value (as xml) as the last "primitiveList" element
+         */
+        @Override
+        public org.apache.xmlbeans.XmlDecimal addNewPrimitiveList() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                org.apache.xmlbeans.XmlDecimal target = null;
+                target = (org.apache.xmlbeans.XmlDecimal)get_store().add_element_user(PROPERTY_QNAME[2]);
+                return target;
+            }
+        }
+// </ADD_NEW>
+// <REMOVE_IDX>
+
+        /**
+         * Removes the ith "primitiveList" element
+         */
+        @Override
+        public void removePrimitiveList(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                get_store().remove_element(PROPERTY_QNAME[2], i);
+            }
+        }
+// </REMOVE_IDX>
+// <GET_LIST>
+
+        /**
+         * Gets a List of "complexList" elements
+         */
+        @Override
+        public java.util.List<partials.XmlBeanchen> getComplexListList() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                return new org.apache.xmlbeans.impl.values.JavaListXmlObject<>(
+// <GET_IDX>
+                    this::getComplexListArray,
+// </GET_IDX>
+// <GET_IDX_ELSE>
+                    null,
+// </GET_IDX_ELSE>
+// <SET_IDX>
+                    this::setComplexListArray,
+// </SET_IDX>
+// <SET_IDX_ELSE>
+                    null,
+// </SET_IDX_ELSE>
+// <INSERT_NEW_IDX>
+                    this::insertNewComplexList,
+// </INSERT_NEW_IDX>
+// <INSERT_NEW_IDX_ELSE>
+                    null,
+// </INSERT_NEW_IDX_ELSE>
+// <REMOVE_IDX>
+                    this::removeComplexList,
+// </REMOVE_IDX>
+// <REMOVE_IDX_ELSE>
+                    null,
+// </REMOVE_IDX_ELSE>
+// <SIZE_OF_ARRAY>
+                    this::sizeOfComplexListArray
+// </SIZE_OF_ARRAY>
+// <SIZE_OF_ARRAY_ELSE>
+                    null
+// </SIZE_OF_ARRAY_ELSE>
+                );
+            }
+        }
+// </GET_LIST>
+// <GET_ARRAY>
+
+        /**
+         * Gets array of all "complexList" elements
+         */
+        @Override
+        public partials.XmlBeanchen[] getComplexListArray() {
+            return getXmlObjectArray(PROPERTY_QNAME[3], new partials.XmlBeanchen[0]);
+        }
+// </GET_ARRAY>
+// <GET_IDX>
+
+        /**
+         * Gets ith "complexList" element
+         */
+        @Override
+        public partials.XmlBeanchen getComplexListArray(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                partials.XmlBeanchen target = null;
+                target = (partials.XmlBeanchen)get_store().find_element_user(PROPERTY_QNAME[3], i);
+                if (target == null) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return target;
+            }
+        }
+// </GET_IDX>
+// <SIZE_OF_ARRAY>
+
+        /**
+         * Returns number of "complexList" element
+         */
+        @Override
+        public int sizeOfComplexListArray() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                return get_store().count_elements(PROPERTY_QNAME[3]);
+            }
+        }
+// </SIZE_OF_ARRAY>
+// <SET_ARRAY>
+
+        /**
+         * Sets array of all "complexList" element  WARNING: This method is not atomicaly synchronized.
+         */
+        @Override
+        public void setComplexListArray(partials.XmlBeanchen[] complexListArray) {
+            check_orphaned();
+            arraySetterHelper(complexListArray, PROPERTY_QNAME[3]);
+        }
+// </SET_ARRAY>
+// <SET_IDX>
+
+        /**
+         * Sets ith "complexList" element
+         */
+        @Override
+        public void setComplexListArray(int i, partials.XmlBeanchen complexList) {
+            generatedSetterHelperImpl(complexList, PROPERTY_QNAME[3], i, org.apache.xmlbeans.impl.values.XmlObjectBase.KIND_SETTERHELPER_ARRAYITEM);
+        }
+// </SET_IDX>
+// <INSERT_NEW_IDX>
+
+        /**
+         * Inserts and returns a new empty value (as xml) as the ith "complexList" element
+         */
+        @Override
+        public partials.XmlBeanchen insertNewComplexList(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                partials.XmlBeanchen target = null;
+                target = (partials.XmlBeanchen)get_store().insert_element_user(PROPERTY_QNAME[3], i);
+                return target;
+            }
+        }
+// </INSERT_NEW_IDX>
+// <ADD_NEW>
+
+        /**
+         * Appends and returns a new empty value (as xml) as the last "complexList" element
+         */
+        @Override
+        public partials.XmlBeanchen addNewComplexList() {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                partials.XmlBeanchen target = null;
+                target = (partials.XmlBeanchen)get_store().add_element_user(PROPERTY_QNAME[3]);
+                return target;
+            }
+        }
+// </ADD_NEW>
+// <REMOVE_IDX>
+
+        /**
+         * Removes the ith "complexList" element
+         */
+        @Override
+        public void removeComplexList(int i) {
+            synchronized (monitor())
+            {
+                check_orphaned();
+                get_store().remove_element(PROPERTY_QNAME[3], i);
+            }
+        }
+// </REMOVE_IDX>
+    }
+}
diff --git a/src/test/resources/xbean/compile/scomp/partials/partialMethods.xsd b/src/test/resources/xbean/compile/scomp/partials/partialMethods.xsd
new file mode 100755
index 0000000..67282a7
--- /dev/null
+++ b/src/test/resources/xbean/compile/scomp/partials/partialMethods.xsd
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!-- 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. -->
+
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+        xmlns="partials"
+        targetNamespace="partials"
+        elementFormDefault="qualified">
+
+    <xs:element name="root">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="single" minOccurs="0" type="xs:decimal" nillable="true"/>
+                <xs:element name="complex" minOccurs="0" type="xmlBeanchen"/>
+                <xs:element name="primitiveList" minOccurs="0" maxOccurs="unbounded" type="xs:decimal" nillable="true"/>
+                <xs:element name="complexList" minOccurs="0" maxOccurs="unbounded" type="xmlBeanchen"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:complexType name="xmlBeanchen">
+        <xs:attribute name="name" type="xs:string"/>
+    </xs:complexType>
+</xs:schema>
