diff --git a/src/main/java/org/apache/xmlbeans/SchemaParticle.java b/src/main/java/org/apache/xmlbeans/SchemaParticle.java
index 741dea6..7c29302 100644
--- a/src/main/java/org/apache/xmlbeans/SchemaParticle.java
+++ b/src/main/java/org/apache/xmlbeans/SchemaParticle.java
@@ -198,4 +198,16 @@
      */
     boolean isFixed();
 
+     /**
+     * Returns user specified documentation
+     *
+     * <xs:element ... >
+     *   <xs:annotation>
+     *     <xs:documentation>
+     *      getDocumentation method will return whatever stuff here.
+     *     </xs:documentation>
+     *   </xs:annotation>
+     * </xs:element>
+     */
+    String getDocumentation();
 }
diff --git a/src/main/java/org/apache/xmlbeans/SchemaProperty.java b/src/main/java/org/apache/xmlbeans/SchemaProperty.java
index e993012..23f0878 100644
--- a/src/main/java/org/apache/xmlbeans/SchemaProperty.java
+++ b/src/main/java/org/apache/xmlbeans/SchemaProperty.java
@@ -15,9 +15,8 @@
 
 package org.apache.xmlbeans;
 
-import java.math.BigInteger;
-
 import javax.xml.namespace.QName;
+import java.math.BigInteger;
 
 /**
  * Represents a summary of similar SchemaFields in a complex type.
@@ -35,7 +34,7 @@
  * or attribute, it is typically easier to consult then SchemaProperty
  * than to hunt for the exact SchemaField in the particle tree or
  * attribute model.
- * 
+ *
  * @see SchemaType#getProperties
  * @see SchemaType#getAttributeProperties
  * @see SchemaType#getElementProperties
@@ -46,12 +45,12 @@
 {
     /**
      * The type within which this property appears
-     */ 
+     */
     SchemaType getContainerType();
-    
+
     /**
      * The name of this element or attribute
-     */ 
+     */
     QName getName();
 
     /**
@@ -60,28 +59,28 @@
      * have at least one element, ie, the property's name.
      */
     QName[] acceptedNames();
-    
+
     /**
      * The Java name for this property.  For example, if the method to
      * access this property is called getFirstName, then this method
      * returns the string "FirstName".  May be null if the schema type
      * has not been compiled to Java.
-     */ 
+     */
     String getJavaPropertyName();
-    
+
     /**
      * True for read-only properties.
-     */ 
+     */
     boolean isReadOnly();
 
     /**
      * True for attributes.
-     */ 
+     */
     boolean isAttribute();
 
     /**
      * The schema type for the property.
-     */ 
+     */
     SchemaType getType();
 
     // note that in the inheritance hierarchy, if the array getter shows up first,
@@ -91,128 +90,128 @@
      * The schema type returned from the Java getter for this property.
      * Applies only to types that have been code generated to Java; may
      * be a base type of getType().
-     */ 
-    public SchemaType javaBasedOnType(); // Java property type based on this base type
-    
+     */
+    SchemaType javaBasedOnType(); // Java property type based on this base type
+
     /**
      * True if there is a Java getter that returns a singleton.
-     */ 
+     */
     boolean extendsJavaSingleton(); // has singleton getter
-    
+
     /**
      * True if there is an Java isSet method that tests for presence.
-     */ 
+     */
     boolean extendsJavaOption();    // has isSet tester
-    
+
     /**
      * True if there is a Java getter that returns an array.
-     */ 
+     */
     boolean extendsJavaArray();     // has array getter (called -Array, if singleton is present)
-    
+
     /**
      * Returns the natural Java type for this property.  Returns either
      * XML_OBJECT (for complex types) or one of the JAVA_* constants described
      * in this interface.
-     */ 
+     */
     int getJavaTypeCode();
-    
+
     /**
      * Returns the set of element names which should appear strictly after all
      * occurences of the elements described by this property. For element properties only.
-     */ 
+     */
     QNameSet getJavaSetterDelimiter();
 
     /**
      * Returns a summarized minimum occurrance number.
      * For example, a sequence containing a nonoptional singleton element repeated twice will
      * result in a property getMinOccurs() of 2.
-     */ 
+     */
     BigInteger getMinOccurs();
-    
+
     /**
      * Returns a summarized minimum occurrance number.
      * For example, a sequence containing a nonoptional singleton element repeated twice will
      * result in a property getMaxOccurs() of 2.
-     */ 
+     */
     BigInteger getMaxOccurs();
 
     /**
      * Returns {@link #NEVER}, {@link #VARIABLE}, or {@link #CONSISTENTLY} nillable, depending on the
-     * nillability of the elements in this property. 
+     * nillability of the elements in this property.
      */
     int hasNillable();
 
     /**
      * Returns {@link #NEVER}, {@link #VARIABLE}, or {@link #CONSISTENTLY} defaulted, depending on the
-     * defaults present in the elements in this property. 
+     * defaults present in the elements in this property.
      */
     int hasDefault();
 
     /**
      * Returns {@link #NEVER}, {@link #VARIABLE}, or {@link #CONSISTENTLY} fixed, depending on the
-     * fixed constraints present in the elements in this property. 
+     * fixed constraints present in the elements in this property.
      */
     int hasFixed();
 
     /** Applies to no elements for this property.  See {@link #hasNillable}, {@link #hasDefault}, {@link #hasFixed} */
-    static final int NEVER = 0;
+    int NEVER = 0;
     /** Applies to some, but not other elements for this property.  See {@link #hasNillable}, {@link #hasDefault}, {@link #hasFixed} */
-    static final int VARIABLE = 1;
+    int VARIABLE = 1;
     /** Applies to all elements for this property.  See {@link #hasNillable}, {@link #hasDefault}, {@link #hasFixed} */
-    static final int CONSISTENTLY = 2;
+    int CONSISTENTLY = 2;
 
     /** An XML Bean type that inherits from {@link XmlObject}. See {@link #getJavaTypeCode}. */
-    static final int XML_OBJECT = 0;
+    int XML_OBJECT = 0;
 
     /** Java primitive type codes (for non-nullable Java types) are between JAVA_FIRST_PRIMITIVE and JAVA_LAST_PRIMITIVE, inclusive. */
-    static final int JAVA_FIRST_PRIMITIVE = 1;
+    int JAVA_FIRST_PRIMITIVE = 1;
 
     /** A Java boolean. See {@link #getJavaTypeCode}. */
-    static final int JAVA_BOOLEAN = 1;
+    int JAVA_BOOLEAN = 1;
     /** A Java float. See {@link #getJavaTypeCode}. */
-    static final int JAVA_FLOAT = 2;
+    int JAVA_FLOAT = 2;
     /** A Java double. See {@link #getJavaTypeCode}. */
-    static final int JAVA_DOUBLE = 3;
+    int JAVA_DOUBLE = 3;
     /** A Java byte. See {@link #getJavaTypeCode}. */
-    static final int JAVA_BYTE = 4;
+    int JAVA_BYTE = 4;
     /** A Java short. See {@link #getJavaTypeCode}. */
-    static final int JAVA_SHORT = 5;
+    int JAVA_SHORT = 5;
     /** A Java int. See {@link #getJavaTypeCode}. */
-    static final int JAVA_INT = 6;
+    int JAVA_INT = 6;
     /** A Java long. See {@link #getJavaTypeCode}. */
-    static final int JAVA_LONG = 7;
+    int JAVA_LONG = 7;
 
     /** Java primitive type codes (for non-nullable Java types) are between JAVA_FIRST_PRIMITIVE and JAVA_LAST_PRIMITIVE, inclusive. */
-    static final int JAVA_LAST_PRIMITIVE = 7;
+    int JAVA_LAST_PRIMITIVE = 7;
 
     /** A {@link java.math.BigDecimal}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_BIG_DECIMAL = 8;
+    int JAVA_BIG_DECIMAL = 8;
     /** A {@link java.math.BigInteger}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_BIG_INTEGER = 9;
+    int JAVA_BIG_INTEGER = 9;
     /** A {@link String}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_STRING = 10;
+    int JAVA_STRING = 10;
     /** A byte[]. See {@link #getJavaTypeCode}. */
-    static final int JAVA_BYTE_ARRAY = 11;
+    int JAVA_BYTE_ARRAY = 11;
     /** A {@link GDate}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_GDATE = 12;
+    int JAVA_GDATE = 12;
     /** A {@link GDuration}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_GDURATION = 13;
+    int JAVA_GDURATION = 13;
     /** A {@link java.util.Date}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_DATE = 14;
+    int JAVA_DATE = 14;
     /** A {@link javax.xml.namespace.QName}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_QNAME = 15;
+    int JAVA_QNAME = 15;
     /** A {@link java.util.List}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_LIST = 16;
+    int JAVA_LIST = 16;
     /** A {@link java.util.Calendar}. See {@link #getJavaTypeCode}. */
-    static final int JAVA_CALENDAR = 17;
+    int JAVA_CALENDAR = 17;
 
     /** A generated {@link StringEnumAbstractBase} subclass. See {@link #getJavaTypeCode}. */
-    static final int JAVA_ENUM = 18;
+    int JAVA_ENUM = 18;
     /** A {@link java.lang.Object}, used for some simple type unions. See {@link #getJavaTypeCode}. */
-    static final int JAVA_OBJECT = 19; // for some unions
+    int JAVA_OBJECT = 19; // for some unions
 
     /** A user specified type. */
-    static final int JAVA_USER = 20;
+    int JAVA_USER = 20;
 
     /**
      * Returns the default or fixed value,
@@ -221,7 +220,7 @@
      * See {@link #hasDefault} and {@link #hasFixed}.
      */
     String getDefaultText();
-    
+
     /**
      * Returns the default or fixed value as a strongly-typed value,
      * if it is consistent. If it is not consistent,
@@ -229,4 +228,8 @@
      * See {@link #hasDefault} and {@link #hasFixed}.
      */
     XmlAnySimpleType getDefaultValue();
+
+    /** return user specified documentation */
+    String getDocumentation();
+    void setDocumentation(String documentation);
 }
diff --git a/src/main/java/org/apache/xmlbeans/SchemaType.java b/src/main/java/org/apache/xmlbeans/SchemaType.java
index def4795..9753ff1 100644
--- a/src/main/java/org/apache/xmlbeans/SchemaType.java
+++ b/src/main/java/org/apache/xmlbeans/SchemaType.java
@@ -1108,4 +1108,17 @@
      * @return the constructed QNameSet
      */
     QNameSet qnameSetForWildcardAttributes();
+
+    /**
+     * returns user specified documentation
+     *
+     * <xs:complexType ...>
+     *   <xs:annotation>
+     *      <xs:documentation>
+     *          getDocumentation method will return whatever stuff here.
+     *      </xs:docmentation>
+     *   </xs:annotation>
+     * </xs complexType>
+     */
+    String getDocumentation();
 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java
index 6752e8b..1de600a 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaParticleImpl.java
@@ -17,6 +17,9 @@
 
 import org.apache.xmlbeans.*;
 import org.apache.xmlbeans.impl.values.NamespaceContext;
+import org.apache.xmlbeans.impl.xb.xsdschema.AnnotationDocument.Annotation;
+import org.apache.xmlbeans.impl.xb.xsdschema.DocumentationDocument.Documentation;
+import org.apache.xmlbeans.impl.xb.xsdschema.Element;
 
 import javax.xml.namespace.QName;
 import java.math.BigInteger;
@@ -44,6 +47,7 @@
     protected XmlObject _parseObject;
     private Object _userData;
     private XmlValueRef _defaultValue;
+    private String _documentation;
 
     protected void mutate() {
         if (_isImmutable) {
@@ -246,6 +250,7 @@
         _isDefault = (deftext != null);
         _isFixed = isFixed;
         _parseObject = parseObject;
+        _documentation = parseDocumentation(_parseObject);
     }
 
     public boolean isNillable() {
@@ -287,4 +292,31 @@
     public void setUserData(Object data) {
         _userData = data;
     }
+
+    public String getDocumentation(){
+        return _documentation;
+    }
+
+    private static String parseDocumentation(XmlObject parseObject){
+        try {
+            if (parseObject instanceof Element) {
+                Element e = (Element) parseObject;
+                if (e.getAnnotation() != null) {
+                    Annotation a = e.getAnnotation();
+                    if (a.getDocumentationArray() != null) {
+                        Documentation[] docArray = a.getDocumentationArray();
+                        StringBuilder sb = new StringBuilder();
+                        for (Documentation documentation : docArray) {
+                            XmlCursor c = documentation.newCursor();
+                            sb.append(c.getTextValue());
+                        }
+                        return sb.toString();
+                    }
+                }
+            }
+        } catch (Exception e) {
+            return "";
+        }
+        return "";
+    }
 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaPropertyImpl.java b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaPropertyImpl.java
index fb5cce3..b040b17 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaPropertyImpl.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaPropertyImpl.java
@@ -15,22 +15,14 @@
 
 package org.apache.xmlbeans.impl.schema;
 
-import org.apache.xmlbeans.SchemaComponent;
-import org.apache.xmlbeans.SchemaType;
-import org.apache.xmlbeans.SchemaGlobalElement;
-import org.apache.xmlbeans.SchemaGlobalAttribute;
-import org.apache.xmlbeans.SchemaProperty;
-import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.SchemaField;
 import org.apache.xmlbeans.QNameSet;
+import org.apache.xmlbeans.SchemaProperty;
+import org.apache.xmlbeans.SchemaType;
 import org.apache.xmlbeans.XmlAnySimpleType;
-import org.apache.xmlbeans.XmlQName;
-import org.apache.xmlbeans.impl.values.NamespaceContext;
-
-import java.math.BigInteger;
-import java.util.Set;
 
 import javax.xml.namespace.QName;
+import java.math.BigInteger;
+import java.util.Set;
 
 public class SchemaPropertyImpl implements SchemaProperty
 {
@@ -53,7 +45,8 @@
     private int _javaTypeCode;
     private QNameSet _javaSetterDelimiter;
     private XmlValueRef _defaultValue;
-    private Set _acceptedNames;
+    private Set<QName> _acceptedNames;
+    private String _documentation;
 
     private void mutate()
         { if (_isImmutable) throw new IllegalStateException(); }
@@ -128,22 +121,18 @@
     void setJavaSetterDelimiter(QNameSet set)
         { _javaSetterDelimiter = set; }
 
-    public QName[] acceptedNames()
-    { 
-        if (_acceptedNames == null)
-            return new QName[] { _name };
-
-        return (QName[])_acceptedNames.toArray(new QName[_acceptedNames.size()]); 
+    public QName[] acceptedNames() {
+        return _acceptedNames == null ? new QName[]{_name} : _acceptedNames.toArray(new QName[0]);
     }
 
-    public void setAcceptedNames(Set set)
+    public void setAcceptedNames(Set<QName> set)
     {
-        mutate(); 
+        mutate();
         _acceptedNames = set;
     }
     public void setAcceptedNames(QNameSet set)
-    { 
-        mutate(); 
+    {
+        mutate();
         _acceptedNames = set.includedQNamesInExcludedURIs();
     }
 
@@ -189,7 +178,7 @@
             return _defaultValue.get();
         return null;
     }
-    
+
     public void setDefaultValue(XmlValueRef defaultRef)
     {
         mutate();
@@ -201,4 +190,12 @@
 
     public void setJavaTypeCode(int code)
         { mutate(); _javaTypeCode = code; }
+
+    public String getDocumentation() {
+        return _documentation;
+    }
+
+    public void setDocumentation(String documentation) {
+        _documentation = documentation;
+    }
 }
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 6f64b86..6a891a1 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeCodePrinter.java
@@ -185,6 +185,11 @@
         }
 
         emit("/**");
+        if(sType.getDocumentation() != null && sType.getDocumentation().length() > 0){
+            emit(" *");
+            printJavaDocBody(sType.getDocumentation());
+            emit(" *");
+        }
         if (sType.isDocumentType()) {
             emit(" * A document containing one " + prettyQName(name) + " element.");
         } else if (sType.isAttributeType()) {
@@ -333,6 +338,9 @@
     }
 
     void printTopComment(SchemaType sType) throws IOException {
+        // if(sType.getDocumentation() != null && sType.getDocumentation().length() > 0){
+        //     printJavaDocParagraph(sType.getDocumentation());
+        // }
         emit("/*");
         if (sType.getName() != null) {
             emit(" * XML Type:  " + sType.getName().getLocalPart());
@@ -382,8 +390,7 @@
 
         String baseInterface = findJavaType(sType.getBaseType());
 
-        emit("public interface " + shortName + " extends " + baseInterface + getExtensionInterfaces(sType));
-        emit("{");
+        emit("public interface " + shortName + " extends " + baseInterface + getExtensionInterfaces(sType) + " {");
         indent();
         emitSpecializedAccessors(sType);
     }
@@ -486,7 +493,41 @@
         emit(" */");
     }
 
-    public static String javaStringEscape(String str) {
+    void printJavaDocParagraph(String s) throws IOException{
+        emit("");
+        emit("/**");
+        printJavaDocBody(s);
+        emit(" */");
+    }
+
+    //  removes newline, tabs and white spaces.
+    String cleanUpString(String s){
+        s = s.replace("\n", "");
+        s = s.replace("\t", "");
+        return s.trim();
+    }
+
+    void printJavaDocBody(String s) throws IOException{
+
+        int start = 0;
+        int newLineIndex = s.indexOf("\n");
+
+        if(newLineIndex == -1){
+            emit(" * " + s);
+        }else{
+            if(newLineIndex == 0){
+                newLineIndex = s.indexOf("\n", newLineIndex + 1);
+            }
+            while(newLineIndex > 0){
+                emit(" * " + cleanUpString(s.substring(start, newLineIndex)));
+                start = newLineIndex;
+                newLineIndex = s.indexOf("\n", start + 1);
+            }
+        }
+    }
+
+    public static String javaStringEscape(String str)
+    {
         // forbidden: \n, \r, \", \\.
         test:
         {
@@ -550,9 +591,9 @@
             }
             String constName = entry.getEnumName();
             if (hasBase) {
-                emit("static final " + baseEnumClass + ".Enum " + constName + " = " + baseEnumClass + "." + constName + ";");
+                emit(baseEnumClass + ".Enum " + constName + " = " + baseEnumClass + "." + constName + ";");
             } else {
-                emit("static final Enum " + constName + " = Enum.forString(\"" + javaStringEscape(enumValue) + "\");");
+                emit("Enum " + constName + " = Enum.forString(\"" + javaStringEscape(enumValue) + "\");");
             }
         }
         emit("");
@@ -562,9 +603,9 @@
             }
             String constName = "INT_" + entry.getEnumName();
             if (hasBase) {
-                emit("static final int " + constName + " = " + baseEnumClass + "." + constName + ";");
+                emit("int " + constName + " = " + baseEnumClass + "." + constName + ";");
             } else {
-                emit("static final int " + constName + " = Enum." + constName + ";");
+                emit("int " + constName + " = Enum." + constName + ";");
             }
         }
         if (!hasBase) {
@@ -586,22 +627,25 @@
             emit(" * public constructor. See the constants defined within this");
             emit(" * class for all the valid values.");
             emit(" */");
-            emit("static final class Enum extends org.apache.xmlbeans.StringEnumAbstractBase");
-            emit("{");
+            emit("final class Enum extends org.apache.xmlbeans.StringEnumAbstractBase {");
             indent();
             emit("/**");
             emit(" * Returns the enum value for a string, or null if none.");
             emit(" */");
-            emit("public static Enum forString(java.lang.String s)");
-            emit("    { return (Enum)table.forString(s); }");
+            emit("public static Enum forString(java.lang.String s) {");
+            emit("    return (Enum)table.forString(s);");
+            emit("}");
+            emit("");
             emit("/**");
             emit(" * Returns the enum value corresponding to an int, or null if none.");
             emit(" */");
-            emit("public static Enum forInt(int i)");
-            emit("    { return (Enum)table.forInt(i); }");
+            emit("public static Enum forInt(int i) {");
+            emit("    return (Enum)table.forInt(i);");
+            emit("}");
             emit("");
-            emit("private Enum(java.lang.String s, int i)");
-            emit("    { super(s, i); }");
+            emit("private Enum(java.lang.String s, int i) {");
+            emit("    super(s, i);");
+            emit("}");
             emit("");
             for (SchemaStringEnumEntry entry : entries) {
                 String constName = "INT_" + entry.getEnumName();
@@ -610,11 +654,7 @@
             }
             emit("");
             emit("public static final org.apache.xmlbeans.StringEnumAbstractBase.Table table =");
-            emit("    new org.apache.xmlbeans.StringEnumAbstractBase.Table");
-            emit("(");
-            indent();
-            emit("new Enum[]");
-            emit("{");
+            emit("    new org.apache.xmlbeans.StringEnumAbstractBase.Table(new Enum[] {");
             indent();
             for (SchemaStringEnumEntry entry : entries) {
                 String enumValue = entry.getString();
@@ -622,11 +662,11 @@
                 emit("new Enum(\"" + javaStringEscape(enumValue) + "\", " + constName + "),");
             }
             outdent();
-            emit("}");
-            outdent();
-            emit(");");
+            emit("});");
             emit("private static final long serialVersionUID = 1L;");
-            emit("private java.lang.Object readResolve() { return forInt(intValue()); } ");
+            emit("private java.lang.Object readResolve() {");
+            emit("    return forInt(intValue());");
+            emit("}");
             outdent();
             emit("}");
         }
@@ -764,12 +804,17 @@
         String xtype = xmlTypeForProperty(prop);
         boolean nillable = prop.hasNillable() != SchemaProperty.NEVER;
         boolean several = prop.extendsJavaArray();
+        String propertyDocumentation = prop.getDocumentation();
 
         String propdesc = "\"" + prop.getName().getLocalPart() + "\"" + (prop.isAttribute() ? " attribute" : " element");
         boolean xmltype = (javaType == SchemaProperty.XML_OBJECT);
 
         if (prop.extendsJavaSingleton()) {
-            printJavaDoc((several ? "Gets first " : "Gets the ") + propdesc, BeanMethod.GET);
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0){
+                printJavaDocParagraph(propertyDocumentation);
+            }else {
+                printJavaDoc((several ? "Gets first " : "Gets the ") + propdesc, BeanMethod.GET);
+            }
             emit(type + " get" + propertyName + "();", BeanMethod.GET);
 
             if (!xmltype) {
@@ -784,11 +829,19 @@
         }
 
         if (prop.extendsJavaOption()) {
-            printJavaDoc((several ? "True if has at least one " : "True if has ") + propdesc, BeanMethod.IS_SET);
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0){
+                printJavaDocParagraph(propertyDocumentation);
+            }else {
+                printJavaDoc((several ? "True if has at least one " : "True if has ") + propdesc, BeanMethod.IS_SET);
+            }
             emit("boolean isSet" + propertyName + "();", BeanMethod.IS_SET);
         }
 
         if (several) {
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0){
+                printJavaDocParagraph(propertyDocumentation);
+            }
+
             String arrayName = propertyName + "Array";
 
             String wrappedType = type;
@@ -796,10 +849,18 @@
                 wrappedType = javaWrappedType(javaType);
             }
 
-            printJavaDoc("Gets a List of " + propdesc + "s", BeanMethod.GET_LIST);
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0){
+                printJavaDocParagraph(propertyDocumentation);
+            }else{
+                printJavaDoc("Gets a List of " + propdesc + "s", BeanMethod.GET_LIST);
+            }
             emit("java.util.List<" + wrappedType + "> get" + propertyName + "List();", BeanMethod.GET_LIST);
 
-            printJavaDoc("Gets array of all " + propdesc + "s", BeanMethod.GET_ARRAY);
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0){
+                printJavaDocParagraph(propertyDocumentation);
+            }else{
+                printJavaDoc("Gets array of all " + propdesc + "s", BeanMethod.GET_ARRAY);
+            }
             emit(type + "[] get" + arrayName + "();", BeanMethod.GET_ARRAY);
 
             printJavaDoc("Gets ith " + propdesc, BeanMethod.GET_IDX);
@@ -837,6 +898,7 @@
         boolean optional = prop.extendsJavaOption();
         boolean several = prop.extendsJavaArray();
         boolean singleton = prop.extendsJavaSingleton();
+        String propertyDocumentation = prop.getDocumentation();
 
         String safeVarName = NameUtil.nonJavaKeyword(NameUtil.lowerCamelCase(propertyName));
         if (safeVarName.equals("i")) {
@@ -847,7 +909,11 @@
         String propdesc = "\"" + qName.getLocalPart() + "\"" + (isAttr ? " attribute" : " element");
 
         if (singleton) {
-            printJavaDoc((several ? "Sets first " : "Sets the ") + propdesc, BeanMethod.SET);
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0) {
+                printJavaDocParagraph(propertyDocumentation);
+            } else {
+                printJavaDoc((several ? "Sets first " : "Sets the ") + propdesc, BeanMethod.SET);
+            }
             emit("void set" + propertyName + "(" + type + " " + safeVarName + ");", BeanMethod.SET);
 
             if (!xmltype) {
@@ -867,17 +933,29 @@
         }
 
         if (optional) {
-            printJavaDoc((several ? "Removes first " : "Unsets the ") + propdesc, BeanMethod.UNSET);
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0) {
+                printJavaDocParagraph(propertyDocumentation);
+            } else {
+                printJavaDoc((several ? "Removes first " : "Unsets the ") + propdesc, BeanMethod.UNSET);
+            }
             emit("void unset" + propertyName + "();", BeanMethod.UNSET);
         }
 
         if (several) {
             String arrayName = propertyName + "Array";
 
-            printJavaDoc("Sets array of all " + propdesc, BeanMethod.SET_ARRAY);
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0) {
+                printJavaDocParagraph(propertyDocumentation);
+            } else {
+                printJavaDoc("Sets array of all " + propdesc, BeanMethod.SET_ARRAY);
+            }
             emit("void set" + arrayName + "(" + type + "[] " + safeVarName + "Array);", BeanMethod.SET_ARRAY);
 
-            printJavaDoc("Sets ith " + propdesc, BeanMethod.SET_IDX);
+            if(propertyDocumentation != null && propertyDocumentation.length() > 0) {
+                printJavaDocParagraph(propertyDocumentation);
+            } else {
+                printJavaDoc("Sets ith " + propdesc, BeanMethod.SET_IDX);
+            }
             emit("void set" + arrayName + "(int i, " + type + " " + safeVarName + ");", BeanMethod.SET_IDX);
 
             if (!xmltype) {
@@ -1040,7 +1118,7 @@
         }
 
         emit("public " + (isInner ? "static " : "") + "class " + shortName +
-             " extends " + baseClass + " implements " + interfaces.toString() + " {");
+             " extends " + baseClass + " implements " + interfaces + " {");
 
         startBlock();
 
@@ -1056,29 +1134,24 @@
         emit("target = (" + fullName + ")get_default_attribute_value(" + identifier + ");");
     }
 
-    void makeMissingValue(int javaType) throws IOException {
+    String makeMissingValue(int javaType) throws IOException {
         switch (javaType) {
             case SchemaProperty.JAVA_BOOLEAN:
-                emit("return false;");
-                break;
+                return "false";
 
             case SchemaProperty.JAVA_FLOAT:
-                emit("return 0.0f;");
-                break;
+                return "0.0f";
 
             case SchemaProperty.JAVA_DOUBLE:
-                emit("return 0.0;");
-                break;
+                return "0.0";
 
             case SchemaProperty.JAVA_BYTE:
             case SchemaProperty.JAVA_SHORT:
             case SchemaProperty.JAVA_INT:
-                emit("return 0;");
-                break;
+                return "0";
 
             case SchemaProperty.JAVA_LONG:
-                emit("return 0L;");
-                break;
+                return "0L";
 
             default:
             case SchemaProperty.XML_OBJECT:
@@ -1094,8 +1167,7 @@
             case SchemaProperty.JAVA_CALENDAR:
             case SchemaProperty.JAVA_ENUM:
             case SchemaProperty.JAVA_OBJECT:
-                emit("return null;");
-                break;
+                return "null";
         }
     }
 
@@ -1193,97 +1265,74 @@
         emit("return get" +em.replace("#ID#", setIdentifier), BeanMethod.GET_ARRAY);
     }
 
-    void printJGetValue(int javaType, String type, SchemaTypeImpl stype) throws IOException {
-        String em;
+    String printJGetValue(int javaType, String type, SchemaTypeImpl stype) throws IOException {
         switch (javaType) {
             case SchemaProperty.XML_OBJECT:
-                em = "target";
-                break;
+                return "target";
 
             case SchemaProperty.JAVA_BOOLEAN:
-                em = "target.getBooleanValue()";
-                break;
+                return "target.getBooleanValue()";
 
             case SchemaProperty.JAVA_FLOAT:
-                em = "target.getFloatValue()";
-                break;
+                return "target.getFloatValue()";
 
             case SchemaProperty.JAVA_DOUBLE:
-                em = "target.getDoubleValue()";
-                break;
+                return "target.getDoubleValue()";
 
             case SchemaProperty.JAVA_BYTE:
-                em = "target.getByteValue()";
-                break;
+                return "target.getByteValue()";
 
             case SchemaProperty.JAVA_SHORT:
-                em = "target.getShortValue()";
-                break;
+                return "target.getShortValue()";
 
             case SchemaProperty.JAVA_INT:
-                em = "target.getIntValue()";
-                break;
+                return "target.getIntValue()";
 
             case SchemaProperty.JAVA_LONG:
-                em = "target.getLongValue()";
-                break;
+                return "target.getLongValue()";
 
             case SchemaProperty.JAVA_BIG_DECIMAL:
-                em = "target.getBigDecimalValue()";
-                break;
+                return "target.getBigDecimalValue()";
 
             case SchemaProperty.JAVA_BIG_INTEGER:
-                em = "target.getBigIntegerValue()";
-                break;
+                return "target.getBigIntegerValue()";
 
             case SchemaProperty.JAVA_STRING:
-                em = "target.getStringValue()";
-                break;
+                return "target.getStringValue()";
 
             case SchemaProperty.JAVA_BYTE_ARRAY:
-                em = "target.getByteArrayValue()";
-                break;
+                return "target.getByteArrayValue()";
 
             case SchemaProperty.JAVA_GDATE:
-                em = "target.getGDateValue()";
-                break;
+                return "target.getGDateValue()";
 
             case SchemaProperty.JAVA_GDURATION:
-                em = "target.getGDurationValue()";
-                break;
+                return "target.getGDurationValue()";
 
             case SchemaProperty.JAVA_CALENDAR:
-                em = "target.getCalendarValue()";
-                break;
+                return "target.getCalendarValue()";
 
             case SchemaProperty.JAVA_DATE:
-                em = "target.getDateValue()";
-                break;
+                return "target.getDateValue()";
 
             case SchemaProperty.JAVA_QNAME:
-                em = "target.getQNameValue()";
-                break;
+                return "target.getQNameValue()";
 
             case SchemaProperty.JAVA_LIST:
-                em = "target.getListValue()";
-                break;
+                return "target.getListValue()";
 
             case SchemaProperty.JAVA_ENUM:
-                em = "(" + type + ")target.getEnumValue()";
-                break;
+                return "(" + type + ")target.getEnumValue()";
 
             case SchemaProperty.JAVA_OBJECT:
-                em = "target.getObjectValue()";
-                break;
+                return "target.getObjectValue()";
 
             case SchemaProperty.JAVA_USER:
-                em = getUserTypeStaticHandlerMethod(false, stype) + "(target)";
-                break;
+                return getUserTypeStaticHandlerMethod(false, stype) + "(target)";
 
             default:
                 throw new IllegalStateException();
         }
-        emit("return " + em + ";");
     }
 
     void printJSetValue(int javaType, String safeVarName, SchemaTypeImpl stype) throws IOException {
@@ -1428,8 +1477,7 @@
     }
 
     void emitImplementationPreamble() throws IOException {
-        emit("synchronized (monitor())");
-        emit("{");
+        emit("synchronized (monitor()) {");
         indent();
         emit("check_orphaned();");
     }
@@ -1615,6 +1663,7 @@
         final int javaType = prop.getJavaTypeCode();
         final boolean isAttr = prop.isAttribute();
         final String propertyName = prop.getJavaPropertyName();
+        String propertyDocumentation = prop.getDocumentation();
 
         String propdesc = "\"" + qName.getLocalPart() + "\"" + (isAttr ? " attribute" : " element");
         boolean xmltype = (javaType == SchemaProperty.XML_OBJECT);
@@ -1626,7 +1675,11 @@
         if (prop.extendsJavaSingleton()) {
             if (bmList == null || bmList.contains(BeanMethod.GET)) {
                 // Value getProp()
-                printJavaDoc((several ? "Gets first " : "Gets the ") + propdesc);
+                if(propertyDocumentation != null && propertyDocumentation.length() > 0){
+                    printJavaDocParagraph(propertyDocumentation);
+                } else {
+                    printJavaDoc((several ? "Gets first " : "Gets the ") + propdesc);
+                }
                 if (!opt.isCompileNoAnnotations()) {
                     emit("@Override");
                 }
@@ -1643,12 +1696,9 @@
                     makeAttributeDefaultValue(jtargetType, prop, identifier);
                     endBlock();
                 }
-                emit("if (target == null) {");
-                startBlock();
-                makeMissingValue(javaType);
-                endBlock();
 
-                printJGetValue(javaType, type, (SchemaTypeImpl) prop.getType());
+                emit("return (target == null) ? " + makeMissingValue(javaType) +
+                     " : " + printJGetValue(javaType, type, (SchemaTypeImpl) prop.getType()) + ";");
 
                 emitImplementationPostamble();
 
@@ -1690,8 +1740,7 @@
                 emitImplementationPreamble();
                 emitGetTarget(setIdentifier, identifier, isAttr, "0", NOTHING, xtype);
 
-                emit("if (target == null) return false;");
-                emit("return target.isNil();");
+                emit("return target != null && target.isNil();");
                 emitImplementationPostamble();
                 endBlock();
             }
@@ -1755,7 +1804,7 @@
                 emitImplementationPreamble();
 
                 emitGetTarget(setIdentifier, identifier, isAttr, "i", THROW_EXCEPTION, jtargetType);
-                printJGetValue(javaType, type, (SchemaTypeImpl) prop.getType());
+                emit("return " + printJGetValue(javaType, type, (SchemaTypeImpl) prop.getType()) + ";");
 
                 emitImplementationPostamble();
                 endBlock();
@@ -2100,7 +2149,7 @@
                 startBlock();
                 emitImplementationPreamble();
                 emitPre(sType, PrePostExtension.OPERATION_INSERT, identifier, isAttr, "i");
-                emit(jtargetType + " target = ");
+                emit(jtargetType + " target =");
                 indent();
                 if (!isSubstGroup) {
                     emit("(" + jtargetType + ")get_store().insert_element_user(" + identifier + ", i);");
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java
index 90d15c9..0b0a250 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/SchemaTypeImpl.java
@@ -19,6 +19,9 @@
 import org.apache.xmlbeans.impl.common.QNameHelper;
 import org.apache.xmlbeans.impl.common.XBeanDebug;
 import org.apache.xmlbeans.impl.values.*;
+import org.apache.xmlbeans.impl.xb.xsdschema.AnnotationDocument.Annotation;
+import org.apache.xmlbeans.impl.xb.xsdschema.DocumentationDocument.Documentation;
+import org.apache.xmlbeans.impl.xb.xsdschema.Element;
 
 import javax.xml.namespace.QName;
 import java.lang.reflect.Constructor;
@@ -176,6 +179,8 @@
     private QName _sg;
     private final List<QName> _sgMembers = new ArrayList<>();
 
+    private String _documentation;
+
     public boolean isUnloaded() {
         return _unloaded;
     }
@@ -867,9 +872,9 @@
         }
     }
 
-    private boolean containsElements() {
-        return getContentType() == ELEMENT_CONTENT ||
-               getContentType() == MIXED_CONTENT;
+    private boolean noElements() {
+        return getContentType() != ELEMENT_CONTENT &&
+               getContentType() != MIXED_CONTENT;
     }
 
     public boolean hasAttributeWildcards() {
@@ -885,7 +890,7 @@
     }
 
     public SchemaType getElementType(QName eltName, QName xsiType, SchemaTypeLoader wildcardTypeLoader) {
-        if (isSimpleType() || !containsElements() || isNoType()) {
+        if (isSimpleType() || noElements() || isNoType()) {
             return BuiltinSchemaTypeSystem.ST_NO_TYPE;
         }
 
@@ -977,7 +982,7 @@
     public XmlObject createElementType(QName eltName, QName xsiType, SchemaTypeLoader wildcardTypeLoader) {
         SchemaType type;
         SchemaProperty prop = null;
-        if (isSimpleType() || !containsElements() || isNoType()) {
+        if (isSimpleType() || noElements() || isNoType()) {
             type = BuiltinSchemaTypeSystem.ST_NO_TYPE;
         } else {
             prop = _propertyModelByElementName.get(eltName);
@@ -2248,6 +2253,7 @@
         _elemFormDefault = elemFormDefault;
         _attFormDefault = attFormDefault;
         _redefinition = redefinition;
+        _documentation = parseDocumentation(_parseObject);
     }
 
     public XmlObject getParseObject() {
@@ -2387,4 +2393,37 @@
 
         return qnsb.toQNameSet();
     }
+
+    public String getDocumentation()
+    {
+        return _documentation;
+    }
+
+    private static String parseDocumentation(XmlObject lcti){
+        String str = lcti.toString();
+        Element el;
+        try {
+            el = Element.Factory.parse(str);
+        } catch (Throwable ignore) {
+            return "";
+        }
+
+        Annotation ann = el.getAnnotation();
+        if (ann == null || ann.sizeOfDocumentationArray() == 0) {
+            return "";
+        }
+
+        StringBuilder docBody = new StringBuilder();
+        for (Documentation documentation : ann.getDocumentationArray()) {
+            XmlCursor c = documentation.newCursor();
+            try {
+                if (c.getChars() != null) {
+                    docBody.append(c.getTextValue());
+                }
+            } finally {
+                c.dispose();
+            }
+        }
+        return docBody.toString();
+    }
 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java b/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java
index d51db24..f5ad400 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/StscComplexTypeResolver.java
@@ -1485,6 +1485,10 @@
         sPropImpl.setMinOccurs(use.getMinOccurs());
         sPropImpl.setMaxOccurs(use.getMaxOccurs());
 
+        if(use instanceof SchemaParticle){
+            sPropImpl.setDocumentation(((SchemaParticle)use).getDocumentation());
+        }
+
         if (use instanceof SchemaLocalElementImpl) {
             SchemaLocalElementImpl elt = (SchemaLocalElementImpl) use;
             sPropImpl.setAcceptedNames(elt.acceptedStartNames());
diff --git a/src/test/java/tools/inst2xsd/checkin/Inst2XsdCheckinTest.java b/src/test/java/tools/inst2xsd/checkin/Inst2XsdCheckinTest.java
index a2fded8..3fc62d1 100644
--- a/src/test/java/tools/inst2xsd/checkin/Inst2XsdCheckinTest.java
+++ b/src/test/java/tools/inst2xsd/checkin/Inst2XsdCheckinTest.java
@@ -16,11 +16,16 @@
 
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.impl.inst2xsd.Inst2XsdOptions;
+import org.junit.FixMethodOrder;
 import org.junit.Test;
+import org.junit.runners.MethodSorters;
 import tools.inst2xsd.common.Inst2XsdTestBase;
 
 import java.io.File;
 
+// need to order tests, as "atest_examples_component" didn't work anymore in combination with the other
+// tests since XMLBEANS-82
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
 public class Inst2XsdCheckinTest extends Inst2XsdTestBase {
 
     @Test
@@ -196,9 +201,8 @@
                 XmlObject.Factory.parse(new File(SCHEMA_CASES_DIR + "examples" + P + "cdcatalog_ss0.xsd")));
     }
 
-    //component
     @Test
-    public void test_examples_component() throws Exception {
+    public void atest_examples_component() throws Exception {
         XmlObject inst = XmlObject.Factory.parse(new File(SCHEMA_CASES_DIR + "examples" + P + "component.xml"));
 
         log("-= Venetian Options =-");
diff --git a/src/test/resources/xbean/compile/scomp/partials/RootDocument.java b/src/test/resources/xbean/compile/scomp/partials/RootDocument.java
index e53fa21..8eadd02 100644
--- a/src/test/resources/xbean/compile/scomp/partials/RootDocument.java
+++ b/src/test/resources/xbean/compile/scomp/partials/RootDocument.java
@@ -19,8 +19,7 @@
  *
  * This is a complex type.
  */
-public interface RootDocument extends org.apache.xmlbeans.XmlObject
-{
+public interface RootDocument extends org.apache.xmlbeans.XmlObject {
     DocumentFactory<partials.RootDocument> Factory = new DocumentFactory<>(org.apache.xmlbeans.metadata.system.Partials.TypeSystemHolder.typeSystem, "rootc8d7doctype");
     org.apache.xmlbeans.SchemaType type = Factory.getType();
 
@@ -51,8 +50,7 @@
      *
      * This is a complex type.
      */
-    public interface Root extends org.apache.xmlbeans.XmlObject
-    {
+    public interface Root extends org.apache.xmlbeans.XmlObject {
         ElementFactory<partials.RootDocument.Root> Factory = new ElementFactory<>(org.apache.xmlbeans.metadata.system.Partials.TypeSystemHolder.typeSystem, "root8a55elemtype");
         org.apache.xmlbeans.SchemaType type = Factory.getType();
 
diff --git a/src/test/resources/xbean/compile/scomp/partials/impl/RootDocumentImpl.java b/src/test/resources/xbean/compile/scomp/partials/impl/RootDocumentImpl.java
index dec9860..baf7c1c 100644
--- a/src/test/resources/xbean/compile/scomp/partials/impl/RootDocumentImpl.java
+++ b/src/test/resources/xbean/compile/scomp/partials/impl/RootDocumentImpl.java
@@ -34,15 +34,11 @@
      */
     @Override
     public partials.RootDocument.Root getRoot() {
-        synchronized (monitor())
-        {
+        synchronized (monitor()) {
             check_orphaned();
             partials.RootDocument.Root target = null;
             target = (partials.RootDocument.Root)get_store().find_element_user(PROPERTY_QNAME[0], 0);
-            if (target == null) {
-                return null;
-            }
-            return target;
+            return (target == null) ? null : target;
         }
     }
 // </GET>
@@ -63,8 +59,7 @@
      */
     @Override
     public partials.RootDocument.Root addNewRoot() {
-        synchronized (monitor())
-        {
+        synchronized (monitor()) {
             check_orphaned();
             partials.RootDocument.Root target = null;
             target = (partials.RootDocument.Root)get_store().add_element_user(PROPERTY_QNAME[0]);
@@ -98,15 +93,11 @@
          */
         @Override
         public java.math.BigDecimal getSingle() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.SimpleValue target = null;
                 target = (org.apache.xmlbeans.SimpleValue)get_store().find_element_user(PROPERTY_QNAME[0], 0);
-                if (target == null) {
-                    return null;
-                }
-                return target.getBigDecimalValue();
+                return (target == null) ? null : target.getBigDecimalValue();
             }
         }
 // </GET>
@@ -117,8 +108,7 @@
          */
         @Override
         public org.apache.xmlbeans.XmlDecimal xgetSingle() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[0], 0);
@@ -133,13 +123,11 @@
          */
         @Override
         public boolean isNilSingle() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[0], 0);
-                if (target == null) return false;
-                return target.isNil();
+                return target != null && target.isNil();
             }
         }
 // </IS_NIL>
@@ -150,8 +138,7 @@
          */
         @Override
         public boolean isSetSingle() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 return get_store().count_elements(PROPERTY_QNAME[0]) != 0;
             }
@@ -164,8 +151,7 @@
          */
         @Override
         public void setSingle(java.math.BigDecimal single) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.SimpleValue target = null;
                 target = (org.apache.xmlbeans.SimpleValue)get_store().find_element_user(PROPERTY_QNAME[0], 0);
@@ -183,8 +169,7 @@
          */
         @Override
         public void xsetSingle(org.apache.xmlbeans.XmlDecimal single) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[0], 0);
@@ -202,8 +187,7 @@
          */
         @Override
         public void setNilSingle() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[0], 0);
@@ -221,8 +205,7 @@
          */
         @Override
         public void unsetSingle() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 get_store().remove_element(PROPERTY_QNAME[0], 0);
             }
@@ -235,15 +218,11 @@
          */
         @Override
         public partials.XmlBeanchen getComplex() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 partials.XmlBeanchen target = null;
                 target = (partials.XmlBeanchen)get_store().find_element_user(PROPERTY_QNAME[1], 0);
-                if (target == null) {
-                    return null;
-                }
-                return target;
+                return (target == null) ? null : target;
             }
         }
 // </GET>
@@ -254,8 +233,7 @@
          */
         @Override
         public boolean isSetComplex() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 return get_store().count_elements(PROPERTY_QNAME[1]) != 0;
             }
@@ -278,8 +256,7 @@
          */
         @Override
         public partials.XmlBeanchen addNewComplex() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 partials.XmlBeanchen target = null;
                 target = (partials.XmlBeanchen)get_store().add_element_user(PROPERTY_QNAME[1]);
@@ -294,8 +271,7 @@
          */
         @Override
         public void unsetComplex() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 get_store().remove_element(PROPERTY_QNAME[1], 0);
             }
@@ -308,8 +284,7 @@
          */
         @Override
         public java.util.List<java.math.BigDecimal> getPrimitiveListList() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 return new org.apache.xmlbeans.impl.values.JavaListObject<>(
 // <GET_IDX>
@@ -363,8 +338,7 @@
          */
         @Override
         public java.math.BigDecimal getPrimitiveListArray(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.SimpleValue target = null;
                 target = (org.apache.xmlbeans.SimpleValue)get_store().find_element_user(PROPERTY_QNAME[2], i);
@@ -382,8 +356,7 @@
          */
         @Override
         public java.util.List<org.apache.xmlbeans.XmlDecimal> xgetPrimitiveListList() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 return new org.apache.xmlbeans.impl.values.JavaListXmlObject<>(
 // <XGET_IDX>
@@ -437,8 +410,7 @@
          */
         @Override
         public org.apache.xmlbeans.XmlDecimal xgetPrimitiveListArray(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[2], i);
@@ -456,8 +428,7 @@
          */
         @Override
         public boolean isNilPrimitiveListArray(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[2], i);
@@ -475,8 +446,7 @@
          */
         @Override
         public int sizeOfPrimitiveListArray() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 return get_store().count_elements(PROPERTY_QNAME[2]);
             }
@@ -489,8 +459,7 @@
          */
         @Override
         public void setPrimitiveListArray(java.math.BigDecimal[] primitiveListArray) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 arraySetterHelper(primitiveListArray, PROPERTY_QNAME[2]);
             }
@@ -503,8 +472,7 @@
          */
         @Override
         public void setPrimitiveListArray(int i, java.math.BigDecimal primitiveList) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.SimpleValue target = null;
                 target = (org.apache.xmlbeans.SimpleValue)get_store().find_element_user(PROPERTY_QNAME[2], i);
@@ -522,8 +490,7 @@
          */
         @Override
         public void xsetPrimitiveListArray(org.apache.xmlbeans.XmlDecimal[]primitiveListArray) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 arraySetterHelper(primitiveListArray, PROPERTY_QNAME[2]);
             }
@@ -536,8 +503,7 @@
          */
         @Override
         public void xsetPrimitiveListArray(int i, org.apache.xmlbeans.XmlDecimal primitiveList) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[2], i);
@@ -555,8 +521,7 @@
          */
         @Override
         public void setNilPrimitiveListArray(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().find_element_user(PROPERTY_QNAME[2], i);
@@ -574,10 +539,9 @@
          */
         @Override
         public void insertPrimitiveList(int i, java.math.BigDecimal primitiveList) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
-                org.apache.xmlbeans.SimpleValue target = 
+                org.apache.xmlbeans.SimpleValue target =
                     (org.apache.xmlbeans.SimpleValue)get_store().insert_element_user(PROPERTY_QNAME[2], i);
                 target.setBigDecimalValue(primitiveList);
             }
@@ -590,8 +554,7 @@
          */
         @Override
         public void addPrimitiveList(java.math.BigDecimal primitiveList) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.SimpleValue target = null;
                 target = (org.apache.xmlbeans.SimpleValue)get_store().add_element_user(PROPERTY_QNAME[2]);
@@ -606,8 +569,7 @@
          */
         @Override
         public org.apache.xmlbeans.XmlDecimal insertNewPrimitiveList(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().insert_element_user(PROPERTY_QNAME[2], i);
@@ -622,8 +584,7 @@
          */
         @Override
         public org.apache.xmlbeans.XmlDecimal addNewPrimitiveList() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 org.apache.xmlbeans.XmlDecimal target = null;
                 target = (org.apache.xmlbeans.XmlDecimal)get_store().add_element_user(PROPERTY_QNAME[2]);
@@ -638,8 +599,7 @@
          */
         @Override
         public void removePrimitiveList(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 get_store().remove_element(PROPERTY_QNAME[2], i);
             }
@@ -652,8 +612,7 @@
          */
         @Override
         public java.util.List<partials.XmlBeanchen> getComplexListList() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 return new org.apache.xmlbeans.impl.values.JavaListXmlObject<>(
 // <GET_IDX>
@@ -707,8 +666,7 @@
          */
         @Override
         public partials.XmlBeanchen getComplexListArray(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 partials.XmlBeanchen target = null;
                 target = (partials.XmlBeanchen)get_store().find_element_user(PROPERTY_QNAME[3], i);
@@ -726,8 +684,7 @@
          */
         @Override
         public int sizeOfComplexListArray() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 return get_store().count_elements(PROPERTY_QNAME[3]);
             }
@@ -761,8 +718,7 @@
          */
         @Override
         public partials.XmlBeanchen insertNewComplexList(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 partials.XmlBeanchen target = null;
                 target = (partials.XmlBeanchen)get_store().insert_element_user(PROPERTY_QNAME[3], i);
@@ -777,8 +733,7 @@
          */
         @Override
         public partials.XmlBeanchen addNewComplexList() {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 partials.XmlBeanchen target = null;
                 target = (partials.XmlBeanchen)get_store().add_element_user(PROPERTY_QNAME[3]);
@@ -793,8 +748,7 @@
          */
         @Override
         public void removeComplexList(int i) {
-            synchronized (monitor())
-            {
+            synchronized (monitor()) {
                 check_orphaned();
                 get_store().remove_element(PROPERTY_QNAME[3], i);
             }
