diff --git a/build.xml b/build.xml
index 173fe77..49ea7dd 100644
--- a/build.xml
+++ b/build.xml
@@ -295,6 +295,10 @@
         <replaceHolder srcDir="build/bootstrap/generated-sources" rscDir="build/bootstrap/generated-resources" schemaName="sXMLTOOLS"/>
 
         <replace dir="build/bootstrap/generated-sources" token="schemaorg_apache_xmlbeans" value="org.apache.xmlbeans.metadata" includes="**/*.java"/>
+        <!-- remove deprecated and not supported XMLInputStream API -->
+        <replaceregexp match="^.*@deprecated.*XMLInputStream.*\r?\n.*\r?\n.*\r?\n.*\r?\n" replace="" flags="gm">
+            <fileset dir="build/bootstrap/generated-sources" includes="**/*.java"/>
+        </replaceregexp>
 
         <mkdir dir="build/classes"/>
         <mkdir dir="build/generated-sources"/>
diff --git a/src/main/java/org/apache/xmlbeans/FilterXmlObject.java b/src/main/java/org/apache/xmlbeans/FilterXmlObject.java
index 7f2b667..b925bc6 100644
--- a/src/main/java/org/apache/xmlbeans/FilterXmlObject.java
+++ b/src/main/java/org/apache/xmlbeans/FilterXmlObject.java
@@ -15,20 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.math.BigInteger;
-import java.math.BigDecimal;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
 import org.w3c.dom.Node;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -36,6 +22,12 @@
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
+import java.io.*;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
 
 /**
  * A FilterXmlObject delegates to some other XmlObject, which it can use as
@@ -50,763 +42,621 @@
  * non-transient fields), because subclasses may be serializable and
  * adding storage would break the serialization format.
  */
-public abstract class FilterXmlObject implements XmlObject, SimpleValue, DelegateXmlObject
-{
-    public SchemaType schemaType()
-    {
+public abstract class FilterXmlObject implements XmlObject, SimpleValue, DelegateXmlObject {
+    public SchemaType schemaType() {
         return underlyingXmlObject().schemaType();
     }
 
-    public boolean validate()
-    {
+    public boolean validate() {
         return underlyingXmlObject().validate();
     }
 
-    public boolean validate(XmlOptions options)
-    {
+    public boolean validate(XmlOptions options) {
         return underlyingXmlObject().validate(options);
     }
 
-    public XmlObject[] selectPath(String path)
-    {
+    public XmlObject[] selectPath(String path) {
         return underlyingXmlObject().selectPath(path);
     }
 
-    public XmlObject[] selectPath(String path, XmlOptions options)
-    {
+    public XmlObject[] selectPath(String path, XmlOptions options) {
         return underlyingXmlObject().selectPath(path, options);
     }
 
-    public XmlObject[] execQuery(String query)
-    {
+    public XmlObject[] execQuery(String query) {
         return underlyingXmlObject().execQuery(query);
     }
 
-    public XmlObject[] execQuery(String query, XmlOptions options)
-    {
+    public XmlObject[] execQuery(String query, XmlOptions options) {
         return underlyingXmlObject().execQuery(query, options);
     }
 
-    public XmlObject changeType(SchemaType newType)
-    {
+    public XmlObject changeType(SchemaType newType) {
         return underlyingXmlObject().changeType(newType);
     }
 
-    public boolean isNil()
-    {
+    public boolean isNil() {
         return underlyingXmlObject().isNil();
     }
 
-    public void setNil()
-    {
+    public void setNil() {
         underlyingXmlObject().setNil();
     }
 
-    public boolean isImmutable()
-    {
+    public boolean isImmutable() {
         return underlyingXmlObject().isImmutable();
     }
 
-    public XmlObject set(XmlObject srcObj)
-    {
+    public XmlObject set(XmlObject srcObj) {
         return underlyingXmlObject().set(srcObj);
     }
 
-    public XmlObject copy()
-    {
+    public XmlObject copy() {
         return underlyingXmlObject().copy();
     }
 
-    public XmlObject copy(XmlOptions options)
-    {
+    public XmlObject copy(XmlOptions options) {
         return underlyingXmlObject().copy(options);
     }
-    
-    public boolean valueEquals(XmlObject obj)
-    {
+
+    public boolean valueEquals(XmlObject obj) {
         return underlyingXmlObject().valueEquals(obj);
     }
 
-    public int valueHashCode()
-    {
+    public int valueHashCode() {
         return underlyingXmlObject().valueHashCode();
     }
 
-    public int compareTo(Object obj)
-    {
+    public int compareTo(Object obj) {
         return underlyingXmlObject().compareTo(obj);
     }
 
-    public int compareValue(XmlObject obj)
-    {
+    public int compareValue(XmlObject obj) {
         return underlyingXmlObject().compareValue(obj);
     }
 
-    public Object monitor()
-    {
+    public Object monitor() {
         return underlyingXmlObject().monitor();
     }
 
-    public XmlDocumentProperties documentProperties()
-    {
+    public XmlDocumentProperties documentProperties() {
         return underlyingXmlObject().documentProperties();
     }
 
-    public XmlCursor newCursor()
-    {
+    public XmlCursor newCursor() {
         return underlyingXmlObject().newCursor();
     }
 
-    /**
-     * @deprecated Deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream newXMLInputStream()
-    {
-        return underlyingXmlObject().newXMLInputStream();
-    }
-
-    public XMLStreamReader newXMLStreamReader()
-    {
+    public XMLStreamReader newXMLStreamReader() {
         return underlyingXmlObject().newXMLStreamReader();
     }
 
-    public String xmlText()
-    {
+    public String xmlText() {
         return underlyingXmlObject().xmlText();
     }
 
-    public InputStream newInputStream()
-    {
+    public InputStream newInputStream() {
         return underlyingXmlObject().newInputStream();
     }
 
-    public Reader newReader()
-    {
+    public Reader newReader() {
         return underlyingXmlObject().newReader();
     }
 
-    public Node newDomNode()
-    {
+    public Node newDomNode() {
         return underlyingXmlObject().newDomNode();
     }
 
-    public Node getDomNode()
-    {
+    public Node getDomNode() {
         return underlyingXmlObject().getDomNode();
     }
 
-    public void save(ContentHandler ch, LexicalHandler lh) throws SAXException
-    {
+    public void save(ContentHandler ch, LexicalHandler lh) throws SAXException {
         underlyingXmlObject().save(ch, lh);
     }
 
-    public void save(File file) throws IOException
-    {
+    public void save(File file) throws IOException {
         underlyingXmlObject().save(file);
     }
 
-    public void save(OutputStream os) throws IOException
-    {
+    public void save(OutputStream os) throws IOException {
         underlyingXmlObject().save(os);
     }
 
-    public void save(Writer w) throws IOException
-    {
+    public void save(Writer w) throws IOException {
         underlyingXmlObject().save(w);
     }
 
-    /**
-     * @deprecated Deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream newXMLInputStream(XmlOptions options)
-    {
-        return underlyingXmlObject().newXMLInputStream(options);
-    }
-
-    public XMLStreamReader newXMLStreamReader(XmlOptions options)
-    {
+    public XMLStreamReader newXMLStreamReader(XmlOptions options) {
         return underlyingXmlObject().newXMLStreamReader(options);
     }
 
-    public String xmlText(XmlOptions options)
-    {
+    public String xmlText(XmlOptions options) {
         return underlyingXmlObject().xmlText(options);
     }
 
-    public InputStream newInputStream(XmlOptions options)
-    {
+    public InputStream newInputStream(XmlOptions options) {
         return underlyingXmlObject().newInputStream(options);
     }
 
-    public Reader newReader(XmlOptions options)
-    {
+    public Reader newReader(XmlOptions options) {
         return underlyingXmlObject().newReader(options);
     }
 
-    public Node newDomNode(XmlOptions options)
-    {
+    public Node newDomNode(XmlOptions options) {
         return underlyingXmlObject().newDomNode(options);
     }
 
-    public void save(ContentHandler ch, LexicalHandler lh, XmlOptions options) throws SAXException
-    {
+    public void save(ContentHandler ch, LexicalHandler lh, XmlOptions options) throws SAXException {
         underlyingXmlObject().save(ch, lh, options);
     }
 
-    public void save(File file, XmlOptions options) throws IOException
-    {
+    public void save(File file, XmlOptions options) throws IOException {
         underlyingXmlObject().save(file, options);
     }
 
-    public void save(OutputStream os, XmlOptions options) throws IOException
-    {
+    public void save(OutputStream os, XmlOptions options) throws IOException {
         underlyingXmlObject().save(os, options);
     }
 
-    public void save(Writer w, XmlOptions options) throws IOException
-    {
+    public void save(Writer w, XmlOptions options) throws IOException {
         underlyingXmlObject().save(w, options);
     }
 
-    public SchemaType instanceType()
-    {
-        return ((SimpleValue)underlyingXmlObject()).instanceType();
+    public SchemaType instanceType() {
+        return ((SimpleValue) underlyingXmlObject()).instanceType();
     }
 
     /**
      * @deprecated replaced with {@link #getStringValue}
      */
-    public String stringValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).stringValue();
+    public String stringValue() {
+        return ((SimpleValue) underlyingXmlObject()).stringValue();
     }
 
     /**
      * @deprecated replaced with {@link #getBooleanValue}
      */
-    public boolean booleanValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).booleanValue();
+    public boolean booleanValue() {
+        return ((SimpleValue) underlyingXmlObject()).booleanValue();
     }
 
     /**
      * @deprecated replaced with {@link #getByteValue}
      */
-    public byte byteValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).byteValue();
+    public byte byteValue() {
+        return ((SimpleValue) underlyingXmlObject()).byteValue();
     }
 
     /**
      * @deprecated replaced with {@link #getShortValue}
      */
-    public short shortValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).shortValue();
+    public short shortValue() {
+        return ((SimpleValue) underlyingXmlObject()).shortValue();
     }
 
     /**
      * @deprecated replaced with {@link #getIntValue}
      */
-    public int intValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).intValue();
+    public int intValue() {
+        return ((SimpleValue) underlyingXmlObject()).intValue();
     }
 
     /**
      * @deprecated replaced with {@link #getLongValue}
      */
-    public long longValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).longValue();
+    public long longValue() {
+        return ((SimpleValue) underlyingXmlObject()).longValue();
     }
 
     /**
      * @deprecated replaced with {@link #getBigIntegerValue}
      */
-    public BigInteger bigIntegerValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).bigIntegerValue();
+    public BigInteger bigIntegerValue() {
+        return ((SimpleValue) underlyingXmlObject()).bigIntegerValue();
     }
 
     /**
      * @deprecated replaced with {@link #getBigDecimalValue}
      */
-    public BigDecimal bigDecimalValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).bigDecimalValue();
+    public BigDecimal bigDecimalValue() {
+        return ((SimpleValue) underlyingXmlObject()).bigDecimalValue();
     }
 
     /**
      * @deprecated replaced with {@link #getFloatValue}
      */
-    public float floatValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).floatValue();
+    public float floatValue() {
+        return ((SimpleValue) underlyingXmlObject()).floatValue();
     }
 
     /**
      * @deprecated replaced with {@link #getDoubleValue}
      */
-    public double doubleValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).doubleValue();
+    public double doubleValue() {
+        return ((SimpleValue) underlyingXmlObject()).doubleValue();
     }
 
     /**
      * @deprecated replaced with {@link #getByteArrayValue}
      */
-    public byte[] byteArrayValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).byteArrayValue();
+    public byte[] byteArrayValue() {
+        return ((SimpleValue) underlyingXmlObject()).byteArrayValue();
     }
 
     /**
      * @deprecated replaced with {@link #getEnumValue}
      */
-    public StringEnumAbstractBase enumValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).enumValue();
+    public StringEnumAbstractBase enumValue() {
+        return ((SimpleValue) underlyingXmlObject()).enumValue();
     }
 
     /**
      * @deprecated replaced with {@link #getCalendarValue}
      */
-    public Calendar calendarValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).calendarValue();
+    public Calendar calendarValue() {
+        return ((SimpleValue) underlyingXmlObject()).calendarValue();
     }
 
     /**
      * @deprecated replaced with {@link #getDateValue}
      */
-    public Date dateValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).dateValue();
+    public Date dateValue() {
+        return ((SimpleValue) underlyingXmlObject()).dateValue();
     }
 
     /**
      * @deprecated replaced with {@link #getGDateValue}
      */
-    public GDate gDateValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).gDateValue();
+    public GDate gDateValue() {
+        return ((SimpleValue) underlyingXmlObject()).gDateValue();
     }
 
     /**
      * @deprecated replaced with {@link #getGDurationValue}
      */
-    public GDuration gDurationValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).gDurationValue();
+    public GDuration gDurationValue() {
+        return ((SimpleValue) underlyingXmlObject()).gDurationValue();
     }
 
     /**
      * @deprecated replaced with {@link #getQNameValue}
      */
-    public QName qNameValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).qNameValue();
+    public QName qNameValue() {
+        return ((SimpleValue) underlyingXmlObject()).qNameValue();
     }
 
     /**
      * @deprecated replaced with {@link #getListValue}
      */
-    public List listValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).listValue();
+    public List listValue() {
+        return ((SimpleValue) underlyingXmlObject()).listValue();
     }
 
     /**
      * @deprecated replaced with {@link #getListValue}
      */
-    public List xlistValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).xlistValue();
+    public List xlistValue() {
+        return ((SimpleValue) underlyingXmlObject()).xlistValue();
     }
 
     /**
      * @deprecated replaced with {@link #getObjectValue}
      */
-    public Object objectValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).objectValue();
+    public Object objectValue() {
+        return ((SimpleValue) underlyingXmlObject()).objectValue();
     }
 
     /**
      * @deprecated replaced with {@link #setStringValue}
      */
-    public void set(String obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(String obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setBooleanValue}
      */
-    public void set(boolean v)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(v);
+    public void set(boolean v) {
+        ((SimpleValue) underlyingXmlObject()).set(v);
     }
 
     /**
      * @deprecated replaced with {@link #setByteValue}
      */
-    public void set(byte v)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(v);
+    public void set(byte v) {
+        ((SimpleValue) underlyingXmlObject()).set(v);
     }
 
     /**
      * @deprecated replaced with {@link #setShortValue}
      */
-    public void set(short v)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(v);
+    public void set(short v) {
+        ((SimpleValue) underlyingXmlObject()).set(v);
     }
 
     /**
      * @deprecated replaced with {@link #setIntValue}
      */
-    public void set(int v)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(v);
+    public void set(int v) {
+        ((SimpleValue) underlyingXmlObject()).set(v);
     }
 
     /**
      * @deprecated replaced with {@link #setLongValue}
      */
-    public void set(long v)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(v);
+    public void set(long v) {
+        ((SimpleValue) underlyingXmlObject()).set(v);
     }
 
     /**
      * @deprecated replaced with {@link #setBigIntegerValue}
      */
-    public void set(BigInteger obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(BigInteger obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setBigDecimalValue}
      */
-    public void set(BigDecimal obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(BigDecimal obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setFloatValue}
      */
-    public void set(float v)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(v);
+    public void set(float v) {
+        ((SimpleValue) underlyingXmlObject()).set(v);
     }
 
     /**
      * @deprecated replaced with {@link #setDoubleValue}
      */
-    public void set(double v)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(v);
+    public void set(double v) {
+        ((SimpleValue) underlyingXmlObject()).set(v);
     }
 
     /**
      * @deprecated replaced with {@link #setByteArrayValue}
      */
-    public void set(byte[] obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(byte[] obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setEnumValue}
      */
-    public void set(StringEnumAbstractBase obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(StringEnumAbstractBase obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setCalendarValue}
      */
-    public void set(Calendar obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(Calendar obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setDateValue}
      */
-    public void set(Date obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(Date obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setGDateValue}
      */
-    public void set(GDateSpecification obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(GDateSpecification obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setGDurationValue}
      */
-    public void set(GDurationSpecification obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(GDurationSpecification obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setQNameValue}
      */
-    public void set(QName obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(QName obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setListValue}
      */
-    public void set(List obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).set(obj);
+    public void set(List obj) {
+        ((SimpleValue) underlyingXmlObject()).set(obj);
     }
 
-    public String getStringValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getStringValue();
+    public String getStringValue() {
+        return ((SimpleValue) underlyingXmlObject()).getStringValue();
     }
 
-    public boolean getBooleanValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getBooleanValue();
+    public boolean getBooleanValue() {
+        return ((SimpleValue) underlyingXmlObject()).getBooleanValue();
     }
 
-    public byte getByteValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getByteValue();
+    public byte getByteValue() {
+        return ((SimpleValue) underlyingXmlObject()).getByteValue();
     }
 
-    public short getShortValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getShortValue();
+    public short getShortValue() {
+        return ((SimpleValue) underlyingXmlObject()).getShortValue();
     }
 
-    public int getIntValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getIntValue();
+    public int getIntValue() {
+        return ((SimpleValue) underlyingXmlObject()).getIntValue();
     }
 
-    public long getLongValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getLongValue();
+    public long getLongValue() {
+        return ((SimpleValue) underlyingXmlObject()).getLongValue();
     }
 
-    public BigInteger getBigIntegerValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getBigIntegerValue();
+    public BigInteger getBigIntegerValue() {
+        return ((SimpleValue) underlyingXmlObject()).getBigIntegerValue();
     }
 
-    public BigDecimal getBigDecimalValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getBigDecimalValue();
+    public BigDecimal getBigDecimalValue() {
+        return ((SimpleValue) underlyingXmlObject()).getBigDecimalValue();
     }
 
-    public float getFloatValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getFloatValue();
+    public float getFloatValue() {
+        return ((SimpleValue) underlyingXmlObject()).getFloatValue();
     }
 
-    public double getDoubleValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getDoubleValue();
+    public double getDoubleValue() {
+        return ((SimpleValue) underlyingXmlObject()).getDoubleValue();
     }
 
-    public byte[] getByteArrayValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getByteArrayValue();
+    public byte[] getByteArrayValue() {
+        return ((SimpleValue) underlyingXmlObject()).getByteArrayValue();
     }
 
-    public StringEnumAbstractBase getEnumValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getEnumValue();
+    public StringEnumAbstractBase getEnumValue() {
+        return ((SimpleValue) underlyingXmlObject()).getEnumValue();
     }
 
-    public Calendar getCalendarValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getCalendarValue();
+    public Calendar getCalendarValue() {
+        return ((SimpleValue) underlyingXmlObject()).getCalendarValue();
     }
 
-    public Date getDateValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getDateValue();
+    public Date getDateValue() {
+        return ((SimpleValue) underlyingXmlObject()).getDateValue();
     }
 
-    public GDate getGDateValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getGDateValue();
+    public GDate getGDateValue() {
+        return ((SimpleValue) underlyingXmlObject()).getGDateValue();
     }
 
-    public GDuration getGDurationValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getGDurationValue();
+    public GDuration getGDurationValue() {
+        return ((SimpleValue) underlyingXmlObject()).getGDurationValue();
     }
 
-    public QName getQNameValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getQNameValue();
+    public QName getQNameValue() {
+        return ((SimpleValue) underlyingXmlObject()).getQNameValue();
     }
 
-    public List getListValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getListValue();
+    public List getListValue() {
+        return ((SimpleValue) underlyingXmlObject()).getListValue();
     }
 
-    public List xgetListValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).xgetListValue();
+    public List xgetListValue() {
+        return ((SimpleValue) underlyingXmlObject()).xgetListValue();
     }
 
-    public Object getObjectValue()
-    {
-        return ((SimpleValue)underlyingXmlObject()).getObjectValue();
+    public Object getObjectValue() {
+        return ((SimpleValue) underlyingXmlObject()).getObjectValue();
     }
 
-    public void setStringValue(String obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setStringValue(obj);
+    public void setStringValue(String obj) {
+        ((SimpleValue) underlyingXmlObject()).setStringValue(obj);
     }
 
-    public void setBooleanValue(boolean v)
-    {
-        ((SimpleValue)underlyingXmlObject()).setBooleanValue(v);
+    public void setBooleanValue(boolean v) {
+        ((SimpleValue) underlyingXmlObject()).setBooleanValue(v);
     }
 
-    public void setByteValue(byte v)
-    {
-        ((SimpleValue)underlyingXmlObject()).setByteValue(v);
+    public void setByteValue(byte v) {
+        ((SimpleValue) underlyingXmlObject()).setByteValue(v);
     }
 
-    public void setShortValue(short v)
-    {
-        ((SimpleValue)underlyingXmlObject()).setShortValue(v);
+    public void setShortValue(short v) {
+        ((SimpleValue) underlyingXmlObject()).setShortValue(v);
     }
 
-    public void setIntValue(int v)
-    {
-        ((SimpleValue)underlyingXmlObject()).setIntValue(v);
+    public void setIntValue(int v) {
+        ((SimpleValue) underlyingXmlObject()).setIntValue(v);
     }
 
-    public void setLongValue(long v)
-    {
-        ((SimpleValue)underlyingXmlObject()).setLongValue(v);
+    public void setLongValue(long v) {
+        ((SimpleValue) underlyingXmlObject()).setLongValue(v);
     }
 
-    public void setBigIntegerValue(BigInteger obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setBigIntegerValue(obj);
+    public void setBigIntegerValue(BigInteger obj) {
+        ((SimpleValue) underlyingXmlObject()).setBigIntegerValue(obj);
     }
 
-    public void setBigDecimalValue(BigDecimal obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setBigDecimalValue(obj);
+    public void setBigDecimalValue(BigDecimal obj) {
+        ((SimpleValue) underlyingXmlObject()).setBigDecimalValue(obj);
     }
 
-    public void setFloatValue(float v)
-    {
-        ((SimpleValue)underlyingXmlObject()).setFloatValue(v);
+    public void setFloatValue(float v) {
+        ((SimpleValue) underlyingXmlObject()).setFloatValue(v);
     }
 
-    public void setDoubleValue(double v)
-    {
-        ((SimpleValue)underlyingXmlObject()).setDoubleValue(v);
+    public void setDoubleValue(double v) {
+        ((SimpleValue) underlyingXmlObject()).setDoubleValue(v);
     }
 
-    public void setByteArrayValue(byte[] obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setByteArrayValue(obj);
+    public void setByteArrayValue(byte[] obj) {
+        ((SimpleValue) underlyingXmlObject()).setByteArrayValue(obj);
     }
 
-    public void setEnumValue(StringEnumAbstractBase obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setEnumValue(obj);
+    public void setEnumValue(StringEnumAbstractBase obj) {
+        ((SimpleValue) underlyingXmlObject()).setEnumValue(obj);
     }
 
-    public void setCalendarValue(Calendar obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setCalendarValue(obj);
+    public void setCalendarValue(Calendar obj) {
+        ((SimpleValue) underlyingXmlObject()).setCalendarValue(obj);
     }
 
-    public void setDateValue(Date obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setDateValue(obj);
+    public void setDateValue(Date obj) {
+        ((SimpleValue) underlyingXmlObject()).setDateValue(obj);
     }
 
-    public void setGDateValue(GDate obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setGDateValue(obj);
+    public void setGDateValue(GDate obj) {
+        ((SimpleValue) underlyingXmlObject()).setGDateValue(obj);
     }
 
-    public void setGDurationValue(GDuration obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setGDurationValue(obj);
+    public void setGDurationValue(GDuration obj) {
+        ((SimpleValue) underlyingXmlObject()).setGDurationValue(obj);
     }
 
-    public void setQNameValue(QName obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setQNameValue(obj);
+    public void setQNameValue(QName obj) {
+        ((SimpleValue) underlyingXmlObject()).setQNameValue(obj);
     }
 
-    public void setListValue(List obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setListValue(obj);
+    public void setListValue(List obj) {
+        ((SimpleValue) underlyingXmlObject()).setListValue(obj);
     }
 
-    public void setObjectValue(Object obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).setObjectValue(obj);
+    public void setObjectValue(Object obj) {
+        ((SimpleValue) underlyingXmlObject()).setObjectValue(obj);
     }
 
     /**
      * @deprecated replaced with {@link #setObjectValue}
      **/
-    public void objectSet(Object obj)
-    {
-        ((SimpleValue)underlyingXmlObject()).objectSet(obj);
+    public void objectSet(Object obj) {
+        ((SimpleValue) underlyingXmlObject()).objectSet(obj);
     }
 
-    public XmlObject[] selectChildren(QName elementName)
-    {
+    public XmlObject[] selectChildren(QName elementName) {
         return underlyingXmlObject().selectChildren(elementName);
     }
 
-    public XmlObject[] selectChildren(String elementUri, String elementLocalName)
-    {
+    public XmlObject[] selectChildren(String elementUri, String elementLocalName) {
         return underlyingXmlObject().selectChildren(elementUri, elementLocalName);
     }
 
-    public XmlObject[] selectChildren(QNameSet elementNameSet)
-    {
+    public XmlObject[] selectChildren(QNameSet elementNameSet) {
         return underlyingXmlObject().selectChildren(elementNameSet);
     }
 
-    public XmlObject selectAttribute(QName attributeName)
-    {
+    public XmlObject selectAttribute(QName attributeName) {
         return underlyingXmlObject().selectAttribute(attributeName);
     }
 
-    public XmlObject selectAttribute(String attributeUri, String attributeLocalName)
-    {
+    public XmlObject selectAttribute(String attributeUri, String attributeLocalName) {
         return underlyingXmlObject().selectAttribute(attributeUri, attributeLocalName);
     }
 
-    public XmlObject[] selectAttributes(QNameSet attributeNameSet)
-    {
+    public XmlObject[] selectAttributes(QNameSet attributeNameSet) {
         return underlyingXmlObject().selectAttributes(attributeNameSet);
     }
 }
diff --git a/src/main/java/org/apache/xmlbeans/SchemaTypeLoader.java b/src/main/java/org/apache/xmlbeans/SchemaTypeLoader.java
index abd2ae6..6928658 100644
--- a/src/main/java/org/apache/xmlbeans/SchemaTypeLoader.java
+++ b/src/main/java/org/apache/xmlbeans/SchemaTypeLoader.java
@@ -15,21 +15,17 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.namespace.QName;
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-import org.apache.xmlbeans.xml.stream.XMLStreamException;
+import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Node;
 
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
 import java.io.File;
-import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.Reader;
 import java.net.URL;
 
-import javax.xml.stream.XMLStreamReader;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.DOMImplementation;
-
 /**
  * Represents a searchable set of XML Schema component definitions.
  * <p>
@@ -63,103 +59,165 @@
  * A SchemaTypeLoader can be obtained by dynamically loading XSD files
  * using {@link XmlBeans#loadXsd}, or by assembling other SchemaTypeLoaders
  * or SchemaTypeSystems on a path using {@link XmlBeans#typeLoaderUnion}.
- * 
+ *
  * @see XmlBeans#loadXsd
  * @see XmlBeans#getContextTypeLoader
  * @see XmlBeans#typeLoaderUnion
  * @see SchemaTypeSystem
- */ 
-public interface SchemaTypeLoader
-{
-    /** Returns the type with the given name, or null if none. */
-    public SchemaType findType(QName name);
-
-    /** Returns the document type rooted at the given element name, or null if none. */
-    public SchemaType findDocumentType(QName name);
-    
-    /** Returns the attribute type containing the given attribute name, or null if none. */
-    public SchemaType findAttributeType(QName name);
-
-    /** Returns the global element defintion with the given name, or null if none. */
-    public SchemaGlobalElement findElement(QName name);
-
-    /** Returns the global attribute defintion with the given name, or null if none. */
-    public SchemaGlobalAttribute findAttribute(QName name);
-    
-    /** Returns the model group defintion with the given name, or null if none. */
-    public SchemaModelGroup findModelGroup(QName name);
-    
-    /** Returns the attribute group defintion with the given name, or null if none. */
-    public SchemaAttributeGroup findAttributeGroup(QName name);
-
-    /** True if the typeloader contains any definitions in the given namespace. */
-    public boolean isNamespaceDefined(String namespace);
-
-    /** Used for on-demand loading. */
-    public SchemaType.Ref findTypeRef(QName name);
-
-    /** Used for on-demand loading. */
-    public SchemaType.Ref findDocumentTypeRef(QName name);
-    
-    /** Used for on-demand loading. */
-    public SchemaType.Ref findAttributeTypeRef(QName name);
-
-    /** Used for on-demand loading. */
-    public SchemaGlobalElement.Ref findElementRef(QName name);
-
-    /** Used for on-demand loading. */
-    public SchemaGlobalAttribute.Ref findAttributeRef(QName name);
-    
-    /** Used for on-demand loading. */
-    public SchemaModelGroup.Ref findModelGroupRef(QName name);
-    
-    /** Used for on-demand loading. */
-    public SchemaAttributeGroup.Ref findAttributeGroupRef(QName name);
-
-    /** Used for on-demand loading. */
-    public SchemaIdentityConstraint.Ref findIdentityConstraintRef(QName name);
-
-    /** Finds a type for a given signature string */
-    public SchemaType typeForSignature(String signature);
-
-    /** Finds a type for a given fully-qualified XML Bean classname */
-    public SchemaType typeForClassname(String classname);
-
-    /** Loads original XSD source as a stream.  See {@link SchemaType#getSourceName}. */
-    public InputStream getSourceAsStream(String sourceName);
-    
-    /** Compiles an XPath */
-    public String compilePath(String pathExpr, XmlOptions options) throws XmlException;
-
-    /** Compiles an XQuery */
-    public String compileQuery(String queryExpr, XmlOptions options) throws XmlException;
-
-    /** Creates an instance of the given type. */
-    public XmlObject newInstance ( SchemaType type, XmlOptions options );
-    /** Parses an instance of the given type. */
-    public XmlObject parse ( String xmlText, SchemaType type, XmlOptions options ) throws XmlException;
-    /** Parses an instance of the given type. */
-    public XmlObject parse ( File file, SchemaType type, XmlOptions options ) throws XmlException, IOException;
-    /** Parses an instance of the given type. */
-    public XmlObject parse ( URL file, SchemaType type, XmlOptions options ) throws XmlException, IOException;
-    /** Parses an instance of the given type. */
-    public XmlObject parse ( InputStream jiois, SchemaType type, XmlOptions options ) throws XmlException, IOException;
-    /** Parses an instance of the given type. */
-    public XmlObject parse ( XMLStreamReader xsr, SchemaType type, XmlOptions options ) throws XmlException;
-    /** Parses an instance of the given type. */
-    public XmlObject parse ( Reader jior, SchemaType type, XmlOptions options ) throws XmlException, IOException;
-    /** Parses an instance of the given type. */
-    public XmlObject parse ( Node node, SchemaType type, XmlOptions options ) throws XmlException;
-    /** Parses an instance of the given type.
-     * @deprecated Deprecated by XMLStreamReader from STaX - jsr173 API.
+ */
+public interface SchemaTypeLoader {
+    /**
+     * Returns the type with the given name, or null if none.
      */
-    public XmlObject parse ( XMLInputStream xis, SchemaType type, XmlOptions options ) throws XmlException, XMLStreamException;
-    /** Returns an XmlSaxHandler that can parse an instance of the given type. */
-    public XmlSaxHandler newXmlSaxHandler ( SchemaType type, XmlOptions options );
-    /** Returns a DOMImplementation. */
-    public DOMImplementation newDomImplementation ( XmlOptions options );
-    /** Returns a validating XMLInputStream that will throw an exception if the XML is not valid
-     * @deprecated Deprecated by XMLStreamReader from STaX - jsr173 API.
+    SchemaType findType(QName name);
+
+    /**
+     * Returns the document type rooted at the given element name, or null if none.
      */
-    public XMLInputStream newValidatingXMLInputStream ( XMLInputStream xis, SchemaType type, XmlOptions options ) throws XmlException, XMLStreamException;
+    SchemaType findDocumentType(QName name);
+
+    /**
+     * Returns the attribute type containing the given attribute name, or null if none.
+     */
+    SchemaType findAttributeType(QName name);
+
+    /**
+     * Returns the global element defintion with the given name, or null if none.
+     */
+    SchemaGlobalElement findElement(QName name);
+
+    /**
+     * Returns the global attribute defintion with the given name, or null if none.
+     */
+    SchemaGlobalAttribute findAttribute(QName name);
+
+    /**
+     * Returns the model group defintion with the given name, or null if none.
+     */
+    SchemaModelGroup findModelGroup(QName name);
+
+    /**
+     * Returns the attribute group defintion with the given name, or null if none.
+     */
+    SchemaAttributeGroup findAttributeGroup(QName name);
+
+    /**
+     * True if the typeloader contains any definitions in the given namespace.
+     */
+    boolean isNamespaceDefined(String namespace);
+
+    /**
+     * Used for on-demand loading.
+     */
+    SchemaType.Ref findTypeRef(QName name);
+
+    /**
+     * Used for on-demand loading.
+     */
+    SchemaType.Ref findDocumentTypeRef(QName name);
+
+    /**
+     * Used for on-demand loading.
+     */
+    SchemaType.Ref findAttributeTypeRef(QName name);
+
+    /**
+     * Used for on-demand loading.
+     */
+    SchemaGlobalElement.Ref findElementRef(QName name);
+
+    /**
+     * Used for on-demand loading.
+     */
+    SchemaGlobalAttribute.Ref findAttributeRef(QName name);
+
+    /**
+     * Used for on-demand loading.
+     */
+    SchemaModelGroup.Ref findModelGroupRef(QName name);
+
+    /**
+     * Used for on-demand loading.
+     */
+    SchemaAttributeGroup.Ref findAttributeGroupRef(QName name);
+
+    /**
+     * Used for on-demand loading.
+     */
+    SchemaIdentityConstraint.Ref findIdentityConstraintRef(QName name);
+
+    /**
+     * Finds a type for a given signature string
+     */
+    SchemaType typeForSignature(String signature);
+
+    /**
+     * Finds a type for a given fully-qualified XML Bean classname
+     */
+    SchemaType typeForClassname(String classname);
+
+    /**
+     * Loads original XSD source as a stream.  See {@link SchemaType#getSourceName}.
+     */
+    InputStream getSourceAsStream(String sourceName);
+
+    /**
+     * Compiles an XPath
+     */
+    String compilePath(String pathExpr, XmlOptions options) throws XmlException;
+
+    /**
+     * Compiles an XQuery
+     */
+    String compileQuery(String queryExpr, XmlOptions options) throws XmlException;
+
+    /**
+     * Creates an instance of the given type.
+     */
+    XmlObject newInstance(SchemaType type, XmlOptions options);
+
+    /**
+     * Parses an instance of the given type.
+     */
+    XmlObject parse(String xmlText, SchemaType type, XmlOptions options) throws XmlException;
+
+    /**
+     * Parses an instance of the given type.
+     */
+    XmlObject parse(File file, SchemaType type, XmlOptions options) throws XmlException, IOException;
+
+    /**
+     * Parses an instance of the given type.
+     */
+    XmlObject parse(URL file, SchemaType type, XmlOptions options) throws XmlException, IOException;
+
+    /**
+     * Parses an instance of the given type.
+     */
+    XmlObject parse(InputStream jiois, SchemaType type, XmlOptions options) throws XmlException, IOException;
+
+    /**
+     * Parses an instance of the given type.
+     */
+    XmlObject parse(XMLStreamReader xsr, SchemaType type, XmlOptions options) throws XmlException;
+
+    /**
+     * Parses an instance of the given type.
+     */
+    XmlObject parse(Reader jior, SchemaType type, XmlOptions options) throws XmlException, IOException;
+
+    /**
+     * Parses an instance of the given type.
+     */
+    XmlObject parse(Node node, SchemaType type, XmlOptions options) throws XmlException;
+
+    /**
+     * Returns an XmlSaxHandler that can parse an instance of the given type.
+     */
+    XmlSaxHandler newXmlSaxHandler(SchemaType type, XmlOptions options);
+
+    /**
+     * Returns a DOMImplementation.
+     */
+    DOMImplementation newDomImplementation(XmlOptions options);
 }
diff --git a/src/main/java/org/apache/xmlbeans/XmlAnySimpleType.java b/src/main/java/org/apache/xmlbeans/XmlAnySimpleType.java
index acc6fd6..e66cca5 100644
--- a/src/main/java/org/apache/xmlbeans/XmlAnySimpleType.java
+++ b/src/main/java/org/apache/xmlbeans/XmlAnySimpleType.java
@@ -15,27 +15,28 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-1/#Simple_Type_Definition">xs:anySimpleType</a> type.
  * <p>
- * All simple types are convertible to {@link String}. 
- */ 
-public interface XmlAnySimpleType extends XmlObject
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_anySimpleType");
-    
+ * All simple types are convertible to {@link String}.
+ */
+public interface XmlAnySimpleType extends XmlObject {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_anySimpleType");
+
     /**
      * Returns the value as a {@link String}
+     *
      * @deprecated replaced by {@link #getStringValue}
      **/
     String stringValue();
+
     /**
      * Sets the value as a {@link String}
+     *
      * @deprecated replaced by {@link #setStringValue}
      **/
     void set(String s);
@@ -54,101 +55,129 @@
      * A class with methods for creating instances
      * of {@link XmlAnySimpleType}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlAnySimpleType} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlAnySimpleType} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated Deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlAnySimpleType} fragment from an XMLStreamReader.
          */
-        public static XmlAnySimpleType parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlAnySimpleType} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlAnySimpleType parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlAnySimpleType) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlAnySimpleType} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 4246e72..8fbe686 100644
--- a/src/main/java/org/apache/xmlbeans/XmlAnyURI.java
+++ b/src/main/java/org/apache/xmlbeans/XmlAnyURI.java
@@ -15,119 +15,145 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#anyURI">xs:anyURI</a> type.
  * <p>
- * Convertible to {@link String}. 
- */ 
-public interface XmlAnyURI extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_anyURI");
-    
+ * Convertible to {@link String}.
+ */
+public interface XmlAnyURI extends XmlAnySimpleType {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlAnyURI} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlAnyURI} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlAnyURI} fragment from an XMLStreamReader.
          */
-        public static XmlAnyURI parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlAnyURI} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlAnyURI parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlAnyURI) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlAnyURI} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlBase64Binary.java b/src/main/java/org/apache/xmlbeans/XmlBase64Binary.java
index ba8bbd6..ec7ffcd 100644
--- a/src/main/java/org/apache/xmlbeans/XmlBase64Binary.java
+++ b/src/main/java/org/apache/xmlbeans/XmlBase64Binary.java
@@ -15,35 +15,40 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#base64Binary">xs:base64Binary</a> type.
  * <p>
- * Convertible to a byte array. 
- */ 
-public interface XmlBase64Binary extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_base64Binary");
-    
+ * Convertible to a byte array.
+ */
+public interface XmlBase64Binary extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_base64Binary");
+
     /**
      * Returns this value as a byte array.
+     *
      * @deprecated replaced by {@link #getByteArrayValue}
      **/
     byte[] byteArrayValue();
 
     /**
      * Sets this value as a byte array.
+     *
      * @deprecated replaced by {@link #setByteArrayValue}
      **/
     void set(byte[] ba);
 
-    /** Returns this value as a byte array. **/
+    /**
+     * Returns this value as a byte array.
+     **/
     byte[] getByteArrayValue();
-    /** Sets this value as a byte array. */
+
+    /**
+     * Sets this value as a byte array.
+     */
     void setByteArrayValue(byte[] ba);
 
 
@@ -51,101 +56,129 @@
      * A class with methods for creating instances
      * of {@link XmlBase64Binary}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance of {@link XmlBase64Binary} */
+    final class Factory {
+        /**
+         * Creates an empty instance of {@link XmlBase64Binary}
+         */
         public static XmlBase64Binary newInstance() {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().newInstance( type, null ); }
-        
-        /** Creates an empty instance of {@link XmlBase64Binary} */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().newInstance(type, null);
+        }
+
+        /**
+         * Creates an empty instance of {@link XmlBase64Binary}
+         */
         public static XmlBase64Binary newInstance(org.apache.xmlbeans.XmlOptions options) {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().newInstance( type, options ); }
-        
-        /** Creates an immutable {@link XmlBase64Binary} value */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().newInstance(type, options);
+        }
+
+        /**
+         * Creates an immutable {@link XmlBase64Binary} value
+         */
         public static XmlBase64Binary newValue(Object obj) {
-          return (XmlBase64Binary) type.newValue( obj ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a String. For example: "<code>&lt;xml-fragment&gt;VGhpcyBzdHJp&lt;/xml-fragment&gt;</code>". */
+            return (XmlBase64Binary) type.newValue(obj);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a String. For example: "<code>&lt;xml-fragment&gt;VGhpcyBzdHJp&lt;/xml-fragment&gt;</code>".
+         */
         public static XmlBase64Binary parse(java.lang.String s) throws org.apache.xmlbeans.XmlException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( s, type, null ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a String. For example: "<code>&lt;xml-fragment&gt;VGhpcyBzdHJp&lt;/xml-fragment&gt;</code>". */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(s, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a String. For example: "<code>&lt;xml-fragment&gt;VGhpcyBzdHJp&lt;/xml-fragment&gt;</code>".
+         */
         public static XmlBase64Binary parse(java.lang.String s, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( s, type, options ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a File. */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(s, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a File.
+         */
         public static XmlBase64Binary parse(java.io.File f) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( f, type, null ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a File. */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(f, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a File.
+         */
         public static XmlBase64Binary parse(java.io.File f, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( f, type, options ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a URL. */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(f, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a URL.
+         */
         public static XmlBase64Binary parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( u, type, null ); }
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlBase64Binary} fragment from a URL. */
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a URL.
+         */
         public static XmlBase64Binary parse(java.net.URL u, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( u, type, options ); }
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlBase64Binary} fragment from an InputStream. */
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from an InputStream.
+         */
         public static XmlBase64Binary parse(java.io.InputStream is) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( is, type, null ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from an InputStream. */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(is, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from an InputStream.
+         */
         public static XmlBase64Binary parse(java.io.InputStream is, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( is, type, options ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a Reader. */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(is, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a Reader.
+         */
         public static XmlBase64Binary parse(java.io.Reader r) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( r, type, null ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a Reader. */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(r, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a Reader.
+         */
         public static XmlBase64Binary parse(java.io.Reader r, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( r, type, options ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a DOM Node. */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(r, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a DOM Node.
+         */
         public static XmlBase64Binary parse(org.w3c.dom.Node node) throws org.apache.xmlbeans.XmlException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( node, type, null ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from a DOM Node. */
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(node, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from a DOM Node.
+         */
         public static XmlBase64Binary parse(org.w3c.dom.Node node, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( node, type, options ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from an XMLStreamReader.
          */
-        public static XmlBase64Binary parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlBase64Binary parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( xis, type, options ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from an XMLStreamReader. */
         public static XmlBase64Binary parse(javax.xml.stream.XMLStreamReader xsr) throws org.apache.xmlbeans.XmlException {
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( xsr, type, null ); }
-        
-        /** Parses a {@link XmlBase64Binary} fragment from an XMLStreamReader. */
-        public static XmlBase64Binary parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException{
-          return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse( xsr, type, options ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlBase64Binary} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        public static XmlBase64Binary parse(javax.xml.stream.XMLStreamReader xsr, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException {
+            return (XmlBase64Binary) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
+        }
+
+        private Factory() {
+            // No instance of this class allowed
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlBoolean.java b/src/main/java/org/apache/xmlbeans/XmlBoolean.java
index 579b38d..526ca89 100644
--- a/src/main/java/org/apache/xmlbeans/XmlBoolean.java
+++ b/src/main/java/org/apache/xmlbeans/XmlBoolean.java
@@ -15,135 +15,169 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#boolean">xs:boolean</a> type.
  * <p>
- * Naturally, convertible to Java boolean. 
- */ 
-public interface XmlBoolean extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_boolean");
-    
+ * Naturally, convertible to Java boolean.
+ */
+public interface XmlBoolean extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_boolean");
+
     /**
      * Returns this value as a boolean
+     *
      * @deprecated replaced by {@link #getBooleanValue}
      **/
     boolean booleanValue();
+
     /**
      * Sets this value as a boolean
+     *
      * @deprecated replaced by {@link #setBooleanValue}
      **/
     void set(boolean v);
 
-    /** Returns this value as a boolean */
+    /**
+     * Returns this value as a boolean
+     */
     boolean getBooleanValue();
-    /** Sets this value as a boolean */
+
+    /**
+     * Sets this value as a boolean
+     */
     void setBooleanValue(boolean v);
 
     /**
      * A class with methods for creating instances
      * of {@link XmlBoolean}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlBoolean} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlBoolean} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlBoolean} fragment from an XMLStreamReader.
          */
-        public static XmlBoolean parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlBoolean) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlBoolean} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlBoolean parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlBoolean) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlBoolean) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlBoolean} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 b59d3ee..4cb7eff 100644
--- a/src/main/java/org/apache/xmlbeans/XmlByte.java
+++ b/src/main/java/org/apache/xmlbeans/XmlByte.java
@@ -15,135 +15,169 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#byte">xs:byte</a> type.
  * <p>
- * Naturally, convertible to Java byte. 
- */ 
-public interface XmlByte extends XmlShort
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_byte");
-    
+ * Naturally, convertible to Java byte.
+ */
+public interface XmlByte extends XmlShort {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_byte");
+
     /**
      * Returns this value as a byte
+     *
      * @deprecated replaced by {@link #getByteValue}
      **/
     public byte byteValue();
+
     /**
      * Sets this value as a byte
+     *
      * @deprecated replaced by {@link #setByteValue}
      **/
     public void set(byte s);
 
-    /** Returns this value as a byte */
+    /**
+     * Returns this value as a byte
+     */
     public byte getByteValue();
-    /** Sets this value as a byte */
+
+    /**
+     * Sets this value as a byte
+     */
     public void setByteValue(byte s);
-    
+
     /**
      * A class with methods for creating instances
      * of {@link XmlByte}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance of {@link XmlByte} */
+    final class Factory {
+        /**
+         * Creates an empty instance of {@link XmlByte}
+         */
         public static XmlByte newInstance() {
-          return (XmlByte) XmlBeans.getContextTypeLoader().newInstance( type, null ); }
-        
-        /** Creates an empty instance of {@link XmlByte} */
+            return (XmlByte) XmlBeans.getContextTypeLoader().newInstance(type, null);
+        }
+
+        /**
+         * Creates an empty instance of {@link XmlByte}
+         */
         public static XmlByte newInstance(org.apache.xmlbeans.XmlOptions options) {
-          return (XmlByte) XmlBeans.getContextTypeLoader().newInstance( type, options ); }
-        
-        /** Creates an immutable {@link XmlByte} value */
+            return (XmlByte) XmlBeans.getContextTypeLoader().newInstance(type, options);
+        }
+
+        /**
+         * Creates an immutable {@link XmlByte} value
+         */
         public 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>". */
+            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>".
+         */
         public 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>". */
+            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>".
+         */
         public 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. */
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(s, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from a File.
+         */
         public 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. */
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(f, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from a File.
+         */
         public 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. */
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(f, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from a URL.
+         */
         public static XmlByte parse(java.net.URL u) throws org.apache.xmlbeans.XmlException, java.io.IOException {
-          return (XmlByte) XmlBeans.getContextTypeLoader().parse( u, type, null ); }
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlByte} fragment from a URL. */
+        /**
+         * Parses a {@link XmlByte} fragment from a URL.
+         */
         public 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 ); }
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlByte} fragment from an InputStream. */
+        /**
+         * Parses a {@link XmlByte} fragment from an InputStream.
+         */
         public 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. */
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(is, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from an InputStream.
+         */
         public 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. */
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(is, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from a Reader.
+         */
         public 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. */
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(r, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from a Reader.
+         */
         public 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. */
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(r, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from a DOM Node.
+         */
         public 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. */
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(node, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from a DOM Node.
+         */
         public 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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from an XMLStreamReader.
          */
-        public static XmlByte parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlByte) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlByte} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlByte parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlByte) XmlBeans.getContextTypeLoader().parse( xis, type, options ); }
-        
-        /** Parses a {@link XmlByte} fragment from an XMLStreamReader. */
         public 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. */
-        public 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlByte) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlByte} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        public 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/XmlDate.java b/src/main/java/org/apache/xmlbeans/XmlDate.java
index 7d2fd26..17b4278 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDate.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDate.java
@@ -15,11 +15,8 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
-import java.util.Date;
 import java.util.Calendar;
+import java.util.Date;
 
 
 /**
@@ -27,159 +24,216 @@
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#date">xs:date</a> type.
  * <p>
  * Convertible to {@link Calendar}, {@link Date}, and {@link GDate}.
- * 
+ *
  * @see XmlCalendar
  * @see GDate
- */ 
-public interface XmlDate extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_date");
+ */
+public interface XmlDate extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_date");
 
 
     /**
      * Returns this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #getCalendarValue}
      **/
     Calendar calendarValue();
+
     /**
      * Sets this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #setCalendarValue}
      **/
     void set(Calendar c);
+
     /**
      * Returns this value as a {@link GDate}
+     *
      * @deprecated replaced with {@link #getGDateValue}
      **/
     GDate gDateValue();
+
     /**
      * Sets this value as a {@link GDateSpecification}
+     *
      * @deprecated replaced with {@link #setGDateValue}
      **/
     void set(GDateSpecification gd);
+
     /**
      * Returns this value as a {@link Date}
+     *
      * @deprecated replaced with {@link #getDateValue}
      **/
     Date dateValue();
+
     /**
      * Sets this value as a {@link Date}
+     *
      * @deprecated replaced with {@link #setDateValue}
      **/
     void set(Date d);
 
-    /** Returns this value as a {@link Calendar} */
+    /**
+     * Returns this value as a {@link Calendar}
+     */
     Calendar getCalendarValue();
-    /** Sets this value as a {@link Calendar} */
+
+    /**
+     * Sets this value as a {@link Calendar}
+     */
     void setCalendarValue(Calendar c);
-    /** Returns this value as a {@link GDate} */
+
+    /**
+     * Returns this value as a {@link GDate}
+     */
     GDate getGDateValue();
-    /** Sets this value as a {@link GDateSpecification} */
+
+    /**
+     * Sets this value as a {@link GDateSpecification}
+     */
     void setGDateValue(GDate gd);
-    /** Returns this value as a {@link Date} */
+
+    /**
+     * Returns this value as a {@link Date}
+     */
     Date getDateValue();
-    /** Sets this value as a {@link Date} */
+
+    /**
+     * Sets this value as a {@link Date}
+     */
     void setDateValue(Date d);
 
     /**
      * A class with methods for creating instances
      * of {@link XmlDate}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlDate) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlDate} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlDate) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlDate} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDate) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlDate} fragment from an XMLStreamReader.
          */
-        public static XmlDate parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDate) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlDate} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlDate parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDate) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDate) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlDate} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 1dabef7..a06925f 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDateTime.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDateTime.java
@@ -15,11 +15,8 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
-import java.util.Date;
 import java.util.Calendar;
+import java.util.Date;
 
 
 /**
@@ -31,158 +28,216 @@
  * <p>
  * The XmlDateTime class only encapsulates a schema DateTime value, if you need to perform operations
  * on dates, see the GDate class
+ *
  * @see XmlCalendar
  * @see GDate
  * @see GDuration
- */ 
-public interface XmlDateTime extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_dateTime");
-    
+ */
+public interface XmlDateTime extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_dateTime");
+
     /**
      * Returns this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #getCalendarValue}
      **/
     Calendar calendarValue();
+
     /**
      * Sets this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #setCalendarValue}
      **/
     void set(Calendar c);
+
     /**
      * Returns this value as a {@link GDate}
+     *
      * @deprecated replaced with {@link #getGDateValue}
      **/
     GDate gDateValue();
+
     /**
      * Sets this value as a {@link GDateSpecification}
+     *
      * @deprecated replaced with {@link #setGDateValue}
      **/
     void set(GDateSpecification gd);
+
     /**
      * Returns this value as a {@link Date}
+     *
      * @deprecated replaced with {@link #getDateValue}
      **/
     Date dateValue();
+
     /**
      * Sets this value as a {@link Date}
+     *
      * @deprecated replaced with {@link #setDateValue}
      **/
     void set(Date d);
 
-    /** Returns this value as a {@link Calendar} */
+    /**
+     * Returns this value as a {@link Calendar}
+     */
     Calendar getCalendarValue();
-    /** Sets this value as a {@link Calendar} */
+
+    /**
+     * Sets this value as a {@link Calendar}
+     */
     void setCalendarValue(Calendar c);
-    /** Returns this value as a {@link GDate} */
+
+    /**
+     * Returns this value as a {@link GDate}
+     */
     GDate getGDateValue();
-    /** Sets this value as a {@link GDateSpecification} */
+
+    /**
+     * Sets this value as a {@link GDateSpecification}
+     */
     void setGDateValue(GDate gd);
-    /** Returns this value as a {@link Date} */
+
+    /**
+     * Returns this value as a {@link Date}
+     */
     Date getDateValue();
-    /** Sets this value as a {@link Date} */
+
+    /**
+     * Sets this value as a {@link Date}
+     */
     void setDateValue(Date d);
 
     /**
      * A class with methods for creating instances
      * of {@link XmlDateTime}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlDateTime} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlDateTime} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlDateTime} fragment from an XMLStreamReader.
          */
-        public static XmlDateTime parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDateTime) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlDateTime} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlDateTime parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDateTime) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDateTime) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlDateTime} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 ad8c3ed..1073bd9 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDecimal.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDecimal.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.math.BigDecimal;
 
 /**
@@ -25,24 +22,33 @@
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#decimal">xs:decimal</a> type.
  * <p>
  * Convertible to {@link BigDecimal}.
- */ 
-public interface XmlDecimal extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_decimal");
-    
-    /** Returns this value as a {@link BigDecimal} */
+ */
+public interface XmlDecimal extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_decimal");
+
+    /**
+     * Returns this value as a {@link BigDecimal}
+     */
     BigDecimal getBigDecimalValue();
-    /** Sets this value as a {@link BigDecimal} */
+
+    /**
+     * Sets this value as a {@link BigDecimal}
+     */
     void setBigDecimalValue(BigDecimal bd);
 
     /**
      * Returns this value as a {@link BigDecimal}
+     *
      * @deprecated replaced with {@link #getBigDecimalValue}
      **/
     BigDecimal bigDecimalValue();
+
     /**
      * Sets this value as a {@link BigDecimal}
+     *
      * @deprecated replaced with {@link #setBigDecimalValue}
      **/
     void set(BigDecimal bd);
@@ -51,101 +57,129 @@
      * A class with methods for creating instances
      * of {@link XmlDecimal}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlDecimal} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlDecimal} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlDecimal} fragment from an XMLStreamReader.
          */
-        public static XmlDecimal parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDecimal) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlDecimal} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlDecimal parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDecimal) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDecimal) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlDecimal} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 77d1ff0..dadde0a 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDouble.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDouble.java
@@ -15,32 +15,38 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#double">xs:double</a> type.
  * <p>
  * Naturally, convertible to a Java double.
- */ 
-public interface XmlDouble extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_double");
-    
-    /** Returns this value as a double */
+ */
+public interface XmlDouble extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_double");
+
+    /**
+     * Returns this value as a double
+     */
     double getDoubleValue();
-    /** Sets this value as a double */
+
+    /**
+     * Sets this value as a double
+     */
     void setDoubleValue(double v);
 
     /**
      * Returns this value as a double
+     *
      * @deprecated replaced with {@link #getDoubleValue}
      **/
     double doubleValue();
+
     /**
      * Sets this value as a double
+     *
      * @deprecated replaced with {@link #setDoubleValue}
      **/
     void set(double v);
@@ -49,101 +55,129 @@
      * A class with methods for creating instances
      * of {@link XmlDouble}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlDouble} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlDouble} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlDouble} fragment from an XMLStreamReader.
          */
-        public static XmlDouble parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDouble) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlDouble} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlDouble parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDouble) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDouble) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlDouble} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 f1debb2..dc8dcb7 100644
--- a/src/main/java/org/apache/xmlbeans/XmlDuration.java
+++ b/src/main/java/org/apache/xmlbeans/XmlDuration.java
@@ -15,34 +15,40 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#duration">xs:duration</a> type.
  * <p>
  * Convertible to a {@link GDuration}.
- * 
+ *
  * @see GDuration
- */ 
-public interface XmlDuration extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_duration");
-    
-    /** Returns this value as a {@link GDuration} */
+ */
+public interface XmlDuration extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_duration");
+
+    /**
+     * Returns this value as a {@link GDuration}
+     */
     GDuration getGDurationValue();
-    /** Sets this value as a {@link GDuration} */
+
+    /**
+     * Sets this value as a {@link GDuration}
+     */
     void setGDurationValue(GDuration gd);
 
     /**
      * Returns this value as a {@link GDuration}
+     *
      * @deprecated replaced with {@link #getGDurationValue}
      **/
     GDuration gDurationValue();
+
     /**
      * Sets this value as a {@link GDuration}
+     *
      * @deprecated replaced with {@link #setGDurationValue}
      **/
     void set(GDurationSpecification gd);
@@ -51,101 +57,129 @@
      * A class with methods for creating instances
      * of {@link XmlDuration}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlDuration} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlDuration} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlDuration} fragment from an XMLStreamReader.
          */
-        public static XmlDuration parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDuration) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlDuration} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlDuration parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlDuration) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlDuration) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlDuration} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 6481db4..763e95b 100644
--- a/src/main/java/org/apache/xmlbeans/XmlENTITIES.java
+++ b/src/main/java/org/apache/xmlbeans/XmlENTITIES.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.util.List;
 
 
@@ -27,31 +24,45 @@
  * a list type.
  * <p>
  * A list type.
- */ 
-public interface XmlENTITIES extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_ENTITIES");
-    
-    /** Returns the value as a {@link List} of {@link String} values */
+ */
+public interface XmlENTITIES extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_ENTITIES");
+
+    /**
+     * Returns the value as a {@link List} of {@link String} values
+     */
     List getListValue();
-    /** Returns the value as a {@link List} of {@link XmlENTITY} values **/
+
+    /**
+     * Returns the value as a {@link List} of {@link XmlENTITY} values
+     **/
     List xgetListValue();
-    /** Sets the value as a {@link List} */
+
+    /**
+     * Sets the value as a {@link List}
+     */
     void setListValue(List l);
 
     /**
      * Returns the value as a {@link List} of {@link String} values
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     List listValue();
+
     /**
      * Returns the value as a {@link List} of {@link XmlENTITY} values
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     List xlistValue();
+
     /**
      * Sets the value as a {@link List}
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     void set(List l);
@@ -60,101 +71,129 @@
      * A class with methods for creating instances
      * of {@link XmlENTITIES}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlENTITIES} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlENTITIES} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlENTITIES} fragment from an XMLStreamReader.
          */
-        public static XmlENTITIES parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlENTITIES} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlENTITIES parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlENTITIES) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlENTITIES} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 d5ed9f0..955812e 100644
--- a/src/main/java/org/apache/xmlbeans/XmlENTITY.java
+++ b/src/main/java/org/apache/xmlbeans/XmlENTITY.java
@@ -15,119 +15,145 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#ENTITY">xs:ENTITY</a> type.
  * <p>
  * Convertible to {@link String}.
- */ 
-public interface XmlENTITY extends XmlNCName
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_ENTITY");
-    
+ */
+public interface XmlENTITY extends XmlNCName {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlENTITY} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlENTITY} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlENTITY} fragment from an XMLStreamReader.
          */
-        public static XmlENTITY parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlENTITY) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlENTITY} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlENTITY parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlENTITY) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlENTITY) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlENTITY} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlFactoryHook.java b/src/main/java/org/apache/xmlbeans/XmlFactoryHook.java
index 55e7cc8..5c28509 100644
--- a/src/main/java/org/apache/xmlbeans/XmlFactoryHook.java
+++ b/src/main/java/org/apache/xmlbeans/XmlFactoryHook.java
@@ -15,19 +15,15 @@
 
 package org.apache.xmlbeans;
 
-import org.w3c.dom.Node;
 import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Node;
 
+import javax.xml.stream.XMLStreamReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
 import java.lang.ref.SoftReference;
 
-import javax.xml.stream.XMLStreamReader;
-
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-import org.apache.xmlbeans.xml.stream.XMLStreamException;
-
 /**
  * A hook for the XML Bean Factory mechanism.
  * Provided for advanced users who wish to provide their own
@@ -44,7 +40,7 @@
  * // this results in a call to hook.parse(...)
  * XmlObject.Factory.parse(new File("test.xml"));
  * </pre>
- * 
+ * <p>
  * If the hook needs to turn around and invoke the built-in parsers, then
  * it should do so by calling the appropriate method on the passed
  * SchemaTypeLoader.  Since SchemaTypeLoader.parse() methods delegate
@@ -62,35 +58,52 @@
  * }
  * </pre>
  */
-public interface XmlFactoryHook
-{
-    /** Hooks Factory.newInstance calls */
-    public XmlObject newInstance ( SchemaTypeLoader loader, SchemaType type, XmlOptions options );
-    /** Hooks Factory.parse calls */
-    public XmlObject parse ( SchemaTypeLoader loader, String xmlText, SchemaType type, XmlOptions options ) throws XmlException;
-    /** Hooks Factory.parse calls */
-    public XmlObject parse ( SchemaTypeLoader loader, InputStream jiois, SchemaType type, XmlOptions options ) throws XmlException, IOException;
-    /** Hooks Factory.parse calls */
-    public XmlObject parse ( SchemaTypeLoader loader, XMLStreamReader xsr, SchemaType type, XmlOptions options ) throws XmlException;
-    /** Hooks Factory.parse calls */
-    public XmlObject parse ( SchemaTypeLoader loader, Reader jior, SchemaType type, XmlOptions options ) throws XmlException, IOException;
-    /** Hooks Factory.parse calls */
-    public XmlObject parse ( SchemaTypeLoader loader, Node node, SchemaType type, XmlOptions options ) throws XmlException;
-    /** Hooks Factory.parse calls
-      * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-      */
-    public XmlObject parse ( SchemaTypeLoader loader, XMLInputStream xis, SchemaType type, XmlOptions options ) throws XmlException, XMLStreamException;
-    /** Hooks Factory.newXmlSaxHandler calls */
-    public XmlSaxHandler newXmlSaxHandler ( SchemaTypeLoader loader, SchemaType type, XmlOptions options );
-    /** Hooks Factory.newDomImplementation calls */
-    public DOMImplementation newDomImplementation ( SchemaTypeLoader loader, XmlOptions options );
+public interface XmlFactoryHook {
+    /**
+     * Hooks Factory.newInstance calls
+     */
+    XmlObject newInstance(SchemaTypeLoader loader, SchemaType type, XmlOptions options);
+
+    /**
+     * Hooks Factory.parse calls
+     */
+    XmlObject parse(SchemaTypeLoader loader, String xmlText, SchemaType type, XmlOptions options) throws XmlException;
+
+    /**
+     * Hooks Factory.parse calls
+     */
+    XmlObject parse(SchemaTypeLoader loader, InputStream jiois, SchemaType type, XmlOptions options) throws XmlException, IOException;
+
+    /**
+     * Hooks Factory.parse calls
+     */
+    XmlObject parse(SchemaTypeLoader loader, XMLStreamReader xsr, SchemaType type, XmlOptions options) throws XmlException;
+
+    /**
+     * Hooks Factory.parse calls
+     */
+    XmlObject parse(SchemaTypeLoader loader, Reader jior, SchemaType type, XmlOptions options) throws XmlException, IOException;
+
+    /**
+     * Hooks Factory.parse calls
+     */
+    XmlObject parse(SchemaTypeLoader loader, Node node, SchemaType type, XmlOptions options) throws XmlException;
+
+    /**
+     * Hooks Factory.newXmlSaxHandler calls
+     */
+    XmlSaxHandler newXmlSaxHandler(SchemaTypeLoader loader, SchemaType type, XmlOptions options);
+
+    /**
+     * Hooks Factory.newDomImplementation calls
+     */
+    DOMImplementation newDomImplementation(SchemaTypeLoader loader, XmlOptions options);
 
     /**
      * Used to manage the XmlFactoryHook for the current thread.
-     */ 
-    public final static class ThreadContext
-    {
-        private static ThreadLocal threadHook = new ThreadLocal();
+     */
+    final class ThreadContext {
+        private static final ThreadLocal<SoftReference<XmlFactoryHook>> threadHook = new ThreadLocal<>();
 
         public static void clearThreadLocals() {
             threadHook.remove();
@@ -98,24 +111,21 @@
 
         /**
          * Returns the current thread's hook, or null if none.
-         */ 
-        public static XmlFactoryHook getHook()
-        {
-            SoftReference softRef = (SoftReference)threadHook.get();
-            return softRef==null ? null : (XmlFactoryHook)softRef.get();
+         */
+        public static XmlFactoryHook getHook() {
+            SoftReference<XmlFactoryHook> softRef = threadHook.get();
+            return softRef == null ? null : softRef.get();
         }
 
         /**
          * Sets the hook for the current thread.
-         */ 
-        public static void setHook(XmlFactoryHook hook)
-        {
-            threadHook.set(new SoftReference(hook));
+         */
+        public static void setHook(XmlFactoryHook hook) {
+            threadHook.set(new SoftReference<>(hook));
         }
 
         // provided to prevent unwanted construction
-        private ThreadContext()
-        {
+        private ThreadContext() {
         }
     }
 }
diff --git a/src/main/java/org/apache/xmlbeans/XmlFloat.java b/src/main/java/org/apache/xmlbeans/XmlFloat.java
index 23dd2eb..a0b44ca 100644
--- a/src/main/java/org/apache/xmlbeans/XmlFloat.java
+++ b/src/main/java/org/apache/xmlbeans/XmlFloat.java
@@ -15,135 +15,169 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#float">xs:float</a> type.
  * <p>
  * Naturally, convertible to a Java float.
- */ 
-public interface XmlFloat extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_float");
-    
-    /** Returns this value as a float */
+ */
+public interface XmlFloat extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_float");
+
+    /**
+     * Returns this value as a float
+     */
     float getFloatValue();
-    /** Sets this value as a float */
+
+    /**
+     * Sets this value as a float
+     */
     void setFloatValue(float v);
 
     /**
      * Returns this value as a float
+     *
      * @deprecated replaced by {@link #getFloatValue}
      **/
     float floatValue();
+
     /**
      * Sets this value as a float
+     *
      * @deprecated replaced by {@link #setFloatValue}
      **/
     void set(float v);
-    
+
     /**
      * A class with methods for creating instances
      * of {@link XmlFloat}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlFloat} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlFloat} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlFloat} fragment from an XMLStreamReader.
          */
-        public static XmlFloat parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlFloat) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlFloat} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlFloat parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlFloat) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlFloat) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlFloat} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 913fdd6..3b58642 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGDay.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGDay.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.util.Calendar;
 
 
@@ -27,158 +24,215 @@
  * A gDay specifies only a day-of-month.
  * <p>
  * Convertible to {@link Calendar}, {@link GDate}, or an int.
- * 
+ *
  * @see XmlCalendar
  * @see GDate
- */ 
-public interface XmlGDay extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gDay");
-    
-    /** Returns this value as a {@link Calendar} */
+ */
+public interface XmlGDay extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gDay");
+
+    /**
+     * Returns this value as a {@link Calendar}
+     */
     Calendar getCalendarValue();
-    /** Sets this value as a {@link Calendar} */
+
+    /**
+     * Sets this value as a {@link Calendar}
+     */
     void setCalendarValue(Calendar c);
-    /** Returns this value as a {@link GDate} */
+
+    /**
+     * Returns this value as a {@link GDate}
+     */
     GDate getGDateValue();
-    /** Sets this value as a {@link GDateSpecification} */
+
+    /**
+     * Sets this value as a {@link GDateSpecification}
+     */
     void setGDateValue(GDate gd);
-    /** Returns this value as an int from 1-31 */
+
+    /**
+     * Returns this value as an int from 1-31
+     */
     int getIntValue();
-    /** Sets this value as an int from 1-31 */
+
+    /**
+     * Sets this value as an int from 1-31
+     */
     void setIntValue(int v);
 
     /**
      * Returns this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #getCalendarValue}
      **/
     Calendar calendarValue();
+
     /**
      * Sets this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #setCalendarValue}
      **/
     void set(Calendar c);
+
     /**
      * Returns this value as a {@link GDate}
+     *
      * @deprecated replaced with {@link #getGDateValue}
      **/
     GDate gDateValue();
+
     /**
      * Sets this value as a {@link GDateSpecification}
+     *
      * @deprecated replaced with {@link #setGDateValue}
      **/
     void set(GDateSpecification gd);
+
     /**
      * Returns this value as an int from 1-31
+     *
      * @deprecated replaced with {@link #getIntValue}
      **/
     int intValue();
+
     /**
      * Sets this value as an int from 1-31
+     *
      * @deprecated replaced with {@link #setIntValue}
      **/
     void set(int v);
-    
+
     /**
      * A class with methods for creating instances
      * of {@link XmlGDay}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlGDay} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlGDay} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlGDay} fragment from an XMLStreamReader.
          */
-        public static XmlGDay parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGDay) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlGDay} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlGDay parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGDay) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGDay) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlGDay} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 f9a310e..eaff7dc 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGMonth.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGMonth.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.util.Calendar;
 
 
@@ -27,55 +24,84 @@
  * A gMonth specifies only a month-of-year.
  * <p>
  * Convertible to {@link Calendar}, {@link GDate}, or an int.
- * 
+ *
  * @see XmlCalendar
  * @see GDate
- */ 
-public interface XmlGMonth extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gMonth");
-    
-    /** Returns this value as a {@link Calendar} */
+ */
+public interface XmlGMonth extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gMonth");
+
+    /**
+     * Returns this value as a {@link Calendar}
+     */
     Calendar getCalendarValue();
-    /** Sets this value as a {@link Calendar} */
+
+    /**
+     * Sets this value as a {@link Calendar}
+     */
     void setCalendarValue(Calendar c);
-    /** Returns this value as a {@link GDate} */
+
+    /**
+     * Returns this value as a {@link GDate}
+     */
     GDate getGDateValue();
-    /** Sets this value as a {@link GDateSpecification} */
+
+    /**
+     * Sets this value as a {@link GDateSpecification}
+     */
     void setGDateValue(GDate gd);
-    /** Returns this value as an int from 1-12 */
+
+    /**
+     * Returns this value as an int from 1-12
+     */
     int getIntValue();
-    /** Sets this value as an int from 1-12 */
+
+    /**
+     * Sets this value as an int from 1-12
+     */
     void setIntValue(int v);
 
     /**
      * Returns this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #getCalendarValue}
      **/
     Calendar calendarValue();
+
     /**
      * Sets this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #setCalendarValue}
      **/
     void set(Calendar c);
+
     /**
      * Returns this value as a {@link GDate}
+     *
      * @deprecated replaced with {@link #getGDateValue}
      **/
     GDate gDateValue();
+
     /**
      * Sets this value as a {@link GDateSpecification}
+     *
      * @deprecated replaced with {@link #setGDateValue}
      **/
     void set(GDateSpecification gd);
+
     /**
      * Returns this value as an int from 1-12
+     *
      * @deprecated replaced with {@link #getIntValue}
      **/
     int intValue();
+
     /**
      * Sets this value as an int from 1-12
+     *
      * @deprecated replaced with {@link #setIntValue}
      **/
     void set(int v);
@@ -84,101 +110,129 @@
      * A class with methods for creating instances
      * of {@link XmlGMonth}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlGMonth} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlGMonth} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlGMonth} fragment from an XMLStreamReader.
          */
-        public static XmlGMonth parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGMonth) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlGMonth} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlGMonth parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGMonth) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGMonth) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlGMonth} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 20c7c73..b25e4f8 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGMonthDay.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGMonthDay.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.util.Calendar;
 
 
@@ -27,41 +24,60 @@
  * A gMonthDay specifies a day of a specific month without specifying the year.
  * <p>
  * Convertible to {@link Calendar} or {@link GDate}.
- * 
+ *
  * @see XmlCalendar
  * @see GDate
- */ 
-public interface XmlGMonthDay extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gMonthDay");
-    
-    /** Returns this value as a {@link Calendar} */
+ */
+public interface XmlGMonthDay extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gMonthDay");
+
+    /**
+     * Returns this value as a {@link Calendar}
+     */
     Calendar getCalendarValue();
-    /** Sets this value as a {@link Calendar} */
+
+    /**
+     * Sets this value as a {@link Calendar}
+     */
     void setCalendarValue(Calendar c);
-    /** Returns this value as a {@link GDate} */
+
+    /**
+     * Returns this value as a {@link GDate}
+     */
     GDate getGDateValue();
-    /** Sets this value as a {@link GDateSpecification} */
+
+    /**
+     * Sets this value as a {@link GDateSpecification}
+     */
     void setGDateValue(GDate gd);
 
     /**
      * Returns this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #getCalendarValue}
      **/
     Calendar calendarValue();
+
     /**
      * Sets this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #setCalendarValue}
      **/
     void set(Calendar c);
+
     /**
      * Returns this value as a {@link GDate}
+     *
      * @deprecated replaced with {@link #getGDateValue}
      **/
     GDate gDateValue();
+
     /**
      * Sets this value as a {@link GDateSpecification}
+     *
      * @deprecated replaced with {@link #setGDateValue}
      **/
     void set(GDateSpecification gd);
@@ -70,101 +86,129 @@
      * A class with methods for creating instances
      * of {@link XmlGMonthDay}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlGMonthDay} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlGMonthDay} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlGMonthDay} fragment from an XMLStreamReader.
          */
-        public static XmlGMonthDay parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlGMonthDay} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlGMonthDay parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGMonthDay) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlGMonthDay} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 52ebb43..8f73c82 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGYear.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGYear.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.util.Calendar;
 
 
@@ -27,55 +24,84 @@
  * A gYear specifies a Gregorian year (AD).
  * <p>
  * Convertible to {@link Calendar}, {@link GDate}, or an int.
- * 
+ *
  * @see XmlCalendar
  * @see GDate
- */ 
-public interface XmlGYear extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gYear");
-    
-    /** Returns this value as a {@link Calendar} */
+ */
+public interface XmlGYear extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gYear");
+
+    /**
+     * Returns this value as a {@link Calendar}
+     */
     Calendar getCalendarValue();
-    /** Sets this value as a {@link Calendar} */
+
+    /**
+     * Sets this value as a {@link Calendar}
+     */
     void setCalendarValue(Calendar c);
-    /** Returns this value as a {@link GDate} */
+
+    /**
+     * Returns this value as a {@link GDate}
+     */
     GDate getGDateValue();
-    /** Sets this value as a {@link GDateSpecification} */
+
+    /**
+     * Sets this value as a {@link GDateSpecification}
+     */
     void setGDateValue(GDate gd);
-    /** Returns this value as an int from 1-31 */
+
+    /**
+     * Returns this value as an int from 1-31
+     */
     int getIntValue();
-    /** Sets this value as an int from 1-31 */
+
+    /**
+     * Sets this value as an int from 1-31
+     */
     void setIntValue(int v);
 
     /**
      * Returns this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #getCalendarValue}
      **/
     Calendar calendarValue();
+
     /**
      * Sets this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #setCalendarValue}
      **/
     void set(Calendar c);
+
     /**
      * Returns this value as a {@link GDate}
+     *
      * @deprecated replaced with {@link #getGDateValue}
      **/
     GDate gDateValue();
+
     /**
      * Sets this value as a {@link GDateSpecification}
+     *
      * @deprecated replaced with {@link #setGDateValue}
      **/
     void set(GDateSpecification gd);
+
     /**
      * Returns this value as an int from 1-31
+     *
      * @deprecated replaced with {@link #getIntValue}
      **/
     int intValue();
+
     /**
      * Sets this value as an int from 1-31
+     *
      * @deprecated replaced with {@link #setIntValue}
      **/
     void set(int v);
@@ -84,101 +110,129 @@
      * A class with methods for creating instances
      * of {@link XmlGYear}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlGYear} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlGYear} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlGYear} fragment from an XMLStreamReader.
          */
-        public static XmlGYear parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGYear) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlGYear} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlGYear parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGYear) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGYear) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlGYear} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 cb2f55c..b5dd8e2 100644
--- a/src/main/java/org/apache/xmlbeans/XmlGYearMonth.java
+++ b/src/main/java/org/apache/xmlbeans/XmlGYearMonth.java
@@ -15,10 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
-import java.util.Date;
 import java.util.Calendar;
 
 
@@ -28,41 +24,60 @@
  * A gYearMonth specifies a month in a specific year.
  * <p>
  * Convertible to {@link Calendar}, {@link GDate}.
- * 
+ *
  * @see XmlCalendar
  * @see GDate
- */ 
-public interface XmlGYearMonth extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gYearMonth");
-    
-    /** Returns this value as a {@link Calendar} */
+ */
+public interface XmlGYearMonth extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_gYearMonth");
+
+    /**
+     * Returns this value as a {@link Calendar}
+     */
     Calendar getCalendarValue();
-    /** Sets this value as a {@link Calendar} */
+
+    /**
+     * Sets this value as a {@link Calendar}
+     */
     void setCalendarValue(Calendar c);
-    /** Returns this value as a {@link GDate} */
+
+    /**
+     * Returns this value as a {@link GDate}
+     */
     GDate getGDateValue();
-    /** Sets this value as a {@link GDateSpecification} */
+
+    /**
+     * Sets this value as a {@link GDateSpecification}
+     */
     void setGDateValue(GDate gd);
 
     /**
      * Returns this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #getCalendarValue}
      **/
     Calendar calendarValue();
+
     /**
      * Sets this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #setCalendarValue}
      **/
     void set(Calendar c);
+
     /**
      * Returns this value as a {@link GDate}
+     *
      * @deprecated replaced with {@link #getGDateValue}
      **/
     GDate gDateValue();
+
     /**
      * Sets this value as a {@link GDateSpecification}
+     *
      * @deprecated replaced with {@link #setGDateValue}
      **/
     void set(GDateSpecification gd);
@@ -71,101 +86,129 @@
      * A class with methods for creating instances
      * of {@link XmlGYearMonth}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlGYearMonth} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlGYearMonth} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlGYearMonth} fragment from an XMLStreamReader.
          */
-        public static XmlGYearMonth parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlGYearMonth} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlGYearMonth parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlGYearMonth) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlGYearMonth} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 54fd14c..416a420 100644
--- a/src/main/java/org/apache/xmlbeans/XmlHexBinary.java
+++ b/src/main/java/org/apache/xmlbeans/XmlHexBinary.java
@@ -15,138 +15,170 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#hexBinary">xs:hexBinary</a> type.
  * <p>
- * Convertible to a byte array. 
- */ 
-public interface XmlHexBinary extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_hexBinary");
-    
+ * Convertible to a byte array.
+ */
+public interface XmlHexBinary extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_hexBinary");
+
     /**
      * Returns this value as a byte array.
+     *
      * @deprecated replaced by {@link #getByteArrayValue}
      **/
     byte[] byteArrayValue();
 
     /**
      * Sets this value as a byte array.
+     *
      * @deprecated replaced by {@link #setByteArrayValue}
      **/
     void set(byte[] ba);
 
-    /** Returns this value as a byte array. **/
+    /**
+     * Returns this value as a byte array.
+     **/
     byte[] getByteArrayValue();
-    /** Sets this value as a byte array. */
-    void setByteArrayValue(byte[] ba);
 
+    /**
+     * Sets this value as a byte array.
+     */
+    void setByteArrayValue(byte[] ba);
 
 
     /**
      * A class with methods for creating instances
      * of {@link XmlHexBinary}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlHexBinary} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlHexBinary} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlHexBinary} fragment from an XMLStreamReader.
          */
-        public static XmlHexBinary parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlHexBinary} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlHexBinary parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlHexBinary) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlHexBinary} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 4493f7d..ef56e1c 100644
--- a/src/main/java/org/apache/xmlbeans/XmlID.java
+++ b/src/main/java/org/apache/xmlbeans/XmlID.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#ID">xs:ID</a> type.
@@ -25,112 +22,141 @@
  * When validated, IDs must be unique within a document.  An element
  * may not have more than one attribute whose type is ID.
  * <p>
- * Convertible to a {@link String}. 
- */ 
-public interface XmlID extends XmlNCName
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_ID");
-    
+ * Convertible to a {@link String}.
+ */
+public interface XmlID extends XmlNCName {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlID) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlID} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlID) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlID} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlID) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlID} fragment from an XMLStreamReader.
          */
-        public static XmlID parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlID) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlID} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlID parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlID) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlID) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlID} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlIDREF.java b/src/main/java/org/apache/xmlbeans/XmlIDREF.java
index 6f6e7ef..5d5f99f 100644
--- a/src/main/java/org/apache/xmlbeans/XmlIDREF.java
+++ b/src/main/java/org/apache/xmlbeans/XmlIDREF.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#IDREF">xs:IDREF</a> type.
@@ -26,112 +23,141 @@
  * the document. This rule is only verified when a whole document is validated
  * at once.
  * <p>
- * Convertible to a {@link String}. 
- */ 
-public interface XmlIDREF extends XmlNCName
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_IDREF");
-    
+ * Convertible to a {@link String}.
+ */
+public interface XmlIDREF extends XmlNCName {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlIDREF} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlIDREF} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlIDREF} fragment from an XMLStreamReader.
          */
-        public static XmlIDREF parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlIDREF) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlIDREF} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlIDREF parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlIDREF) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlIDREF) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlIDREF} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlIDREFS.java b/src/main/java/org/apache/xmlbeans/XmlIDREFS.java
index 8674772..f5b1797 100644
--- a/src/main/java/org/apache/xmlbeans/XmlIDREFS.java
+++ b/src/main/java/org/apache/xmlbeans/XmlIDREFS.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.util.List;
 
 
@@ -30,32 +27,46 @@
  * the document. This rule is only verified when a whole document is validated
  * at once.
  * <p>
- * Convertible to a {@link List}. 
- */ 
-public interface XmlIDREFS extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_IDREFS");
-    
-    /** Returns the value as a {@link List} of {@link String} values */
+ * Convertible to a {@link List}.
+ */
+public interface XmlIDREFS extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_IDREFS");
+
+    /**
+     * Returns the value as a {@link List} of {@link String} values
+     */
     List getListValue();
-    /** Returns the value as a {@link List} of {@link XmlIDREF} values */
+
+    /**
+     * Returns the value as a {@link List} of {@link XmlIDREF} values
+     */
     List xgetListValue();
-    /** Sets the value as a {@link List} */
+
+    /**
+     * Sets the value as a {@link List}
+     */
     void setListValue(List l);
 
     /**
      * Returns the value as a {@link List} of {@link String} values
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     List listValue();
+
     /**
      * Returns the value as a {@link List} of {@link XmlIDREF} values
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     List xlistValue();
+
     /**
      * Sets the value as a {@link List}
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     void set(List l);
@@ -64,101 +75,129 @@
      * A class with methods for creating instances
      * of {@link XmlIDREFS}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlIDREFS} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlIDREFS} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlIDREFS} fragment from an XMLStreamReader.
          */
-        public static XmlIDREFS parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlIDREFS} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlIDREFS parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlIDREFS) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlIDREFS} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 a2b3df4..3a0bd55 100644
--- a/src/main/java/org/apache/xmlbeans/XmlInt.java
+++ b/src/main/java/org/apache/xmlbeans/XmlInt.java
@@ -15,33 +15,39 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#int">xs:int</a> type.
  * One of the derived types based on <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#decimal">xs:decimal</a>.
  * <p>
  * Naturally, convertible to a Java int.
- */ 
-public interface XmlInt extends XmlLong
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_int");
-    
-    /** Returns this value as an int */
+ */
+public interface XmlInt extends XmlLong {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_int");
+
+    /**
+     * Returns this value as an int
+     */
     int getIntValue();
-    /** Sets this value as an int */
+
+    /**
+     * Sets this value as an int
+     */
     void setIntValue(int v);
 
     /**
      * Returns this value as an int
+     *
      * @deprecated replaced with {@link #getIntValue}
      **/
     int intValue();
+
     /**
      * Sets this value as an int
+     *
      * @deprecated replaced with {@link #setIntValue}
      **/
     void set(int v);
@@ -50,101 +56,129 @@
      * A class with methods for creating instances
      * of {@link XmlInt}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlInt) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlInt} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlInt) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlInt} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlInt) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlInt} fragment from an XMLStreamReader.
          */
-        public static XmlInt parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlInt) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlInt} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlInt parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlInt) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlInt) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlInt} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 dbb013e..f3f84de 100644
--- a/src/main/java/org/apache/xmlbeans/XmlInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlInteger.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.math.BigInteger;
 
 /**
@@ -30,24 +27,33 @@
  * any number of digits, while a Java int or an xs:int is a 32-bit finite-precision integer.
  * <p>
  * Convertible to a Java {@link BigInteger}.
- */ 
-public interface XmlInteger extends XmlDecimal
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_integer");
-    
-    /** Returns this value as a {@link BigInteger} */
+ */
+public interface XmlInteger extends XmlDecimal {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_integer");
+
+    /**
+     * Returns this value as a {@link BigInteger}
+     */
     BigInteger getBigIntegerValue();
-    /** Sets this value as a {@link BigInteger} */
+
+    /**
+     * Sets this value as a {@link BigInteger}
+     */
     void setBigIntegerValue(BigInteger bi);
 
     /**
      * Returns this value as a {@link BigInteger}
+     *
      * @deprecated replaced with {@link #getBigIntegerValue}
      **/
     BigInteger bigIntegerValue();
+
     /**
      * Sets this value as a {@link BigInteger}
+     *
      * @deprecated replaced with {@link #setBigIntegerValue}
      **/
     void set(BigInteger bi);
@@ -56,101 +62,129 @@
      * A class with methods for creating instances
      * of {@link XmlInteger}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlInteger} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlInteger} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlInteger} fragment from an XMLStreamReader.
          */
-        public static XmlInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlInteger) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlInteger} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlInteger) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlInteger} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 59ccc60..b936311 100644
--- a/src/main/java/org/apache/xmlbeans/XmlLanguage.java
+++ b/src/main/java/org/apache/xmlbeans/XmlLanguage.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#language">xs:language</a> type.
@@ -25,111 +22,140 @@
  * This type is intended to represent an standard ISO language code string.
  * <p>
  * Convertible to a Java {@link String}.
- */ 
-public interface XmlLanguage extends XmlToken
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_language");
-    
+ */
+public interface XmlLanguage extends XmlToken {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlLanguage} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlLanguage} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlLanguage} fragment from an XMLStreamReader.
          */
-        public static XmlLanguage parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlLanguage) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlLanguage} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlLanguage parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlLanguage) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlLanguage) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlLanguage} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlLong.java b/src/main/java/org/apache/xmlbeans/XmlLong.java
index e1f296b..4170f6c 100644
--- a/src/main/java/org/apache/xmlbeans/XmlLong.java
+++ b/src/main/java/org/apache/xmlbeans/XmlLong.java
@@ -15,33 +15,39 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#long">xs:long</a> type.
  * One of the derived types based on <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#decimal">xs:decimal</a>.
  * <p>
  * Naturally, convertible to a Java long.
- */ 
-public interface XmlLong extends XmlInteger
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_long");
-    
-    /** Returns this value as a long */
+ */
+public interface XmlLong extends XmlInteger {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_long");
+
+    /**
+     * Returns this value as a long
+     */
     long getLongValue();
-    /** Sets this value as a long */
+
+    /**
+     * Sets this value as a long
+     */
     void setLongValue(long v);
 
     /**
      * Returns this value as a long
+     *
      * @deprecated replaced with {@link #getLongValue}
      **/
     long longValue();
+
     /**
      * Sets this value as a long
+     *
      * @deprecated replaced with {@link #setLongValue}
      **/
     void set(long v);
@@ -50,101 +56,129 @@
      * A class with methods for creating instances
      * of {@link XmlLong}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlLong) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlLong} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlLong) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlLong} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlLong) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlLong} fragment from an XMLStreamReader.
          */
-        public static XmlLong parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlLong) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlLong} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlLong parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlLong) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlLong) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlLong} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 de819dd..4f52fca 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNCName.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNCName.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#Name">xs:Name</a> type.
@@ -29,111 +26,140 @@
  * which is a logical combination of localname and namespace URI.
  * <p>
  * Convertible to {@link String}.
- */ 
-public interface XmlNCName extends XmlName
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NCName");
-    
+ */
+public interface XmlNCName extends XmlName {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlNCName} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlNCName} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlNCName} fragment from an XMLStreamReader.
          */
-        public static XmlNCName parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNCName) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlNCName} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlNCName parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNCName) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNCName) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlNCName} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNMTOKEN.java b/src/main/java/org/apache/xmlbeans/XmlNMTOKEN.java
index 591cc43..dfccff4 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNMTOKEN.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNMTOKEN.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#NMTOKEN">xs:NMTOKEN</a> type.
@@ -28,111 +25,140 @@
  * commonly used to describe a single token or enumerated string value.
  * <p>
  * Convertible to {@link String}.
- */ 
-public interface XmlNMTOKEN extends XmlToken
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NMTOKEN");
-    
+ */
+public interface XmlNMTOKEN extends XmlToken {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlNMTOKEN} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlNMTOKEN} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlNMTOKEN} fragment from an XMLStreamReader.
          */
-        public static XmlNMTOKEN parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlNMTOKEN} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlNMTOKEN parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNMTOKEN) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlNMTOKEN} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNMTOKENS.java b/src/main/java/org/apache/xmlbeans/XmlNMTOKENS.java
index 53fe278..03864ab 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNMTOKENS.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNMTOKENS.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.util.List;
 
 
@@ -27,31 +24,45 @@
  * a list type.
  * <p>
  * Convertible to {@link List}.
- */ 
-public interface XmlNMTOKENS extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NMTOKENS");
-    
-    /** Returns the value as a {@link List} of {@link String} values */
+ */
+public interface XmlNMTOKENS extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NMTOKENS");
+
+    /**
+     * Returns the value as a {@link List} of {@link String} values
+     */
     List getListValue();
-    /** Returns the value as a {@link List} of {@link XmlNMTOKEN} values */
+
+    /**
+     * Returns the value as a {@link List} of {@link XmlNMTOKEN} values
+     */
     List xgetListValue();
-    /** Sets the value as a {@link List} */
+
+    /**
+     * Sets the value as a {@link List}
+     */
     void setListValue(List l);
 
     /**
      * Returns the value as a {@link List} of {@link String} values
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     List listValue();
+
     /**
      * Returns the value as a {@link List} of {@link XmlNMTOKEN} values
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     List xlistValue();
+
     /**
      * Sets the value as a {@link List}
+     *
      * @deprecated replaced by {@link #getListValue}
      **/
     void set(List l);
@@ -61,101 +72,129 @@
      * A class with methods for creating instances
      * of {@link XmlNMTOKENS}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlNMTOKENS} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlNMTOKENS} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlNMTOKENS} fragment from an XMLStreamReader.
          */
-        public static XmlNMTOKENS parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlNMTOKENS} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlNMTOKENS parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNMTOKENS) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlNMTOKENS} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 8729559..6b56eaa 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNOTATION.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNOTATION.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#NOTATION">xs:NOTATION</a> type.
@@ -27,111 +24,140 @@
  * users should almost never have any reason to use this data type.
  * <p>
  * Convertible to {@link String}.
- */ 
-public interface XmlNOTATION extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_NOTATION");
-    
+ */
+public interface XmlNOTATION extends XmlAnySimpleType {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlNOTATION} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlNOTATION} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlNOTATION} fragment from an XMLStreamReader.
          */
-        public static XmlNOTATION parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlNOTATION} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlNOTATION parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNOTATION) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlNOTATION} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlName.java b/src/main/java/org/apache/xmlbeans/XmlName.java
index b6b51c4..1bd945d 100644
--- a/src/main/java/org/apache/xmlbeans/XmlName.java
+++ b/src/main/java/org/apache/xmlbeans/XmlName.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#Name">xs:Name</a> type.
@@ -29,111 +26,140 @@
  * which is a logical combination of localname and namespace URI.
  * <p>
  * Convertible to {@link String}.
- */ 
-public interface XmlName extends XmlToken
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_Name");
-    
+ */
+public interface XmlName extends XmlToken {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlName) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlName} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlName) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlName} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlName) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlName} fragment from an XMLStreamReader.
          */
-        public static XmlName parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlName) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlName} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlName parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlName) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlName) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlName} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNegativeInteger.java b/src/main/java/org/apache/xmlbeans/XmlNegativeInteger.java
index d6ef98d..ee7aa7c 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNegativeInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNegativeInteger.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#negativeInteger">xs:negativeInteger</a> type.
@@ -26,111 +23,140 @@
  * Verified to be negative when validating.
  * <p>
  * Convertible to {@link java.math.BigInteger}.
- */ 
-public interface XmlNegativeInteger extends XmlNonPositiveInteger
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_negativeInteger");
-    
+ */
+public interface XmlNegativeInteger extends XmlNonPositiveInteger {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlNegativeInteger} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlNegativeInteger} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlNegativeInteger} fragment from an XMLStreamReader.
          */
-        public static XmlNegativeInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlNegativeInteger} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlNegativeInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNegativeInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlNegativeInteger} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNonNegativeInteger.java b/src/main/java/org/apache/xmlbeans/XmlNonNegativeInteger.java
index 5b47c07..0179f4e 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNonNegativeInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNonNegativeInteger.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#nonNegativeInteger">xs:nonNegativeInteger</a> type.
@@ -26,111 +23,140 @@
  * Verified to be zero or positive when validating.
  * <p>
  * Convertible to {@link java.math.BigInteger}.
- */ 
-public interface XmlNonNegativeInteger extends XmlInteger
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_nonNegativeInteger");
-    
+ */
+public interface XmlNonNegativeInteger extends XmlInteger {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlNonNegativeInteger} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlNonNegativeInteger} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlNonNegativeInteger} fragment from an XMLStreamReader.
          */
-        public static XmlNonNegativeInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlNonNegativeInteger} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlNonNegativeInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse( xis, 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. */
+            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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+            return (XmlNonNegativeInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
+        }
+
+        private Factory() {
+            // No instance of this class allowed
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNonPositiveInteger.java b/src/main/java/org/apache/xmlbeans/XmlNonPositiveInteger.java
index 3f22e4a..6333e88 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNonPositiveInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNonPositiveInteger.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#nonPositiveInteger">xs:nonPositiveInteger</a> type.
@@ -26,111 +23,140 @@
  * Verified to be zero or negative when validating.
  * <p>
  * Convertible to {@link java.math.BigInteger}.
- */ 
-public interface XmlNonPositiveInteger extends XmlInteger
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_nonPositiveInteger");
-    
+ */
+public interface XmlNonPositiveInteger extends XmlInteger {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlNonPositiveInteger} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlNonPositiveInteger} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlNonPositiveInteger} fragment from an XMLStreamReader.
          */
-        public static XmlNonPositiveInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlNonPositiveInteger} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlNonPositiveInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse( xis, 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. */
+            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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+            return (XmlNonPositiveInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
+        }
+
+        private Factory() {
+            // No instance of this class allowed
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlNormalizedString.java b/src/main/java/org/apache/xmlbeans/XmlNormalizedString.java
index a0cf2d6..98fe1c5 100644
--- a/src/main/java/org/apache/xmlbeans/XmlNormalizedString.java
+++ b/src/main/java/org/apache/xmlbeans/XmlNormalizedString.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#normalizedString">xs:normalizedString</a> type.
@@ -33,111 +30,140 @@
  * <p>
  * Convertible to {@link String}.  When obtaining the stringValue, the
  * whitespace-normalized value is returned.
- */ 
-public interface XmlNormalizedString extends XmlString
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_normalizedString");
-    
+ */
+public interface XmlNormalizedString extends XmlString {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlNormalizedString} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlNormalizedString} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlNormalizedString} fragment from an XMLStreamReader.
          */
-        public static XmlNormalizedString parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlNormalizedString} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlNormalizedString parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse( xis, 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. */
+            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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+            return (XmlNormalizedString) XmlBeans.getContextTypeLoader().parse(xsr, type, options);
+        }
+
+        private Factory() {
+            // No instance of this class allowed
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlObject.java b/src/main/java/org/apache/xmlbeans/XmlObject.java
index 3a29b59..d99f151 100644
--- a/src/main/java/org/apache/xmlbeans/XmlObject.java
+++ b/src/main/java/org/apache/xmlbeans/XmlObject.java
@@ -15,19 +15,15 @@
 
 package org.apache.xmlbeans;
 
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-import org.apache.xmlbeans.xml.stream.XMLStreamException;
-
-import javax.xml.stream.XMLStreamReader;
-import javax.xml.namespace.QName;
-
-import org.w3c.dom.Node;
 import org.w3c.dom.DOMImplementation;
+import org.w3c.dom.Node;
 
-import java.io.InputStream;
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
 import java.io.File;
-import java.io.Reader;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
 
 /**
  * Corresponds to the XML Schema
@@ -59,7 +55,7 @@
  * <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}
- *     to load from SAX; use {@link #newDomNode()} to save to DOM; and use 
+ *     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.
  * <li>Use {@link #validate} to validate the subtree of XML under this
@@ -69,7 +65,7 @@
  * <li>Use {@link #newCursor} to access the full XML infoset, for example,
  *     if you need to determine interleaved element order or manipulate
  *     annotations, comments, or mixed content.  You can get an element name with
- *     a cursor by calling {@link XmlCursor#getName() cursor.getName()} when the 
+ *     a cursor by calling {@link XmlCursor#getName() cursor.getName()} when the
  *     cursor is positioned at an element's START token. See {@link XmlCursor}.
  * <li>Use {@link #selectPath} to find other XmlObjects in the subtree underneath
  *     this XmlObject using relative XPaths.  (In selectPath, "." indicates
@@ -131,12 +127,13 @@
  * If you need to implement XmlObject yourself, you should subclass
  * FilterXmlObject in order to delegate to another underlying XmlObject
  * implementation. This technique will allow you to use your code unchanged
- * with future versions of XMLBeans that add additional methods on XmlObject. 
- */ 
-public interface XmlObject extends XmlTokenSource
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_anyType");
+ * with future versions of XMLBeans that add additional methods on XmlObject.
+ */
+public interface XmlObject extends XmlTokenSource {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_anyType");
 
     /**
      * @return The schema type for this instance. This is a permanent,
@@ -161,16 +158,16 @@
      * use the {@link XmlOptions#setErrorListener} method. With that method,
      * you can specify an object in which to store messages related to validation.
      * The following is a simple example.</p>
-     * 
+     *
      * <pre>
      * // Create an XmlOptions instance and set the error listener.
      * XmlOptions validateOptions = new XmlOptions();
      * ArrayList errorList = new ArrayList();
      * validateOptions.setErrorListener(errorList);
-     * 
+     *
      * // Validate the XML.
      * boolean isValid = newEmp.validate(validateOptions);
-     * 
+     *
      * // If the XML isn't valid, loop through the listener's contents,
      * // printing contained messages.
      * if (!isValid)
@@ -178,18 +175,17 @@
      *      for (int i = 0; i &lt; errorList.size(); i++)
      *      {
      *          XmlError error = (XmlError)errorList.get(i);
-     *          
+     *
      *          System.out.println("\n");
      *          System.out.println("Message: " + error.getMessage() + "\n");
-     *          System.out.println("Location of invalid XML: " + 
+     *          System.out.println("Location of invalid XML: " +
      *              error.getCursorLocation().xmlText() + "\n");
      *      }
      * }
      * </pre>
      *
      * @param options An object that implements the {@link java.util.Collection
-     * Collection} interface.
-     *
+     *                Collection} interface.
      * @return true if the contents of this object are valid
      * accoring to schemaType().
      */
@@ -198,19 +194,19 @@
     /**
      * Selects a path.  Path can be a string or precompiled path String.
      * <p>
-     *
+     * <p>
      * The path must be a relative path, where "." represents the
      * element or attribute containg 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>
-     *
+     * <p>
      * The array that is returned contains all the selected
      * XmlObjects, within the same document, listed in document
      * order.  The actual array type of the result is inferred
      * from the closest common base type of selected results.
      * <p>
-     *
+     * <p>
      * Here is an example of usage.  Suppose we have a global
      * element definition for "owner" whose type is "person":
      *
@@ -222,7 +218,7 @@
      *      &lt;/complexType&gt;
      *   &lt;/schema&gt;
      * </pre>
-     *
+     * <p>
      * and suppose "owner" tags can be scattered throughout the
      * document.  Then we can write the following code to find
      * them all:
@@ -237,7 +233,7 @@
      *      "declare namespace s='http://www.openuri.org/sample' " +
      *      ".//s:owner");
      * </pre>
-     *
+     * <p>
      * Notice the way in which namespace declarations are done in XPath 2.0.
      * Since XPath can only navigate within an XML document - it cannot
      * construct new XML - the resulting XmlObjects all reside in
@@ -246,19 +242,18 @@
      * @param path the xpath
      * @return an array of all selected XmlObjects
      */
-    XmlObject[] selectPath ( String path );
+    XmlObject[] selectPath(String path);
 
     /**
      * Selects a path, applying options.
      *
-     * @param path the xpath
+     * @param path    the xpath
      * @param options the options used to execute the xpath
      * @return an array of all selected XmlObjects
-     *
      * @see #selectPath(String)
      */
-    XmlObject[] selectPath ( String path, XmlOptions options );
-    
+    XmlObject[] selectPath(String path, XmlOptions options);
+
 
     /**
      * Executes a query.  Query can be a string or precompiled query String.
@@ -273,16 +268,15 @@
      *
      * @param query The XQuery expression
      * @return an array of all selected XmlObjects
-     *
      * @see #selectPath(String)
      */
-    XmlObject[] execQuery ( String query );
+    XmlObject[] execQuery(String query);
 
     /**
      * Executes a query with options.
-     * 
+     * <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>
@@ -315,7 +309,7 @@
      *  <td>{@link XmlOptions#setLoadAdditionalNamespaces}</td>
      * </tr>
      * <tr>
-     *  <td>To trim the underlying XML text buffer immediately after constructing 
+     *  <td>To trim the underlying XML text buffer immediately after constructing
      *  a document, resulting in a smaller memory footprint.</td>
      *  <td>{@link XmlOptions#setLoadTrimTextBuffer}</td>
      * </tr>
@@ -323,17 +317,15 @@
      *  <td>Whether value facets should be checked as they are set.</td>
      *  <td>{@link XmlOptions#setValidateOnSet}</td>
      * </tr>
-     * </table> 
-     * 
-     * @param query The XQuery expression.
+     * </table>
+     *
+     * @param query   The XQuery expression.
      * @param options Options as described.
-     *
      * @return an array of all selected XmlObjects
-     *
      * @see #execQuery(String)
      */
-    XmlObject[] execQuery ( String query, XmlOptions options );
-    
+    XmlObject[] execQuery(String query, XmlOptions options);
+
 
     /**
      * Changes the schema type associated with this data and
@@ -354,7 +346,7 @@
      * any other XmlObject instances in the subtree are permanently
      * invalidated and should not be used. (They will return
      * XmlValueDisconnectedException if you try to use them.)
-     *
+     * <p>
      * If a type change is done on the interior of an Xml
      * tree, then xsi:type attributes are updated as needed.
      *
@@ -385,9 +377,8 @@
      *
      * @param newName the new name
      * @param newType the new type
-     *
      * @return an XmlObject instance whose schemaType is the
-     *      new type and container name is the new name
+     * new type and container name is the new name
      */
     XmlObject substitute(QName newName, SchemaType newType);
 
@@ -447,11 +438,12 @@
      * the XML document underneath the current object.  Note that
      * any parts of the XML document above or outside this XmlObject are
      * 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.
      * To use a different synchronization domain use setCopyUseNewSynchronizationDomain
      * option with copy(XmlOptions) method.
+     *
      * @see #copy(XmlOptions)
      * @see org.apache.xmlbeans.XmlOptions#setCopyUseNewSynchronizationDomain(boolean)
      */
@@ -463,11 +455,12 @@
      * the XML document underneath the current object.  Note that
      * any parts of the XML document above or outside this XmlObject are
      * 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.
      * To use a different synchronization domain use setCopyUseNewSynchronizationDomain
      * option when creating the original XmlObject.
+     *
      * @see org.apache.xmlbeans.XmlOptions#setCopyUseNewSynchronizationDomain(boolean)
      */
     XmlObject copy(XmlOptions options);
@@ -524,20 +517,29 @@
      */
     int compareValue(XmlObject obj);
 
-    /** LESS_THAN is -1. See {@link #compareValue}. */
+    /**
+     * LESS_THAN is -1. See {@link #compareValue}.
+     */
     static final int LESS_THAN = -1;
 
-    /** EQUAL is 0. See {@link #compareValue}. */
+    /**
+     * EQUAL is 0. See {@link #compareValue}.
+     */
     static final int EQUAL = 0;
 
-    /** GREATER_THAN is 1. See {@link #compareValue}. */
+    /**
+     * GREATER_THAN is 1. See {@link #compareValue}.
+     */
     static final int GREATER_THAN = 1;
 
-    /** NOT_EQUAL is 2. See {@link #compareValue}. */
+    /**
+     * NOT_EQUAL is 2. See {@link #compareValue}.
+     */
     static final int NOT_EQUAL = 2;
 
     /**
      * Selects the contents of the children elements with the given name.
+     *
      * @param elementName The name of the elements to be selected.
      * @return Returns the contents of the selected elements.
      */
@@ -545,7 +547,8 @@
 
     /**
      * Selects the contents of the children elements with the given name.
-     * @param elementUri The URI of the elements to be selected.
+     *
+     * @param elementUri       The URI of the elements to be selected.
      * @param elementLocalName The local name of the elements to be selected.
      * @return Returns the contents of the selected elements.
      */
@@ -553,6 +556,7 @@
 
     /**
      * Selects the contents of the children elements that are contained in the elementNameSet.
+     *
      * @param elementNameSet Set of element names to be selected.
      * @return Returns the contents of the selected elements.
      * @see SchemaType#qnameSetForWildcardElements()
@@ -562,6 +566,7 @@
 
     /**
      * Selects the content of the attribute with the given name.
+     *
      * @param attributeName The name of the attribute to be selected.
      * @return Returns the contents of the selected attribute.
      */
@@ -569,7 +574,8 @@
 
     /**
      * Selects the content of the attribute with the given name.
-     * @param attributeUri The URI of the attribute to be selected.
+     *
+     * @param attributeUri       The URI of the attribute to be selected.
      * @param attributeLocalName The local name of the attribute to be selected.
      * @return Returns the content of the selected attribute.
      */
@@ -577,6 +583,7 @@
 
     /**
      * Selects the contents of the attributes that are contained in the elementNameSet.
+     *
      * @param attributeNameSet Set of attribute names to be selected.
      * @return Returns the contents of the selected attributes.
      * @see SchemaType#qnameSetForWildcardAttributes()
@@ -591,21 +598,21 @@
      * returned by a factory will have the inferred type.  Otherwise
      * the Factory will returned an untyped document.
      */
-    public static final class Factory
-    {
+    final class Factory {
         /**
          * Creates a new, completely empty instance.
-         */ 
-        public static XmlObject newInstance ( ) {
-          return XmlBeans.getContextTypeLoader().newInstance( null, null ); }
-        
+         */
+        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>
@@ -616,33 +623,38 @@
          *  <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.
+         * </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 ); }
-        
+         */
+        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 ); }
-        
+         */
+        /**
+         * 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 ); }
-        
+         */
+        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>
@@ -678,60 +690,67 @@
          *  <td>{@link XmlOptions#setLoadAdditionalNamespaces}</td>
          * </tr>
          * <tr>
-         *  <td>To trim the underlying XML text buffer immediately after parsing 
+         *  <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> 
-         * 
+         * </table>
+         *
          * @param xmlAsString The string to parse.
-         * @param options Options as specified.
+         * @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 ); }
+         */
+        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, XmlOptions options ) throws XmlException, IOException {
-          return XmlBeans.getContextTypeLoader().parse( file, null, options ); }
-        
+         */
+        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 ); }
+            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 ); }
+            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 ); }
-        
+         */
+        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 ); }
-        
+         */
+        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>
@@ -771,116 +790,83 @@
          *  <td>{@link XmlOptions#setLoadAdditionalNamespaces}</td>
          * </tr>
          * <tr>
-         *  <td>Trim the underlying XML text buffer immediately after parsing 
+         *  <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 ); }
-        
+         * </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 ); }
-        
+         */
+        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 ); }
-        
+         */
+        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 ); }
-        
+         */
+        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 ); }
-        
+         */
+        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 ); }
-        
-        /**
-         * Loads the given {@link XMLInputStream} into an XmlObject.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
          */
-        public static XmlObject parse ( XMLInputStream xis ) throws XmlException, XMLStreamException {
-          return XmlBeans.getContextTypeLoader().parse( xis, null, null ); }
-        
-        /**
-         * Loads the given {@link XMLInputStream} into an XmlObject.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlObject parse ( XMLInputStream xis, XmlOptions options ) throws XmlException, XMLStreamException {
-          return XmlBeans.getContextTypeLoader().parse( xis, null, options ); }
+        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 ); }
-            
+         */
+        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 ); }
-            
+         */
+        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 ); }
-        
+         */
+        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 ); }
-        
-        /**
-         * Returns a new validating {@link XMLInputStream} that throws exceptions when the input is not valid.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
          */
-        public static XMLInputStream newValidatingXMLInputStream ( XMLInputStream xis ) throws XmlException, XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, null, null ); }
-        
-        /**
-         * Returns a new validating {@link XMLInputStream} that throws exceptions 
-         * when the input is not valid, specifying options
-         * for the root element's document type and/or the collection object to use
-         * as an error listener while validating.</p>
-         * 
-         * <p>Use the <em>options</em> parameter to specify the following:</p>
-         * 
-         * <ul>
-         * <li>A collection instance that should be used as an error listener during
-         * compilation, as described in {@link XmlOptions#setErrorListener}.</li>
-         * <li>The document type for the root element, as described in 
-         * {@link XmlOptions#setDocumentType(SchemaType)}.</li>
-         * </ul>
-         * 
-         * @param xis The basis for the new XMLInputStream.
-         * @param options Options specifying root document type and/or an error listener.
-         * @return A new validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XMLInputStream newValidatingXMLInputStream ( XMLInputStream xis, XmlOptions options ) throws XmlException, XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, null, options ); }
-        
+        public static DOMImplementation newDomImplementation(XmlOptions options) {
+            return XmlBeans.getContextTypeLoader().newDomImplementation(options);
+        }
+
         /**
          * Instances cannot be created.
-         */ 
-        private Factory() { }
+         */
+        private Factory() {
+        }
     }
 }
diff --git a/src/main/java/org/apache/xmlbeans/XmlOptions.java b/src/main/java/org/apache/xmlbeans/XmlOptions.java
index 6e3e484..1f67bcf 100644
--- a/src/main/java/org/apache/xmlbeans/XmlOptions.java
+++ b/src/main/java/org/apache/xmlbeans/XmlOptions.java
@@ -157,8 +157,6 @@
 
 
     public static final int DEFAULT_ENTITY_EXPANSION_LIMIT = 2048;
-    public static final String GENERATE_JAVA_14 = "1.4";
-    public static final String GENERATE_JAVA_15 = "1.5";
 
     private static final XmlOptions EMPTY_OPTIONS;
 
@@ -1240,25 +1238,6 @@
     }
 
     /**
-     * If this option is set, then the schema compiler will print java code
-     * that is compatible with the desired Java version.  If not set, the
-     * current Java version is used.  Currently, only "1.4" and "1.5" are
-     * supported.
-     *
-     * @param source A Java version number
-     * @see #GENERATE_JAVA_14
-     * @see #GENERATE_JAVA_15
-     * @see XmlBeans#compileXmlBeans
-     */
-    public XmlOptions setGenerateJavaVersion(String source) {
-        return set(XmlOptionsKeys.GENERATE_JAVA_VERSION, source);
-    }
-
-    public String getGenerateJavaVersion() {
-        return (String) get(XmlOptionsKeys.GENERATE_JAVA_VERSION);
-    }
-
-    /**
      * If this option is set to true, the return of XmlObject.copy() method will
      * return an object in it's own synchronization domain, otherwise both objects
      * will share the same synchronization domain, requiring explicit synchronization
diff --git a/src/main/java/org/apache/xmlbeans/XmlPositiveInteger.java b/src/main/java/org/apache/xmlbeans/XmlPositiveInteger.java
index 69ef620..cfa2679 100644
--- a/src/main/java/org/apache/xmlbeans/XmlPositiveInteger.java
+++ b/src/main/java/org/apache/xmlbeans/XmlPositiveInteger.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#positiveInteger">xs:positiveInteger</a> type.
@@ -26,111 +23,140 @@
  * Verified to be positive when validating.
  * <p>
  * Convertible to {@link java.math.BigInteger}.
- */ 
-public interface XmlPositiveInteger extends XmlNonNegativeInteger
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_positiveInteger");
-    
+ */
+public interface XmlPositiveInteger extends XmlNonNegativeInteger {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlPositiveInteger} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlPositiveInteger} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlPositiveInteger} fragment from an XMLStreamReader.
          */
-        public static XmlPositiveInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlPositiveInteger} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlPositiveInteger parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlPositiveInteger) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlPositiveInteger} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlQName.java b/src/main/java/org/apache/xmlbeans/XmlQName.java
index 69993be..9b84ba8 100644
--- a/src/main/java/org/apache/xmlbeans/XmlQName.java
+++ b/src/main/java/org/apache/xmlbeans/XmlQName.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import javax.xml.namespace.QName;
 
 
@@ -33,127 +30,164 @@
  * the first instance maps to the same URI as "b:" in the second instance.
  * <p>
  * Convertible to {@link javax.xml.namespace.QName}.
- */ 
-public interface XmlQName extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_QName");
-    
-    /** Returns this value as a {@link QName} */
+ */
+public interface XmlQName extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_QName");
+
+    /**
+     * Returns this value as a {@link QName}
+     */
     QName getQNameValue();
-    /** Sets this value as a {@link QName} */
+
+    /**
+     * Sets this value as a {@link QName}
+     */
     void setQNameValue(QName name);
 
     /**
      * Returns this value as a {@link QName}
+     *
      * @deprecated replaced with {@link #getQNameValue}
      **/
     QName qNameValue();
+
     /**
      * Sets this value as a {@link QName}
+     *
      * @deprecated replaced with {@link #setQNameValue}
      **/
     void set(QName name);
-    
+
     /**
      * A class with methods for creating instances
      * of {@link XmlQName}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlQName) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlQName} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlQName) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlQName} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlQName) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlQName} fragment from an XMLStreamReader.
          */
-        public static XmlQName parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlQName) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlQName} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlQName parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlQName) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlQName) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlQName} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 db5a62a..a8b68a6 100644
--- a/src/main/java/org/apache/xmlbeans/XmlShort.java
+++ b/src/main/java/org/apache/xmlbeans/XmlShort.java
@@ -15,33 +15,39 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#short">xs:short</a> type.
  * One of the derived types based on <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#decimal">xs:decimal</a>.
  * <p>
  * Naturally, convertible to a Java short.
- */ 
-public interface XmlShort extends XmlInt
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_short");
-    
-    /** Returns this value as a short */
+ */
+public interface XmlShort extends XmlInt {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_short");
+
+    /**
+     * Returns this value as a short
+     */
     public short getShortValue();
-    /** Sets this value as a short */
+
+    /**
+     * Sets this value as a short
+     */
     public void setShortValue(short s);
 
     /**
      * Returns this value as a short
+     *
      * @deprecated replaced with {@link #getShortValue}
      **/
     public short shortValue();
+
     /**
      * Sets this value as a short
+     *
      * @deprecated replaced with {@link #setShortValue}
      **/
     public void set(short s);
@@ -50,101 +56,129 @@
      * A class with methods for creating instances
      * of {@link XmlShort}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlShort) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlShort} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlShort) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlShort} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlShort) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlShort} fragment from an XMLStreamReader.
          */
-        public static XmlShort parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlShort) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlShort} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlShort parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlShort) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlShort) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlShort} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 e0bfd15..b05a72e 100644
--- a/src/main/java/org/apache/xmlbeans/XmlString.java
+++ b/src/main/java/org/apache/xmlbeans/XmlString.java
@@ -15,16 +15,13 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#string">xs:string</a> type.
  * <p>
  * A basic string in XML schema is not whitespace normalized.  If you
  * want your string type to be insensitive to variations in runs of
- * whitespace, consider using 
+ * whitespace, consider using
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#token">xs:token</a>
  * (aka {@link XmlToken}) instead.
  * To forbid whitespace and permit just alphanumeric and other
@@ -33,111 +30,140 @@
  * (aka {@link XmlNMTOKEN}) instead.
  * <p>
  * Convertible to {@link String}.
- */ 
-public interface XmlString extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_string");
-    
+ */
+public interface XmlString extends XmlAnySimpleType {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlString) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlString} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlString) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlString} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlString) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlString} fragment from an XMLStreamReader.
          */
-        public static XmlString parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlString) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlString} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlString parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlString) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlString) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlString} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlTime.java b/src/main/java/org/apache/xmlbeans/XmlTime.java
index d0c6267..7b803cb 100644
--- a/src/main/java/org/apache/xmlbeans/XmlTime.java
+++ b/src/main/java/org/apache/xmlbeans/XmlTime.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.util.Calendar;
 
 
@@ -27,41 +24,60 @@
  * A gDay specifies only a day-of-month.
  * <p>
  * Convertible to {@link Calendar} or {@link GDate}.
- * 
+ *
  * @see XmlCalendar
  * @see GDate
- */ 
-public interface XmlTime extends XmlAnySimpleType
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_time");
-    
-    /** Returns this value as a {@link Calendar} */
+ */
+public interface XmlTime extends XmlAnySimpleType {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_time");
+
+    /**
+     * Returns this value as a {@link Calendar}
+     */
     Calendar getCalendarValue();
-    /** Sets this value as a {@link Calendar} */
+
+    /**
+     * Sets this value as a {@link Calendar}
+     */
     void setCalendarValue(Calendar c);
-    /** Returns this value as a {@link GDate} */
+
+    /**
+     * Returns this value as a {@link GDate}
+     */
     GDate getGDateValue();
-    /** Sets this value as a {@link GDateSpecification} */
+
+    /**
+     * Sets this value as a {@link GDateSpecification}
+     */
     void setGDateValue(GDate gd);
 
     /**
      * Returns this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #getCalendarValue}
      **/
     Calendar calendarValue();
+
     /**
      * Sets this value as a {@link Calendar}
+     *
      * @deprecated replaced with {@link #setCalendarValue}
      **/
     void set(Calendar c);
+
     /**
      * Returns this value as a {@link GDate}
+     *
      * @deprecated replaced with {@link #getGDateValue}
      **/
     GDate gDateValue();
+
     /**
      * Sets this value as a {@link GDateSpecification}
+     *
      * @deprecated replaced with {@link #setGDateValue}
      **/
     void set(GDateSpecification gd);
@@ -71,101 +87,129 @@
      * A class with methods for creating instances
      * of {@link XmlTime}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlTime) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlTime} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlTime) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlTime} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlTime) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlTime} fragment from an XMLStreamReader.
          */
-        public static XmlTime parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlTime) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlTime} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlTime parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlTime) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlTime) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlTime} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 8d820a8..f209dd1 100644
--- a/src/main/java/org/apache/xmlbeans/XmlToken.java
+++ b/src/main/java/org/apache/xmlbeans/XmlToken.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#token">xs:token</a> type.
@@ -33,115 +30,144 @@
  * to be equivalent to <code>"high priority"</code>, you should consider
  * using xs:token or a subtype of xs:token.
  * <p>
- * When the {@link #stringValue} is obtained from an XmlToken, the normalized,
+ * When the {@link #getStringValue()} is obtained from an XmlToken, the normalized,
  * trimmed, whitespace collapsed value is returned.
  * <p>
  * Convertible to {@link String}.
- */ 
-public interface XmlToken extends XmlNormalizedString
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_token");
-    
+ */
+public interface XmlToken extends XmlNormalizedString {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlToken) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlToken} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlToken) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlToken} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlToken) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlToken} fragment from an XMLStreamReader.
          */
-        public static XmlToken parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlToken) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlToken} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlToken parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlToken) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlToken) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlToken} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlTokenSource.java b/src/main/java/org/apache/xmlbeans/XmlTokenSource.java
index 0cf0c11..8082863 100644
--- a/src/main/java/org/apache/xmlbeans/XmlTokenSource.java
+++ b/src/main/java/org/apache/xmlbeans/XmlTokenSource.java
@@ -15,7 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
 import org.w3c.dom.Node;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -64,24 +63,6 @@
     XmlCursor newCursor();
 
     /**
-     * Returns a new XmlInputStream.
-     * <p>
-     * The stream starts at the current begin-tag or begin-document
-     * position and ends at the matching end-tag or end-document.
-     * <p>
-     * This is a fail-fast stream, so if the underlying data is changed
-     * while the stream is being read, the stream throws a
-     * ConcurrentModificationException.
-     * <p>
-     * Throws an IllegalStateException if the XmlTokenSource is not
-     * positioned at begin-tag or begin-document (e.g., if it is at
-     * an attribute).
-     *
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    XMLInputStream newXMLInputStream();
-
-    /**
      * Returns a new XMLStreamReader.
      * <p>
      * The stream starts at the current begin-tag or begin-document
@@ -198,8 +179,18 @@
     void save(Writer w) throws IOException;
 
     /**
-     * <p>Just like newXMLInputStream() but with any of a number of options. Use the
-     * <em>options</em> parameter to specify the following:</p>
+     * Returns a new XMLStreamReader.
+     * <p>
+     * The stream starts at the current begin-tag or begin-document
+     * position and ends at the matching end-tag or end-document.
+     * <p>
+     * This is a fail-fast stream, so if the underlying data is changed
+     * while the stream is being read, the stream throws a
+     * ConcurrentModificationException.
+     * <p>
+     * Throws an IllegalStateException if the XmlTokenSource is not
+     * positioned at begin-tag or begin-document (e.g., if it is at
+     * an attribute).
      *
      * <table>
      * <tr><th>To specify this</th><th>Use this method</th></tr>
@@ -278,17 +269,8 @@
      * </tr>
      * </table>
      *
-     * @param options Any of the described options.
-     * @return A new validating XMLInputStream.
-     * @see XmlOptions
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    XMLInputStream newXMLInputStream(XmlOptions options);
-
-    /**
-     * Just like newXMLInputStream() but with options.
-     * Options map may be null.
-     *
+     * @param options Any of the described options. Options map may be null.
+     * @return A new validating XMLStreamReader.
      * @see XmlOptions
      */
     XMLStreamReader newXMLStreamReader(XmlOptions options);
diff --git a/src/main/java/org/apache/xmlbeans/XmlUnsignedByte.java b/src/main/java/org/apache/xmlbeans/XmlUnsignedByte.java
index 49b889f..795c486 100644
--- a/src/main/java/org/apache/xmlbeans/XmlUnsignedByte.java
+++ b/src/main/java/org/apache/xmlbeans/XmlUnsignedByte.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#unsignedByte">xs:unsignedByte</a> type.
@@ -26,24 +23,33 @@
  * Verified to be in the range 0..255 when validating.
  * <p>
  * As suggested by JAXB, convertible to Java short.
- */ 
-public interface XmlUnsignedByte extends XmlUnsignedShort
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedByte");
-    
-    /** Returns this value as a short */
+ */
+public interface XmlUnsignedByte extends XmlUnsignedShort {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedByte");
+
+    /**
+     * Returns this value as a short
+     */
     public short getShortValue();
-    /** Sets this value as a short */
+
+    /**
+     * Sets this value as a short
+     */
     public void setShortValue(short s);
 
     /**
      * Returns this value as a short
+     *
      * @deprecated replaced with {@link #getShortValue}
      **/
     public short shortValue();
+
     /**
      * Sets this value as a short
+     *
      * @deprecated replaced with {@link #setShortValue}
      **/
     public void set(short s);
@@ -52,101 +58,129 @@
      * A class with methods for creating instances
      * of {@link XmlUnsignedByte}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlUnsignedByte} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlUnsignedByte} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlUnsignedByte} fragment from an XMLStreamReader.
          */
-        public static XmlUnsignedByte parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlUnsignedByte} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlUnsignedByte parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlUnsignedByte) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlUnsignedByte} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 f124221..1c830c6 100644
--- a/src/main/java/org/apache/xmlbeans/XmlUnsignedInt.java
+++ b/src/main/java/org/apache/xmlbeans/XmlUnsignedInt.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#unsignedInt">xs:unsignedInt</a> type.
@@ -26,24 +23,33 @@
  * Verified to be in the range 0..4294967295 when validating.
  * <p>
  * Convertible to Java long.
- */ 
-public interface XmlUnsignedInt extends XmlUnsignedLong
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedInt");
-    
-    /** Returns this value as a long */
+ */
+public interface XmlUnsignedInt extends XmlUnsignedLong {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedInt");
+
+    /**
+     * Returns this value as a long
+     */
     long getLongValue();
-    /** Sets this value as a long */
+
+    /**
+     * Sets this value as a long
+     */
     void setLongValue(long v);
 
     /**
      * Returns this value as a long
+     *
      * @deprecated replaced with {@link #getLongValue}
      **/
     long longValue();
+
     /**
      * Sets this value as a long
+     *
      * @deprecated replaced with {@link #setLongValue}
      **/
     void set(long v);
@@ -52,101 +58,129 @@
      * A class with methods for creating instances
      * of {@link XmlUnsignedInt}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlUnsignedInt} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlUnsignedInt} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlUnsignedInt} fragment from an XMLStreamReader.
          */
-        public static XmlUnsignedInt parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlUnsignedInt} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlUnsignedInt parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlUnsignedInt) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlUnsignedInt} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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 a507ce7..8b55954 100644
--- a/src/main/java/org/apache/xmlbeans/XmlUnsignedLong.java
+++ b/src/main/java/org/apache/xmlbeans/XmlUnsignedLong.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 import java.math.BigInteger;
 
 
@@ -29,111 +26,140 @@
  * Verified to be in the range 0..2<super>64</super>-1 when validating.
  * <p>
  * Convertible to {@link BigInteger}.
- */ 
-public interface XmlUnsignedLong extends XmlNonNegativeInteger
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedLong");
-    
+ */
+public interface XmlUnsignedLong extends XmlNonNegativeInteger {
+    /**
+     * 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}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlUnsignedLong} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlUnsignedLong} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlUnsignedLong} fragment from an XMLStreamReader.
          */
-        public static XmlUnsignedLong parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlUnsignedLong} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlUnsignedLong parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlUnsignedLong) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlUnsignedLong} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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
+        }
     }
 }
 
diff --git a/src/main/java/org/apache/xmlbeans/XmlUnsignedShort.java b/src/main/java/org/apache/xmlbeans/XmlUnsignedShort.java
index 9a6af78..356b0aa 100644
--- a/src/main/java/org/apache/xmlbeans/XmlUnsignedShort.java
+++ b/src/main/java/org/apache/xmlbeans/XmlUnsignedShort.java
@@ -15,9 +15,6 @@
 
 package org.apache.xmlbeans;
 
-import javax.xml.stream.XMLStreamReader;
-
-
 /**
  * Corresponds to the XML Schema
  * <a target="_blank" href="http://www.w3.org/TR/xmlschema-2/#unsignedShort">xs:unsignedShort</a> type.
@@ -26,24 +23,33 @@
  * Verified to be in the range 0..65535 when validating.
  * <p>
  * Convertible to a Java int.
- */ 
-public interface XmlUnsignedShort extends XmlUnsignedInt
-{
-    /** The constant {@link SchemaType} object representing this schema type. */
-    public static final SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedShort");
-    
-    /** Returns this value as an int */
+ */
+public interface XmlUnsignedShort extends XmlUnsignedInt {
+    /**
+     * The constant {@link SchemaType} object representing this schema type.
+     */
+    SchemaType type = XmlBeans.getBuiltinTypeSystem().typeForHandle("_BI_unsignedShort");
+
+    /**
+     * Returns this value as an int
+     */
     int getIntValue();
-    /** Sets this value as an int */
+
+    /**
+     * Sets this value as an int
+     */
     void setIntValue(int v);
 
     /**
      * Returns this value as an int
+     *
      * @deprecated replaced with {@link #getIntValue}
      **/
     int intValue();
+
     /**
      * Sets this value as an int
+     *
      * @deprecated replaced with {@link #setIntValue}
      **/
     void set(int v);
@@ -52,101 +58,129 @@
      * A class with methods for creating instances
      * of {@link XmlUnsignedShort}.
      */
-    public static final class Factory
-    {
-        /** Creates an empty instance 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} */
+            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 */
+            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>". */
+            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>". */
+            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. */
+            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. */
+            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. */
+            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 ); }
+            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(u, type, null);
+        }
 
-        /** Parses a {@link XmlUnsignedShort} fragment from a URL. */
+        /**
+         * 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 ); }
+            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(u, type, options);
+        }
 
-        /** Parses a {@link XmlUnsignedShort} fragment from an InputStream. */
+        /**
+         * 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. */
+            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. */
+            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. */
+            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. */
+            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. */
+            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 XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(node, type, options);
+        }
+
+        /**
+         * Parses a {@link XmlUnsignedShort} fragment from an XMLStreamReader.
          */
-        public static XmlUnsignedShort parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse( xis, type, null ); }
-        
-        /** Parses a {@link XmlUnsignedShort} fragment from an XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static XmlUnsignedShort parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse( xis, 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 ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
+            return (XmlUnsignedShort) XmlBeans.getContextTypeLoader().parse(xsr, type, null);
+        }
+
+        /**
+         * Parses a {@link XmlUnsignedShort} fragment from an XMLStreamReader.
          */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, null ); }
-        
-        /** Returns a validating XMLInputStream.
-         * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-         */
-        public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-          return XmlBeans.getContextTypeLoader().newValidatingXMLInputStream( xis, type, options ); }
-        
-        private Factory() { } // No instance of this class allowed
+        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/common/GenericXmlInputStream.java b/src/main/java/org/apache/xmlbeans/impl/common/GenericXmlInputStream.java
deleted file mode 100644
index e70dfa0..0000000
--- a/src/main/java/org/apache/xmlbeans/impl/common/GenericXmlInputStream.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.xmlbeans.impl.common;
-
-import org.apache.xmlbeans.xml.stream.ReferenceResolver;
-import org.apache.xmlbeans.xml.stream.XMLEvent;
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-import org.apache.xmlbeans.xml.stream.XMLName;
-import org.apache.xmlbeans.xml.stream.XMLStreamException;
-
-/**
- * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
- */
-public class GenericXmlInputStream implements XMLInputStream
-{
-    public GenericXmlInputStream ( )
-    {
-        _master = this;
-        _elementCount = 1; // Go all the way
-    }
-
-    private GenericXmlInputStream ( GenericXmlInputStream master )
-    {
-        (_master = master).ensureInit();
-        _nextEvent = master._nextEvent;
-    }
-
-    //
-    // The source for all events
-    //
-
-    protected XMLEvent nextEvent ( ) throws XMLStreamException
-    {
-        throw new RuntimeException( "nextEvent not overridden" );
-    }
-
-    //
-    //
-    //
-
-    private class EventItem
-    {
-        EventItem ( XMLEvent e )
-        {
-            _event = e;
-        }
-
-        int     getType ( ) { return _event.getType(); }
-        boolean hasName ( ) { return _event.hasName(); }
-        XMLName getName ( ) { return _event.getName(); }
-
-        final XMLEvent _event;
-
-        EventItem _next;
-    }
-
-    private void ensureInit ( )
-    {
-        if (!_master._initialized)
-        {
-            try
-            {
-                _master._nextEvent = getNextEvent();
-            }
-            catch ( XMLStreamException e )
-            {
-                throw new RuntimeException( e );
-            }
-
-            _master._initialized = true;
-        }
-    }
-
-    private EventItem getNextEvent ( ) throws XMLStreamException
-    {
-        XMLEvent e = nextEvent();
-
-        return e == null ? null : new EventItem( e );
-    }
-
-    public XMLEvent next ( ) throws XMLStreamException
-    {
-        ensureInit();
-
-        EventItem currentEvent = _nextEvent;
-
-        if (_nextEvent != null)
-        {
-            if (_nextEvent._next == null)
-                _nextEvent._next = _master.getNextEvent();
-
-            _nextEvent = _nextEvent._next;
-        }
-
-        if (currentEvent == null)
-            return null;
-
-        if (currentEvent.getType() == XMLEvent.END_ELEMENT)
-        {
-            if (--_elementCount <= 0)
-                _nextEvent = null;
-        }
-        else if (currentEvent.getType() == XMLEvent.START_ELEMENT)
-            _elementCount++;
-
-        return currentEvent._event;
-    }
-
-    public boolean hasNext ( ) throws XMLStreamException
-    {
-        ensureInit();
-
-        return _nextEvent != null;
-    }
-
-    public void skip ( ) throws XMLStreamException
-    {
-        next();
-    }
-
-    public void skipElement ( ) throws XMLStreamException
-    {
-        ensureInit();
-
-        for ( ; _nextEvent != null ; next() )
-        {
-            if (_nextEvent.getType() == XMLEvent.START_ELEMENT)
-                break;
-        }
-
-        int count = 0;
-
-        for ( ; _nextEvent != null ; next() )
-        {
-            int type = next().getType();
-
-            if (type == XMLEvent.START_ELEMENT)
-                count++;
-            else if (type == XMLEvent.END_ELEMENT && --count == 0)
-                break;
-        }
-    }
-
-    public XMLEvent peek ( ) throws XMLStreamException
-    {
-        ensureInit();
-
-        return _nextEvent._event;
-    }
-
-    public boolean skip ( int eventType ) throws XMLStreamException
-    {
-        ensureInit();
-
-        for ( ; _nextEvent != null ; next() )
-        {
-            if (_nextEvent.getType() == eventType)
-                return true;
-        }
-
-        return false;
-    }
-
-    public boolean skip ( XMLName name ) throws XMLStreamException
-    {
-        ensureInit();
-
-        for ( ; _nextEvent != null ; next() )
-        {
-            if (_nextEvent.hasName() && _nextEvent.getName().equals( name ))
-                return true;
-        }
-
-        return false;
-    }
-
-    public boolean skip ( XMLName name, int eventType ) throws XMLStreamException
-    {
-        ensureInit();
-
-        for ( ; _nextEvent != null ; next() )
-        {
-            if (_nextEvent.getType() == eventType &&
-                  _nextEvent.hasName() &&
-                    _nextEvent.getName().equals( name ))
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public XMLInputStream getSubStream ( ) throws XMLStreamException
-    {
-        ensureInit();
-
-        GenericXmlInputStream subStream = new GenericXmlInputStream( this );
-
-        subStream.skip( XMLEvent.START_ELEMENT );
-
-        return subStream;
-    }
-
-    public void close ( ) throws XMLStreamException
-    {
-        // BUGBUG - can I do anything here, really?
-        // SHould I count the number of open sub streams?
-        // I have no destructor, how can I close properly?
-    }
-
-    public ReferenceResolver getReferenceResolver ( )
-    {
-        ensureInit();
-
-        throw new RuntimeException( "Not impl" );
-    }
-
-    public void setReferenceResolver ( ReferenceResolver resolver )
-    {
-        ensureInit();
-
-        throw new RuntimeException( "Not impl" );
-    }
-
-    private boolean               _initialized;
-    private EventItem             _nextEvent;
-    private int                   _elementCount;
-    private GenericXmlInputStream _master;
-}
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 d2c658b..e2d774e 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
@@ -32,7 +32,6 @@
 public final class SchemaTypeCodePrinter implements SchemaCodePrinter {
     Writer _writer;
     int _indent;
-    boolean _useJava15;
 
 
     static final String LINE_SEPARATOR =
@@ -59,19 +58,11 @@
 
     private static SchemaCodePrinter getPrinter(XmlOptions opt) {
         SchemaCodePrinter printer = opt == null ? null : opt.getSchemaCodePrinter();
-        return printer == null ? new SchemaTypeCodePrinter(opt) : printer;
+        return printer == null ? new SchemaTypeCodePrinter() : printer;
     }
 
-    public SchemaTypeCodePrinter(XmlOptions opt) {
+    public SchemaTypeCodePrinter() {
         _indent = 0;
-
-        String genversion = (opt == null) ? null : opt.getGenerateJavaVersion();
-
-        if (genversion == null) {
-            genversion = XmlOptions.GENERATE_JAVA_14;
-        }
-
-        _useJava15 = XmlOptions.GENERATE_JAVA_15.equals(genversion);
     }
 
     void indent() {
@@ -173,6 +164,9 @@
     }
 
     static String prettyQName(QName qname) {
+        if (qname == null) {
+            return "";
+        }
         String result = qname.getLocalPart();
         if (qname.getNamespaceURI() != null) {
             result += "(@" + qname.getNamespaceURI() + ")";
@@ -229,7 +223,7 @@
         SchemaTypeImpl sTypeI = (SchemaTypeImpl) sType;
         String ret = sTypeI.getFullJavaName();
 
-        while (sTypeI.isRedefinition()) {
+        while (sTypeI != null && sTypeI.isRedefinition()) {
             ret = sTypeI.getFullJavaName();
             sTypeI = (SchemaTypeImpl) sTypeI.getBaseType();
         }
@@ -258,7 +252,7 @@
     }
 
     void printStaticTypeDeclaration(SchemaType sType, SchemaTypeSystem system) throws IOException {
-        emit("public static final org.apache.xmlbeans.SchemaType type = (org.apache.xmlbeans.SchemaType)");
+        emit("org.apache.xmlbeans.SchemaType type = (org.apache.xmlbeans.SchemaType)");
         indent();
         emit("Factory.getTypeLoader().resolveHandle(\"" + ((SchemaTypeSystemImpl) system).handleForType(sType) + "\");");
         outdent();
@@ -340,7 +334,7 @@
         emit("");
         // BUGBUG - Can I use the name loader here?  could it be a
         // nested type name?  It is lower case!
-        emit("public static final class Factory");
+        emit("final class Factory");
         emit("{");
         indent();
 
@@ -356,26 +350,15 @@
         }
 
         // Only need newInstance() for non-abstract types
-        if (sType.isAbstract()) {
-            emit("/** @deprecated No need to be able to create instances of abstract types */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-        }
-        emit("public static " + fullName + " newInstance() {");
-        emit("  return (" + fullName + ") getTypeLoader().newInstance( type, null ); }");
-        emit("");
+        if (!sType.isAbstract()) {
+            emit("public static " + fullName + " newInstance() {");
+            emit("  return (" + fullName + ") getTypeLoader().newInstance( type, null ); }");
+            emit("");
 
-        // Only need newInstance() for non-abstract types
-        if (sType.isAbstract()) {
-            emit("/** @deprecated No need to be able to create instances of abstract types */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
+            emit("public static " + fullName + " newInstance(org.apache.xmlbeans.XmlOptions options) {");
+            emit("  return (" + fullName + ") getTypeLoader().newInstance( type, options ); }");
+            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 */");
@@ -435,40 +418,6 @@
             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("/** @deprecated {@link org.apache.xmlbeans.xml.stream.XMLInputStream} */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("public static " + fullName + " parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( xis, type, null ); }");
-            emit("");
-
-            emit("/** @deprecated {@link org.apache.xmlbeans.xml.stream.XMLInputStream} */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("public static " + fullName + " parse(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {");
-            emit("  return (" + fullName + ") getTypeLoader().parse( xis, type, options ); }");
-            emit("");
-
-            // Don't have XMLInputStream anymore
-            emit("/** @deprecated {@link org.apache.xmlbeans.xml.stream.XMLInputStream} */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {");
-            emit("  return getTypeLoader().newValidatingXMLInputStream( xis, type, null ); }");
-            emit("");
-
-            // Don't have XMLInputStream anymore
-            emit("/** @deprecated {@link org.apache.xmlbeans.xml.stream.XMLInputStream} */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("public static org.apache.xmlbeans.xml.stream.XMLInputStream newValidatingXMLInputStream(org.apache.xmlbeans.xml.stream.XMLInputStream xis, org.apache.xmlbeans.XmlOptions options) throws org.apache.xmlbeans.XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {");
-            emit("  return getTypeLoader().newValidatingXMLInputStream( xis, type, options ); }");
-            emit("");
         }
 
         emit("private Factory() { } // No instance of this class allowed");
@@ -591,7 +540,7 @@
         InterfaceExtension[] exts = sImpl.getInterfaceExtensions();
         if (exts != null) {
             for (InterfaceExtension ext : exts) {
-                sb.append(", " + ext.getInterface());
+                sb.append(", ").append(ext.getInterface());
             }
         }
 
@@ -615,68 +564,18 @@
                 if (bits == SchemaType.SIZE_BIG_INTEGER) {
                     emit("java.math.BigInteger getBigIntegerValue();");
                     emit("void setBigIntegerValue(java.math.BigInteger bi);");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("java.math.BigInteger bigIntegerValue();");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("void set(java.math.BigInteger bi);");
                 } else if (bits == SchemaType.SIZE_LONG) {
                     emit("long getLongValue();");
                     emit("void setLongValue(long l);");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("long longValue();");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("void set(long l);");
                 } else if (bits == SchemaType.SIZE_INT) {
                     emit("int getIntValue();");
                     emit("void setIntValue(int i);");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("int intValue();");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("void set(int i);");
                 } else if (bits == SchemaType.SIZE_SHORT) {
                     emit("short getShortValue();");
                     emit("void setShortValue(short s);");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("short shortValue();");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("void set(short s);");
                 } else if (bits == SchemaType.SIZE_BYTE) {
                     emit("byte getByteValue();");
                     emit("void setByteValue(byte b);");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("byte byteValue();");
-                    emit("/** @deprecated */");
-                    if (_useJava15) {
-                        emit("@Deprecated");
-                    }
-                    emit("void set(byte b);");
                 }
             }
         }
@@ -684,16 +583,6 @@
         if (sType.getSimpleVariety() == SchemaType.UNION) {
             emit("java.lang.Object getObjectValue();");
             emit("void setObjectValue(java.lang.Object val);");
-            emit("/** @deprecated */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("java.lang.Object objectValue();");
-            emit("/** @deprecated */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("void objectSet(java.lang.Object val);");
             emit("org.apache.xmlbeans.SchemaType instanceType();");
             SchemaType ctype = sType.getUnionCommonBaseType();
             if (ctype != null && ctype.getSimpleVariety() != SchemaType.UNION) {
@@ -705,25 +594,10 @@
             emit("java.util.List getListValue();");
             emit("java.util.List xgetListValue();");
             emit("void setListValue(java.util.List list);");
-            emit("/** @deprecated */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("java.util.List listValue();");
-            emit("/** @deprecated */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("java.util.List xlistValue();");
-            emit("/** @deprecated */");
-            if (_useJava15) {
-                emit("@Deprecated");
-            }
-            emit("void set(java.util.List list);");
         }
     }
 
-    void startBlock() throws IOException {
+    void startBlock() {
         // emit("{");
         indent();
     }
@@ -1043,16 +917,14 @@
         if (several) {
             String arrayName = propertyName + "Array";
 
-            if (_useJava15) {
-                String wrappedType = type;
-                if (isJavaPrimitive(javaType)) {
-                    wrappedType = javaWrappedType(javaType);
-                }
-
-                printJavaDoc("Gets a List of " + propdesc + "s");
-                emit("java.util.List<" + wrappedType + "> get" + propertyName + "List();");
+            String wrappedType = type;
+            if (isJavaPrimitive(javaType)) {
+                wrappedType = javaWrappedType(javaType);
             }
 
+            printJavaDoc("Gets a List of " + propdesc + "s");
+            emit("java.util.List<" + wrappedType + "> get" + propertyName + "List();");
+
             printJavaDoc("Gets array of all " + propdesc + "s");
             emit(type + "[] get" + arrayName + "();");
 
@@ -1060,10 +932,8 @@
             emit(type + " get" + arrayName + "(int i);");
 
             if (!xmltype) {
-                if (_useJava15) {
-                    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");
+                emit("java.util.List<" + xtype + "> xget" + propertyName + "List();");
 
                 printJavaDoc("Gets (as xml) array of all " + propdesc + "s");
                 emit(xtype + "[] xget" + arrayName + "();");
@@ -1284,7 +1154,7 @@
         if (sType.getSimpleVariety() == SchemaType.UNION) {
             SchemaType[] memberTypes = sType.getUnionMemberTypes();
             for (SchemaType memberType : memberTypes) {
-                interfaces.append(", " + memberType.getFullJavaName().replace('$', '.'));
+                interfaces.append(", ").append(memberType.getFullJavaName().replace('$', '.'));
             }
         }
 
@@ -1689,14 +1559,7 @@
         emit("}");
     }
 
-    void emitDeclareTarget(boolean declareTarget, String xtype)
-        throws IOException {
-        if (declareTarget) {
-            emit(xtype + " target = null;");
-        }
-    }
-
-    void emitAddTarget(String identifier, boolean isAttr, boolean declareTarget, String xtype)
+    void emitAddTarget(String identifier, boolean isAttr, String xtype)
         throws IOException {
         if (isAttr) {
             emit("target = (" + xtype + ")get_store().add_attribute_user(" + identifier + ");");
@@ -1794,7 +1657,7 @@
         switch (nullBehaviour) {
             case ADD_NEW_VALUE:
                 // target already emited, no need for emitDeclareTarget(false, xtype);
-                emitAddTarget(identifier, isAttr, false, xtype);
+                emitAddTarget(identifier, isAttr, xtype);
                 break;
 
             case THROW_EXCEPTION:
@@ -1813,7 +1676,7 @@
 
     void printListGetter15Impl(String parentJavaName,
                                String propdesc, String propertyName,
-                               String wrappedType, String xtype,
+                               String wrappedType,
                                boolean xmltype, boolean xget)
         throws IOException {
         String arrayName = propertyName + "Array";
@@ -1832,17 +1695,13 @@
         startBlock();
 
         // Object get(i)
-        if (_useJava15) {
-            emit("@Override");
-        }
+        emit("@Override");
         emit("public " + wrappedType + " get(int i)");
         emit("    { return " + parentThis + xgetMethod + arrayName + "(i); }");
         emit("");
 
         // Object set(i, o)
-        if (_useJava15) {
-            emit("@Override");
-        }
+        emit("@Override");
         emit("public " + wrappedType + " set(int i, " + wrappedType + " o) {");
         startBlock();
         emit(wrappedType + " old = " + parentThis + xgetMethod + arrayName + "(i);");
@@ -1852,9 +1711,7 @@
         emit("");
 
         // void add(i, o)
-        if (_useJava15) {
-            emit("@Override");
-        }
+        emit("@Override");
         emit("public void add(int i, " + wrappedType + " o)");
         if (xmltype || xget) {
             emit("    { " + parentThis + "insertNew" + propertyName + "(i).set(o); }");
@@ -1864,9 +1721,7 @@
         emit("");
 
         // Object remove(i)
-        if (_useJava15) {
-            emit("@Override");
-        }
+        emit("@Override");
         emit("public " + wrappedType + " remove(int i) {");
         startBlock();
         emit(wrappedType + " old = " + parentThis + xgetMethod + arrayName + "(i);");
@@ -1876,9 +1731,7 @@
         emit("");
 
         // int size()
-        if (_useJava15) {
-            emit("@Override");
-        }
+        emit("@Override");
         emit("public int size()");
         emit("    { return " + parentThis + "sizeOf" + arrayName + "(); }");
         emit("");
@@ -1992,17 +1845,15 @@
         if (several) {
             String arrayName = propertyName + "Array";
 
-            if (_useJava15) {
-                // use boxed type if the java type is a primitive and jdk1.5
-                // jdk1.5 will box/unbox for us
-                String wrappedType = type;
-                if (isJavaPrimitive(javaType)) {
-                    wrappedType = javaWrappedType(javaType);
-                }
-
-                printListGetter15Impl(parentJavaName, propdesc, propertyName, wrappedType, xtype, xmltype, false);
+            // use boxed type if the java type is a primitive and jdk1.5
+            // jdk1.5 will box/unbox for us
+            String wrappedType = type;
+            if (isJavaPrimitive(javaType)) {
+                wrappedType = javaWrappedType(javaType);
             }
 
+            printListGetter15Impl(parentJavaName, propdesc, propertyName, wrappedType, xmltype, false);
+
             // Value[] getProp()
             printJavaDoc("Gets array of all " + propdesc + "s");
             emit("public " + type + "[] get" + arrayName + "() {");
@@ -2025,9 +1876,7 @@
             endBlock();
 
             if (!xmltype) {
-                if (_useJava15) {
-                    printListGetter15Impl(parentJavaName, propdesc, propertyName, xtype, xtype, xmltype, true);
-                }
+                printListGetter15Impl(parentJavaName, propdesc, propertyName, xtype, false, true);
 
                 // Value[] xgetProp()
                 printJavaDoc("Gets (as xml) array of all " + propdesc + "s");
@@ -2081,7 +1930,7 @@
 
         boolean xmltype = (javaType == SchemaProperty.XML_OBJECT);
         boolean isobj = (javaType == SchemaProperty.JAVA_OBJECT);
-        boolean isSubstGroup = identifier != setIdentifier;
+        boolean isSubstGroup = !Objects.equals(identifier, setIdentifier);
         String jtargetType = (isunion || !xmltype) ? "org.apache.xmlbeans.SimpleValue" : xtype;
 
         String propdesc = "\"" + qName.getLocalPart() + "\"" + (isAttr ? " attribute" : " element");
@@ -2092,10 +1941,10 @@
             emit("public void set" + propertyName + "(" + type + " " + safeVarName + ") {");
             startBlock();
             if (xmltype && !isSubstGroup && !isAttr) {
-                emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
+                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, isAttr, several ? "0" : "-1");
+                emitPost(sType, PrePostExtension.OPERATION_SET, identifier, false, several ? "0" : "-1");
             } else {
                 emitImplementationPreamble();
                 emitPre(sType, PrePostExtension.OPERATION_SET, identifier, isAttr, several ? "0" : "-1");
@@ -2127,9 +1976,9 @@
                 emit("public " + xtype + " addNew" + propertyName + "() {");
                 startBlock();
                 emitImplementationPreamble();
-                emitDeclareTarget(true, xtype);
+                emit(xtype + " target = null;");
                 emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
-                emitAddTarget(identifier, isAttr, true, xtype);
+                emitAddTarget(identifier, isAttr, xtype);
                 emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
                 emit("return target;");
                 emitImplementationPostamble();
@@ -2314,9 +2163,9 @@
                 emit("public void add" + propertyName + "(" + type + " " + safeVarName + ") {");
                 startBlock();
                 emitImplementationPreamble();
-                emitDeclareTarget(true, jtargetType);
+                emit(jtargetType + " target = null;");
                 emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
-                emitAddTarget(identifier, isAttr, true, jtargetType);
+                emitAddTarget(identifier, isAttr, jtargetType);
                 printJSetValue(javaType, safeVarName, (SchemaTypeImpl) prop.getType());
                 emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
                 emitImplementationPostamble();
@@ -2327,7 +2176,7 @@
             emit("public " + xtype + " insertNew" + propertyName + "(int i) {");
             startBlock();
             emitImplementationPreamble();
-            emitDeclareTarget(true, xtype);
+            emit(xtype + " target = null;");
             emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
             if (!isSubstGroup) {
                 emit("target = (" + xtype + ")get_store().insert_element_user(" + identifier + ", i);");
@@ -2345,9 +2194,9 @@
             emit("public " + xtype + " addNew" + propertyName + "() {");
             startBlock();
             emitImplementationPreamble();
-            emitDeclareTarget(true, xtype);
+            emit(xtype + " target = null;");
             emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
-            emitAddTarget(identifier, isAttr, true, xtype);
+            emitAddTarget(identifier, isAttr, xtype);
             emitPost(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr);
             emit("return target;");
             emitImplementationPostamble();
@@ -2537,7 +2386,7 @@
 
         String[] exceptions = method.getExceptionTypes();
         for (int i = 0; i < exceptions.length; i++) {
-            decl.append((i == 0 ? " throws " : ", ") + exceptions[i]);
+            decl.append(i == 0 ? " throws " : ", ").append(exceptions[i]);
         }
 
         decl.append(" {");
@@ -2556,7 +2405,7 @@
 
         String[] params = method.getParameterTypes();
         for (int i = 0; i < params.length; i++) {
-            impl.append(", p" + i);
+            impl.append(", p").append(i);
         }
 
         impl.append(");");
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderBase.java b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderBase.java
index 1dfc45f..bd9afdc 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderBase.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderBase.java
@@ -18,10 +18,7 @@
 import org.apache.xmlbeans.*;
 import org.apache.xmlbeans.impl.common.QNameHelper;
 import org.apache.xmlbeans.impl.store.Locale;
-import org.apache.xmlbeans.impl.validator.ValidatingXMLInputStream;
 import org.apache.xmlbeans.impl.xpath.XPathFactory;
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-import org.apache.xmlbeans.xml.stream.XMLStreamException;
 import org.w3c.dom.DOMImplementation;
 import org.w3c.dom.Node;
 
@@ -142,19 +139,6 @@
         return Locale.parseToXmlObject(this, xmlText, type, options);
     }
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XmlObject parse(XMLInputStream xis, SchemaType type, XmlOptions options) throws XmlException, XMLStreamException {
-        XmlFactoryHook hook = XmlFactoryHook.ThreadContext.getHook();
-
-        if (hook != null) {
-            return hook.parse(this, xis, type, options);
-        }
-
-        return Locale.parseToXmlObject(this, xis, type, options);
-    }
-
     public XmlObject parse(XMLStreamReader xsr, SchemaType type, XmlOptions options) throws XmlException {
         XmlFactoryHook hook = XmlFactoryHook.ThreadContext.getHook();
 
@@ -289,13 +273,6 @@
         return Locale.newDomImplementation(this, options);
     }
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream newValidatingXMLInputStream(XMLInputStream xis, SchemaType type, XmlOptions options) throws XmlException, XMLStreamException {
-        return new ValidatingXMLInputStream(xis, this, type, options);
-    }
-
     //
     //
     //
diff --git a/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java b/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java
index 1df26b8..f81b744 100755
--- a/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java
+++ b/src/main/java/org/apache/xmlbeans/impl/store/Cursor.java
@@ -25,7 +25,6 @@
 import org.apache.xmlbeans.impl.store.Saver.TextSaver;
 import org.apache.xmlbeans.impl.xpath.XPathEngine;
 import org.apache.xmlbeans.impl.xpath.XPathFactory;
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
 import org.w3c.dom.Node;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -481,12 +480,6 @@
     // These simply delegate to the version of the method which takes XmlOptions
     //
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream _newXMLInputStream() {
-        return _newXMLInputStream(null);
-    }
 
     public XMLStreamReader _newXMLStreamReader() {
         return _newXMLStreamReader(null);
@@ -536,13 +529,6 @@
         return Jsr173.newXmlStreamReader(_cur, options);
     }
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream _newXMLInputStream(XmlOptions options) {
-        return new Saver.XmlInputStreamImpl(_cur, options);
-    }
-
     public String _xmlText(XmlOptions options) {
         assert isValid();
 
@@ -1948,13 +1934,6 @@
         return syncWrap(() -> _newXMLStreamReader(options));
     }
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream newXMLInputStream() {
-        return syncWrap((Supplier<XMLInputStream>) this::_newXMLInputStream);
-    }
-
     public String xmlText() {
         return syncWrap((Supplier<String>) this::_xmlText);
     }
@@ -1991,13 +1970,6 @@
         syncWrapIOEx(() -> _save(w));
     }
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream newXMLInputStream(XmlOptions options) {
-        return syncWrap(() -> _newXMLInputStream(options));
-    }
-
     public String xmlText(XmlOptions options) {
         return syncWrap(() -> _xmlText(options));
     }
diff --git a/src/main/java/org/apache/xmlbeans/impl/store/Locale.java b/src/main/java/org/apache/xmlbeans/impl/store/Locale.java
index 4757f53..6649ac0 100755
--- a/src/main/java/org/apache/xmlbeans/impl/store/Locale.java
+++ b/src/main/java/org/apache/xmlbeans/impl/store/Locale.java
@@ -22,9 +22,7 @@
 import org.apache.xmlbeans.impl.store.DomImpl.Dom;
 import org.apache.xmlbeans.impl.store.Saaj.SaajCallback;
 import org.apache.xmlbeans.impl.values.TypeStore;
-import org.apache.xmlbeans.xml.stream.CharacterData;
-import org.apache.xmlbeans.xml.stream.ProcessingInstruction;
-import org.apache.xmlbeans.xml.stream.*;
+import org.apache.xmlbeans.xml.stream.XMLEvent;
 import org.w3c.dom.*;
 import org.xml.sax.*;
 import org.xml.sax.ext.DeclHandler;
@@ -593,55 +591,6 @@
     //
     //
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public static XmlObject parseToXmlObject(SchemaTypeLoader stl,
-                                             XMLInputStream xis, SchemaType type, XmlOptions options)
-        throws XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-        Locale l = getLocale(stl, options);
-
-        if (l.noSync()) {
-            l.enter();
-            try {
-                return l.parseToXmlObject(xis, type, options);
-            } finally {
-                l.exit();
-            }
-        } else {
-            synchronized (l) {
-                l.enter();
-                try {
-                    return l.parseToXmlObject(xis, type, options);
-                } finally {
-                    l.exit();
-                }
-            }
-        }
-    }
-
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XmlObject parseToXmlObject(XMLInputStream xis, SchemaType type,
-                                      XmlOptions options)
-        throws XmlException, org.apache.xmlbeans.xml.stream.XMLStreamException {
-        Cur c;
-
-        try {
-            c = loadXMLInputStream(xis, options);
-        } catch (org.apache.xmlbeans.xml.stream.XMLStreamException e) {
-            throw new XmlException(e.getMessage(), e);
-        }
-
-        autoTypeDocument(c, type, options);
-
-        XmlObject x = (XmlObject) c.getUser();
-
-        c.release();
-
-        return x;
-    }
 
     //
     //
@@ -736,181 +685,6 @@
 
     }
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    private Cur loadXMLInputStream(XMLInputStream xis, XmlOptions options)
-        throws org.apache.xmlbeans.xml.stream.XMLStreamException {
-        options = XmlOptions.maskNull(options);
-
-        boolean lineNums = options.isLoadLineNumbers();
-
-        XMLEvent x = xis.peek();
-
-        if (x != null && x.getType() == XMLEvent.START_ELEMENT) {
-            Map<String, String> nsMap = ((StartElement) x).getNamespaceMap();
-
-            if (nsMap != null && nsMap.size() > 0) {
-
-                Map<String, String> namespaces = new HashMap<>(nsMap);
-
-                options = new XmlOptions(options);
-
-                options.setLoadAdditionalNamespaces(namespaces);
-            }
-        }
-
-        String systemId = null;
-        String encoding = null;
-        String version = null;
-        boolean standAlone = true;
-
-        LoadContext context = new Cur.CurLoadContext(this, options);
-
-        events:
-        for (XMLEvent xe = xis.next(); xe != null; xe = xis.next()) {
-            switch (xe.getType()) {
-                case XMLEvent.START_DOCUMENT:
-                    StartDocument doc = (StartDocument) xe;
-
-                    systemId = doc.getSystemId();
-                    encoding = doc.getCharacterEncodingScheme();
-                    version = doc.getVersion();
-                    standAlone = doc.isStandalone();
-                    standAlone = doc.isStandalone();
-
-                    if (lineNums) {
-                        lineNumber(xe, context);
-                    }
-
-                    break;
-
-                case XMLEvent.END_DOCUMENT:
-                    if (lineNums) {
-                        lineNumber(xe, context);
-                    }
-
-                    break events;
-
-                case XMLEvent.NULL_ELEMENT:
-                    if (!xis.hasNext()) {
-                        break events;
-                    }
-                    break;
-
-                case XMLEvent.START_ELEMENT:
-                    context.startElement(XMLNameHelper.getQName(xe.getName()));
-
-                    if (lineNums) {
-                        lineNumber(xe, context);
-                    }
-
-                    for (AttributeIterator ai = ((StartElement) xe).getAttributes();
-                         ai.hasNext(); ) {
-                        Attribute attr = ai.next();
-
-                        context.attr(XMLNameHelper.getQName(attr.getName()),
-                            attr.getValue());
-                    }
-
-                    for (AttributeIterator ai = ((StartElement) xe).getNamespaces()
-                         ; ai.hasNext(); ) {
-                        Attribute attr = ai.next();
-
-                        XMLName name = attr.getName();
-                        String local = name.getLocalName();
-
-                        if (name.getPrefix() == null && local.equals("xmlns")) {
-                            local = "";
-                        }
-
-                        context.xmlns(local, attr.getValue());
-                    }
-
-                    break;
-
-                case XMLEvent.END_ELEMENT:
-                    context.endElement();
-
-                    if (lineNums) {
-                        lineNumber(xe, context);
-                    }
-
-                    break;
-
-                case XMLEvent.SPACE:
-                    if (((Space) xe).ignorable()) {
-                        break;
-                    }
-
-                    // Fall through
-
-                case XMLEvent.CHARACTER_DATA:
-                    CharacterData cd = (CharacterData) xe;
-
-                    if (cd.hasContent()) {
-                        context.text(cd.getContent());
-
-                        if (lineNums) {
-                            lineNumber(xe, context);
-                        }
-                    }
-
-                    break;
-
-                case XMLEvent.COMMENT:
-                    org.apache.xmlbeans.xml.stream.Comment comment =
-                        (org.apache.xmlbeans.xml.stream.Comment) xe;
-
-                    if (comment.hasContent()) {
-                        context.comment(comment.getContent());
-
-                        if (lineNums) {
-                            lineNumber(xe, context);
-                        }
-                    }
-
-                    break;
-
-                case XMLEvent.PROCESSING_INSTRUCTION:
-                    ProcessingInstruction procInstr = (ProcessingInstruction) xe;
-
-                    context.procInst(procInstr.getTarget(), procInstr.getData());
-
-                    if (lineNums) {
-                        lineNumber(xe, context);
-                    }
-
-                    break;
-
-                // These are ignored
-                case XMLEvent.ENTITY_REFERENCE:
-                case XMLEvent.START_PREFIX_MAPPING:
-                case XMLEvent.END_PREFIX_MAPPING:
-                case XMLEvent.CHANGE_PREFIX_MAPPING:
-                case XMLEvent.XML_EVENT:
-                    break;
-
-                default:
-                    throw new RuntimeException(
-                        "Unhandled xml event type: " + xe.getTypeAsString());
-            }
-        }
-
-        Cur c = context.finish();
-
-        associateSourceName(c, options);
-
-        XmlDocumentProperties props = getDocProps(c, true);
-
-        props.setDoctypeSystemId(systemId);
-        props.setEncoding(encoding);
-        props.setVersion(version);
-        props.setStandalone(standAlone);
-
-        return c;
-    }
-
     private Cur loadXMLStreamReader(XMLStreamReader xsr, XmlOptions options)
         throws XMLStreamException {
         options = XmlOptions.maskNull(options);
diff --git a/src/main/java/org/apache/xmlbeans/impl/store/Saver.java b/src/main/java/org/apache/xmlbeans/impl/store/Saver.java
index 4be88a5..4f5fc12 100755
--- a/src/main/java/org/apache/xmlbeans/impl/store/Saver.java
+++ b/src/main/java/org/apache/xmlbeans/impl/store/Saver.java
@@ -19,7 +19,10 @@
 import org.apache.xmlbeans.XmlDocumentProperties;
 import org.apache.xmlbeans.XmlOptionCharEscapeMap;
 import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.impl.common.*;
+import org.apache.xmlbeans.impl.common.EncodingMap;
+import org.apache.xmlbeans.impl.common.QNameHelper;
+import org.apache.xmlbeans.impl.common.XmlEventBase;
+import org.apache.xmlbeans.impl.common.XmlNameImpl;
 import org.apache.xmlbeans.xml.stream.CharacterData;
 import org.apache.xmlbeans.xml.stream.*;
 import org.xml.sax.ContentHandler;
@@ -118,7 +121,8 @@
             SynthNamespaceSaver saver = new SynthNamespaceSaver(c, options);
 
             //noinspection StatementWithEmptyBody
-            while (saver.process()) { }
+            while (saver.process()) {
+            }
 
             if (!saver._synthNamespaces.isEmpty()) {
                 _preComputedNamespaces = saver._synthNamespaces;
@@ -356,7 +360,8 @@
             if (docTypeName == null) {
                 _cur.push();
                 //noinspection StatementWithEmptyBody
-                while (!_cur.isElem() && _cur.next()) { }
+                while (!_cur.isElem() && _cur.next()) {
+                }
                 if (_cur.isElem()) {
                     docTypeName = _cur.getName().getLocalPart();
                 }
@@ -453,7 +458,7 @@
         // namespaces are mapped on the first container which has a name.
 
         if (_preComputedNamespaces != null) {
-            for (Map.Entry<String,String> entry : _preComputedNamespaces.entrySet()) {
+            for (Map.Entry<String, String> entry : _preComputedNamespaces.entrySet()) {
                 String uri = entry.getKey();
                 String prefix = entry.getValue();
                 boolean considerDefault = prefix.length() == 0 && !ensureDefaultEmpty;
@@ -792,7 +797,7 @@
         return _prefixMap.get(prefix);
     }
 
-    protected Map<String,String> getPrefixMap() {
+    protected Map<String, String> getPrefixMap() {
         return _prefixMap;
     }
 
@@ -801,7 +806,7 @@
     //
 
     static final class SynthNamespaceSaver extends Saver {
-        LinkedHashMap<String,String> _synthNamespaces = new LinkedHashMap<>();
+        LinkedHashMap<String, String> _synthNamespaces = new LinkedHashMap<>();
 
         SynthNamespaceSaver(Cur c, XmlOptions options) {
             super(c, options);
@@ -1730,7 +1735,8 @@
             // create a String!
 
             //noinspection StatementWithEmptyBody
-            while (process()) { }
+            while (process()) {
+            }
 
             assert _out == 0;
 
@@ -1788,7 +1794,8 @@
             try {
                 Saver saver = new OptimizedForSpeedSaver(cur, writer);
                 //noinspection StatementWithEmptyBody
-                while (saver.process()) { }
+                while (saver.process()) {
+                }
             } catch (SaverIOException e) {
                 throw (IOException) e.getCause();
             }
@@ -2816,7 +2823,7 @@
 
         private static class StartElementImpl
             extends XmlEventImpl implements StartElement {
-            StartElementImpl(XMLName name, AttributeImpl attributes, AttributeImpl namespaces, Map<String,String> prefixMap) {
+            StartElementImpl(XMLName name, AttributeImpl attributes, AttributeImpl namespaces, Map<String, String> prefixMap) {
                 super(XMLEvent.START_ELEMENT);
 
                 _name = name;
@@ -2859,7 +2866,7 @@
                 return _prefixMap.get(prefix == null ? "" : prefix);
             }
 
-            public Map<String,String> getNamespaceMap() {
+            public Map<String, String> getNamespaceMap() {
                 return _prefixMap;
             }
 
@@ -3002,7 +3009,7 @@
             }
 
             private final XMLName _name;
-            private final Map<String,String> _prefixMap;
+            private final Map<String, String> _prefixMap;
 
             private final AttributeImpl _attributes;
             private final AttributeImpl _namespaces;
@@ -3153,24 +3160,6 @@
         private XmlEventImpl _in, _out;
     }
 
-    static final class XmlInputStreamImpl extends GenericXmlInputStream {
-        XmlInputStreamImpl(Cur cur, XmlOptions options) {
-            _xmlInputStreamSaver =
-                new XmlInputStreamSaver(cur, options);
-
-            // Make the saver grind away just a bit to throw any exceptions
-            // related to the inability to create a stream on this xml
-
-            _xmlInputStreamSaver.process();
-        }
-
-        protected XMLEvent nextEvent() {
-            return _xmlInputStreamSaver.dequeue();
-        }
-
-        private final XmlInputStreamSaver _xmlInputStreamSaver;
-    }
-
     static final class SaxSaver extends Saver {
         SaxSaver(Cur c, XmlOptions options, ContentHandler ch, LexicalHandler lh)
             throws SAXException {
@@ -3186,7 +3175,8 @@
 
             try {
                 //noinspection StatementWithEmptyBody
-                while (process()) { }
+                while (process()) {
+                }
             } catch (SaverSAXException e) {
                 throw e._saxException;
             }
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 6a6a920..041cf9e 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/SchemaCompiler.java
@@ -52,7 +52,6 @@
         System.out.println("    -novdoc - do not validate contents of <documentation>");
         System.out.println("    -noext - ignore all extension (Pre/Post and Interface) found in .xsdconfig files");
         System.out.println("    -compiler - path to external java compiler");
-        System.out.println("    -javasource [version] - generate java source compatible for a Java version (1.4 or 1.5)");
         System.out.println("    -ms - initial memory for external java compiler (default '" + CodeGenUtil.DEFAULT_MEM_START + "')");
         System.out.println("    -mx - maximum memory for external java compiler (default '" + CodeGenUtil.DEFAULT_MEM_MAX + "')");
         System.out.println("    -debug - compile with debug symbols");
@@ -102,7 +101,6 @@
         opts.add("d");
         opts.add("cp");
         opts.add("compiler");
-        opts.add("javasource");
         opts.add("jar"); // deprecated
         opts.add("ms");
         opts.add("mx");
@@ -273,7 +271,6 @@
             classpath = CodeGenUtil.systemClasspath();
         }
 
-        String javasource = cl.getOpt("javasource");
         String compiler = cl.getOpt("compiler");
         String jar = cl.getOpt("jar");
         if (verbose && jar != null) {
@@ -313,7 +310,6 @@
         params.setSrcDir(src);
         params.setClassesDir(classes);
         params.setCompiler(compiler);
-        params.setJavaSource(javasource);
         params.setMemoryInitialSize(memoryInitialSize);
         params.setMemoryMaximumSize(memoryMaximumSize);
         params.setNojavac(nojavac);
@@ -361,7 +357,6 @@
         private String memoryInitialSize;
         private String memoryMaximumSize;
         private String compiler;
-        private String javasource;
         private boolean nojavac;
         private boolean quiet;
         private boolean verbose;
@@ -581,14 +576,6 @@
             this.compiler = compiler;
         }
 
-        public String getJavaSource() {
-            return javasource;
-        }
-
-        public void setJavaSource(String javasource) {
-            this.javasource = javasource;
-        }
-
         public Collection<XmlError> getErrorListener() {
             return errorListener;
         }
@@ -650,7 +637,7 @@
                                                    File[] javaFiles, ResourceLoader cpResourceLoader,
                                                    boolean download, boolean noUpa, boolean noPvr, boolean noAnn, boolean noVDoc, boolean noExt,
                                                    Set<String> mdefNamespaces, File baseDir, Map<String, String> sourcesToCopyMap,
-                                                   Collection<XmlError> outerErrorListener, File schemasDir, EntityResolver entResolver, File[] classpath, String javasource) {
+                                                   Collection<XmlError> outerErrorListener, File schemasDir, EntityResolver entResolver, File[] classpath) {
         XmlErrorWatcher errorListener = new XmlErrorWatcher(outerErrorListener);
 
         // construct the state (have to initialize early in case of errors)
@@ -818,9 +805,6 @@
             }
             opts.setCompileNoValidation(); // already validated here
             opts.setEntityResolver(entResolver);
-            if (javasource != null) {
-                opts.setGenerateJavaVersion(javasource);
-            }
 
             // now pass it to the main compile function
             SchemaTypeSystemCompiler.Parameters params = new SchemaTypeSystemCompiler.Parameters();
@@ -895,7 +879,6 @@
         File srcDir = params.getSrcDir();
         File classesDir = params.getClassesDir();
         String compiler = params.getCompiler();
-        String javasource = params.getJavaSource();
         String memoryInitialSize = params.getMemoryInitialSize();
         String memoryMaximumSize = params.getMemoryMaximumSize();
         boolean nojavac = params.isNojavac();
@@ -961,7 +944,7 @@
         XmlErrorWatcher errorListener = new XmlErrorWatcher(outerErrorListener);
         SchemaTypeSystem system = loadTypeSystem(name, xsdFiles, wsdlFiles, urlFiles, configFiles,
             javaFiles, cpResourceLoader, download, noUpa, noPvr, noAnn, noVDoc, noExt, mdefNamespaces,
-            baseDir, sourcesToCopyMap, errorListener, schemasDir, cmdLineEntRes, classpath, javasource);
+            baseDir, sourcesToCopyMap, errorListener, schemasDir, cmdLineEntRes, classpath);
         if (errorListener.hasError()) {
             result = false;
         }
@@ -984,9 +967,6 @@
             if (codePrinter != null) {
                 options.setSchemaCodePrinter(codePrinter);
             }
-            if (javasource != null) {
-                options.setGenerateJavaVersion(javasource);
-            }
 
             // save .xsb files
             system.save(filer);
@@ -1016,7 +996,7 @@
                 if (javaFiles != null) {
                     sourcefiles.addAll(java.util.Arrays.asList(javaFiles));
                 }
-                if (!CodeGenUtil.externalCompile(sourcefiles, classesDir, classpath, debug, compiler, javasource, memoryInitialSize, memoryMaximumSize, quiet, verbose)) {
+                if (!CodeGenUtil.externalCompile(sourcefiles, classesDir, classpath, debug, compiler, memoryInitialSize, memoryMaximumSize, quiet, verbose)) {
                     result = false;
                 }
 
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 2c28290..bd7dd10 100644
--- a/src/main/java/org/apache/xmlbeans/impl/tool/XMLBean.java
+++ b/src/main/java/org/apache/xmlbeans/impl/tool/XMLBean.java
@@ -15,28 +15,27 @@
 
 package org.apache.xmlbeans.impl.tool;
 
-import org.apache.tools.ant.types.Path;
-import org.apache.tools.ant.types.FileSet;
-import org.apache.tools.ant.types.Reference;
-import org.apache.tools.ant.taskdefs.MatchingTask;
-import org.apache.tools.ant.taskdefs.Javac;
-import org.apache.tools.ant.taskdefs.Jar;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.FileScanner;
 import org.apache.tools.ant.Project;
-
-import java.io.File;
-import java.io.StringWriter;
-import java.io.PrintWriter;
-import java.util.*;
-import java.net.URI;
-
+import org.apache.tools.ant.taskdefs.Jar;
+import org.apache.tools.ant.taskdefs.Javac;
+import org.apache.tools.ant.taskdefs.MatchingTask;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.types.Reference;
 import org.apache.xmlbeans.XmlError;
 import org.apache.xmlbeans.impl.common.IOUtil;
 
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URI;
+import java.util.*;
+
 /**
  * Modeled after Ant's javac and zip tasks.
- *
+ * <p>
  * Schema files to process, or directories of schema files, are set with the 'schema'
  * attribute, and can be filtered with 'includes' and 'excludes'.
  * Alternatively, one or more nested &lt;fileset&gt; elements can specify the
@@ -46,104 +45,93 @@
  * for instructions on FileSets if you are unfamiliar with their usage.
  */
 
-public class XMLBean extends MatchingTask
-{
-    private ArrayList   schemas = new ArrayList();
+public class XMLBean extends MatchingTask {
+    private final List<FileSet> schemas = new ArrayList<>();
 
-    private Set         mdefnamespaces;
+    private Set<String> mdefnamespaces;
 
-    private Path        classpath;
+    private Path classpath;
 
-    private File        destfile,
-                        schema,
-                        srcgendir,
-                        classgendir;
+    private File destfile,
+        schema,
+        srcgendir,
+        classgendir;
 
-    private boolean     quiet,
-                        verbose,
-                        debug,
-                        optimize,
-                        download,
-                        srconly,
-                        noupa,
-                        nopvr,
-                        noann,
-                        novdoc,
-                        noext = false,
-                        failonerror = true,
-                        fork = true,
-                        includeAntRuntime = true,
-                        noSrcRegen,
-                        includeJavaRuntime = false,
-                        nowarn = false;
+    private boolean quiet,
+        verbose,
+        debug,
+        optimize,
+        download,
+        srconly,
+        noupa,
+        nopvr,
+        noann,
+        novdoc,
+        noext = false,
+        failonerror = true,
+        fork = true,
+        includeAntRuntime = true,
+        noSrcRegen,
+        includeJavaRuntime = false,
+        nowarn = false;
 
-    private String      typesystemname,
-                        forkedExecutable,
-                        compiler,
-                        debugLevel,
-                        memoryInitialSize,
-                        memoryMaximumSize,
-                        catalog,
-                        javasource,
-                        repackage;
+    private String typesystemname,
+        forkedExecutable,
+        compiler,
+        debugLevel,
+        memoryInitialSize,
+        memoryMaximumSize,
+        catalog,
+        repackage;
 
-    private List        extensions = new ArrayList();
+    private final List<Extension> extensions = new ArrayList<>();
 
-    private HashMap     _extRouter = new HashMap(5);
+    private final Map<String, Set<File>> _extRouter = new HashMap<>(5);
 
     private static final String XSD = ".xsd",
-                                WSDL = ".wsdl",
-                                JAVA = ".java",
-                                XSDCONFIG = ".xsdconfig";
+        WSDL = ".wsdl",
+        JAVA = ".java",
+        XSDCONFIG = ".xsdconfig";
 
 
-    public void execute() throws BuildException
-    {
+    public void execute() throws BuildException {
         /* VALIDATION */
         //required
         if (schemas.size() == 0
             && schema == null
-            && fileset.getDir(project) == null)
-        {
+            && fileset.getDir(project) == null) {
             String msg = "The 'schema' or 'dir' attribute or a nested fileset is required.";
-            if (failonerror)
+            if (failonerror) {
                 throw new BuildException(msg);
-            else
-            {
+            } else {
                 log(msg, Project.MSG_ERR);
                 return;
             }
         }
 
-        _extRouter.put(XSD, new HashSet());
-        _extRouter.put(WSDL, new HashSet());
-        _extRouter.put(JAVA, new HashSet());
-        _extRouter.put(XSDCONFIG, new HashSet());
+        _extRouter.put(XSD, new HashSet<>());
+        _extRouter.put(WSDL, new HashSet<>());
+        _extRouter.put(JAVA, new HashSet<>());
+        _extRouter.put(XSDCONFIG, new HashSet<>());
 
         File theBasedir = schema;
 
-        if (schema != null)
-        {
-            if (schema.isDirectory())
-            {
+        if (schema != null) {
+            if (schema.isDirectory()) {
                 FileScanner scanner = getDirectoryScanner(schema);
                 String[] paths = scanner.getIncludedFiles();
                 processPaths(paths, scanner.getBasedir());
-            }
-            else
-            {
+            } else {
                 theBasedir = schema.getParentFile();
-                processPaths(new String[] { schema.getName() }, theBasedir);
+                processPaths(new String[]{schema.getName()}, theBasedir);
             }
         }
 
-        if (fileset.getDir(project) != null)
+        if (fileset.getDir(project) != null) {
             schemas.add(fileset);
+        }
 
-        Iterator si = schemas.iterator();
-        while (si.hasNext())
-        {
-            FileSet fs = (FileSet) si.next();
+        for (FileSet fs : schemas) {
             FileScanner scanner = fs.getDirectoryScanner(project);
             File basedir = scanner.getBasedir();
             String[] paths = scanner.getIncludedFiles();
@@ -151,54 +139,55 @@
             processPaths(paths, basedir);
         }
 
-        Set xsdList = (Set) _extRouter.get(XSD);
-        Set wsdlList = (Set) _extRouter.get(WSDL);
+        Set<File> xsdList = _extRouter.get(XSD);
+        Set<File> wsdlList = _extRouter.get(WSDL);
 
-        if (xsdList.size() + wsdlList.size() == 0)
-        {
+        if (xsdList.size() + wsdlList.size() == 0) {
             log("Could not find any xsd or wsdl files to process.", Project.MSG_WARN);
             return;
         }
 
         //optional
-        Set javaList = (Set) _extRouter.get(JAVA);
-        Set xsdconfigList = (Set) _extRouter.get(XSDCONFIG);
+        Set<File> javaList = _extRouter.get(JAVA);
+        Set<File> xsdconfigList = _extRouter.get(XSDCONFIG);
 
-        if (srcgendir == null && srconly)
+        if (srcgendir == null && srconly) {
             srcgendir = classgendir;
+        }
 
-        if (destfile == null && classgendir == null && ! srconly)
+        if (destfile == null && classgendir == null && !srconly) {
             destfile = new File("xmltypes.jar");
+        }
 
-        if (verbose)
+        if (verbose) {
             quiet = false;
+        }
 
         /* EXECUTION */
 
-        File[] xsdArray = (File[]) xsdList.toArray(new File[xsdList.size()]);
-        File[] wsdlArray = (File[]) wsdlList.toArray(new File[wsdlList.size()]);
-        File[] javaArray = (File[]) javaList.toArray(new File[javaList.size()]);
-        File[] xsdconfigArray = (File[]) xsdconfigList.toArray(new File[xsdconfigList.size()]);
+        File[] xsdArray = xsdList.toArray(new File[0]);
+        File[] wsdlArray = wsdlList.toArray(new File[0]);
+        File[] javaArray = javaList.toArray(new File[0]);
+        File[] xsdconfigArray = xsdconfigList.toArray(new File[0]);
         ErrorLogger err = new ErrorLogger(verbose);
 
         boolean success = false;
 
-        try
-        {
+        try {
             // create a temp directory
             File tmpdir = null;
-            if (srcgendir == null || classgendir == null)
-            {
+            if (srcgendir == null || classgendir == null) {
                 tmpdir = SchemaCodeGenerator.createTempDir();
             }
-            if (srcgendir == null)
+            if (srcgendir == null) {
                 srcgendir = IOUtil.createDir(tmpdir, "src");
-            if (classgendir == null)
+            }
+            if (classgendir == null) {
                 classgendir = IOUtil.createDir(tmpdir, "classes");
+            }
 
             // use the system classpath if user didn't provide any
-            if (classpath == null)
-            {
+            if (classpath == null) {
                 classpath = new Path(project);
                 classpath.concatSystemClasspath();
             }
@@ -209,8 +198,9 @@
 
             String[] paths = classpath.list();
             File[] cp = new File[paths.length];
-            for (int i = 0; i < paths.length; i++)
+            for (int i = 0; i < paths.length; i++) {
                 cp[i] = new File(paths[i]);
+            }
 
             // generate the source
             SchemaCompiler.Parameters params = new SchemaCompiler.Parameters();
@@ -238,7 +228,6 @@
             params.setNoAnn(noann);
             params.setNoVDoc(novdoc);
             params.setNoExt(noext);
-            params.setJavaSource(javasource);
             params.setRepackage(repackage);
             success = SchemaCompiler.compile(params);
 
@@ -250,39 +239,39 @@
                 javac.setProject(project);
                 javac.setTaskName(getTaskName());
                 javac.setClasspath(classpath);
-                if (compiler != null) javac.setCompiler(compiler);
+                if (compiler != null) {
+                    javac.setCompiler(compiler);
+                }
                 javac.setDebug(debug);
-                if (debugLevel != null) javac.setDebugLevel(debugLevel);
+                if (debugLevel != null) {
+                    javac.setDebugLevel(debugLevel);
+                }
                 javac.setDestdir(classgendir);
                 javac.setExecutable(forkedExecutable);
                 javac.setFailonerror(failonerror);
                 javac.setFork(fork);
-                if (javasource != null)
-                {
-                    javac.setSource(javasource);
-                    javac.setTarget(javasource);
-                }
-                else
-                {
-                    javac.setSource("1.4");
-                    javac.setTarget("1.4");
-                }
+                javac.setSource("1.8");
+                javac.setTarget("1.8");
                 javac.setIncludeantruntime(includeAntRuntime);
                 javac.setIncludejavaruntime(includeJavaRuntime);
                 javac.setNowarn(nowarn);
                 javac.setSrcdir(new Path(project, srcgendir.getAbsolutePath()));
-                if (memoryInitialSize != null) javac.setMemoryInitialSize(memoryInitialSize);
-                if (memoryMaximumSize != null) javac.setMemoryMaximumSize(memoryMaximumSize);
+                if (memoryInitialSize != null) {
+                    javac.setMemoryInitialSize(memoryInitialSize);
+                }
+                if (memoryMaximumSize != null) {
+                    javac.setMemoryMaximumSize(memoryMaximumSize);
+                }
                 javac.setOptimize(optimize);
                 javac.setVerbose(verbose);
                 javac.execute();
 
                 long finish = System.currentTimeMillis();
-                if (!quiet)
-                    log("Time to compile code: " + ((double)(finish - start) / 1000.0) + " seconds");
+                if (!quiet) {
+                    log("Time to compile code: " + ((double) (finish - start) / 1000.0) + " seconds");
+                }
 
-                if (destfile != null)
-                {
+                if (destfile != null) {
                     // jar the compiled classes
                     Jar jar = new Jar();
                     jar.setProject(project);
@@ -296,17 +285,14 @@
             if (tmpdir != null) {
                 SchemaCodeGenerator.tryHardToDelete(tmpdir);
             }
-        }
-        catch (BuildException e)
-        {
+        } catch (BuildException e) {
             // re-throw anything thrown from javac or jar task
             throw e;
-        }
-        catch (Throwable e)
-        {
+        } catch (Throwable e) {
             //interrupted means cancel
-            if (e instanceof InterruptedException || failonerror)
+            if (e instanceof InterruptedException || failonerror) {
                 throw new BuildException(e);
+            }
 
             log("Exception while building schemas: " + e.getMessage(), Project.MSG_ERR);
             StringWriter sw = new StringWriter();
@@ -314,36 +300,32 @@
             log(sw.toString(), Project.MSG_VERBOSE);
         }
 
-        if (!success && failonerror)
+        if (!success && failonerror) {
             throw new BuildException(); //stop the build
+        }
     }
 
-    private void processPaths(String[] paths, File baseDir)
-    {
-        for (int i = 0; i < paths.length; i++)
-        {
-            int dot = paths[i].lastIndexOf('.');
-            if (dot > -1)
-            {
-                String path = paths[i];
-                String possExt = path.substring(dot).toLowerCase();
-                Set set = (Set) _extRouter.get(possExt);
+    private void processPaths(String[] paths, File baseDir) {
+        for (String s : paths) {
+            int dot = s.lastIndexOf('.');
+            if (dot > -1) {
+                String possExt = s.substring(dot).toLowerCase();
+                Set<File> set = _extRouter.get(possExt);
 
-                if (set != null)
-                    set.add(new File(baseDir, path));
+                if (set != null) {
+                    set.add(new File(baseDir, s));
+                }
             }
         }
     }
 
-    public void addFileset(FileSet fileset)
-    {
+    public void addFileset(FileSet fileset) {
         schemas.add(fileset);
     }
 
     /////////////////////////////
     //Getter/Setters
-    public File getSchema()
-    {
+    public File getSchema() {
         return schema;
     }
 
@@ -351,10 +333,10 @@
      * A file that points to either an individual schema file or a directory of files.
      * It is optional only if one or more &lt;fileset&gt; elements are nested in this
      * task.
+     *
      * @param schema Required, unless a fileset element is nested.
      */
-    public void setSchema(File schema)
-    {
+    public void setSchema(File schema) {
         this.schema = schema;
     }
 
@@ -362,14 +344,15 @@
      * The classpath to use if schemas in the fileset import definitions that are
      * supplied by other compiled xml beans JAR files, or if .java files are in the
      * schema fileset.
+     *
      * @param classpath Optional.
      */
-    public void setClasspath(Path classpath)
-    {
-        if (this.classpath != null)
+    public void setClasspath(Path classpath) {
+        if (this.classpath != null) {
             this.classpath.append(classpath);
-        else
+        } else {
             this.classpath = classpath;
+        }
     }
 
     /**
@@ -384,23 +367,22 @@
 
     /**
      * Adds a reference to a classpath defined elsewhere.
+     *
      * @param classpathref Optional.
      */
-    public void setClasspathRef(Reference classpathref)
-    {
-        if (classpath == null)
+    public void setClasspathRef(Reference classpathref) {
+        if (classpath == null) {
             classpath = new Path(project);
+        }
 
         classpath.createPath().setRefid(classpathref);
     }
 
-    public Path getClasspath()
-    {
+    public Path getClasspath() {
         return classpath;
     }
 
-    public File getDestfile()
-    {
+    public File getDestfile() {
         return destfile;
     }
 
@@ -408,40 +390,38 @@
      * Define the name of the jar file created.  For instance, "myXMLBean.jar"
      * will output the results of this task into a jar with the same name.
      * Optional, defaults to "xmltypes.jar".
+     *
      * @param destfile Optional.
      */
-    public void setDestfile(File destfile)
-    {
+    public void setDestfile(File destfile) {
         this.destfile = destfile;
     }
 
-    public File getSrcgendir()
-    {
+    public File getSrcgendir() {
         return srcgendir;
     }
 
     /**
      * Set a location to generate .java files into.  Optional, defaults to
      * a temp dir.
+     *
      * @param srcgendir Optional.
      */
-    public void setSrcgendir(File srcgendir)
-    {
+    public void setSrcgendir(File srcgendir) {
         this.srcgendir = srcgendir;
     }
 
-    public File getClassgendir()
-    {
+    public File getClassgendir() {
         return classgendir;
     }
 
     /**
      * Set a location to generate .class files into.  Optional, defaults to
      * a temp dir.
+     *
      * @param classgendir Optional.
      */
-    public void setClassgendir(File classgendir)
-    {
+    public void setClassgendir(File classgendir) {
         this.classgendir = classgendir;
     }
 
@@ -450,13 +430,11 @@
      *
      * @since Ant 1.5
      */
-    public void setCompiler(String compiler)
-    {
+    public void setCompiler(String compiler) {
         this.compiler = compiler;
     }
 
-    public boolean isDownload()
-    {
+    public boolean isDownload() {
         return download;
     }
 
@@ -464,10 +442,10 @@
      * Set to true to permit the compiler to download URLs for imports
      * and includes.  Defaults to false, meaning all imports and includes
      * must be copied locally.
+     *
      * @param download Optional.
      */
-    public void setDownload(boolean download)
-    {
+    public void setDownload(boolean download) {
         this.download = download;
     }
 
@@ -478,46 +456,46 @@
         this.optimize = optimize;
     }
 
-    /** Gets the optimize flag. */
+    /**
+     * Gets the optimize flag.
+     */
     public boolean getOptimize() {
         return optimize;
     }
 
-    public boolean isVerbose()
-    {
+    public boolean isVerbose() {
         return verbose;
     }
 
     /**
      * Controls the amount of output.  Defaults to true.
+     *
      * @param verbose Optional.
      */
-    public void setVerbose(boolean verbose)
-    {
+    public void setVerbose(boolean verbose) {
         this.verbose = verbose;
     }
 
-    public boolean isQuiet()
-    {
+    public boolean isQuiet() {
         return quiet;
     }
 
     /**
      * Controls the amount of output.  Defaults to false.
+     *
      * @param quiet Optional.
      */
-    public void setQuiet(boolean quiet)
-    {
+    public void setQuiet(boolean quiet) {
         this.quiet = quiet;
     }
 
-    public boolean isDebug()
-    {
+    public boolean isDebug() {
         return debug;
     }
 
     /**
      * Get the value of debugLevel.
+     *
      * @return value of debugLevel.
      */
     public String getDebugLevel() {
@@ -526,7 +504,7 @@
 
     /**
      * Keyword list to be appended to the -g command-line switch.
-     *
+     * <p>
      * This will be ignored by all implementations except modern
      * and classic(ver >= 1.2). Legal values are none or a
      * comma-separated list of the following keywords: lines, vars,
@@ -534,18 +512,18 @@
      * will be appended to -g. If debug is not turned on, this attribute
      * will be ignored.
      *
-     * @param v  Value to assign to debugLevel.
+     * @param v Value to assign to debugLevel.
      */
-    public void setDebugLevel(String  v) {
+    public void setDebugLevel(String v) {
         this.debugLevel = v;
     }
 
     /**
      * Generate debugging symbols.
+     *
      * @param debug Optional.
      */
-    public void setDebug(boolean debug)
-    {
+    public void setDebug(boolean debug) {
         this.debug = debug;
     }
 
@@ -572,29 +550,27 @@
         return forkedExecutable;
     }
 
-    public boolean isSrconly()
-    {
+    public boolean isSrconly() {
         return srconly;
     }
 
     /**
      * A value of true means that only source will be generated.  Optional,
      * default is false.
+     *
      * @param srconly Optional.
      */
-    public void setSrconly(boolean srconly)
-    {
+    public void setSrconly(boolean srconly) {
         this.srconly = srconly;
     }
 
-    public String getTypesystemname()
-    {
+    public String getTypesystemname() {
         return typesystemname;
     }
 
     /**
      * One or more SchemaCompiler extensions can be passed in via the &lt;extension> subelement.
-     *  Schema Compiler extensions must implement the interface com.xbean.too.SchemaCompilerExtension
+     * Schema Compiler extensions must implement the interface com.xbean.too.SchemaCompilerExtension
      */
     public Extension createExtension() {
         Extension e = new Extension();
@@ -607,28 +583,17 @@
      * can be passed in via the &lt;ignoreDuplicatesInNamespaces> subelement.
      */
     public void setIgnoreDuplicatesInNamespaces(String namespaces) {
-        mdefnamespaces = new HashSet();
+        mdefnamespaces = new HashSet<>();
         StringTokenizer st = new StringTokenizer(namespaces, ",");
-        while (st.hasMoreTokens())
-        {
-          String namespace = st.nextToken().trim();
-          mdefnamespaces.add(namespace);
+        while (st.hasMoreTokens()) {
+            String namespace = st.nextToken().trim();
+            mdefnamespaces.add(namespace);
         }
     }
 
     public String getIgnoreDuplicatesInNamespaces() {
-        if (mdefnamespaces == null) {
-            return null;
-        }
-        StringBuilder buf = new StringBuilder();
-        Iterator i = mdefnamespaces.iterator();
-        while (i.hasNext()) {
-            buf.append((String)i.next());
-            if (i.hasNext()) {
-                buf.append(",");
-            }
-        }
-        return buf.toString();
+        return mdefnamespaces == null ? null : String.join(",", mdefnamespaces);
+
     }
 
     /**
@@ -636,193 +601,158 @@
      * generated in. Normally this should be left unspecified.  None of
      * the xml beans are generated in this package.
      * <BR><BR>Use .xsdconfig files to modify xml bean package or class names.
+     *
      * @param typesystemname Optional.
      */
-    public void setTypesystemname(String typesystemname)
-    {
+    public void setTypesystemname(String typesystemname) {
         this.typesystemname = typesystemname;
     }
 
-    public boolean isFailonerror()
-    {
+    public boolean isFailonerror() {
         return failonerror;
     }
 
     /**
      * Determines whether or not the ant target will continue if the XMLBean
      * creation encounters a build error.  Defaults to true.  Optional.
+     *
      * @param failonerror Optional.
      */
-    public void setFailonerror(boolean failonerror)
-    {
+    public void setFailonerror(boolean failonerror) {
         this.failonerror = failonerror;
     }
 
-    public boolean isIncludeAntRuntime()
-    {
+    public boolean isIncludeAntRuntime() {
         return includeAntRuntime;
     }
 
-    public void setIncludeAntRuntime(boolean includeAntRuntime)
-    {
+    public void setIncludeAntRuntime(boolean includeAntRuntime) {
         this.includeAntRuntime = includeAntRuntime;
     }
 
-    public boolean isIncludeJavaRuntime()
-    {
+    public boolean isIncludeJavaRuntime() {
         return includeJavaRuntime;
     }
 
-    public void setIncludeJavaRuntime(boolean includeJavaRuntime)
-    {
+    public void setIncludeJavaRuntime(boolean includeJavaRuntime) {
         this.includeJavaRuntime = includeJavaRuntime;
     }
 
-    public boolean isNowarn()
-    {
+    public boolean isNowarn() {
         return nowarn;
     }
 
-    public void setNowarn(boolean nowarn)
-    {
+    public void setNowarn(boolean nowarn) {
         this.nowarn = nowarn;
     }
 
-    public boolean isNoSrcRegen()
-    {
+    public boolean isNoSrcRegen() {
         return noSrcRegen;
     }
 
-    public void setNoSrcRegen(boolean noSrcRegen)
-    {
+    public void setNoSrcRegen(boolean noSrcRegen) {
         this.noSrcRegen = noSrcRegen;
     }
 
     /**
      * Set the initial memory size of the underlying javac process.
      */
-    public String getMemoryInitialSize()
-    {
+    public String getMemoryInitialSize() {
         return memoryInitialSize;
     }
 
-    public void setMemoryInitialSize(String memoryInitialSize)
-    {
+    public void setMemoryInitialSize(String memoryInitialSize) {
         this.memoryInitialSize = memoryInitialSize;
     }
 
     /**
      * Set the maximum memory size of the underlying javac process.
      */
-    public String getMemoryMaximumSize()
-    {
+    public String getMemoryMaximumSize() {
         return memoryMaximumSize;
     }
 
-    public void setMemoryMaximumSize(String memoryMaximumSize)
-    {
+    public void setMemoryMaximumSize(String memoryMaximumSize) {
         this.memoryMaximumSize = memoryMaximumSize;
     }
 
     /**
      * Do not enforce the unique particle attribution rule.
      */
-    public void setNoUpa(boolean noupa)
-    {
+    public void setNoUpa(boolean noupa) {
         this.noupa = noupa;
     }
 
-    public boolean isNoUpa()
-    {
+    public boolean isNoUpa() {
         return noupa;
     }
 
     /**
      * Do not enforce the particle valid (restriction) rule.
      */
-    public void setNoPvr(boolean nopvr)
-    {
+    public void setNoPvr(boolean nopvr) {
         this.nopvr = nopvr;
     }
 
-    public boolean isNoPvr()
-    {
+    public boolean isNoPvr() {
         return nopvr;
     }
 
     /**
      * Skip over schema &lt;annotation%gt; elements.
      */
-    public void setNoAnnotations(boolean noann)
-    {
+    public void setNoAnnotations(boolean noann) {
         this.noann = noann;
     }
 
-    public boolean isNoAnnotations()
-    {
+    public boolean isNoAnnotations() {
         return noann;
     }
 
     /**
      * Do not validate the contents of schema &lt;documentation&gt; elements.
      */
-    public void setNoValidateDoc(boolean novdoc)
-    {
+    public void setNoValidateDoc(boolean novdoc) {
         this.novdoc = novdoc;
     }
 
-    public boolean isNoValidateDoc()
-    {
+    public boolean isNoValidateDoc() {
         return novdoc;
     }
 
     /**
      * Ignore extensions found in .xsdconfig files
-     * @param novdoc
+     *
+     * @param noext Ignore extensions
      */
-    public void setNoExt(boolean noext)
-    {
+    public void setNoExt(boolean noext) {
         this.noext = noext;
     }
 
-    public boolean isNoExt()
-    {
+    public boolean isNoExt() {
         return noext;
     }
 
-    /**
-     * Generate java source compatible with the given version.  Currently,
-     * only "1.4" or "1.5" are supported and "1.4" is the default.
-     */
-    public void setJavaSource(String javasource)
-    {
-        this.javasource = javasource;
-    }
+    //REVIEW this allows people to deal with the case where they drag in
+    //more files for compilation than they should.  not sure if this is
+    //a good thing or not
+    private String source = null;
 
-    public String getJavaSource()
-    {
-        return javasource;
+    public void setSource(String s) {
+        source = s;
     }
 
-  //REVIEW this allows people to deal with the case where they drag in
-  //more files for compilation than they should.  not sure if this is
-  //a good thing or not
-  private String source = null;
-  public void setSource(String s) { source = s; }
-
     /**
      * Gets the XML Catalog file for org.apache.xml.resolver.tools.CatalogResolver. (Note: needs resolver.jar from http://xml.apache.org/commons/components/resolver/index.html)
      */
-    public String getCatalog()
-    {
+    public String getCatalog() {
         return catalog;
     }
 
     /**
      * Sets the XML Catalog file for org.apache.xml.resolver.tools.CatalogResolver. (Note: needs resolver.jar from http://xml.apache.org/commons/components/resolver/index.html)
      */
-    public void setCatalog(String catalog)
-    {
+    public void setCatalog(String catalog) {
         this.catalog = catalog;
     }
 
@@ -834,17 +764,14 @@
         this.repackage = repackage;
     }
 
-    private static URI uriFromFile(File f)
-    {
-        if (f == null)
+    private static URI uriFromFile(File f) {
+        if (f == null) {
             return null;
-
-        try
-        {
-            return f.getCanonicalFile().toURI();
         }
-        catch(java.io.IOException e)
-        {
+
+        try {
+            return f.getCanonicalFile().toURI();
+        } catch (java.io.IOException e) {
             // Don't spit out an exception here because on Windows you'll get one
             // if the filename is "aux", "lpt1", etc. It's the caller's responsibility
             // to deal with those cases correctly, usually by calling FileSvc.invalidPathCheck()
@@ -853,39 +780,31 @@
         }
     }
 
-    public class ErrorLogger extends AbstractCollection
-    {
-        private boolean _noisy;
-        private URI _baseURI;
+    public class ErrorLogger extends AbstractCollection<XmlError> {
+        private final boolean _noisy;
+        private final URI _baseURI;
 
-        public ErrorLogger(boolean noisy)
-        {
+        public ErrorLogger(boolean noisy) {
             _noisy = noisy;
             _baseURI = uriFromFile(project.getBaseDir());
         }
 
-        public boolean add(Object o)
-        {
-            if (o instanceof XmlError)
-            {
-                XmlError err = (XmlError)o;
-                if (err.getSeverity() == XmlError.SEVERITY_ERROR)
-                    log(err.toString(_baseURI), Project.MSG_ERR);
-                else if (err.getSeverity() == XmlError.SEVERITY_WARNING)
-                    log(err.toString(_baseURI), Project.MSG_WARN);
-                else if (_noisy)
-                    log(err.toString(_baseURI), Project.MSG_INFO);
+        public boolean add(XmlError err) {
+            if (err.getSeverity() == XmlError.SEVERITY_ERROR) {
+                log(err.toString(_baseURI), Project.MSG_ERR);
+            } else if (err.getSeverity() == XmlError.SEVERITY_WARNING) {
+                log(err.toString(_baseURI), Project.MSG_WARN);
+            } else if (_noisy) {
+                log(err.toString(_baseURI), Project.MSG_INFO);
             }
             return false;
         }
 
-        public Iterator iterator()
-        {
-            return Collections.EMPTY_LIST.iterator();
+        public Iterator<XmlError> iterator() {
+            return Collections.emptyIterator();
         }
 
-        public int size()
-        {
+        public int size() {
             return 0;
         }
     }
diff --git a/src/main/java/org/apache/xmlbeans/impl/validator/ValidatingXMLInputStream.java b/src/main/java/org/apache/xmlbeans/impl/validator/ValidatingXMLInputStream.java
deleted file mode 100644
index 3f5cc67..0000000
--- a/src/main/java/org/apache/xmlbeans/impl/validator/ValidatingXMLInputStream.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.xmlbeans.impl.validator;
-
-import org.apache.xmlbeans.*;
-import org.apache.xmlbeans.impl.common.GenericXmlInputStream;
-import org.apache.xmlbeans.impl.common.ValidatorListener;
-import org.apache.xmlbeans.impl.common.ValidatorListener.Event;
-import org.apache.xmlbeans.impl.common.XMLNameHelper;
-import org.apache.xmlbeans.impl.common.XmlWhitespace;
-import org.apache.xmlbeans.impl.schema.BuiltinSchemaTypeSystem;
-import org.apache.xmlbeans.xml.stream.CharacterData;
-import org.apache.xmlbeans.xml.stream.*;
-
-import javax.xml.namespace.QName;
-import java.util.AbstractCollection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
- */
-public final class ValidatingXMLInputStream
-    extends GenericXmlInputStream implements Event {
-    public ValidatingXMLInputStream(
-        XMLInputStream xis,
-        SchemaTypeLoader typeLoader, SchemaType sType, XmlOptions options)
-        throws XMLStreamException {
-        _source = xis;
-
-        // Figure out the root type
-
-        options = XmlOptions.maskNull(options);
-
-        SchemaType type = options.getDocumentType();
-
-        if (type == null) {
-            type = sType;
-        }
-
-        if (type == null) {
-            type = BuiltinSchemaTypeSystem.ST_ANY_TYPE;
-
-            xis = xis.getSubStream();
-
-            if (xis.skip(XMLEvent.START_ELEMENT)) {
-                SchemaType docType =
-                    typeLoader.findDocumentType(
-                        XMLNameHelper.getQName(xis.next().getName()));
-
-                if (docType != null) {
-                    type = docType;
-                }
-            }
-
-            xis.close();
-        }
-
-        // Create the validator
-
-        _validator =
-            new Validator(
-                type, null, typeLoader, options, new ExceptionXmlErrorListener());
-
-        nextEvent(ValidatorListener.BEGIN);
-    }
-
-    // TODO - this is the quick and dirty impl of streaming validation,
-    // may objects are created (like strings) which can be optimized
-
-    protected XMLEvent nextEvent() throws XMLStreamException {
-        XMLEvent e = _source.next();
-
-        if (e == null) {
-            if (!_finished) {
-                flushText();
-                nextEvent(ValidatorListener.END);
-                _finished = true;
-            }
-        } else {
-            switch (e.getType()) {
-                case XMLEvent.CHARACTER_DATA:
-                case XMLEvent.SPACE: {
-                    CharacterData cd = (CharacterData) e;
-
-                    if (cd.hasContent()) {
-                        _text.append(cd.getContent());
-                    }
-
-                    break;
-                }
-                case XMLEvent.START_ELEMENT: {
-                    StartElement se = (StartElement) e;
-
-                    flushText();
-
-                    // Used for prefix to namespace mapping
-                    _startElement = se;
-
-                    // Prepare the xsi:* values
-
-                    AttributeIterator attrs = se.getAttributes();
-
-                    while (attrs.hasNext()) {
-                        Attribute attr = attrs.next();
-
-                        XMLName attrName = attr.getName();
-
-                        if ("http://www.w3.org/2001/XMLSchema-instance".equals(
-                            attrName.getNamespaceUri())) {
-                            String local = attrName.getLocalName();
-
-                            if (local.equals("type")) {
-                                _xsiType = attr.getValue();
-                            } else if (local.equals("nil")) {
-                                _xsiNil = attr.getValue();
-                            } else if (local.equals("schemaLocation")) {
-                                _xsiLoc = attr.getValue();
-                            } else if (local.equals("noNamespaceSchemaLocation")) {
-                                _xsiNoLoc = attr.getValue();
-                            }
-                        }
-                    }
-
-                    // Emit the START
-
-                    // TODO - should delay the aquisition of the name
-                    _name = e.getName();
-
-                    nextEvent(ValidatorListener.BEGIN);
-
-                    // Emit the attrs
-
-                    attrs = se.getAttributes();
-
-                    while (attrs.hasNext()) {
-                        Attribute attr = attrs.next();
-
-                        XMLName attrName = attr.getName();
-
-                        if ("http://www.w3.org/2001/XMLSchema-instance".equals(
-                            attrName.getNamespaceUri())) {
-                            String local = attrName.getLocalName();
-
-                            if (local.equals("type")) {
-                                continue;
-                            } else if (local.equals("nil")) {
-                                continue;
-                            } else if (local.equals("schemaLocation")) {
-                                continue;
-                            } else if (local.equals("noNamespaceSchemaLocation")) {
-                                continue;
-                            }
-                        }
-
-                        // TODO - God, this is lame :-)
-
-                        _text.append(attr.getValue());
-                        _name = attr.getName();
-
-                        nextEvent(ValidatorListener.ATTR);
-                    }
-
-                    clearText();
-
-                    _startElement = null;
-
-                    break;
-                }
-
-                case XMLEvent.END_ELEMENT: {
-                    flushText();
-
-                    nextEvent(ValidatorListener.END);
-
-                    break;
-                }
-            }
-        }
-
-        return e;
-    }
-
-    private void clearText() {
-        _text.delete(0, _text.length());
-    }
-
-    private void flushText() throws XMLStreamException {
-        if (_text.length() > 0) {
-            nextEvent(ValidatorListener.TEXT);
-            clearText();
-        }
-    }
-
-    public String getNamespaceForPrefix(String prefix) {
-        if (_startElement == null) {
-            return null;
-        }
-
-        Map map = _startElement.getNamespaceMap();
-
-        if (map == null) {
-            return null;
-        }
-
-        return (String) map.get(prefix);
-    }
-
-    public XmlCursor getLocationAsCursor() {
-        return null;
-    }
-
-    public javax.xml.stream.Location getLocation() {
-        try {
-            final org.apache.xmlbeans.xml.stream.Location xeLoc = _source.peek().getLocation();
-
-            if (xeLoc == null) {
-                return null;
-            }
-
-            javax.xml.stream.Location loc = new javax.xml.stream.Location() {
-                public int getLineNumber() {
-                    return xeLoc.getLineNumber();
-                }
-
-                public int getColumnNumber() {
-                    return xeLoc.getColumnNumber();
-                }
-
-                public int getCharacterOffset() {
-                    return -1;
-                }
-
-                public String getPublicId() {
-                    return xeLoc.getPublicId();
-                }
-
-                public String getSystemId() {
-                    return xeLoc.getSystemId();
-                }
-            };
-
-            return loc;
-        } catch (XMLStreamException e) {
-            return null;
-        }
-    }
-
-    public String getXsiType() {
-        return _xsiType;
-    }
-
-    public String getXsiNil() {
-        return _xsiNil;
-    }
-
-    public String getXsiLoc() {
-        return _xsiLoc;
-    }
-
-    public String getXsiNoLoc() {
-        return _xsiNoLoc;
-    }
-
-    public QName getName() {
-        return XMLNameHelper.getQName(_name);
-    }
-
-    public String getText() {
-        return _text.toString();
-    }
-
-    public String getText(int wsr) {
-        return XmlWhitespace.collapse(_text.toString(), wsr);
-    }
-
-    public boolean textIsWhitespace() {
-        for (int i = 0; i < _text.length(); i++) {
-            switch (_text.charAt(i)) {
-                case ' ':
-                case '\n':
-                case '\r':
-                case '\t':
-                    break;
-
-                default:
-                    return false;
-            }
-        }
-
-        return true;
-    }
-
-    private final class ExceptionXmlErrorListener extends AbstractCollection {
-        public boolean add(Object o) {
-            assert ValidatingXMLInputStream.this._exception == null;
-
-            ValidatingXMLInputStream.this._exception =
-                new XMLStreamValidationException((XmlError) o);
-
-            return false;
-        }
-
-        public Iterator iterator() {
-            return Collections.EMPTY_LIST.iterator();
-        }
-
-        public int size() {
-            return 0;
-        }
-    }
-
-    private void nextEvent(int kind)
-        throws XMLStreamException {
-        assert _exception == null;
-
-        _validator.nextEvent(kind, this);
-
-        if (_exception != null) {
-            throw _exception;
-        }
-    }
-
-    private XMLStreamValidationException _exception;
-
-    private XMLInputStream _source;
-    private Validator _validator;
-    private StringBuilder _text = new StringBuilder();
-    private boolean _finished;
-    private String _xsiType;
-    private String _xsiNil;
-    private String _xsiLoc;
-    private String _xsiNoLoc;
-    private XMLName _name;
-    private StartElement _startElement;
-}
\ No newline at end of file
diff --git a/src/main/java/org/apache/xmlbeans/impl/values/XmlObjectBase.java b/src/main/java/org/apache/xmlbeans/impl/values/XmlObjectBase.java
index 5b23ff9..34a1494 100644
--- a/src/main/java/org/apache/xmlbeans/impl/values/XmlObjectBase.java
+++ b/src/main/java/org/apache/xmlbeans/impl/values/XmlObjectBase.java
@@ -20,7 +20,6 @@
 import org.apache.xmlbeans.impl.schema.SchemaTypeImpl;
 import org.apache.xmlbeans.impl.schema.SchemaTypeVisitorImpl;
 import org.apache.xmlbeans.impl.validator.Validator;
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
 import org.w3c.dom.Node;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -130,25 +129,6 @@
         }
     }
 
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream newXMLInputStream() {
-        return newXMLInputStream(null);
-    }
-
-    /**
-     * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-     */
-    public XMLInputStream newXMLInputStream(XmlOptions options) {
-        XmlCursor cur = newCursorForce();
-        try {
-            return cur.newXMLInputStream(makeInnerOptions(options));
-        } finally {
-            cur.dispose();
-        }
-    }
-
     public XMLStreamReader newXMLStreamReader() {
         return newXMLStreamReader(null);
     }
@@ -3476,7 +3456,7 @@
             List<XmlObjectBase> targetList = getBaseArray(elementName);
             boolean[] result = new boolean[targetList.size()];
             for (int i = 0; i < result.length; i++) {
-                result[i] = ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getBooleanValue();
+                result[i] = ((org.apache.xmlbeans.SimpleValue) targetList.get(i)).getBooleanValue();
             }
             return result;
         }
@@ -3487,7 +3467,7 @@
             List<XmlObjectBase> targetList = getBaseArray(elementName);
             float[] result = new float[targetList.size()];
             for (int i = 0; i < result.length; i++) {
-                result[i] = ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getFloatValue();
+                result[i] = ((org.apache.xmlbeans.SimpleValue) targetList.get(i)).getFloatValue();
             }
             return result;
         }
@@ -3508,7 +3488,7 @@
             List<XmlObjectBase> targetList = getBaseArray(elementName);
             byte[] result = new byte[targetList.size()];
             for (int i = 0; i < result.length; i++) {
-                result[i] = ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getByteValue();
+                result[i] = ((org.apache.xmlbeans.SimpleValue) targetList.get(i)).getByteValue();
             }
             return result;
         }
@@ -3519,7 +3499,7 @@
             List<XmlObjectBase> targetList = getBaseArray(elementName);
             short[] result = new short[targetList.size()];
             for (int i = 0; i < result.length; i++) {
-                result[i] = ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getShortValue();
+                result[i] = ((org.apache.xmlbeans.SimpleValue) targetList.get(i)).getShortValue();
             }
             return result;
         }
@@ -3568,7 +3548,7 @@
             List<XmlObjectBase> targetList = getBaseArray(elementSet);
             boolean[] result = new boolean[targetList.size()];
             for (int i = 0; i < result.length; i++) {
-                result[i] = ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getBooleanValue();
+                result[i] = ((org.apache.xmlbeans.SimpleValue) targetList.get(i)).getBooleanValue();
             }
             return result;
         }
@@ -3579,7 +3559,7 @@
             List<XmlObjectBase> targetList = getBaseArray(elementSet);
             float[] result = new float[targetList.size()];
             for (int i = 0; i < result.length; i++) {
-                result[i] = ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getFloatValue();
+                result[i] = ((org.apache.xmlbeans.SimpleValue) targetList.get(i)).getFloatValue();
             }
             return result;
         }
@@ -3600,7 +3580,7 @@
             List<XmlObjectBase> targetList = getBaseArray(elementSet);
             byte[] result = new byte[targetList.size()];
             for (int i = 0; i < result.length; i++) {
-                result[i] = ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getByteValue();
+                result[i] = ((org.apache.xmlbeans.SimpleValue) targetList.get(i)).getByteValue();
             }
             return result;
         }
@@ -3611,7 +3591,7 @@
             List<XmlObjectBase> targetList = getBaseArray(elementSet);
             short[] result = new short[targetList.size()];
             for (int i = 0; i < result.length; i++) {
-                result[i] = ((org.apache.xmlbeans.SimpleValue)targetList.get(i)).getShortValue();
+                result[i] = ((org.apache.xmlbeans.SimpleValue) targetList.get(i)).getShortValue();
             }
             return result;
         }
diff --git a/src/main/java/org/apache/xmlbeans/xml/stream/BufferedXMLInputStream.java b/src/main/java/org/apache/xmlbeans/xml/stream/BufferedXMLInputStream.java
deleted file mode 100755
index 3b5cc82..0000000
--- a/src/main/java/org/apache/xmlbeans/xml/stream/BufferedXMLInputStream.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.xmlbeans.xml.stream;
-
-import java.io.IOException;
-/**
- * Extends the XMLInputStream to allow marking and reseting of the stream.
- *
- * @since XMLInputStream 1.0
- * @version 1.0
- * @see org.apache.xmlbeans.xml.stream.CharacterData
- * @see org.apache.xmlbeans.xml.stream.ProcessingInstruction
- * @see org.apache.xmlbeans.xml.stream.StartElement
- * @see org.apache.xmlbeans.xml.stream.EndElement
- * @see org.apache.xmlbeans.xml.stream.CharacterData
- * @see org.apache.xmlbeans.xml.stream.XMLName
- * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
- */
-public interface BufferedXMLInputStream extends XMLInputStream {
-  /**
-   * Sets the marks a point to return to in the stream,
-   * throws an exception if the stream does not support mark.
-   * This is only supported in BufferedStreams
-   */
-  public void mark() throws XMLStreamException;
-  /**
-   * Resets the stream to the previous mark.
-   * throws an exception if the stream does not support mark;
-   */
-  public void reset() throws XMLStreamException;
-}
-
-
-
-
-
diff --git a/src/main/java/org/apache/xmlbeans/xml/stream/ReferenceResolver.java b/src/main/java/org/apache/xmlbeans/xml/stream/ReferenceResolver.java
deleted file mode 100755
index ac5c886..0000000
--- a/src/main/java/org/apache/xmlbeans/xml/stream/ReferenceResolver.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.xmlbeans.xml.stream;
-
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-
-/**
- * This interface can be implemented to allow resolution of references
- * on a stream.
- * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
- */
-public interface ReferenceResolver {
-  /**
-   * Returns the xml pointed to by this idref as an XMLInputStream
-   * @param idref
-   * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
-   */
-  XMLInputStream resolve(String idref)
-    throws XMLStreamException;
-
-  /**
-   * Returns the id that corresponds to this idref
-   * @param idref
-   */
-  String getId(String idref);
-}
diff --git a/src/main/java/org/apache/xmlbeans/xml/stream/XMLInputStream.java b/src/main/java/org/apache/xmlbeans/xml/stream/XMLInputStream.java
deleted file mode 100755
index 1d69110..0000000
--- a/src/main/java/org/apache/xmlbeans/xml/stream/XMLInputStream.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.xmlbeans.xml.stream;
-
-/**
- *
- * This is the top level interface for iterating over XML Events
- * in an XML document.
- *
- * <p> Difference from SAX </p>
- * <p> An event stream can be thought of encapsulating SAX
- * events. It applies an iterator/pull metaphor to the parser 
- * allowing procedural, stream-based, handling of input XML rather than
- * having to write chained event handlers to handle complex XML
- * documents.
- * <p> Difference from DOM </p>
- * <p>The pull metaphor allows single-pass, stream-based  parsing of the document rather
- * than tree based manipulation.</p>
- *
- * @since XMLInputStream 1.0
- * @version 1.0
- * @see org.apache.xmlbeans.xml.stream.XMLEvent
- * @see org.apache.xmlbeans.xml.stream.CharacterData
- * @see org.apache.xmlbeans.xml.stream.ProcessingInstruction
- * @see org.apache.xmlbeans.xml.stream.StartElement
- * @see org.apache.xmlbeans.xml.stream.EndElement
- * @see org.apache.xmlbeans.xml.stream.CharacterData
- * @see org.apache.xmlbeans.xml.stream.XMLName
- * @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
- */
-
-// REVIEW pdapkus@bea.com 2002-Sep-13 -- while I like the convenience
-// of many of these methods, it strikes me that many of these methods
-// could implemented as static methods in a utility class.  the down
-// side to having them in this base interface is that it makes the
-// contract for implementers unnecessarily steap and results in
-// duplicated code in methods that can't extend one of the common base
-// classes.  
-
-public interface XMLInputStream {
-  /**
-   * Get the next XMLEvent on the stream
-   * @see org.apache.xmlbeans.xml.stream.XMLEvent
-   */
-  public XMLEvent next() throws XMLStreamException;
-  /**
-   * Check if there are more events to pull of the stream
-   * @see org.apache.xmlbeans.xml.stream.XMLEvent
-   */
-  public boolean hasNext() throws XMLStreamException;
-  /**
-   * Skip the next stream event
-   */
-  public void skip() throws XMLStreamException;
-  /**
-   * Skips the entire next start tag / end tag pair.
-   */
-  public void skipElement() throws XMLStreamException;
-  /**
-   * Check the next XMLEvent without reading it from the stream.
-   * Returns null if the stream is at EOF or has no more XMLEvents.
-   * @see org.apache.xmlbeans.xml.stream.XMLEvent
-   */
-  public XMLEvent peek() throws XMLStreamException;
-  /**
-   * Position the stream at the next XMLEvent of this type.  The method
-   * returns true if the stream contains another XMLEvent of this type
-   * and false otherwise.
-   * @param eventType An integer code that indicates the element type.
-   * @see org.apache.xmlbeans.xml.stream.XMLEvent
-   */
-  public boolean skip(int eventType) throws XMLStreamException;
-  /**
-   * Position the stream at the next element of this name.  The method
-   * returns true if the stream contains another element with this name
-   * and false otherwise.  Skip is a forward operator only.  It does
-   * not look backward in the stream.
-   * @param name An object that defines an XML name.
-   * If the XMLName.getNameSpaceName() method on the XMLName argument returns
-   * null the XMLName will match just the local name.  Prefixes are
-   * not checked for equality.
-   * @see org.apache.xmlbeans.xml.stream.XMLName
-   */
-  public boolean skip(XMLName name) throws XMLStreamException;
-  /**
-   * Position the stream at the next element of this name and this type.
-   * The method returns true if the stream contains another element 
-   * with this name of this type and false otherwise.  
-   * @param name An object that defines an XML name.
-   * If the XMLName.getNameSpaceName() method on the XMLName argument returns
-   * null the XMLName will match just the local name.  Prefixes are
-   * not checked for equality.
-   * @param eventType An integer code that indicates the element type.
-   * @see org.apache.xmlbeans.xml.stream.XMLEvent
-   * @see org.apache.xmlbeans.xml.stream.XMLName
-   */
-  public boolean skip(XMLName name, int eventType) throws XMLStreamException;
-  /**
-   * getSubStream() returns a stream which points to the entire next element in the
-   * current stream.  For example: take a document that has a root node A, where the children
-   * of A are B, C, and D. If the stream is pointing to the start element of A, getSubStream() will return 
-   * A, B, C and D including the start element of A and the end element of A.  The position of the parent
-   * stream is not changed and the events read by the substream are written back to its parent.   
-   */
-  public XMLInputStream getSubStream() throws XMLStreamException;
-  /**
-   * Closes this input stream and releases any system resources associated with the stream.
-   */
-  public void close() throws XMLStreamException;
-
-  /**
-   * Returns the reference resolver that was set for this stream,
-   * returns null if no ReferenceResolver has been set.
-   * @see org.apache.xmlbeans.xml.stream.ReferenceResolver
-   */
-  public ReferenceResolver getReferenceResolver();
-  /**
-   * Provides a way to set the ReferenceResolver of the stream,
-   * this is mostly needed for handle references to other parts of the
-   * document.
-   * @see org.apache.xmlbeans.xml.stream.ReferenceResolver
-   */
-  public void setReferenceResolver(ReferenceResolver resolver);
-}
-
-
-
-
-
diff --git a/src/test/java/random/common/Random.java b/src/test/java/random/common/Random.java
index d7b0ded..1f46dd2 100755
--- a/src/test/java/random/common/Random.java
+++ b/src/test/java/random/common/Random.java
@@ -15,55 +15,52 @@
 package random.common;
 
 
-import org.apache.xmlbeans.XmlCursor;
-import org.apache.xmlbeans.XmlBeans;
-import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.SchemaType;
+import com.easypo.XmlCustomerBean;
+import com.easypo.XmlLineItemBean;
+import com.easypo.XmlPurchaseOrderDocumentBean.PurchaseOrder;
+import com.easypo.XmlShipperBean;
+import org.apache.xmlbeans.*;
 import org.apache.xmlbeans.impl.tool.CommandLine;
 import org.apache.xmlbeans.impl.values.XmlValueDisconnectedException;
 
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
 import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Arrays;
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import javax.xml.namespace.QName;
-
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
-
-import com.easypo.XmlPurchaseOrderDocumentBean.PurchaseOrder;
-import com.easypo.XmlCustomerBean;
-import com.easypo.XmlLineItemBean;
-import com.easypo.XmlShipperBean;
+import java.util.ArrayList;
+import java.util.Calendar;
 
 public class Random implements Runnable {
 
-   static long seed;
-   static int iterations;
-   static int threads;
-   static int docs;
+    static long seed;
+    static int iterations;
+    static int threads;
+    static int docs;
 
 
     public static void runTest(CommandLine cl) {
         if (cl.getOpt("?") != null || cl.getOpt("help") != null ||
-                cl.args().length != 0)
+            cl.args().length != 0) {
             System.out.println(
-                    "Usage: random [-seed #] [-i iterations] [-t threads] [-docs docs] [-readonly] [-nosave]");
-        else {
+                "Usage: random [-seed #] [-i iterations] [-t threads] [-docs docs] [-readonly] [-nosave]");
+        } else {
             boolean readonly = false;
             boolean nosave = false;
             boolean noquery = false;
 
-            if (cl.getOpt("seed") != null)
+            if (cl.getOpt("seed") != null) {
                 seed = Long.parseLong(cl.getOpt("seed"));
-            if (cl.getOpt("i") != null)
+            }
+            if (cl.getOpt("i") != null) {
                 iterations = Integer.parseInt(cl.getOpt("i"));
-            if (cl.getOpt("t") != null)
+            }
+            if (cl.getOpt("t") != null) {
                 threads = Integer.parseInt(cl.getOpt("t"));
-            if (cl.getOpt("docs") != null)
+            }
+            if (cl.getOpt("docs") != null) {
                 docs = Integer.parseInt(cl.getOpt("docs"));
+            }
             noquery = (cl.getOpt("noquery") != null);
             readonly = (cl.getOpt("readonly") != null);
             nosave = (cl.getOpt("nosave") != null);
@@ -90,7 +87,7 @@
         for (int i = 0; i < iterations; i++) {
             for (int j = 0; j < threadCount; j++) {
                 Random runnable = new Random(seed, sharedDocs, readonly,
-                        nosave, noquery, threadCount > 1);
+                    nosave, noquery, threadCount > 1);
                 threads[j] = new Thread(runnable);
                 threads[j].start();
                 seed++;
@@ -98,8 +95,7 @@
             for (int j = 0; j < threadCount; j++) {
                 try {
                     threads[j].join();
-                }
-                catch (InterruptedException e) {
+                } catch (InterruptedException e) {
                     System.err.println("Thread interrupted");
                 }
             }
@@ -109,15 +105,16 @@
 
         System.err.println();
         System.err.println(
-                "Seconds to run random tests: " + (end - start) / 1000);
+            "Seconds to run random tests: " + (end - start) / 1000);
     }
 
     public void run() {
         System.err.print("\rSeed: " + _seed);
 
         try {
-            for (int d = 0; d < _docs.length; d++)
+            for (int d = 0; d < _docs.length; d++) {
                 _docs[d] = XmlObject.Factory.newInstance();
+            }
 
             _cursors = new ArrayList();
 
@@ -129,8 +126,7 @@
                     _iter++;
                     iterate();
                     good = true;
-                }
-                finally {
+                } finally {
                     if (!good) {
                         System.err.println();
                         System.err.println("Error on iteration " + _iter);
@@ -138,8 +134,7 @@
                     }
                 }
             }
-        }
-        catch (Throwable e) {
+        } catch (Throwable e) {
             System.err.println("Error on seed " + _seed);
             e.printStackTrace(System.err);
         }
@@ -199,16 +194,15 @@
                     interateLow();
                     break;
             }
-        }
-        catch (IllegalStateException e) {
-            if (!_interference)
+        } catch (IllegalStateException e) {
+            if (!_interference) {
                 throw e;
-        }
-        catch (IllegalArgumentException e) {
-            if (!_interference)
+            }
+        } catch (IllegalArgumentException e) {
+            if (!_interference) {
                 throw e;
-        }
-        catch (XmlValueDisconnectedException e) {
+            }
+        } catch (XmlValueDisconnectedException e) {
 
         }
     }
@@ -337,7 +331,7 @@
                 execQuery();
                 break;
             case 10:
-                xmlInputStream();
+                xmlStreamReader();
                 break;
             case 11:
                 docBytes();
@@ -364,31 +358,37 @@
         XmlCursor c = getCursor();
         c.push();
 
-        while (!(c.isContainer() || c.isAttr()))
-            if (c.toNextToken().isNone())
+        while (!(c.isContainer() || c.isAttr())) {
+            if (c.toNextToken().isNone()) {
                 break;
+            }
+        }
 
         if (!c.isEnddoc()) {
             XmlObject x = c.getObject();
             c.pop();
-            if (x == null)
+            if (x == null) {
                 throw new IllegalStateException(
-                        "getObject returned null - content must have changed");
+                    "getObject returned null - content must have changed");
+            }
             return x;
         }
 
         c.pop();
         c.push();
 
-        while (!(c.isContainer() || c.isAttr()))
-            if (c.toPrevToken().isNone())
+        while (!(c.isContainer() || c.isAttr())) {
+            if (c.toPrevToken().isNone()) {
                 break;
+            }
+        }
 
         XmlObject x = c.getObject();
         c.pop();
-        if (x == null)
+        if (x == null) {
             throw new IllegalStateException(
-                    "getObject returned null - content must have changed");
+                "getObject returned null - content must have changed");
+        }
         return x;
     }
 
@@ -413,11 +413,9 @@
             o = findObject();
             SchemaType type = findObject().schemaType();
             n = o.changeType(type);
-        }
-        catch (IllegalArgumentException e) {
+        } catch (IllegalArgumentException e) {
             return;
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalStateException e) {
             return;
         }
 
@@ -440,38 +438,40 @@
     private void setName() {
         XmlCursor c = findObject().newCursor();
 
-        if (!c.isStartdoc())
+        if (!c.isStartdoc()) {
             c.setName(getQName());
+        }
 
         c.dispose();
     }
 
     private void newDomNode() {
-        if (rnd(5) != 0)
+        if (rnd(5) != 0) {
             return;
+        }
 
         try {
             getCursor().newDomNode();
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
-    private void xmlInputStream() throws Exception {
-        if (rnd(5) != 0)
+    private void xmlStreamReader() throws Exception {
+        if (rnd(5) != 0) {
             return;
+        }
 
-        XMLInputStream xis;
+        XMLStreamReader xis;
 
         try {
-            xis = getCursor().newXMLInputStream();
-        }
-        catch (IllegalStateException e) {
+            xis = getCursor().newXMLStreamReader();
+        } catch (IllegalStateException e) {
             return;
         }
 
-        while (xis.next() != null)
-            ;
+        while (xis.hasNext()) {
+            xis.next();
+        }
     }
 
     private void objectSet() {
@@ -488,14 +488,17 @@
             XmlCustomerBean o = (XmlCustomerBean) x;
             o.setName("Bob");
 
-            if (rnd(2) == 0)
+            if (rnd(2) == 0) {
                 o.setAge(23);
+            }
 
-            if (rnd(2) == 0)
+            if (rnd(2) == 0) {
                 o.setMoo(24);
+            }
 
-            if (rnd(2) == 0)
+            if (rnd(2) == 0) {
                 o.setPoo(200);
+            }
         } else if (x instanceof XmlLineItemBean) {
             XmlLineItemBean o = (XmlLineItemBean) x;
             o.setPerUnitOunces(new BigDecimal(122.44));
@@ -517,22 +520,25 @@
     }
 
     private void execQuery() {
-        if (_noquery)
+        if (_noquery) {
             return;
+        }
 
-        if (rnd(20) > 0)
+        if (rnd(20) > 0) {
             return;
+        }
 
         QName name = getQName();
 
         String query =
-                "declare namespace xxx='" + name.getNamespaceURI() + "' " +
-                ".//xxx:" + name.getLocalPart();
+            "declare namespace xxx='" + name.getNamespaceURI() + "' " +
+            ".//xxx:" + name.getLocalPart();
 
         XmlObject x = getCursor().execQuery(query).getObject();
 
-        if (rnd(3) == 0)
+        if (rnd(3) == 0) {
             _docs[rnd(_docs.length)] = x;
+        }
     }
 
     private void getObject() {
@@ -548,19 +554,18 @@
             getCursor().isInSameDocument(getCursor());
             getCursor().comparePosition(getCursor());
             getCursor().isAtSamePositionAs(getCursor());
-        }
-        catch (IllegalArgumentException e) {
+        } catch (IllegalArgumentException e) {
         }
     }
 
     private String[] _xmls =
-            {
-                "<a/>",
-            };
+        {
+            "<a/>",
+        };
 
     private String[] _schema_xmls =
-            {
-                "<po:purchase-order xmlns:po='http://openuri.org/easypo'>\n" +
+        {
+            "<po:purchase-order xmlns:po='http://openuri.org/easypo'>\n" +
             "<po:customer age='31' poo='200'>\n" +
             "<po:name>David Bau</po:name>\n" +
             "<po:address>Gladwyne, PA</po:address>\n" +
@@ -594,20 +599,20 @@
             "</po:shipper>\n" +
             "</po:purchase-order>\n" +
             "",
-            };
+        };
 
     private void loadDoc() throws Exception {
         if (rnd(15) == 0) {
             _docs[rnd(_docs.length)] =
-                    XmlObject.Factory.parse(_xmls[rnd(_xmls.length)]);
+                XmlObject.Factory.parse(_xmls[rnd(_xmls.length)]);
         }
     }
 
     private void loadSchemadDoc() throws Exception {
         if (rnd(4) == 0) {
             _docs[rnd(_docs.length)] =
-                    XmlObject.Factory.parse(
-                            _schema_xmls[rnd(_schema_xmls.length)]);
+                XmlObject.Factory.parse(
+                    _schema_xmls[rnd(_schema_xmls.length)]);
         }
     }
 
@@ -620,18 +625,19 @@
     }
 
     private char[] _chars =
-            {
-                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
-                'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
-                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-                ' ', '<', '>', '&', '-', '?'
-            };
+        {
+            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+            'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+            ' ', '<', '>', '&', '-', '?'
+        };
 
     private void getTextValue() {
         XmlCursor c = getCursor();
 
-        if (c.isFinish() || c.isNamespace() || c.isText())
+        if (c.isFinish() || c.isNamespace() || c.isText()) {
             return;
+        }
 
         c.getTextValue();
     }
@@ -639,13 +645,15 @@
     private void setTextValue() {
         XmlCursor c = getCursor();
 
-        if (c.isFinish() || c.isNamespace() || c.isText())
+        if (c.isFinish() || c.isNamespace() || c.isText()) {
             return;
+        }
 
         StringBuilder sb = new StringBuilder();
 
-        for (int i = rnd(10); i >= 0; i--)
+        for (int i = rnd(10); i >= 0; i--) {
             sb.append(_chars[rnd(_chars.length)]);
+        }
 
         c.setTextValue(sb.toString());
     }
@@ -653,20 +661,16 @@
     private void moveText() {
         try {
             getCursor().moveChars(rnd(10), getCursor());
-        }
-        catch (IllegalArgumentException e) {
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
     private void copyText() {
         try {
             getCursor().copyChars(rnd(10), getCursor());
-        }
-        catch (IllegalArgumentException e) {
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
@@ -677,33 +681,31 @@
     private void insertComment() {
         try {
             getCursor().insertComment("poo");
-        }
-        catch (IllegalArgumentException e) {
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
     private void insertProcinst() {
         try {
             getCursor().insertProcInst("target", "val");
-        }
-        catch (IllegalArgumentException e) {
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
     private void insertText() {
         XmlCursor c = getCursor();
 
-        if (c.isAnyAttr() || c.isStartdoc())
+        if (c.isAnyAttr() || c.isStartdoc()) {
             return;
+        }
 
         StringBuilder sb = new StringBuilder();
 
-        for (int i = rnd(10); i >= 0; i--)
+        for (int i = rnd(10); i >= 0; i--) {
             sb.append(_chars[rnd(_chars.length)]);
+        }
 
         c.insertChars(sb.toString());
     }
@@ -753,8 +755,9 @@
     private void insertElem() throws Exception {
         XmlCursor c = getCursor();
 
-        if (c.isAnyAttr() || c.isStartdoc())
+        if (c.isAnyAttr() || c.isStartdoc()) {
             return;
+        }
 
         c.insertElement(getQName());
     }
@@ -762,11 +765,13 @@
     public void insertAttr() {
         XmlCursor c = getCursor();
 
-        while (!c.isEnddoc() && !c.isContainer())
+        while (!c.isEnddoc() && !c.isContainer()) {
             c.toNextToken();
+        }
 
-        if (c.isEnddoc())
+        if (c.isEnddoc()) {
             return;
+        }
 
         c.toNextToken();
 
@@ -782,48 +787,41 @@
     public void copyXmlContents() {
         try {
             getCursor().copyXmlContents(getCursor());
-        }
-        catch (IllegalArgumentException e) {
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
     public void copyXml() {
         try {
             getCursor().copyXml(getCursor());
-        }
-        catch (IllegalArgumentException e) {
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
     public void moveXmlContents() {
         try {
             getCursor().moveXmlContents(getCursor());
-        }
-        catch (IllegalArgumentException e) {
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
     public void moveXml() {
         try {
             getCursor().moveXml(getCursor());
-        }
-        catch (IllegalArgumentException e) {
-        }
-        catch (IllegalStateException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (IllegalStateException e) {
         }
     }
 
     public void removeXml() {
         XmlCursor c = getCursor();
 
-        if (!c.isStartdoc() && !c.isFinish())
+        if (!c.isStartdoc() && !c.isFinish()) {
             c.removeXml();
+        }
     }
 
     public static class Bookmark extends XmlCursor.XmlBookmark {
diff --git a/src/test/java/xmlobject/detailed/SoapFaultTest.java b/src/test/java/xmlobject/detailed/SoapFaultTest.java
index 23e19b8..41fa11f 100755
--- a/src/test/java/xmlobject/detailed/SoapFaultTest.java
+++ b/src/test/java/xmlobject/detailed/SoapFaultTest.java
@@ -15,6 +15,7 @@
 
 package xmlobject.detailed;
 
+import org.apache.xmlbeans.XmlError;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
 import org.junit.Ignore;
@@ -39,7 +40,7 @@
     @Ignore
     public void testSetDetail() throws Exception {
         Fault fault = Fault.Factory.newInstance();
-        fault.setDetail(Detail.Factory.parse(XmlObject.Factory.parse("<foo/>").newXMLInputStream()));
+        fault.setDetail(Detail.Factory.parse(XmlObject.Factory.parse("<foo/>").newXMLStreamReader()));
 
         assertEquals("<detail><foo/></detail>", fault.xmlText());
         assertEquals("<xml-fragment><foo/></xml-fragment>", fault.getDetail().xmlText());
@@ -58,10 +59,10 @@
             XmlObject.Factory.parse("<foo/>").changeType(Detail.type));
 
         String expect = "<xml-fragment>" +
-            "<faultcode xmlns:soapenv=\"" + soapenv + "\">soapenv:foo</faultcode>" +
-            "<faultstring>Undefined</faultstring>" +
-            "<detail><foo/></detail>" +
-            "</xml-fragment>";
+                        "<faultcode xmlns:soapenv=\"" + soapenv + "\">soapenv:foo</faultcode>" +
+                        "<faultstring>Undefined</faultstring>" +
+                        "<detail><foo/></detail>" +
+                        "</xml-fragment>";
         assertEquals(expect, fault.xmlText());
         assertEquals(new QName(soapenv, "foo"), fault.getFaultcode());
         assertEquals("Undefined", fault.getFaultstring());
@@ -93,7 +94,7 @@
 
         Fault faultDoc = Fault.Factory.parse(soapFault);
         XmlOptions opt = new XmlOptions();
-        ArrayList errors = new ArrayList();
+        ArrayList<XmlError> errors = new ArrayList<>();
         opt.setErrorListener(errors);
         assertTrue(faultDoc.validate(opt));
         assertEquals(new QName(soapenv, "Server"), faultDoc.getFaultcode());
diff --git a/src/test/java/xmltokensource/detailed/RoundTripLoaderTest.java b/src/test/java/xmltokensource/detailed/RoundTripLoaderTest.java
index 383c1f3..4c95ec1 100755
--- a/src/test/java/xmltokensource/detailed/RoundTripLoaderTest.java
+++ b/src/test/java/xmltokensource/detailed/RoundTripLoaderTest.java
@@ -19,7 +19,6 @@
 import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
-import org.apache.xmlbeans.xml.stream.XMLInputStream;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Node;
@@ -106,44 +105,6 @@
         }
     }
 
-    /**
-     * yana_kadiyska (3:25:15 PM): Eric, is this going to be impl
-     * on this release? Bug? store.Cursor._newXMLInputStream
-     * ericvasilik (3:26:01 PM): This is not a v2 feature. ...
-     * but otherwise, we should disable XMLInputStream tests
-     * <p>
-     * public void testNewReaderRoundTrip() throws Exception {
-     * _newReaderRoundTrip(null);
-     * }
-     * <p>
-     * public void testNewReaderWithOptionsRoundTrip() throws Exception {
-     * _newReaderRoundTrip(m_map);
-     * }
-     */
-
-    private void _newXMLInputStreamRoundTrip(XmlOptions map) throws Exception {
-        m_xo = XmlObject.Factory.parse(Common.XML_FOO_BAR_NESTED_SIBLINGS);
-        XMLInputStream xmlIs = m_xo.newXMLInputStream(map);
-        assertNotNull(xmlIs);
-        XmlObject xo = XmlObject.Factory.parse(xmlIs, map);
-        m_xc = m_xo.newCursor();
-        XmlCursor xc1 = xo.newCursor();
-        try {
-            compareDocTokens(m_xc, xc1);
-        } finally {
-            xc1.dispose();
-        }
-    }
-
-    @Test
-    public void testNewXMLInputStreamRoundTrip() throws Exception {
-        _newXMLInputStreamRoundTrip(null);
-    }
-
-    public void testNewXMLInputStreamWithOptionsRoundTrip() throws Exception {
-        _newXMLInputStreamRoundTrip(m_map);
-    }
-
     private void _xmlTextRoundTrip(XmlOptions map) throws Exception {
         m_xo = XmlObject.Factory.parse(Common.XML_FOO_BAR_NESTED_SIBLINGS);
         String sXml = m_xo.xmlText(map);
