diff --git a/README b/README
index 198b2e5a9bc9656698208510a0a4d2865d5066f7..61e09ebfa2b5f890007371886e4e60a9d81136a3 100644
--- a/README
+++ b/README
@@ -141,9 +141,15 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
-Version 2.13b (09/14/2014)
+Version 2.14a (10/08/2014)
 - Fixed export of simpleType lists (added "' '.join(data)".  Thanks
   to Per Rosengren for catching this.
+- Added new style validation of simpleType data.  Validation
+  requirements are captured from the XML schema definition of the
+  simpleType, e.g. 'restriction base="..."' etc.  Thanks to
+  azer gh for implementing this extended capability.
+- Added unit test for simpleType validation, including test for
+  proper detection of bad (invalid) data.
 
 Version 2.13a (09/09/2014)
 - Minor fix to function generateToEtreeChildren.  Must generate
diff --git a/generateDS.html b/generateDS.html
index 4ed9fd4217980343a74581d3fa526cd0cf5da606..90dfb325439b740baa17e719174413cdabd1b9b0 100644
--- a/generateDS.html
+++ b/generateDS.html
@@ -205,7 +205,7 @@ ul.auto-toc {
 <tr><th class="docinfo-name">Author:</th>
 <td>Dave Kuhlman</td></tr>
 <tr><th class="docinfo-name">Contact:</th>
-<td><a class="first last reference external" href="mailto:dkuhlman&#64;davekuhlman.org">dkuhlman&#64;davekuhlman.org</a></td></tr>
+<td>dkuhlman (at) davekuhlman (dot) org</td></tr>
 <tr><th class="docinfo-name">Address:</th>
 <td><pre class="address">
 <a class="first last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a>
@@ -220,7 +220,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.14a</td>
 </tr>
 </tbody>
 </table>
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">October 08, 2014</td>
 </tr>
 </tbody>
 </table>
@@ -552,6 +552,11 @@ Options:
                              module. Default=&quot;???&quot;
     --validator-bodies=path  Path to a directory containing files that provide
                              bodies (implementations) of validator methods.
+    --use-old-simpletype-validators
+                             Use the old style simpleType validator functions
+                             stored in a specified directory, instead of the
+                             new style validators generated directly from the
+                             XML schema.  See option --validator-bodies.
     --use-getter-setter      Generate getter and setter methods.  Values:
                              &quot;old&quot; - Name getters/setters getVar()/setVar().
                              &quot;new&quot; - Name getters/setters get_var()/set_var().
@@ -729,6 +734,17 @@ an optional &quot;.py&quot; extension.  If a file is not provided for a
 given type, an empty body (<tt class="docutils literal">pass</tt>) is generated.  In these
 files, lines with &quot;##&quot; in the first two columns are ignored
 and are not inserted.</dd>
+<dt>use-old-simpletype-validators</dt>
+<dd><tt class="docutils literal">generateDS.py</tt> is capable of generating validator bodies --
+the code that validates data content in an XML instance
+docuement and writes out warning messages if that data does not
+satisfy the facets in the <tt class="docutils literal">xs:restriction</tt> in the
+<tt class="docutils literal">xs:simpleType</tt> defintion in the XML schema.  Use this option
+if you want to use your own validation bodies/code defined in a
+specified directory .  See option <tt class="docutils literal"><span class="pre">--validator-bodies</span></tt> for
+information on that.  <em>Without</em> this option
+(<tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt>), the validator code will
+be generated directly from the XML schema, which is the default.</dd>
 <dt>use-getter-setter</dt>
 <dd><p class="first"><tt class="docutils literal">generateDS.py</tt> now generates getter and setter methods (for
 variable &quot;abc&quot;, for example) with the names get_abc() and
@@ -761,7 +777,12 @@ changes to the generated python code.</dd>
 <dd>Do not process included XML Schema files.  By default,
 generateDS.py will insert content from files referenced by
 <tt class="docutils literal">&lt;include ... /&gt;</tt> elements into the XML Schema to be processed.
-See section <a class="reference internal" href="#include-file-processing">Include file processing</a>.</dd>
+See section <a class="reference internal" href="#include-file-processing">Include file processing</a>.  Note that include
+processing, which is performed in <tt class="docutils literal">process_includes.py</tt> is
+required for generating validator bodies from the XML schema,
+because the Lxml ElementTree produced in <tt class="docutils literal">process_includes.py</tt>
+is needed to generate the validator code.  So, using this option
+also turns off automatic generation of validator code.</dd>
 <dt>silence</dt>
 <dd>Normally, the code generated with generateDS echoes the
 information being parsed. To prevent the echo from occurring,
@@ -2886,7 +2907,7 @@ following among others:</p>
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateDS.txt">View document source</a>.
-Generated on: 2014-09-09 20:05 UTC.
+Generated on: 2014-10-08 22:22 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/generateDS.py b/generateDS.py
index 12f65cd114dab88ff1b35410a0971f79d840b625..145f99531d3502816210e03d116c1eab5015fd26 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Synopsis:
-    Generate Python classes from XML Schema definition.
+    Generate Python classes from XML schema definition.
     Input is read from in_xsd_file or, if "-" (dash) arg, from stdin.
     Output is written to files named in "-o" and "-s" options.
 Usage:
@@ -35,6 +35,11 @@ Options:
                              module. Default="???"
     --validator-bodies=path  Path to a directory containing files that provide
                              bodies (implementations) of validator methods.
+    --use-old-simpletype-validators
+                             Use the old style simpleType validator functions
+                             stored in a specified directory, instead of the
+                             new style validators generated directly from the
+                             XML schema.  See option --validator-bodies.
     --use-getter-setter      Generate getter and setter methods.  Values:
                              "old" - Name getters/setters getVar()/setVar().
                              "new" - Name getters/setters get_var()/set_var().
@@ -51,10 +56,10 @@ Options:
                              generated files. This is useful if you want
                              to minimize the amount of (no-operation)
                              changes to the generated python code.
-    --no-process-includes    Do not process included XML Schema files.  By
+    --no-process-includes    Do not process included XML schema files.  By
                              default, generateDS.py will insert content
                              from files referenced by <include ... />
-                             elements into the XML Schema to be processed.
+                             elements into the XML schema to be processed.
     --silence                Normally, the code generated with generateDS
                              echoes the information being parsed. To prevent
                              the echo from occurring, use the --silence switch.
@@ -148,11 +153,6 @@ import keyword
 import StringIO
 import textwrap
 
-
-
-#sorry :couldnt pass the filename but with global variable,as i want to use it in validations try to correct this
-xsdFileName=[]
-
 # Default logger configuration
 logging.basicConfig(
     level=logging.DEBUG,
@@ -184,11 +184,14 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.13b'
+VERSION = '2.14a'
 ##VERSION##
 
 GenerateProperties = 0
 UseGetterSetter = 'new'
+UseOldSimpleTypeValidators = False
+SchemaLxmlTree = None
+XsdFileName=[]
 MemberSpecs = None
 DelayedElements = set()
 DelayedElements_subclass = set()
@@ -3933,9 +3936,11 @@ def generateCtor(wrt, prefix, element):
                     wrt('            self.%s = %s\n' % (name, name))
                 else:
                     wrt('        self.%s = %s\n' % (name, name))
-                    #azg: validate if it is a simple type: validation shows warning so no fear that an error would rise
+                    # validate if it is a simple type.  Validation shows
+                    # a warning so no fear that an error would rise.
                     if (child.getSimpleType()):
-                        wrt('        self.validate_%s(self.%s)\n' % (child.getSimpleType(), name))
+                        wrt('        self.validate_%s(self.%s)\n' % (
+                            child.getSimpleType(), name))
     eltype = element.getType()
     if (element.getSimpleContent() or
             element.isMixed() or
@@ -3951,145 +3956,197 @@ def generateCtor(wrt, prefix, element):
 # end generateCtor
 
 
-#validate directly from xsd file, no need to specify directory for validation
-def getValidatorBody(stName,typexs,base):    
-#azg 
-    
-    az_s1 = '        if value is not None and all_validtion:\n'
-    from lxml import etree
-    ns = {'xs': 'http://www.w3.org/2001/XMLSchema'}
-    file = xsdFileName[0]
-    tree = etree.parse(file)
-    ns= {"xs": "http://www.w3.org/2001/XMLSchema"}
-
-    #on determine l elemnt ou le type est definit  
-    bases = tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]",namespaces=ns,n=stName,b=base)
-    enumerations = []
-    #une liste qui contient les restrictions deja traitees  
-    already_processed=[]
-    for restriction in bases[0]:
-        restriction_name = restriction.tag
-        if 'pattern' in  restriction_name and 'pattern' not in already_processed:
-            pattern =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:pattern/@value",namespaces=ns,n=stName,b=base)[0]
-            #convertir en string si le type n est pas string (car on ne peut pas comparer un pattern qu avec un type string
-            valuestring ='(str(value))'
-            toencode = '% {"value" : value}'
-            if 'string' in base:
-                valuestring ='(value)'
-                toencode = '% {"value" : value}.encode("utf-8")'
-            az_s1+="           a = re_.compile('%(pattern)s')\n" %{"pattern": pattern}
-            az_s1+="           if not a.match%(valuestring)s:\n" % {"valuestring":valuestring}
-            az_s1+="              warnings.warn('Value %(val)s dosent match xsd pattern restriction on %(typename)s' %(express)s )\n" %{ "val":'%(value)s' , "typename" : stName, "express": toencode }
-            already_processed.append('pattern')
-        elif 'enumeration' in  restriction_name and 'enumeration' not in already_processed:
-            enumerations =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:enumeration/@value",namespaces=ns,n=stName,b=base)          
-            already_processed.append('enumeration')
-            if len(enumerations)>0:
-                az_s1+="           enumerations=%(enumerations)s\n" % {'enumerations' : enumerations}
-                az_s1+="           enumeration_respectee = False\n"
-                az_s1+="           for enum in enumerations:\n"
-                az_s1+="               if value == enum:\n"    
-                az_s1+="                   enumeration_respectee=True\n"    
-                az_s1+="                   break\n"    
-                az_s1+="           if not enumeration_respectee:\n"
-                az_s1+="               warnings.warn('Value %(val)s dosent match xsd enumeration restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": '% {"value" : value.encode("utf-8")}'}
-        elif 'maxLength' in  restriction_name and 'maxLength' not in already_processed:
-            valuestring ='(str(value))'
-            toencode = '% {"value" : value}'
-            if 'string' in base:
-                valuestring ='(value)' 
-                toencode = '% {"value" : value}.encode("utf-8")'          
-            maxLength =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:maxLength/@value",namespaces=ns,n=stName,b=base)[0]          
-            az_s1+="           if len%(valuestring)s > %(maxLength)s:\n" % {'maxLength' : maxLength, "valuestring" :valuestring}
-            az_s1+="               warnings.warn('Value %(val)s dosent match xsd maxLength restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode}
-        elif 'minLength' in  restriction_name and 'minLength' not in already_processed:
-            valuestring ='(str(value))'
-            toencode = '% {"value" : value}'
-            if 'string' in base:
-                valuestring ='(value)' 
-                toencode = '% {"value" : value}.encode("utf-8")'          
-            minLength =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:minLength/@value",namespaces=ns,n=stName,b=base)[0]          
-            az_s1+="           if len%(valuestring)s < %(minLength)s:\n" % {'minLength' : minLength, "valuestring" :valuestring}
-            az_s1+="               warnings.warn('Value %(val)s dosent match xsd minLength restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode}
-            already_processed.append('minLength')
-        elif 'minInclusive' in  restriction_name and 'minInclusive' not in already_processed:
-            valuestring ='(value)'
-            toencode = '% {"value" : value}'
-            if 'string' in base:
-                valuestring ='len(str(value))' 
-                toencode = '% {"value" : value}.encode("utf-8")'          
-            minInclusive =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:minInclusive/@value",namespaces=ns,n=stName,b=base)[0]          
-            az_s1+="           if %(valuestring)s <= %(minInclusive)s:\n" % {'minInclusive' : minInclusive, "valuestring" :valuestring}
-            az_s1+="               warnings.warn('Value %(val)s dosent match xsd minInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode }
-            already_processed.append('minInclusive')
-        elif 'maxInclusive' in  restriction_name and 'maxInclusive' not in already_processed:
-            valuestring ='(value)'
-            toencode = '% {"value" : value}'
-            if 'string' in base:
-                valuestring ='len(str(value))' 
-                toencode = '% {"value" : value}.encode("utf-8")'          
-            maxInclusive =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:maxInclusive/@value",namespaces=ns,n=stName,b=base)[0]          
-            az_s1+="           if %(valuestring)s >= %(maxInclusive)s:\n" % {'maxInclusive' : maxInclusive, "valuestring" :valuestring}
-            az_s1+="               warnings.warn('Value %(val)s dosent match xsd maxInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode }
-            already_processed.append('maxInclusive')
-        elif 'totalDigits' in  restriction_name and 'totalDigits' not in already_processed:
-            valuestring ='(str(value))'
-            toencode = '% {"value" : value}'
-            if 'string' in base:
-                valuestring ='(value)' 
-                toencode = '% {"value" : value}.encode("utf-8")'          
-            totalDigits =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:totalDigits/@value",namespaces=ns,n=stName,b=base)[0]          
-            az_s1+="           if len%(valuestring)s >= %(totalDigits)s:\n" % {'totalDigits' : totalDigits, "valuestring" :valuestring}
-            az_s1+="               warnings.warn('Value %(val)s dosent match xsd maxInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode }
-            already_processed.append('totalDigits')
-    
-    
-    
-        
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    az_s1+= '           pass\n'
-    
-    
-    return az_s1
-
-#/azg    
-    
-    
-    
-    
-    
-    retrieved = 0
-    if ValidatorBodiesBasePath:
-        found = 0
-        path = '%s%s%s.py' % (ValidatorBodiesBasePath, os.sep, stName, )
-        if os.path.exists(path):
-            found = 1
+# find the simple type, either a named simpleType or an anonymous one.
+def find_simple_type_def(tree, stName, element, child, ns, base):
+    st = None
+    if stName:
+        st_defs = tree.xpath("//xs:simpleType[@name=$n]", namespaces=ns, n=stName)
+        if st_defs:
+            st = st_defs[0]
         else:
-            path = '%s%s%s' % (ValidatorBodiesBasePath, os.sep, stName, )
+            typeName = element.getType()
+            childName = child.getName()
+            # search for an anonymous simpleType.
+            el_defs = tree.xpath("//xs:complexType[@name=$typeName]//xs:element[@name=$childName]/xs:simpleType",
+                namespaces=ns, typeName=typeName, childName=childName)
+            if el_defs:
+                st = el_defs[0]
+            else:
+                # search for an anonymous simpleType inside an anonymous complexType.
+                el_defs = tree.xpath("//xs:element[@name=$typeName]/xs:complexType//xs:element[@name=$childName]/xs:simpleType",
+                    namespaces=ns, typeName=typeName, childName=childName)
+    return st
+
+
+#validate directly from xsd file, no need to specify directory for validation
+def getValidatorBody(stName, base, element, child):
+    if not UseOldSimpleTypeValidators and SchemaLxmlTree is not None:
+        # generate validator bodies directly from the XML schema.
+        s1 = '        if value is not None and Validate_simpletypes_:\n'
+        initial_len = len(s1)
+        ns = {'xs': 'http://www.w3.org/2001/XMLSchema'}
+        fileName = XsdFileName[0]
+        tree = SchemaLxmlTree
+        ns= {"xs": "http://www.w3.org/2001/XMLSchema"}
+        #on determine l elemnt ou le type est definit  
+        st = find_simple_type_def(tree, stName, element, child, ns, base)
+        if st is not None:
+            bases = st.xpath("xs:restriction[@base=$b]", namespaces=ns, n=stName, b=base)
+            #une liste qui contient les restrictions deja traitees  
+            already_processed=[]
+            if bases:
+                for restriction in bases[0]:
+                    restriction_name = restriction.tag
+                    if 'pattern' in restriction_name and 'pattern' not in already_processed:
+                        pattern = st.xpath("xs:restriction[@base=$b]/xs:pattern/@value", namespaces=ns, n=stName, b=base)
+                        if pattern:
+                            pattern = pattern[0]
+                            already_processed.append('pattern')
+                            #convertir en string si le type n est pas string (car on ne peut pas comparer un pattern qu avec un type string
+                            valuestring ='(str(value))'
+                            toencode = '% {"value" : value}'
+                            if 'string' in base:
+                                valuestring = '(value)'
+                                toencode = '% {"value" : value.encode("utf-8")}'
+                            s1 += "           a = re_.compile('%(pattern)s')\n" %{"pattern": pattern}
+                            s1 += "           if not a.match%(valuestring)s:\n" % {"valuestring":valuestring}
+                            s1 += "              warnings.warn('Value \"%(val)s\" does not match xsd pattern restriction on %(typename)s' %(express)s )\n" %{ "val":'%(value)s' , "typename" : stName, "express": toencode }
+                    elif 'enumeration' in restriction_name and 'enumeration' not in already_processed:
+                        enumerations = st.xpath("xs:restriction[@base=$b]/xs:enumeration/@value", namespaces=ns, n=stName, b=base)
+                        if enumerations:
+                            already_processed.append('enumeration')
+                            s1 += "           enumerations = %(enumerations)s\n" % {'enumerations' : enumerations}
+                            s1 += "           enumeration_respectee = False\n"
+                            s1 += "           for enum in enumerations:\n"
+                            s1 += "               if value == enum:\n"
+                            s1 += "                   enumeration_respectee = True\n"
+                            s1 += "                   break\n"
+                            s1 += "           if not enumeration_respectee:\n"
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd enumeration restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": '% {"value" : value.encode("utf-8")}'}
+                    elif 'maxLength' in restriction_name and 'maxLength' not in already_processed:
+                        valuestring = '(str(value))'
+                        toencode = '% {"value" : value}'
+                        if 'string' in base:
+                            valuestring = '(value)' 
+                            toencode = '% {"value" : value.encode("utf-8")}'
+                        maxLength = st.xpath("xs:restriction[@base=$b]/xs:maxLength/@value", namespaces=ns, n=stName, b=base)
+                        if maxLength:
+                            maxLength = maxLength[0]
+                            already_processed.append('maxLength')
+                            s1 += "           if len%(valuestring)s > %(maxLength)s:\n" % {'maxLength' : maxLength, "valuestring" :valuestring}
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd maxLength restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode}
+                    elif 'minLength' in restriction_name and 'minLength' not in already_processed:
+                        valuestring = '(str(value))'
+                        toencode = '% {"value" : value}'
+                        if 'string' in base:
+                            valuestring = '(value)' 
+                            toencode = '% {"value" : value.encode("utf-8")}'
+                        minLength = st.xpath("xs:restriction[@base=$b]/xs:minLength/@value", namespaces=ns, n=stName, b=base)
+                        if minLength:
+                            minLength = minLength[0]
+                            already_processed.append('minLength')
+                            s1 += "           if len%(valuestring)s < %(minLength)s:\n" % {'minLength' : minLength, "valuestring" :valuestring}
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd minLength restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode}
+                    elif 'length' in restriction_name and 'length' not in already_processed:
+                        valuestring = '(str(value))'
+                        toencode = '% {"value" : value}'
+                        if 'string' in base:
+                            valuestring = '(value)' 
+                            toencode = '% {"value" : value.encode("utf-8")}'
+                        length = st.xpath("xs:restriction[@base=$b]/xs:length/@value", namespaces=ns, n=stName, b=base)
+                        if length:
+                            length = length[0]
+                            already_processed.append('length')
+                            s1 += "           if len%(valuestring)s != %(length)s:\n" % {'length' : length, "valuestring" :valuestring}
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd length restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode}
+                    elif 'minInclusive' in  restriction_name and 'minInclusive' not in already_processed:
+                        valuestring = 'value'
+                        toencode = '% {"value" : value}'
+                        if 'string' in base:
+                            valuestring = 'len(str(value))'
+                            toencode = '% {"value" : value.encode("utf-8")}'
+                        minInclusive = st.xpath("xs:restriction[@base=$b]/xs:minInclusive/@value", namespaces=ns, n=stName, b=base)
+                        if minInclusive:
+                            minInclusive = minInclusive[0]
+                            already_processed.append('minInclusive')
+                            s1 += "           if %(valuestring)s <= %(minInclusive)s:\n" % {'minInclusive' : minInclusive, "valuestring" :valuestring}
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd minInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode }
+                    elif 'maxInclusive' in  restriction_name and 'maxInclusive' not in already_processed:
+                        valuestring = 'value'
+                        toencode = '% {"value" : value}'
+                        if 'string' in base:
+                            valuestring = 'len(str(value))'
+                            toencode = '% {"value" : value.encode("utf-8")}'
+                        maxInclusive = st.xpath("xs:restriction[@base=$b]/xs:maxInclusive/@value", namespaces=ns, n=stName, b=base)
+                        if maxInclusive:
+                            maxInclusive = maxInclusive[0]
+                            already_processed.append('maxInclusive')
+                            s1 += "           if %(valuestring)s >= %(maxInclusive)s:\n" % {'maxInclusive' : maxInclusive, "valuestring" :valuestring}
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd maxInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode }
+                    elif 'minExclusive' in  restriction_name and 'minExclusive' not in already_processed:
+                        valuestring = 'value'
+                        toencode = '% {"value" : value}'
+                        if 'string' in base:
+                            valuestring = 'len(str(value))'
+                            toencode = '% {"value" : value.encode("utf-8")}'
+                        minExclusive = st.xpath("xs:restriction[@base=$b]/xs:minExclusive/@value", namespaces=ns, n=stName, b=base)
+                        if minExclusive:
+                            minExclusive = minExclusive[0]
+                            already_processed.append('minExclusive')
+                            s1 += "           if %(valuestring)s < %(minExclusive)s:\n" % {'minExclusive' : minExclusive, "valuestring" :valuestring}
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd minExclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode }
+                    elif 'maxExclusive' in restriction_name and 'maxExclusive' not in already_processed:
+                        valuestring = 'value'
+                        toencode = '% {"value" : value}'
+                        if 'string' in base:
+                            valuestring = 'len(str(value))'
+                            toencode = '% {"value" : value.encode("utf-8")}'
+                        maxExclusive = st.xpath("xs:restriction[@base=$b]/xs:maxExclusive/@value", namespaces=ns, n=stName, b=base)
+                        if maxExclusive:
+                            maxExclusive = maxExclusive[0]
+                            already_processed.append('maxExclusive')
+                            s1 += "           if %(valuestring)s > %(maxExclusive)s:\n" % {'maxExclusive' : maxExclusive, "valuestring" :valuestring}
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd maxExclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode }
+                    elif 'totalDigits' in restriction_name and 'totalDigits' not in already_processed:
+                        valuestring = '(str(value))'
+                        toencode = '% {"value" : value}'
+                        if 'string' in base:
+                            valuestring = '(value)'
+                            toencode = '% {"value" : value.encode("utf-8")}'
+                        totalDigits = st.xpath("xs:restriction[@base=$b]/xs:totalDigits/@value", namespaces=ns, n=stName, b=base)
+                        if totalDigits:
+                            totalDigits = totalDigits[0]
+                            already_processed.append('totalDigits')
+                            s1 += "           if len%(valuestring)s >= %(totalDigits)s:\n" % {'totalDigits' : totalDigits, "valuestring" :valuestring}
+                            s1 += "               warnings.warn('Value \"%(val)s\" does not match xsd maxInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode }
+        if len(s1) == initial_len:
+            s1 += '           pass\n'
+        return s1
+    else:
+        # if UseOldSimpleTypeValidators -- generate validator bodies from use code.
+        retrieved = 0
+        if ValidatorBodiesBasePath:
+            found = 0
+            path = '%s%s%s.py' % (ValidatorBodiesBasePath, os.sep, stName, )
             if os.path.exists(path):
                 found = 1
-        if found:
-            infile = open(path, 'r')
-            lines = infile.readlines()
-            infile.close()
-            lines1 = []
-            for line in lines:
-                if not line.startswith('##'):
-                    lines1.append(line)
-            s1 = ''.join(lines1)
-            retrieved = 1
-    if not retrieved:
-        s1 = '        pass\n'
-    return s1
+            else:
+                path = '%s%s%s' % (ValidatorBodiesBasePath, os.sep, stName, )
+                if os.path.exists(path):
+                    found = 1
+            if found:
+                infile = open(path, 'r')
+                lines = infile.readlines()
+                infile.close()
+                lines1 = []
+                for line in lines:
+                    if not line.startswith('##'):
+                        lines1.append(line)
+                s1 = ''.join(lines1)
+                retrieved = 1
+        if not retrieved:
+            s1 = '        pass\n'
+        return s1
 # end getValidatorBody
 
 
@@ -4178,7 +4235,7 @@ def generateValidatorDefs(wrt, element):
                     (typeName, stObj.getBase(), ))
             else:
                 wrt('        # validate type %s\n' % (typeName, ))
-            wrt(getValidatorBody(typeName,child.getType(),stObj.getBase()))
+            wrt(getValidatorBody(typeName, stObj.getBase(), element, child))
     attrDefs = element.getAttributeDefs()
     for key in attrDefs:
         attrDef = attrDefs[key]
@@ -4194,7 +4251,7 @@ def generateValidatorDefs(wrt, element):
                     typeName, stObj.getBase(), ))
             else:
                 wrt('        # validate type %s\n' % (typeName, ))
-            wrt(getValidatorBody(typeName,attrDef.getType(),attrDef.getBase()))
+            wrt(getValidatorBody(typeName, stObj.getBase(), None, None))
 # end generateValidatorDefs
 
 
@@ -4430,9 +4487,10 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
 
 
-all_validtion = True
+Validate_simpletypes_ = True
 
 
 etree_ = None
@@ -6033,7 +6091,8 @@ def parseAndGenerate(
         processIncludes, options, args, superModule='???'):
     global DelayedElements, DelayedElements_subclass, \
         AlreadyGenerated, SaxDelayedElements, \
-        AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule
+        AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule, \
+        SchemaLxmlTree
     DelayedElements = set()
     DelayedElements_subclass = set()
     AlreadyGenerated = set()
@@ -6058,13 +6117,14 @@ def parseAndGenerate(
         if processIncludes:
             import process_includes
             outfile = StringIO.StringIO()
-            process_includes.process_include_files(
+            doc = process_includes.process_include_files(
                 infile, outfile,
                 inpath=xschemaFileName,
                 catalogpath=catalogFilename,
                 fixtypenames=FixTypeNames)
             outfile.seek(0)
             infile = outfile
+            SchemaLxmlTree = doc.getroot()
         parser.parse(infile)
         root = dh.getRoot()
         root.annotate()
@@ -6257,7 +6317,7 @@ def main():
         ExternalEncoding, MemberSpecs, NoQuestions, \
         ExportWrite, ExportEtree, ExportLiteral, \
         FixTypeNames, SingleFileOutput, OutputDirectory, \
-        ModuleSuffix
+        ModuleSuffix, UseOldSimpleTypeValidators
     outputText = True
     args = sys.argv[1:]
     try:
@@ -6273,7 +6333,7 @@ def main():
                 'no-questions', 'session=', 'fix-type-names=',
                 'version', 'export=',
                 'one-file-per-xsd', 'output-directory=',
-                'module-suffix='
+                'module-suffix=', 'use-old-simpletype-validators',
             ])
     except getopt.GetoptError:
         usage()
@@ -6392,6 +6452,8 @@ def main():
                 err_msg('*** Option use-getter-setter must '
                         '"old" or "new" or "none".\n')
                 sys.exit(1)
+        elif option[0] == '--use-old-simpletype-validators':
+            UseOldSimpleTypeValidators = True
         elif option[0] in ('-u', '--user-methods'):
             UserMethodsPath = option[1]
         elif option[0] == '--no-process-includes':
@@ -6444,7 +6506,7 @@ def main():
             usage()
         else:
             xschemaFileName = args[0]
-            xsdFileName.append(xschemaFileName)
+            XsdFileName.append(xschemaFileName)
     silent = not outputText
     TEMPLATE_MAIN = fixSilence(TEMPLATE_MAIN, silent)
     TEMPLATE_SUBCLASS_FOOTER = fixSilence(TEMPLATE_SUBCLASS_FOOTER, silent)
diff --git a/generateDS.txt b/generateDS.txt
index d8e2df54e0af1cf217e4bccb6f71ce16d65e47fe..ad40547ce277a5ccb298a9b6c9fc86020318d2b2 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -3,7 +3,7 @@ generateDS -- Generate Data Structures from XML Schema
 ======================================================
 
 :author: Dave Kuhlman
-:contact: dkuhlman@davekuhlman.org
+:contact: dkuhlman (at) davekuhlman (dot) org
 :address:
     http://www.davekuhlman.org
 
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.13b
+:revision: 2.14a
 
 .. version
 
@@ -253,6 +253,11 @@ Here is the usage message displayed by ``generateDS.py``::
                                  module. Default="???"
         --validator-bodies=path  Path to a directory containing files that provide
                                  bodies (implementations) of validator methods.
+        --use-old-simpletype-validators
+                                 Use the old style simpleType validator functions
+                                 stored in a specified directory, instead of the
+                                 new style validators generated directly from the
+                                 XML schema.  See option --validator-bodies.
         --use-getter-setter      Generate getter and setter methods.  Values:
                                  "old" - Name getters/setters getVar()/setVar().
                                  "new" - Name getters/setters get_var()/set_var().
@@ -442,6 +447,18 @@ validator-bodies=<path>
     files, lines with "##" in the first two columns are ignored
     and are not inserted.
 
+use-old-simpletype-validators
+    ``generateDS.py`` is capable of generating validator bodies --
+    the code that validates data content in an XML instance
+    docuement and writes out warning messages if that data does not
+    satisfy the facets in the ``xs:restriction`` in the
+    ``xs:simpleType`` defintion in the XML schema.  Use this option
+    if you want to use your own validation bodies/code defined in a
+    specified directory .  See option ``--validator-bodies`` for
+    information on that.  *Without* this option
+    (``--use-old-simpletype-validators``), the validator code will
+    be generated directly from the XML schema, which is the default.
+
 use-getter-setter
     ``generateDS.py`` now generates getter and setter methods (for
     variable "abc", for example) with the names get_abc() and
@@ -477,7 +494,12 @@ no-process-includes
     Do not process included XML Schema files.  By default,
     generateDS.py will insert content from files referenced by
     ``<include ... />`` elements into the XML Schema to be processed.
-    See section `Include file processing`_.
+    See section `Include file processing`_.  Note that include
+    processing, which is performed in ``process_includes.py`` is
+    required for generating validator bodies from the XML schema,
+    because the Lxml ElementTree produced in ``process_includes.py``
+    is needed to generate the validator code.  So, using this option
+    also turns off automatic generation of validator code.
 
 silence
     Normally, the code generated with generateDS echoes the
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index 3e2bc3f5e09004812aacf3dd65fb78c794bb5994..d0e31e8d94ef565f7de3aa6f9324eb5a3c4a81fd 100755
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -31,7 +31,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.13b'
+VERSION = '2.14a'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index db0373e6e90e744f1717cc761f486d098c96ccf3..fe924753791188c975bf76e74f53345a04f6e24e 100644
--- a/librarytemplate_howto.html
+++ b/librarytemplate_howto.html
@@ -217,7 +217,7 @@ ul.auto-toc {
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.14a</td>
 </tr>
 </tbody>
 </table>
@@ -226,7 +226,7 @@ ul.auto-toc {
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">October 08, 2014</td>
 </tr>
 </tbody>
 </table>
@@ -380,7 +380,7 @@ this command for your needs.  For example, you may need to use
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="librarytemplate_howto.txt">View document source</a>.
-Generated on: 2014-09-09 19:14 UTC.
+Generated on: 2014-10-08 22:22 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index ed399ce928bb610f7ced13220da55fe01043c6ee..1c3c5212fd0676891e4ae201f23b60fc316a6728 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.13b
+:revision: 2.14a
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 8ea77859c2bf97a3d67887b05b86c0adf33a6c4c..166239bf4e7f9f2dfe40f5522d55acaf82f5d73b 100755
--- a/process_includes.py
+++ b/process_includes.py
@@ -30,7 +30,7 @@ from lxml import etree
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.13b'
+VERSION = '2.14a'
 ##VERSION##
 
 CatalogDict = {}
@@ -59,7 +59,8 @@ def process_include_files(
         'force': False,
         'fixtypenames': fixtypenames,
     })
-    prep_schema_doc(infile, outfile, inpath, options)
+    doc = prep_schema_doc(infile, outfile, inpath, options)
+    return doc
 
 
 def get_all_root_file_paths(infile, inpath='', catalogpath=None):
diff --git a/setup.py b/setup.py
index e73b0d4e0f8be568894c0e786e5c11dd56734b9d..6f85b8b23e9cd416707f87f600c4043844ba07eb 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ setup(name="generateDS",
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.13b",
+    version="2.14a",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/OnePer/oneperType00_1One.py b/tests/OnePer/oneperType00_1One.py
index eb028c4604959d7621d32ea8f889405d23a8e790..36917905171fbe2b866028065559526b76b08fc4 100644
--- a/tests/OnePer/oneperType00_1One.py
+++ b/tests/OnePer/oneperType00_1One.py
@@ -30,6 +30,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py
index eb028c4604959d7621d32ea8f889405d23a8e790..36917905171fbe2b866028065559526b76b08fc4 100644
--- a/tests/OnePer/oneperType00_2One.py
+++ b/tests/OnePer/oneperType00_2One.py
@@ -30,6 +30,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/OnePer/oneperType01_1One.py b/tests/OnePer/oneperType01_1One.py
index 96afe49ff4181b2b7b329987f737859b0ead3eb6..af63e675c32c93aa04d78f748504b81fbc102c9d 100644
--- a/tests/OnePer/oneperType01_1One.py
+++ b/tests/OnePer/oneperType01_1One.py
@@ -30,6 +30,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py
index 96afe49ff4181b2b7b329987f737859b0ead3eb6..af63e675c32c93aa04d78f748504b81fbc102c9d 100644
--- a/tests/OnePer/oneperType01_2One.py
+++ b/tests/OnePer/oneperType01_2One.py
@@ -30,6 +30,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/OnePer/oneperType02_1One.py b/tests/OnePer/oneperType02_1One.py
index 63667bb9ba0a9f8c81aece4c9fe8bf1258246c77..b2a887174188943f0a522b795f8321e06d9c2462 100644
--- a/tests/OnePer/oneperType02_1One.py
+++ b/tests/OnePer/oneperType02_1One.py
@@ -30,6 +30,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py
index 63667bb9ba0a9f8c81aece4c9fe8bf1258246c77..b2a887174188943f0a522b795f8321e06d9c2462 100644
--- a/tests/OnePer/oneperType02_2One.py
+++ b/tests/OnePer/oneperType02_2One.py
@@ -30,6 +30,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/OnePer/oneperType03_1One.py b/tests/OnePer/oneperType03_1One.py
index c3102f49f208040c8c5757041542e1e002870af6..ef4bbbb12f696557371ff383e4cbc8305df10843 100644
--- a/tests/OnePer/oneperType03_1One.py
+++ b/tests/OnePer/oneperType03_1One.py
@@ -30,6 +30,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py
index c3102f49f208040c8c5757041542e1e002870af6..ef4bbbb12f696557371ff383e4cbc8305df10843 100644
--- a/tests/OnePer/oneperType03_2One.py
+++ b/tests/OnePer/oneperType03_2One.py
@@ -30,6 +30,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py
index 74747978d07ec88dbd96d5bcc38dca593835cef3..5b2555f46b5ee212888c447bc2273c37dc003db0 100644
--- a/tests/abstract_type1_sup.py
+++ b/tests/abstract_type1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/abstract_type2_sup.py b/tests/abstract_type2_sup.py
index 74747978d07ec88dbd96d5bcc38dca593835cef3..5b2555f46b5ee212888c447bc2273c37dc003db0 100644
--- a/tests/abstract_type2_sup.py
+++ b/tests/abstract_type2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py
index ba6a3807446f43ecd2bdc8ed365f8f28c5c4783e..98b240a5b47c1a8df36ed3250e8d652c560b4735 100644
--- a/tests/annotations1_sup.py
+++ b/tests/annotations1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/annotations2_sup.py b/tests/annotations2_sup.py
index ba6a3807446f43ecd2bdc8ed365f8f28c5c4783e..98b240a5b47c1a8df36ed3250e8d652c560b4735 100644
--- a/tests/annotations2_sup.py
+++ b/tests/annotations2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/anonymous_type.xsd b/tests/anonymous_type.xsd
index 271664ff92562b1bcb22d7cd32b197bc09b40f0c..a9bb07f4c162ed205f5d13cdb95fc3423f768c7c 100644
--- a/tests/anonymous_type.xsd
+++ b/tests/anonymous_type.xsd
@@ -14,6 +14,8 @@
               <xs:element name="FooType">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
+                      <xs:minLength value="10"/>
+                      <xs:maxLength value="19"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
@@ -26,6 +28,8 @@
               <xs:element name="BarType">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
+                      <xs:minLength value="20"/>
+                      <xs:maxLength value="29"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
@@ -38,6 +42,8 @@
               <xs:element name="BazType">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
+                      <xs:minLength value="30"/>
+                      <xs:maxLength value="39"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py
index 21f333e2c1c5aed468c315c90a185e9eb4f97e4b..3d0bc3a796976afd0437707e9122c3213e7ee995 100644
--- a/tests/anonymous_type1_sup.py
+++ b/tests/anonymous_type1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -762,6 +767,7 @@ class FooType1(GeneratedsSuper):
     def __init__(self, FooType=None):
         self.original_tagname_ = None
         self.FooType = FooType
+        self.validate_FooTypeType(self.FooType)
     def factory(*args_, **kwargs_):
         if FooType1.subclass:
             return FooType1.subclass(*args_, **kwargs_)
@@ -772,7 +778,11 @@ class FooType1(GeneratedsSuper):
     def set_FooType(self, FooType): self.FooType = FooType
     def validate_FooTypeType(self, value):
         # Validate type FooTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 10:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
+           if len(value) > 19:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.FooType is not None
@@ -847,6 +857,7 @@ class BarType2(GeneratedsSuper):
     def __init__(self, BarType=None):
         self.original_tagname_ = None
         self.BarType = BarType
+        self.validate_BarTypeType(self.BarType)
     def factory(*args_, **kwargs_):
         if BarType2.subclass:
             return BarType2.subclass(*args_, **kwargs_)
@@ -857,7 +868,11 @@ class BarType2(GeneratedsSuper):
     def set_BarType(self, BarType): self.BarType = BarType
     def validate_BarTypeType(self, value):
         # Validate type BarTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 20:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} )
+           if len(value) > 29:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.BarType is not None
@@ -932,6 +947,7 @@ class BazType3(GeneratedsSuper):
     def __init__(self, BazType=None):
         self.original_tagname_ = None
         self.BazType = BazType
+        self.validate_BazTypeType(self.BazType)
     def factory(*args_, **kwargs_):
         if BazType3.subclass:
             return BazType3.subclass(*args_, **kwargs_)
@@ -942,7 +958,11 @@ class BazType3(GeneratedsSuper):
     def set_BazType(self, BazType): self.BazType = BazType
     def validate_BazTypeType(self, value):
         # Validate type BazTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 30:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} )
+           if len(value) > 39:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.BazType is not None
diff --git a/tests/anonymous_type2_sup.py b/tests/anonymous_type2_sup.py
index 21f333e2c1c5aed468c315c90a185e9eb4f97e4b..3d0bc3a796976afd0437707e9122c3213e7ee995 100644
--- a/tests/anonymous_type2_sup.py
+++ b/tests/anonymous_type2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -762,6 +767,7 @@ class FooType1(GeneratedsSuper):
     def __init__(self, FooType=None):
         self.original_tagname_ = None
         self.FooType = FooType
+        self.validate_FooTypeType(self.FooType)
     def factory(*args_, **kwargs_):
         if FooType1.subclass:
             return FooType1.subclass(*args_, **kwargs_)
@@ -772,7 +778,11 @@ class FooType1(GeneratedsSuper):
     def set_FooType(self, FooType): self.FooType = FooType
     def validate_FooTypeType(self, value):
         # Validate type FooTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 10:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
+           if len(value) > 19:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.FooType is not None
@@ -847,6 +857,7 @@ class BarType2(GeneratedsSuper):
     def __init__(self, BarType=None):
         self.original_tagname_ = None
         self.BarType = BarType
+        self.validate_BarTypeType(self.BarType)
     def factory(*args_, **kwargs_):
         if BarType2.subclass:
             return BarType2.subclass(*args_, **kwargs_)
@@ -857,7 +868,11 @@ class BarType2(GeneratedsSuper):
     def set_BarType(self, BarType): self.BarType = BarType
     def validate_BarTypeType(self, value):
         # Validate type BarTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 20:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} )
+           if len(value) > 29:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.BarType is not None
@@ -932,6 +947,7 @@ class BazType3(GeneratedsSuper):
     def __init__(self, BazType=None):
         self.original_tagname_ = None
         self.BazType = BazType
+        self.validate_BazTypeType(self.BazType)
     def factory(*args_, **kwargs_):
         if BazType3.subclass:
             return BazType3.subclass(*args_, **kwargs_)
@@ -942,7 +958,11 @@ class BazType3(GeneratedsSuper):
     def set_BazType(self, BazType): self.BazType = BazType
     def validate_BazTypeType(self, value):
         # Validate type BazTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 30:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} )
+           if len(value) > 39:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.BazType is not None
diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py
index 8965b0841e90cc5bf9065239aef33ec417e010d5..d1d826b51a4923e412a2f99474cbe0b8986503de 100644
--- a/tests/anysimpletype1_sup.py
+++ b/tests/anysimpletype1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/anysimpletype2_sup.py b/tests/anysimpletype2_sup.py
index 8965b0841e90cc5bf9065239aef33ec417e010d5..d1d826b51a4923e412a2f99474cbe0b8986503de 100644
--- a/tests/anysimpletype2_sup.py
+++ b/tests/anysimpletype2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py
index 6fe49290abe6edf80958b798ee7b58f85e0d39dc..5fad0db50417f970c3411aa3b710009aa36681e3 100644
--- a/tests/anywildcard1_sup.py
+++ b/tests/anywildcard1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/anywildcard2_sup.py b/tests/anywildcard2_sup.py
index 6fe49290abe6edf80958b798ee7b58f85e0d39dc..5fad0db50417f970c3411aa3b710009aa36681e3 100644
--- a/tests/anywildcard2_sup.py
+++ b/tests/anywildcard2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py
index 75755fea7a66890468a0edf9d74159616bfc835f..ec108a244c1ce4e0ef71d05bc4cf29a4b8fa3544 100644
--- a/tests/attr_groups1_sup.py
+++ b/tests/attr_groups1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/attr_groups2_sup.py b/tests/attr_groups2_sup.py
index 75755fea7a66890468a0edf9d74159616bfc835f..ec108a244c1ce4e0ef71d05bc4cf29a4b8fa3544 100644
--- a/tests/attr_groups2_sup.py
+++ b/tests/attr_groups2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index 56df5a9b293af5de105730154977deee6e81f859..4b81152849b379c2a88aacf6c029a5060e091fb1 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -1011,6 +1016,7 @@ class simpleFactoidType(GeneratedsSuper):
     def __init__(self, relation=None):
         self.original_tagname_ = None
         self.relation = relation
+        self.validate_RelationType(self.relation)
     def factory(*args_, **kwargs_):
         if simpleFactoidType.subclass:
             return simpleFactoidType.subclass(*args_, **kwargs_)
@@ -1021,7 +1027,15 @@ class simpleFactoidType(GeneratedsSuper):
     def set_relation(self, relation): self.relation = relation
     def validate_RelationType(self, value):
         # Validate type RelationType, a restriction on RelationType2.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['down', 'add']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.relation is not None
@@ -1097,6 +1111,7 @@ class mixedFactoidType(GeneratedsSuper):
     def __init__(self, relation=None, valueOf_=None, mixedclass_=None, content_=None):
         self.original_tagname_ = None
         self.relation = relation
+        self.validate_RelationType(self.relation)
         self.valueOf_ = valueOf_
         if mixedclass_ is None:
             self.mixedclass_ = MixedContainer
@@ -1119,7 +1134,15 @@ class mixedFactoidType(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def validate_RelationType(self, value):
         # Validate type RelationType, a restriction on RelationType2.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['down', 'add']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.relation is not None or
diff --git a/tests/extensions2_sup.py b/tests/extensions2_sup.py
index 56df5a9b293af5de105730154977deee6e81f859..4b81152849b379c2a88aacf6c029a5060e091fb1 100644
--- a/tests/extensions2_sup.py
+++ b/tests/extensions2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -1011,6 +1016,7 @@ class simpleFactoidType(GeneratedsSuper):
     def __init__(self, relation=None):
         self.original_tagname_ = None
         self.relation = relation
+        self.validate_RelationType(self.relation)
     def factory(*args_, **kwargs_):
         if simpleFactoidType.subclass:
             return simpleFactoidType.subclass(*args_, **kwargs_)
@@ -1021,7 +1027,15 @@ class simpleFactoidType(GeneratedsSuper):
     def set_relation(self, relation): self.relation = relation
     def validate_RelationType(self, value):
         # Validate type RelationType, a restriction on RelationType2.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['down', 'add']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.relation is not None
@@ -1097,6 +1111,7 @@ class mixedFactoidType(GeneratedsSuper):
     def __init__(self, relation=None, valueOf_=None, mixedclass_=None, content_=None):
         self.original_tagname_ = None
         self.relation = relation
+        self.validate_RelationType(self.relation)
         self.valueOf_ = valueOf_
         if mixedclass_ is None:
             self.mixedclass_ = MixedContainer
@@ -1119,7 +1134,15 @@ class mixedFactoidType(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def validate_RelationType(self, value):
         # Validate type RelationType, a restriction on RelationType2.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['down', 'add']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.relation is not None or
diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py
index 9776f19e070adcbe15d01b72c7664ffd71d54461..0d05b131625a0ea66976829174d02f7b72a8da34 100644
--- a/tests/mapcleanname1_sup.py
+++ b/tests/mapcleanname1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/mapcleanname2_sup.py b/tests/mapcleanname2_sup.py
index 9776f19e070adcbe15d01b72c7664ffd71d54461..0d05b131625a0ea66976829174d02f7b72a8da34 100644
--- a/tests/mapcleanname2_sup.py
+++ b/tests/mapcleanname2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index 0ce418cf302b1bfbb6e58651ec3c926b35b90b39..3890019e075ad177cbe5ca7067aa57f319317142 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -28,6 +28,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -1449,6 +1454,7 @@ class programmer(person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if programmer.subclass:
@@ -1496,7 +1502,15 @@ class programmer(person):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
diff --git a/tests/out2_sup.py b/tests/out2_sup.py
index 0ce418cf302b1bfbb6e58651ec3c926b35b90b39..3890019e075ad177cbe5ca7067aa57f319317142 100644
--- a/tests/out2_sup.py
+++ b/tests/out2_sup.py
@@ -28,6 +28,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -1449,6 +1454,7 @@ class programmer(person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if programmer.subclass:
@@ -1496,7 +1502,15 @@ class programmer(person):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index c2d2220da05b010ac0d70aa90825f3df957778bc..1c3537946e36cd79bd59b2575cb84c0b960f784b 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -2520,6 +2525,7 @@ class programmer(person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if programmer.subclass:
@@ -2565,7 +2571,15 @@ class programmer(person):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
diff --git a/tests/people_procincl2_sup.py b/tests/people_procincl2_sup.py
index c2d2220da05b010ac0d70aa90825f3df957778bc..1c3537946e36cd79bd59b2575cb84c0b960f784b 100644
--- a/tests/people_procincl2_sup.py
+++ b/tests/people_procincl2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -2520,6 +2525,7 @@ class programmer(person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if programmer.subclass:
@@ -2565,7 +2571,15 @@ class programmer(person):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py
index 96730d24716cbd34de2c74b933f7557338849990..404810c4257c53b1e958bacd00cf1290da0ff8f7 100644
--- a/tests/prefix_classname1_sup.py
+++ b/tests/prefix_classname1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -1307,6 +1312,7 @@ class tomato_programmer(tomato_person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if tomato_programmer.subclass:
@@ -1354,7 +1360,15 @@ class tomato_programmer(tomato_person):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
diff --git a/tests/prefix_classname2_sup.py b/tests/prefix_classname2_sup.py
index 96730d24716cbd34de2c74b933f7557338849990..404810c4257c53b1e958bacd00cf1290da0ff8f7 100644
--- a/tests/prefix_classname2_sup.py
+++ b/tests/prefix_classname2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -1307,6 +1312,7 @@ class tomato_programmer(tomato_person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if tomato_programmer.subclass:
@@ -1354,7 +1360,15 @@ class tomato_programmer(tomato_person):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py
index 956f2f67816e5d0d9a954634149d7f3cdcc3c44f..b793adefb925bd7d9ea4ebb2d8d3cb62a4493aee 100644
--- a/tests/recursive_simpletype1_sup.py
+++ b/tests/recursive_simpletype1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/recursive_simpletype2_sup.py b/tests/recursive_simpletype2_sup.py
index 956f2f67816e5d0d9a954634149d7f3cdcc3c44f..b793adefb925bd7d9ea4ebb2d8d3cb62a4493aee 100644
--- a/tests/recursive_simpletype2_sup.py
+++ b/tests/recursive_simpletype2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py
index 3c59aa995a702ddbd80a4f77f48262c7a786e508..817e86e04744a5525e4aea96730c7c1b0e19274a 100644
--- a/tests/simplecontent_restriction1_sup.py
+++ b/tests/simplecontent_restriction1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/simplecontent_restriction2_sup.py b/tests/simplecontent_restriction2_sup.py
index 3c59aa995a702ddbd80a4f77f48262c7a786e508..817e86e04744a5525e4aea96730c7c1b0e19274a 100644
--- a/tests/simplecontent_restriction2_sup.py
+++ b/tests/simplecontent_restriction2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index 8dae63aca4afb82bb72c84ba6c4290beaa542440..6bdaf95e36dd150e97a460b270d33190e8b00cd2 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/simpletype_memberspecs2_sup.py b/tests/simpletype_memberspecs2_sup.py
index 8dae63aca4afb82bb72c84ba6c4290beaa542440..6bdaf95e36dd150e97a460b270d33190e8b00cd2 100644
--- a/tests/simpletype_memberspecs2_sup.py
+++ b/tests/simpletype_memberspecs2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py
index 84e2ae739c1cd821cde3a4337311f006bd75caa0..a51ea60e08a13725f56e760212fe8d03ed9cf26f 100644
--- a/tests/simpletypes_other1_sup.py
+++ b/tests/simpletypes_other1_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/simpletypes_other2_sup.py b/tests/simpletypes_other2_sup.py
index 84e2ae739c1cd821cde3a4337311f006bd75caa0..a51ea60e08a13725f56e760212fe8d03ed9cf26f 100644
--- a/tests/simpletypes_other2_sup.py
+++ b/tests/simpletypes_other2_sup.py
@@ -29,6 +29,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
diff --git a/tests/test.py b/tests/test.py
index 5e965bc05c34b9442b2ea2097573b446115ac1cc..90ee2b6b4b1c219a6cdf5aef55203fd8e44ec57d 100755
--- a/tests/test.py
+++ b/tests/test.py
@@ -331,8 +331,8 @@ class GenTest(unittest.TestCase):
         cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
         result, err = self.execute(cmd)
         self.check_result(result, err, ())
-        cmdTempl = 'python tests/%s2_sup.py tests/ipo.xml > tests/%s2_out.xml'
-        cmd = cmdTempl % (t_, t_, )
+        cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml'
+        cmd = cmdTempl % (t_, t_, t_, )
         result, _ = self.execute(cmd, cwd='..')
         cmd = 'diff %s1_out.xml %s2_out.xml' % (t_, t_, )
         result, err = self.execute(cmd)
@@ -550,6 +550,36 @@ class GenTest(unittest.TestCase):
         result, err = self.execute(cmd)
         self.check_result(result, err, ())
 
+    def test_025_validate_simpletypes(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'validate_simpletypes'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        result, _ = self.execute(cmd, cwd='..')
+        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ('sys.stdout.write',))
+        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ())
+        cmdTempl = (
+            'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml '
+            '2> tests/%s2_warnings.txt'
+        )
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        result, _ = self.execute(cmd, cwd='..')
+        cmd = 'diff %s1_out.xml %s2_out.xml' % (t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ())
+        cmd = 'diff %s1_warnings.txt %s2_warnings.txt' % (t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ())
+
     def check_result(self, result, err, ignore_strings):
         self.failUnlessEqual(len(result), 0)
         self.failUnlessEqual(len(err), 0)
diff --git a/tests/to_etree.xsd b/tests/to_etree.xsd
index 71d28600fccf70894bb542fd9f17a7e4e01a433f..132497174e072133b1add242791d77426b973ee5 100644
--- a/tests/to_etree.xsd
+++ b/tests/to_etree.xsd
@@ -337,4 +337,3 @@
     </xs:complexType>
 
 </xs:schema>
-
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index 8d7435a442e1af61b94ebde6a515b29f3dc2c27b..4fe09cdc814e532da48af005a15dc5725655d8f9 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -31,6 +31,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -924,6 +929,7 @@ class personType(GeneratedsSuper):
             self.promoter = promoter
         self.description = description
         self.range_ = range_
+        self.validate_RangeType(self.range_)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if personType.subclass:
@@ -970,7 +976,8 @@ class personType(GeneratedsSuper):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_RangeType(self, value):
         # Validate type RangeType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+           pass
     def hasContent_(self):
         if (
             self.name is not None or
@@ -1212,6 +1219,7 @@ class programmerType(personType):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if programmerType.subclass:
@@ -1261,7 +1269,15 @@ class programmerType(personType):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
@@ -1532,7 +1548,8 @@ class paramType(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def validate_FlowType(self, value):
         # Validate type FlowType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+           pass
     def hasContent_(self):
         if (
             self.valueOf_
@@ -1624,6 +1641,7 @@ class python_programmerType(programmerType):
         self.gui_developer = _cast(bool, gui_developer)
         self.favorite_editor = favorite_editor
         self.flowvalue = flowvalue
+        self.validate_FlowType(self.flowvalue)
         self.drcs = drcs
     def factory(*args_, **kwargs_):
         if python_programmerType.subclass:
@@ -1645,7 +1663,8 @@ class python_programmerType(programmerType):
     def set_gui_developer(self, gui_developer): self.gui_developer = gui_developer
     def validate_FlowType(self, value):
         # Validate type FlowType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+           pass
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
diff --git a/tests/to_etree2_sup.py b/tests/to_etree2_sup.py
index 8d7435a442e1af61b94ebde6a515b29f3dc2c27b..4fe09cdc814e532da48af005a15dc5725655d8f9 100644
--- a/tests/to_etree2_sup.py
+++ b/tests/to_etree2_sup.py
@@ -31,6 +31,11 @@ import getopt
 import re as re_
 import base64
 import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
 
 etree_ = None
 Verbose_import_ = False
@@ -924,6 +929,7 @@ class personType(GeneratedsSuper):
             self.promoter = promoter
         self.description = description
         self.range_ = range_
+        self.validate_RangeType(self.range_)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if personType.subclass:
@@ -970,7 +976,8 @@ class personType(GeneratedsSuper):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_RangeType(self, value):
         # Validate type RangeType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+           pass
     def hasContent_(self):
         if (
             self.name is not None or
@@ -1212,6 +1219,7 @@ class programmerType(personType):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if programmerType.subclass:
@@ -1261,7 +1269,15 @@ class programmerType(personType):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
@@ -1532,7 +1548,8 @@ class paramType(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def validate_FlowType(self, value):
         # Validate type FlowType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+           pass
     def hasContent_(self):
         if (
             self.valueOf_
@@ -1624,6 +1641,7 @@ class python_programmerType(programmerType):
         self.gui_developer = _cast(bool, gui_developer)
         self.favorite_editor = favorite_editor
         self.flowvalue = flowvalue
+        self.validate_FlowType(self.flowvalue)
         self.drcs = drcs
     def factory(*args_, **kwargs_):
         if python_programmerType.subclass:
@@ -1645,7 +1663,8 @@ class python_programmerType(programmerType):
     def set_gui_developer(self, gui_developer): self.gui_developer = gui_developer
     def validate_FlowType(self, value):
         # Validate type FlowType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+           pass
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
diff --git a/tests/validate_simpletypes.xml b/tests/validate_simpletypes.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a4d15e920c709cae794293fdd40b0c04a1538f13
--- /dev/null
+++ b/tests/validate_simpletypes.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<container>
+    <sample1>
+        <token_enum_value>float</token_enum_value>
+        <integer_range_incl_value>2</integer_range_incl_value>
+        <integer_range_excl_value>7</integer_range_excl_value>
+        <min_max_length_value>abc def ghi</min_max_length_value>
+        <length_value>0123456789</length_value>
+        <totaldigits_value>12.456</totaldigits_value>
+        <anonymous_float_value>2.2</anonymous_float_value>
+    </sample1>
+    <sample2_bad>
+        <token_enum_value>floatxx</token_enum_value>
+        <integer_range_incl_value>22</integer_range_incl_value>
+        <integer_range_excl_value>-40</integer_range_excl_value>
+        <min_max_length_value>mno pqr</min_max_length_value>
+        <length_value>012345</length_value>
+        <totaldigits_value>12.456789</totaldigits_value>
+        <anonymous_float_value>0.2</anonymous_float_value>
+    </sample2_bad>
+    <sample3_bad>
+        <integer_range_incl_value>-50</integer_range_incl_value>
+        <min_max_length_value>asdf asdf asdf adf asdf asdf</min_max_length_value>
+        <length_value>01234567890</length_value>
+        <totaldigits_value>12345678.45678901</totaldigits_value>
+        <anonymous_float_value>6.6</anonymous_float_value>
+    </sample3_bad>
+</container>
diff --git a/tests/validate_simpletypes.xsd b/tests/validate_simpletypes.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..35b3598787edd32481ebe9379877082b73d32e4c
--- /dev/null
+++ b/tests/validate_simpletypes.xsd
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:element name="container" type="containerType"/>
+
+    <xs:complexType name="containerType">
+        <xs:sequence>
+            <xs:element name="sample1" type="simpleOneType" maxOccurs="unbounded"/>
+            <xs:element name="sample2_bad" type="simpleOneType" maxOccurs="unbounded"/>
+            <xs:element name="sample3_bad" type="simpleOneType" maxOccurs="unbounded"/>
+            <xs:element name="sample2" type="simpleTwoType" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="simpleOneType" mixed="0">
+        <xs:sequence>
+            <xs:element name="token_enum_value" type="token_enum_st"/>
+            <xs:element name="token_enum_value" type="token_enum_st"/>
+            <xs:element name="integer_range_incl_value" type="integer_range_incl_st"/>
+            <xs:element name="integer_range_excl_value" type="integer_range_excl_st"/>
+            <xs:element name="min_max_length_value" type="min_max_length_st"/>
+            <xs:element name="length_value" type="length_st"/>
+            <xs:element name="totaldigits_value" type="totaldigits_st"/>
+            <!-- Test for use of anonymous simple type. -->
+            <xs:element name="anonymous_float_value">
+                <xs:simpleType>
+                    <xs:restriction base="xs:float">
+                        <xs:minInclusive value="1.1"/>
+                        <xs:maxInclusive value="4.4"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+    <!-- Test for use of an anonymous simple type inside an anonymous complexType. -->
+    <xs:element name="simpleTwoType">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="Foo">
+                    <xs:complexType>
+                        <xs:all>
+                            <xs:element name="FooType">
+                                <xs:simpleType>
+                                    <xs:restriction base="xs:string">
+                                        <xs:minLength value="12"/>
+                                        <xs:maxLength value="24"/>
+                                    </xs:restriction>
+                                </xs:simpleType>
+                            </xs:element>
+                        </xs:all>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+    <xs:simpleType name="token_enum_st">
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="float"/>
+            <xs:enumeration value="int"/>
+            <xs:enumeration value="Name"/>
+            <xs:enumeration value="token"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="integer_range_incl_st">
+        <xs:restriction base="xs:integer">
+            <xs:minInclusive value="-5"/>
+            <xs:maxInclusive value="10"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="integer_range_excl_st">
+        <xs:restriction base="xs:integer">
+            <xs:minExclusive value="-5"/>
+            <xs:maxExclusive value="10"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="min_max_length_st">
+        <xs:restriction base="xs:string">
+            <xs:minLength value="10"/>
+            <xs:maxLength value="20"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="length_st">
+        <xs:restriction base="xs:string">
+            <xs:length value="10"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="totaldigits_st">
+        <xs:restriction base="xs:float">
+            <xs:totalDigits value="15"/>
+            <xs:fractionDigits value="5"/>
+        </xs:restriction>
+    </xs:simpleType>
+</xs:schema>
diff --git a/tests/validate_simpletypes1_out.xml b/tests/validate_simpletypes1_out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..70c8feb1ec0e915aff1bbc3156b10111cc1422b7
--- /dev/null
+++ b/tests/validate_simpletypes1_out.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" ?>
+<container>
+    <sample1>
+        <token_enum_value>float</token_enum_value>
+        <token_enum_value>float</token_enum_value>
+        <integer_range_incl_value>2</integer_range_incl_value>
+        <integer_range_excl_value>7</integer_range_excl_value>
+        <min_max_length_value>abc def ghi</min_max_length_value>
+        <length_value>0123456789</length_value>
+        <totaldigits_value>12.456</totaldigits_value>
+        <anonymous_float_value>2.2</anonymous_float_value>
+    </sample1>
+    <sample2_bad>
+        <token_enum_value>floatxx</token_enum_value>
+        <token_enum_value>floatxx</token_enum_value>
+        <integer_range_incl_value>22</integer_range_incl_value>
+        <integer_range_excl_value>-40</integer_range_excl_value>
+        <min_max_length_value>mno pqr</min_max_length_value>
+        <length_value>012345</length_value>
+        <totaldigits_value>12.456789000000001</totaldigits_value>
+        <anonymous_float_value>0.2</anonymous_float_value>
+    </sample2_bad>
+    <sample3_bad>
+        <integer_range_incl_value>-50</integer_range_incl_value>
+        <min_max_length_value>asdf asdf asdf adf asdf asdf</min_max_length_value>
+        <length_value>01234567890</length_value>
+        <totaldigits_value>12345678.456789009273052</totaldigits_value>
+        <anonymous_float_value>6.6</anonymous_float_value>
+    </sample3_bad>
+</container>
diff --git a/tests/validate_simpletypes1_sub.py b/tests/validate_simpletypes1_sub.py
new file mode 100644
index 0000000000000000000000000000000000000000..6b50bce01c83794f83b8427c5fb2688fc2b2d969
--- /dev/null
+++ b/tests/validate_simpletypes1_sub.py
@@ -0,0 +1,235 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/validate_simpletypes2_sup.py')
+#   ('-s', 'tests/validate_simpletypes2_sub.py')
+#   ('--super', 'validate_simpletypes2_sup')
+#
+# Command line arguments:
+#   tests/validate_simpletypes.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+
+import validate_simpletypes2_sup as supermod
+
+etree_ = None
+Verbose_import_ = False
+(
+    XMLParser_import_none, XMLParser_import_lxml,
+    XMLParser_import_elementtree
+) = range(3)
+XMLParser_import_library = None
+try:
+    # lxml
+    from lxml import etree as etree_
+    XMLParser_import_library = XMLParser_import_lxml
+    if Verbose_import_:
+        print("running with lxml.etree")
+except ImportError:
+    try:
+        # cElementTree from Python 2.5+
+        import xml.etree.cElementTree as etree_
+        XMLParser_import_library = XMLParser_import_elementtree
+        if Verbose_import_:
+            print("running with cElementTree on Python 2.5+")
+    except ImportError:
+        try:
+            # ElementTree from Python 2.5+
+            import xml.etree.ElementTree as etree_
+            XMLParser_import_library = XMLParser_import_elementtree
+            if Verbose_import_:
+                print("running with ElementTree on Python 2.5+")
+        except ImportError:
+            try:
+                # normal cElementTree install
+                import cElementTree as etree_
+                XMLParser_import_library = XMLParser_import_elementtree
+                if Verbose_import_:
+                    print("running with cElementTree")
+            except ImportError:
+                try:
+                    # normal ElementTree install
+                    import elementtree.ElementTree as etree_
+                    XMLParser_import_library = XMLParser_import_elementtree
+                    if Verbose_import_:
+                        print("running with ElementTree")
+                except ImportError:
+                    raise ImportError(
+                        "Failed to import ElementTree from any known place")
+
+
+def parsexml_(*args, **kwargs):
+    if (XMLParser_import_library == XMLParser_import_lxml and
+            'parser' not in kwargs):
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        kwargs['parser'] = etree_.ETCompatXMLParser()
+    doc = etree_.parse(*args, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class containerTypeSub(supermod.containerType):
+    def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample2=None):
+        super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample2, )
+supermod.containerType.subclass = containerTypeSub
+# end class containerTypeSub
+
+
+class simpleOneTypeSub(supermod.simpleOneType):
+    def __init__(self, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totaldigits_value=None, anonymous_float_value=None):
+        super(simpleOneTypeSub, self).__init__(token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totaldigits_value, anonymous_float_value, )
+supermod.simpleOneType.subclass = simpleOneTypeSub
+# end class simpleOneTypeSub
+
+
+class simpleTwoTypeSub(supermod.simpleTwoType):
+    def __init__(self, Foo=None):
+        super(simpleTwoTypeSub, self).__init__(Foo, )
+supermod.simpleTwoType.subclass = simpleTwoTypeSub
+# end class simpleTwoTypeSub
+
+
+class FooType1Sub(supermod.FooType1):
+    def __init__(self, FooType=None):
+        super(FooType1Sub, self).__init__(FooType, )
+supermod.FooType1.subclass = FooType1Sub
+# end class FooType1Sub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(inString))
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from validate_simpletypes2_sup import *\n\n')
+        sys.stdout.write('import validate_simpletypes2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py
new file mode 100644
index 0000000000000000000000000000000000000000..77d98861db36a2720da12ff49737ec755775b1d7
--- /dev/null
+++ b/tests/validate_simpletypes1_sup.py
@@ -0,0 +1,1396 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/validate_simpletypes2_sup.py')
+#   ('-s', 'tests/validate_simpletypes2_sub.py')
+#   ('--super', 'validate_simpletypes2_sup')
+#
+# Command line arguments:
+#   tests/validate_simpletypes.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import getopt
+import re as re_
+import base64
+import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
+
+etree_ = None
+Verbose_import_ = False
+(
+    XMLParser_import_none, XMLParser_import_lxml,
+    XMLParser_import_elementtree
+) = range(3)
+XMLParser_import_library = None
+try:
+    # lxml
+    from lxml import etree as etree_
+    XMLParser_import_library = XMLParser_import_lxml
+    if Verbose_import_:
+        print("running with lxml.etree")
+except ImportError:
+    try:
+        # cElementTree from Python 2.5+
+        import xml.etree.cElementTree as etree_
+        XMLParser_import_library = XMLParser_import_elementtree
+        if Verbose_import_:
+            print("running with cElementTree on Python 2.5+")
+    except ImportError:
+        try:
+            # ElementTree from Python 2.5+
+            import xml.etree.ElementTree as etree_
+            XMLParser_import_library = XMLParser_import_elementtree
+            if Verbose_import_:
+                print("running with ElementTree on Python 2.5+")
+        except ImportError:
+            try:
+                # normal cElementTree install
+                import cElementTree as etree_
+                XMLParser_import_library = XMLParser_import_elementtree
+                if Verbose_import_:
+                    print("running with cElementTree")
+            except ImportError:
+                try:
+                    # normal ElementTree install
+                    import elementtree.ElementTree as etree_
+                    XMLParser_import_library = XMLParser_import_elementtree
+                    if Verbose_import_:
+                        print("running with ElementTree")
+                except ImportError:
+                    raise ImportError(
+                        "Failed to import ElementTree from any known place")
+
+
+def parsexml_(*args, **kwargs):
+    if (XMLParser_import_library == XMLParser_import_lxml and
+            'parser' not in kwargs):
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        kwargs['parser'] = etree_.ETCompatXMLParser()
+    doc = etree_.parse(*args, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError, exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, basestring) and inStr or
+          '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, basestring) and inStr or
+          '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    if XMLParser_import_library == XMLParser_import_lxml:
+        msg = '%s (element %s/line %d)' % (
+            msg, node.tag, node.sourceline, )
+    else:
+        msg = '%s (element %s)' % (msg, node.tag, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(outfile, level, namespace, name, pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class containerType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('sample1', 'simpleOneType', 1),
+        MemberSpec_('sample2_bad', 'simpleOneType', 1),
+        MemberSpec_('sample3_bad', 'simpleOneType', 1),
+        MemberSpec_('sample2', 'simpleTwoType', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample2=None):
+        self.original_tagname_ = None
+        if sample1 is None:
+            self.sample1 = []
+        else:
+            self.sample1 = sample1
+        if sample2_bad is None:
+            self.sample2_bad = []
+        else:
+            self.sample2_bad = sample2_bad
+        if sample3_bad is None:
+            self.sample3_bad = []
+        else:
+            self.sample3_bad = sample3_bad
+        if sample2 is None:
+            self.sample2 = []
+        else:
+            self.sample2 = sample2
+    def factory(*args_, **kwargs_):
+        if containerType.subclass:
+            return containerType.subclass(*args_, **kwargs_)
+        else:
+            return containerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_sample1(self): return self.sample1
+    def set_sample1(self, sample1): self.sample1 = sample1
+    def add_sample1(self, value): self.sample1.append(value)
+    def insert_sample1_at(self, index, value): self.sample1.insert(index, value)
+    def replace_sample1_at(self, index, value): self.sample1[index] = value
+    def get_sample2_bad(self): return self.sample2_bad
+    def set_sample2_bad(self, sample2_bad): self.sample2_bad = sample2_bad
+    def add_sample2_bad(self, value): self.sample2_bad.append(value)
+    def insert_sample2_bad_at(self, index, value): self.sample2_bad.insert(index, value)
+    def replace_sample2_bad_at(self, index, value): self.sample2_bad[index] = value
+    def get_sample3_bad(self): return self.sample3_bad
+    def set_sample3_bad(self, sample3_bad): self.sample3_bad = sample3_bad
+    def add_sample3_bad(self, value): self.sample3_bad.append(value)
+    def insert_sample3_bad_at(self, index, value): self.sample3_bad.insert(index, value)
+    def replace_sample3_bad_at(self, index, value): self.sample3_bad[index] = value
+    def get_sample2(self): return self.sample2
+    def set_sample2(self, sample2): self.sample2 = sample2
+    def add_sample2(self, value): self.sample2.append(value)
+    def insert_sample2_at(self, index, value): self.sample2.insert(index, value)
+    def replace_sample2_at(self, index, value): self.sample2[index] = value
+    def hasContent_(self):
+        if (
+            self.sample1 or
+            self.sample2_bad or
+            self.sample3_bad or
+            self.sample2
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='containerType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for sample1_ in self.sample1:
+            sample1_.export(outfile, level, namespace_, name_='sample1', pretty_print=pretty_print)
+        for sample2_bad_ in self.sample2_bad:
+            sample2_bad_.export(outfile, level, namespace_, name_='sample2_bad', pretty_print=pretty_print)
+        for sample3_bad_ in self.sample3_bad:
+            sample3_bad_.export(outfile, level, namespace_, name_='sample3_bad', pretty_print=pretty_print)
+        for sample2_ in self.sample2:
+            sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='containerType'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        showIndent(outfile, level)
+        outfile.write('sample1=[\n')
+        level += 1
+        for sample1_ in self.sample1:
+            showIndent(outfile, level)
+            outfile.write('model_.simpleOneType(\n')
+            sample1_.exportLiteral(outfile, level, name_='simpleOneType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('sample2_bad=[\n')
+        level += 1
+        for sample2_bad_ in self.sample2_bad:
+            showIndent(outfile, level)
+            outfile.write('model_.simpleOneType(\n')
+            sample2_bad_.exportLiteral(outfile, level, name_='simpleOneType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('sample3_bad=[\n')
+        level += 1
+        for sample3_bad_ in self.sample3_bad:
+            showIndent(outfile, level)
+            outfile.write('model_.simpleOneType(\n')
+            sample3_bad_.exportLiteral(outfile, level, name_='simpleOneType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('sample2=[\n')
+        level += 1
+        for sample2_ in self.sample2:
+            showIndent(outfile, level)
+            outfile.write('model_.simpleTwoType(\n')
+            sample2_.exportLiteral(outfile, level, name_='simpleTwoType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'sample1':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample1.append(obj_)
+            obj_.original_tagname_ = 'sample1'
+        elif nodeName_ == 'sample2_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample2_bad.append(obj_)
+            obj_.original_tagname_ = 'sample2_bad'
+        elif nodeName_ == 'sample3_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample3_bad.append(obj_)
+            obj_.original_tagname_ = 'sample3_bad'
+        elif nodeName_ == 'sample2':
+            obj_ = simpleTwoType.factory()
+            obj_.build(child_)
+            self.sample2.append(obj_)
+            obj_.original_tagname_ = 'sample2'
+# end class containerType
+
+
+class simpleOneType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0),
+        MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0),
+        MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0),
+        MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0),
+        MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0),
+        MemberSpec_('length_value', ['length_st', 'xs:string'], 0),
+        MemberSpec_('totaldigits_value', ['totaldigits_st', 'xs:float'], 0),
+        MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totaldigits_value=None, anonymous_float_value=None):
+        self.original_tagname_ = None
+        self.token_enum_value = token_enum_value
+        self.validate_token_enum_st(self.token_enum_value)
+        self.token_enum_value = token_enum_value
+        self.validate_token_enum_st(self.token_enum_value)
+        self.integer_range_incl_value = integer_range_incl_value
+        self.validate_integer_range_incl_st(self.integer_range_incl_value)
+        self.integer_range_excl_value = integer_range_excl_value
+        self.validate_integer_range_excl_st(self.integer_range_excl_value)
+        self.min_max_length_value = min_max_length_value
+        self.validate_min_max_length_st(self.min_max_length_value)
+        self.length_value = length_value
+        self.validate_length_st(self.length_value)
+        self.totaldigits_value = totaldigits_value
+        self.validate_totaldigits_st(self.totaldigits_value)
+        self.anonymous_float_value = anonymous_float_value
+        self.validate_anonymous_float_valueType(self.anonymous_float_value)
+    def factory(*args_, **kwargs_):
+        if simpleOneType.subclass:
+            return simpleOneType.subclass(*args_, **kwargs_)
+        else:
+            return simpleOneType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_token_enum_value(self): return self.token_enum_value
+    def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value
+    def get_token_enum_value(self): return self.token_enum_value
+    def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value
+    def get_integer_range_incl_value(self): return self.integer_range_incl_value
+    def set_integer_range_incl_value(self, integer_range_incl_value): self.integer_range_incl_value = integer_range_incl_value
+    def get_integer_range_excl_value(self): return self.integer_range_excl_value
+    def set_integer_range_excl_value(self, integer_range_excl_value): self.integer_range_excl_value = integer_range_excl_value
+    def get_min_max_length_value(self): return self.min_max_length_value
+    def set_min_max_length_value(self, min_max_length_value): self.min_max_length_value = min_max_length_value
+    def get_length_value(self): return self.length_value
+    def set_length_value(self, length_value): self.length_value = length_value
+    def get_totaldigits_value(self): return self.totaldigits_value
+    def set_totaldigits_value(self, totaldigits_value): self.totaldigits_value = totaldigits_value
+    def get_anonymous_float_value(self): return self.anonymous_float_value
+    def set_anonymous_float_value(self, anonymous_float_value): self.anonymous_float_value = anonymous_float_value
+    def validate_token_enum_st(self, value):
+        # Validate type token_enum_st, a restriction on xs:NMTOKEN.
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
+    def validate_integer_range_incl_st(self, value):
+        # Validate type integer_range_incl_st, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+           if value <= -5:
+               warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
+           if value >= 10:
+               warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
+    def validate_integer_range_excl_st(self, value):
+        # Validate type integer_range_excl_st, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+           if value < -5:
+               warnings.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
+           if value > 10:
+               warnings.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_excl_st' % {"value" : value} )
+    def validate_min_max_length_st(self, value):
+        # Validate type min_max_length_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 10:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+           if len(value) > 20:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+    def validate_length_st(self, value):
+        # Validate type length_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+           if len(value) != 10:
+               warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
+    def validate_totaldigits_st(self, value):
+        # Validate type totaldigits_st, a restriction on xs:float.
+        if value is not None and Validate_simpletypes_:
+           if len(str(value)) >= 15:
+               warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on totaldigits_st' % {"value" : value} )
+    def validate_anonymous_float_valueType(self, value):
+        # Validate type anonymous_float_valueType, a restriction on xs:float.
+        if value is not None and Validate_simpletypes_:
+           if value <= 1.1:
+               warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+           if value >= 4.4:
+               warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+    def hasContent_(self):
+        if (
+            self.token_enum_value is not None or
+            self.token_enum_value is not None or
+            self.integer_range_incl_value is not None or
+            self.integer_range_excl_value is not None or
+            self.min_max_length_value is not None or
+            self.length_value is not None or
+            self.totaldigits_value is not None or
+            self.anonymous_float_value is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleOneType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleOneType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleOneType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleOneType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleOneType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.token_enum_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), input_name='token_enum_value'), namespace_, eol_))
+        if self.token_enum_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), input_name='token_enum_value'), namespace_, eol_))
+        if self.integer_range_incl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_incl_value>%s</%sinteger_range_incl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_incl_value, input_name='integer_range_incl_value'), namespace_, eol_))
+        if self.integer_range_excl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_excl_value>%s</%sinteger_range_excl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_excl_value, input_name='integer_range_excl_value'), namespace_, eol_))
+        if self.min_max_length_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%smin_max_length_value>%s</%smin_max_length_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.min_max_length_value).encode(ExternalEncoding), input_name='min_max_length_value'), namespace_, eol_))
+        if self.length_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slength_value>%s</%slength_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.length_value).encode(ExternalEncoding), input_name='length_value'), namespace_, eol_))
+        if self.totaldigits_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stotaldigits_value>%s</%stotaldigits_value>%s' % (namespace_, self.gds_format_float(self.totaldigits_value, input_name='totaldigits_value'), namespace_, eol_))
+        if self.anonymous_float_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sanonymous_float_value>%s</%sanonymous_float_value>%s' % (namespace_, self.gds_format_float(self.anonymous_float_value, input_name='anonymous_float_value'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='simpleOneType'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.token_enum_value is not None:
+            showIndent(outfile, level)
+            outfile.write('token_enum_value=%s,\n' % quote_python(self.token_enum_value).encode(ExternalEncoding))
+        if self.token_enum_value is not None:
+            showIndent(outfile, level)
+            outfile.write('token_enum_value=%s,\n' % quote_python(self.token_enum_value).encode(ExternalEncoding))
+        if self.integer_range_incl_value is not None:
+            showIndent(outfile, level)
+            outfile.write('integer_range_incl_value=%d,\n' % self.integer_range_incl_value)
+        if self.integer_range_excl_value is not None:
+            showIndent(outfile, level)
+            outfile.write('integer_range_excl_value=%d,\n' % self.integer_range_excl_value)
+        if self.min_max_length_value is not None:
+            showIndent(outfile, level)
+            outfile.write('min_max_length_value=%s,\n' % quote_python(self.min_max_length_value).encode(ExternalEncoding))
+        if self.length_value is not None:
+            showIndent(outfile, level)
+            outfile.write('length_value=%s,\n' % quote_python(self.length_value).encode(ExternalEncoding))
+        if self.totaldigits_value is not None:
+            showIndent(outfile, level)
+            outfile.write('totaldigits_value=%f,\n' % self.totaldigits_value)
+        if self.anonymous_float_value is not None:
+            showIndent(outfile, level)
+            outfile.write('anonymous_float_value=%f,\n' % self.anonymous_float_value)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'token_enum_value':
+            token_enum_value_ = child_.text
+            token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value')
+            self.token_enum_value = token_enum_value_
+            self.validate_token_enum_st(self.token_enum_value)    # validate type token_enum_st
+        elif nodeName_ == 'token_enum_value':
+            token_enum_value_ = child_.text
+            token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value')
+            self.token_enum_value = token_enum_value_
+            self.validate_token_enum_st(self.token_enum_value)    # validate type token_enum_st
+        elif nodeName_ == 'integer_range_incl_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value')
+            self.integer_range_incl_value = ival_
+            self.validate_integer_range_incl_st(self.integer_range_incl_value)    # validate type integer_range_incl_st
+        elif nodeName_ == 'integer_range_excl_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value')
+            self.integer_range_excl_value = ival_
+            self.validate_integer_range_excl_st(self.integer_range_excl_value)    # validate type integer_range_excl_st
+        elif nodeName_ == 'min_max_length_value':
+            min_max_length_value_ = child_.text
+            min_max_length_value_ = self.gds_validate_string(min_max_length_value_, node, 'min_max_length_value')
+            self.min_max_length_value = min_max_length_value_
+            self.validate_min_max_length_st(self.min_max_length_value)    # validate type min_max_length_st
+        elif nodeName_ == 'length_value':
+            length_value_ = child_.text
+            length_value_ = self.gds_validate_string(length_value_, node, 'length_value')
+            self.length_value = length_value_
+            self.validate_length_st(self.length_value)    # validate type length_st
+        elif nodeName_ == 'totaldigits_value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'totaldigits_value')
+            self.totaldigits_value = fval_
+            self.validate_totaldigits_st(self.totaldigits_value)    # validate type totaldigits_st
+        elif nodeName_ == 'anonymous_float_value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value')
+            self.anonymous_float_value = fval_
+            self.validate_anonymous_float_valueType(self.anonymous_float_value)    # validate type anonymous_float_valueType
+# end class simpleOneType
+
+
+class simpleTwoType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('Foo', 'FooType1', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, Foo=None):
+        self.original_tagname_ = None
+        self.Foo = Foo
+    def factory(*args_, **kwargs_):
+        if simpleTwoType.subclass:
+            return simpleTwoType.subclass(*args_, **kwargs_)
+        else:
+            return simpleTwoType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_Foo(self): return self.Foo
+    def set_Foo(self, Foo): self.Foo = Foo
+    def hasContent_(self):
+        if (
+            self.Foo is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleTwoType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.Foo is not None:
+            self.Foo.export(outfile, level, namespace_, name_='Foo', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='simpleTwoType'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.Foo is not None:
+            showIndent(outfile, level)
+            outfile.write('Foo=model_.FooType1(\n')
+            self.Foo.exportLiteral(outfile, level, name_='Foo')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'Foo':
+            obj_ = FooType1.factory()
+            obj_.build(child_)
+            self.Foo = obj_
+            obj_.original_tagname_ = 'Foo'
+# end class simpleTwoType
+
+
+class FooType1(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('FooType', ['FooTypeType', 'xs:string'], 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, FooType=None):
+        self.original_tagname_ = None
+        self.FooType = FooType
+        self.validate_FooTypeType(self.FooType)
+    def factory(*args_, **kwargs_):
+        if FooType1.subclass:
+            return FooType1.subclass(*args_, **kwargs_)
+        else:
+            return FooType1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_FooType(self): return self.FooType
+    def set_FooType(self, FooType): self.FooType = FooType
+    def validate_FooTypeType(self, value):
+        # Validate type FooTypeType, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 12:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
+           if len(value) > 24:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
+    def hasContent_(self):
+        if (
+            self.FooType is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='FooType1', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='FooType1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='FooType1', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='FooType1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='FooType1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.FooType is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sFooType>%s</%sFooType>%s' % (namespace_, self.gds_format_string(quote_xml(self.FooType).encode(ExternalEncoding), input_name='FooType'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='FooType1'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.FooType is not None:
+            showIndent(outfile, level)
+            outfile.write('FooType=%s,\n' % quote_python(self.FooType).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'FooType':
+            FooType_ = child_.text
+            FooType_ = self.gds_validate_string(FooType_, node, 'FooType')
+            self.FooType = FooType_
+            self.validate_FooTypeType(self.FooType)    # validate type FooTypeType
+# end class FooType1
+
+
+GDSClassesMapping = {
+    'container': containerType,
+    'sample2_bad': simpleOneType,
+    'sample1': simpleOneType,
+    'sample3_bad': simpleOneType,
+    'sample2': simpleTwoType,
+    'Foo': FooType1,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(inString))
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from validate_simpletypes2_sup import *\n\n')
+        sys.stdout.write('import validate_simpletypes2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "FooType1",
+    "containerType",
+    "simpleOneType",
+    "simpleTwoType"
+]
diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt
new file mode 100644
index 0000000000000000000000000000000000000000..39f77515058044c0e5ebed5561ebf2c1296410d0
--- /dev/null
+++ b/tests/validate_simpletypes1_warnings.txt
@@ -0,0 +1,20 @@
+tests/validate_simpletypes2_sup.py:889: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
+  warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:896: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
+  warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
+tests/validate_simpletypes2_sup.py:901: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
+  warnings.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
+tests/validate_simpletypes2_sup.py:908: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
+  warnings.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:915: UserWarning: Value "012345" does not match xsd length restriction on length_st
+  warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:925: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
+  warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+tests/validate_simpletypes2_sup.py:894: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
+  warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
+tests/validate_simpletypes2_sup.py:910: UserWarning: Value "asdf asdf asdf adf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
+  warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:915: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
+  warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:927: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
+  warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
diff --git a/tests/validate_simpletypes2_out.xml b/tests/validate_simpletypes2_out.xml
new file mode 100644
index 0000000000000000000000000000000000000000..70c8feb1ec0e915aff1bbc3156b10111cc1422b7
--- /dev/null
+++ b/tests/validate_simpletypes2_out.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" ?>
+<container>
+    <sample1>
+        <token_enum_value>float</token_enum_value>
+        <token_enum_value>float</token_enum_value>
+        <integer_range_incl_value>2</integer_range_incl_value>
+        <integer_range_excl_value>7</integer_range_excl_value>
+        <min_max_length_value>abc def ghi</min_max_length_value>
+        <length_value>0123456789</length_value>
+        <totaldigits_value>12.456</totaldigits_value>
+        <anonymous_float_value>2.2</anonymous_float_value>
+    </sample1>
+    <sample2_bad>
+        <token_enum_value>floatxx</token_enum_value>
+        <token_enum_value>floatxx</token_enum_value>
+        <integer_range_incl_value>22</integer_range_incl_value>
+        <integer_range_excl_value>-40</integer_range_excl_value>
+        <min_max_length_value>mno pqr</min_max_length_value>
+        <length_value>012345</length_value>
+        <totaldigits_value>12.456789000000001</totaldigits_value>
+        <anonymous_float_value>0.2</anonymous_float_value>
+    </sample2_bad>
+    <sample3_bad>
+        <integer_range_incl_value>-50</integer_range_incl_value>
+        <min_max_length_value>asdf asdf asdf adf asdf asdf</min_max_length_value>
+        <length_value>01234567890</length_value>
+        <totaldigits_value>12345678.456789009273052</totaldigits_value>
+        <anonymous_float_value>6.6</anonymous_float_value>
+    </sample3_bad>
+</container>
diff --git a/tests/validate_simpletypes2_sub.py b/tests/validate_simpletypes2_sub.py
new file mode 100644
index 0000000000000000000000000000000000000000..6b50bce01c83794f83b8427c5fb2688fc2b2d969
--- /dev/null
+++ b/tests/validate_simpletypes2_sub.py
@@ -0,0 +1,235 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/validate_simpletypes2_sup.py')
+#   ('-s', 'tests/validate_simpletypes2_sub.py')
+#   ('--super', 'validate_simpletypes2_sup')
+#
+# Command line arguments:
+#   tests/validate_simpletypes.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+
+import validate_simpletypes2_sup as supermod
+
+etree_ = None
+Verbose_import_ = False
+(
+    XMLParser_import_none, XMLParser_import_lxml,
+    XMLParser_import_elementtree
+) = range(3)
+XMLParser_import_library = None
+try:
+    # lxml
+    from lxml import etree as etree_
+    XMLParser_import_library = XMLParser_import_lxml
+    if Verbose_import_:
+        print("running with lxml.etree")
+except ImportError:
+    try:
+        # cElementTree from Python 2.5+
+        import xml.etree.cElementTree as etree_
+        XMLParser_import_library = XMLParser_import_elementtree
+        if Verbose_import_:
+            print("running with cElementTree on Python 2.5+")
+    except ImportError:
+        try:
+            # ElementTree from Python 2.5+
+            import xml.etree.ElementTree as etree_
+            XMLParser_import_library = XMLParser_import_elementtree
+            if Verbose_import_:
+                print("running with ElementTree on Python 2.5+")
+        except ImportError:
+            try:
+                # normal cElementTree install
+                import cElementTree as etree_
+                XMLParser_import_library = XMLParser_import_elementtree
+                if Verbose_import_:
+                    print("running with cElementTree")
+            except ImportError:
+                try:
+                    # normal ElementTree install
+                    import elementtree.ElementTree as etree_
+                    XMLParser_import_library = XMLParser_import_elementtree
+                    if Verbose_import_:
+                        print("running with ElementTree")
+                except ImportError:
+                    raise ImportError(
+                        "Failed to import ElementTree from any known place")
+
+
+def parsexml_(*args, **kwargs):
+    if (XMLParser_import_library == XMLParser_import_lxml and
+            'parser' not in kwargs):
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        kwargs['parser'] = etree_.ETCompatXMLParser()
+    doc = etree_.parse(*args, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class containerTypeSub(supermod.containerType):
+    def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample2=None):
+        super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample2, )
+supermod.containerType.subclass = containerTypeSub
+# end class containerTypeSub
+
+
+class simpleOneTypeSub(supermod.simpleOneType):
+    def __init__(self, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totaldigits_value=None, anonymous_float_value=None):
+        super(simpleOneTypeSub, self).__init__(token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totaldigits_value, anonymous_float_value, )
+supermod.simpleOneType.subclass = simpleOneTypeSub
+# end class simpleOneTypeSub
+
+
+class simpleTwoTypeSub(supermod.simpleTwoType):
+    def __init__(self, Foo=None):
+        super(simpleTwoTypeSub, self).__init__(Foo, )
+supermod.simpleTwoType.subclass = simpleTwoTypeSub
+# end class simpleTwoTypeSub
+
+
+class FooType1Sub(supermod.FooType1):
+    def __init__(self, FooType=None):
+        super(FooType1Sub, self).__init__(FooType, )
+supermod.FooType1.subclass = FooType1Sub
+# end class FooType1Sub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(inString))
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    doc = parsexml_(inFilename)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from validate_simpletypes2_sup import *\n\n')
+        sys.stdout.write('import validate_simpletypes2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py
new file mode 100644
index 0000000000000000000000000000000000000000..77d98861db36a2720da12ff49737ec755775b1d7
--- /dev/null
+++ b/tests/validate_simpletypes2_sup.py
@@ -0,0 +1,1396 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/validate_simpletypes2_sup.py')
+#   ('-s', 'tests/validate_simpletypes2_sub.py')
+#   ('--super', 'validate_simpletypes2_sup')
+#
+# Command line arguments:
+#   tests/validate_simpletypes.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import getopt
+import re as re_
+import base64
+import datetime as datetime_
+import warnings
+
+
+Validate_simpletypes_ = True
+
+
+etree_ = None
+Verbose_import_ = False
+(
+    XMLParser_import_none, XMLParser_import_lxml,
+    XMLParser_import_elementtree
+) = range(3)
+XMLParser_import_library = None
+try:
+    # lxml
+    from lxml import etree as etree_
+    XMLParser_import_library = XMLParser_import_lxml
+    if Verbose_import_:
+        print("running with lxml.etree")
+except ImportError:
+    try:
+        # cElementTree from Python 2.5+
+        import xml.etree.cElementTree as etree_
+        XMLParser_import_library = XMLParser_import_elementtree
+        if Verbose_import_:
+            print("running with cElementTree on Python 2.5+")
+    except ImportError:
+        try:
+            # ElementTree from Python 2.5+
+            import xml.etree.ElementTree as etree_
+            XMLParser_import_library = XMLParser_import_elementtree
+            if Verbose_import_:
+                print("running with ElementTree on Python 2.5+")
+        except ImportError:
+            try:
+                # normal cElementTree install
+                import cElementTree as etree_
+                XMLParser_import_library = XMLParser_import_elementtree
+                if Verbose_import_:
+                    print("running with cElementTree")
+            except ImportError:
+                try:
+                    # normal ElementTree install
+                    import elementtree.ElementTree as etree_
+                    XMLParser_import_library = XMLParser_import_elementtree
+                    if Verbose_import_:
+                        print("running with ElementTree")
+                except ImportError:
+                    raise ImportError(
+                        "Failed to import ElementTree from any known place")
+
+
+def parsexml_(*args, **kwargs):
+    if (XMLParser_import_library == XMLParser_import_lxml and
+            'parser' not in kwargs):
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        kwargs['parser'] = etree_.ETCompatXMLParser()
+    doc = etree_.parse(*args, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError, exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, basestring) and inStr or
+          '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, basestring) and inStr or
+          '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    if XMLParser_import_library == XMLParser_import_lxml:
+        msg = '%s (element %s/line %d)' % (
+            msg, node.tag, node.sourceline, )
+    else:
+        msg = '%s (element %s)' % (msg, node.tag, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(outfile, level, namespace, name, pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class containerType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('sample1', 'simpleOneType', 1),
+        MemberSpec_('sample2_bad', 'simpleOneType', 1),
+        MemberSpec_('sample3_bad', 'simpleOneType', 1),
+        MemberSpec_('sample2', 'simpleTwoType', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample2=None):
+        self.original_tagname_ = None
+        if sample1 is None:
+            self.sample1 = []
+        else:
+            self.sample1 = sample1
+        if sample2_bad is None:
+            self.sample2_bad = []
+        else:
+            self.sample2_bad = sample2_bad
+        if sample3_bad is None:
+            self.sample3_bad = []
+        else:
+            self.sample3_bad = sample3_bad
+        if sample2 is None:
+            self.sample2 = []
+        else:
+            self.sample2 = sample2
+    def factory(*args_, **kwargs_):
+        if containerType.subclass:
+            return containerType.subclass(*args_, **kwargs_)
+        else:
+            return containerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_sample1(self): return self.sample1
+    def set_sample1(self, sample1): self.sample1 = sample1
+    def add_sample1(self, value): self.sample1.append(value)
+    def insert_sample1_at(self, index, value): self.sample1.insert(index, value)
+    def replace_sample1_at(self, index, value): self.sample1[index] = value
+    def get_sample2_bad(self): return self.sample2_bad
+    def set_sample2_bad(self, sample2_bad): self.sample2_bad = sample2_bad
+    def add_sample2_bad(self, value): self.sample2_bad.append(value)
+    def insert_sample2_bad_at(self, index, value): self.sample2_bad.insert(index, value)
+    def replace_sample2_bad_at(self, index, value): self.sample2_bad[index] = value
+    def get_sample3_bad(self): return self.sample3_bad
+    def set_sample3_bad(self, sample3_bad): self.sample3_bad = sample3_bad
+    def add_sample3_bad(self, value): self.sample3_bad.append(value)
+    def insert_sample3_bad_at(self, index, value): self.sample3_bad.insert(index, value)
+    def replace_sample3_bad_at(self, index, value): self.sample3_bad[index] = value
+    def get_sample2(self): return self.sample2
+    def set_sample2(self, sample2): self.sample2 = sample2
+    def add_sample2(self, value): self.sample2.append(value)
+    def insert_sample2_at(self, index, value): self.sample2.insert(index, value)
+    def replace_sample2_at(self, index, value): self.sample2[index] = value
+    def hasContent_(self):
+        if (
+            self.sample1 or
+            self.sample2_bad or
+            self.sample3_bad or
+            self.sample2
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='containerType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for sample1_ in self.sample1:
+            sample1_.export(outfile, level, namespace_, name_='sample1', pretty_print=pretty_print)
+        for sample2_bad_ in self.sample2_bad:
+            sample2_bad_.export(outfile, level, namespace_, name_='sample2_bad', pretty_print=pretty_print)
+        for sample3_bad_ in self.sample3_bad:
+            sample3_bad_.export(outfile, level, namespace_, name_='sample3_bad', pretty_print=pretty_print)
+        for sample2_ in self.sample2:
+            sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='containerType'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        showIndent(outfile, level)
+        outfile.write('sample1=[\n')
+        level += 1
+        for sample1_ in self.sample1:
+            showIndent(outfile, level)
+            outfile.write('model_.simpleOneType(\n')
+            sample1_.exportLiteral(outfile, level, name_='simpleOneType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('sample2_bad=[\n')
+        level += 1
+        for sample2_bad_ in self.sample2_bad:
+            showIndent(outfile, level)
+            outfile.write('model_.simpleOneType(\n')
+            sample2_bad_.exportLiteral(outfile, level, name_='simpleOneType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('sample3_bad=[\n')
+        level += 1
+        for sample3_bad_ in self.sample3_bad:
+            showIndent(outfile, level)
+            outfile.write('model_.simpleOneType(\n')
+            sample3_bad_.exportLiteral(outfile, level, name_='simpleOneType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+        showIndent(outfile, level)
+        outfile.write('sample2=[\n')
+        level += 1
+        for sample2_ in self.sample2:
+            showIndent(outfile, level)
+            outfile.write('model_.simpleTwoType(\n')
+            sample2_.exportLiteral(outfile, level, name_='simpleTwoType')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+        level -= 1
+        showIndent(outfile, level)
+        outfile.write('],\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'sample1':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample1.append(obj_)
+            obj_.original_tagname_ = 'sample1'
+        elif nodeName_ == 'sample2_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample2_bad.append(obj_)
+            obj_.original_tagname_ = 'sample2_bad'
+        elif nodeName_ == 'sample3_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample3_bad.append(obj_)
+            obj_.original_tagname_ = 'sample3_bad'
+        elif nodeName_ == 'sample2':
+            obj_ = simpleTwoType.factory()
+            obj_.build(child_)
+            self.sample2.append(obj_)
+            obj_.original_tagname_ = 'sample2'
+# end class containerType
+
+
+class simpleOneType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0),
+        MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0),
+        MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0),
+        MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0),
+        MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0),
+        MemberSpec_('length_value', ['length_st', 'xs:string'], 0),
+        MemberSpec_('totaldigits_value', ['totaldigits_st', 'xs:float'], 0),
+        MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totaldigits_value=None, anonymous_float_value=None):
+        self.original_tagname_ = None
+        self.token_enum_value = token_enum_value
+        self.validate_token_enum_st(self.token_enum_value)
+        self.token_enum_value = token_enum_value
+        self.validate_token_enum_st(self.token_enum_value)
+        self.integer_range_incl_value = integer_range_incl_value
+        self.validate_integer_range_incl_st(self.integer_range_incl_value)
+        self.integer_range_excl_value = integer_range_excl_value
+        self.validate_integer_range_excl_st(self.integer_range_excl_value)
+        self.min_max_length_value = min_max_length_value
+        self.validate_min_max_length_st(self.min_max_length_value)
+        self.length_value = length_value
+        self.validate_length_st(self.length_value)
+        self.totaldigits_value = totaldigits_value
+        self.validate_totaldigits_st(self.totaldigits_value)
+        self.anonymous_float_value = anonymous_float_value
+        self.validate_anonymous_float_valueType(self.anonymous_float_value)
+    def factory(*args_, **kwargs_):
+        if simpleOneType.subclass:
+            return simpleOneType.subclass(*args_, **kwargs_)
+        else:
+            return simpleOneType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_token_enum_value(self): return self.token_enum_value
+    def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value
+    def get_token_enum_value(self): return self.token_enum_value
+    def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value
+    def get_integer_range_incl_value(self): return self.integer_range_incl_value
+    def set_integer_range_incl_value(self, integer_range_incl_value): self.integer_range_incl_value = integer_range_incl_value
+    def get_integer_range_excl_value(self): return self.integer_range_excl_value
+    def set_integer_range_excl_value(self, integer_range_excl_value): self.integer_range_excl_value = integer_range_excl_value
+    def get_min_max_length_value(self): return self.min_max_length_value
+    def set_min_max_length_value(self, min_max_length_value): self.min_max_length_value = min_max_length_value
+    def get_length_value(self): return self.length_value
+    def set_length_value(self, length_value): self.length_value = length_value
+    def get_totaldigits_value(self): return self.totaldigits_value
+    def set_totaldigits_value(self, totaldigits_value): self.totaldigits_value = totaldigits_value
+    def get_anonymous_float_value(self): return self.anonymous_float_value
+    def set_anonymous_float_value(self, anonymous_float_value): self.anonymous_float_value = anonymous_float_value
+    def validate_token_enum_st(self, value):
+        # Validate type token_enum_st, a restriction on xs:NMTOKEN.
+        if value is not None and Validate_simpletypes_:
+           enumerations = ['float', 'int', 'Name', 'token']
+           enumeration_respectee = False
+           for enum in enumerations:
+               if value == enum:
+                   enumeration_respectee = True
+                   break
+           if not enumeration_respectee:
+               warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
+    def validate_integer_range_incl_st(self, value):
+        # Validate type integer_range_incl_st, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+           if value <= -5:
+               warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
+           if value >= 10:
+               warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
+    def validate_integer_range_excl_st(self, value):
+        # Validate type integer_range_excl_st, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+           if value < -5:
+               warnings.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
+           if value > 10:
+               warnings.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_excl_st' % {"value" : value} )
+    def validate_min_max_length_st(self, value):
+        # Validate type min_max_length_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 10:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+           if len(value) > 20:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+    def validate_length_st(self, value):
+        # Validate type length_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+           if len(value) != 10:
+               warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
+    def validate_totaldigits_st(self, value):
+        # Validate type totaldigits_st, a restriction on xs:float.
+        if value is not None and Validate_simpletypes_:
+           if len(str(value)) >= 15:
+               warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on totaldigits_st' % {"value" : value} )
+    def validate_anonymous_float_valueType(self, value):
+        # Validate type anonymous_float_valueType, a restriction on xs:float.
+        if value is not None and Validate_simpletypes_:
+           if value <= 1.1:
+               warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+           if value >= 4.4:
+               warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+    def hasContent_(self):
+        if (
+            self.token_enum_value is not None or
+            self.token_enum_value is not None or
+            self.integer_range_incl_value is not None or
+            self.integer_range_excl_value is not None or
+            self.min_max_length_value is not None or
+            self.length_value is not None or
+            self.totaldigits_value is not None or
+            self.anonymous_float_value is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleOneType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleOneType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleOneType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleOneType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleOneType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.token_enum_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), input_name='token_enum_value'), namespace_, eol_))
+        if self.token_enum_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), input_name='token_enum_value'), namespace_, eol_))
+        if self.integer_range_incl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_incl_value>%s</%sinteger_range_incl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_incl_value, input_name='integer_range_incl_value'), namespace_, eol_))
+        if self.integer_range_excl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_excl_value>%s</%sinteger_range_excl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_excl_value, input_name='integer_range_excl_value'), namespace_, eol_))
+        if self.min_max_length_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%smin_max_length_value>%s</%smin_max_length_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.min_max_length_value).encode(ExternalEncoding), input_name='min_max_length_value'), namespace_, eol_))
+        if self.length_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slength_value>%s</%slength_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.length_value).encode(ExternalEncoding), input_name='length_value'), namespace_, eol_))
+        if self.totaldigits_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stotaldigits_value>%s</%stotaldigits_value>%s' % (namespace_, self.gds_format_float(self.totaldigits_value, input_name='totaldigits_value'), namespace_, eol_))
+        if self.anonymous_float_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sanonymous_float_value>%s</%sanonymous_float_value>%s' % (namespace_, self.gds_format_float(self.anonymous_float_value, input_name='anonymous_float_value'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='simpleOneType'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.token_enum_value is not None:
+            showIndent(outfile, level)
+            outfile.write('token_enum_value=%s,\n' % quote_python(self.token_enum_value).encode(ExternalEncoding))
+        if self.token_enum_value is not None:
+            showIndent(outfile, level)
+            outfile.write('token_enum_value=%s,\n' % quote_python(self.token_enum_value).encode(ExternalEncoding))
+        if self.integer_range_incl_value is not None:
+            showIndent(outfile, level)
+            outfile.write('integer_range_incl_value=%d,\n' % self.integer_range_incl_value)
+        if self.integer_range_excl_value is not None:
+            showIndent(outfile, level)
+            outfile.write('integer_range_excl_value=%d,\n' % self.integer_range_excl_value)
+        if self.min_max_length_value is not None:
+            showIndent(outfile, level)
+            outfile.write('min_max_length_value=%s,\n' % quote_python(self.min_max_length_value).encode(ExternalEncoding))
+        if self.length_value is not None:
+            showIndent(outfile, level)
+            outfile.write('length_value=%s,\n' % quote_python(self.length_value).encode(ExternalEncoding))
+        if self.totaldigits_value is not None:
+            showIndent(outfile, level)
+            outfile.write('totaldigits_value=%f,\n' % self.totaldigits_value)
+        if self.anonymous_float_value is not None:
+            showIndent(outfile, level)
+            outfile.write('anonymous_float_value=%f,\n' % self.anonymous_float_value)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'token_enum_value':
+            token_enum_value_ = child_.text
+            token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value')
+            self.token_enum_value = token_enum_value_
+            self.validate_token_enum_st(self.token_enum_value)    # validate type token_enum_st
+        elif nodeName_ == 'token_enum_value':
+            token_enum_value_ = child_.text
+            token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value')
+            self.token_enum_value = token_enum_value_
+            self.validate_token_enum_st(self.token_enum_value)    # validate type token_enum_st
+        elif nodeName_ == 'integer_range_incl_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value')
+            self.integer_range_incl_value = ival_
+            self.validate_integer_range_incl_st(self.integer_range_incl_value)    # validate type integer_range_incl_st
+        elif nodeName_ == 'integer_range_excl_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value')
+            self.integer_range_excl_value = ival_
+            self.validate_integer_range_excl_st(self.integer_range_excl_value)    # validate type integer_range_excl_st
+        elif nodeName_ == 'min_max_length_value':
+            min_max_length_value_ = child_.text
+            min_max_length_value_ = self.gds_validate_string(min_max_length_value_, node, 'min_max_length_value')
+            self.min_max_length_value = min_max_length_value_
+            self.validate_min_max_length_st(self.min_max_length_value)    # validate type min_max_length_st
+        elif nodeName_ == 'length_value':
+            length_value_ = child_.text
+            length_value_ = self.gds_validate_string(length_value_, node, 'length_value')
+            self.length_value = length_value_
+            self.validate_length_st(self.length_value)    # validate type length_st
+        elif nodeName_ == 'totaldigits_value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'totaldigits_value')
+            self.totaldigits_value = fval_
+            self.validate_totaldigits_st(self.totaldigits_value)    # validate type totaldigits_st
+        elif nodeName_ == 'anonymous_float_value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError), exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value')
+            self.anonymous_float_value = fval_
+            self.validate_anonymous_float_valueType(self.anonymous_float_value)    # validate type anonymous_float_valueType
+# end class simpleOneType
+
+
+class simpleTwoType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('Foo', 'FooType1', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, Foo=None):
+        self.original_tagname_ = None
+        self.Foo = Foo
+    def factory(*args_, **kwargs_):
+        if simpleTwoType.subclass:
+            return simpleTwoType.subclass(*args_, **kwargs_)
+        else:
+            return simpleTwoType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_Foo(self): return self.Foo
+    def set_Foo(self, Foo): self.Foo = Foo
+    def hasContent_(self):
+        if (
+            self.Foo is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleTwoType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.Foo is not None:
+            self.Foo.export(outfile, level, namespace_, name_='Foo', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='simpleTwoType'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.Foo is not None:
+            showIndent(outfile, level)
+            outfile.write('Foo=model_.FooType1(\n')
+            self.Foo.exportLiteral(outfile, level, name_='Foo')
+            showIndent(outfile, level)
+            outfile.write('),\n')
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'Foo':
+            obj_ = FooType1.factory()
+            obj_.build(child_)
+            self.Foo = obj_
+            obj_.original_tagname_ = 'Foo'
+# end class simpleTwoType
+
+
+class FooType1(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('FooType', ['FooTypeType', 'xs:string'], 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, FooType=None):
+        self.original_tagname_ = None
+        self.FooType = FooType
+        self.validate_FooTypeType(self.FooType)
+    def factory(*args_, **kwargs_):
+        if FooType1.subclass:
+            return FooType1.subclass(*args_, **kwargs_)
+        else:
+            return FooType1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_FooType(self): return self.FooType
+    def set_FooType(self, FooType): self.FooType = FooType
+    def validate_FooTypeType(self, value):
+        # Validate type FooTypeType, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+           if len(value) < 12:
+               warnings.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
+           if len(value) > 24:
+               warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
+    def hasContent_(self):
+        if (
+            self.FooType is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='FooType1', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='FooType1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='FooType1', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='FooType1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='FooType1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.FooType is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sFooType>%s</%sFooType>%s' % (namespace_, self.gds_format_string(quote_xml(self.FooType).encode(ExternalEncoding), input_name='FooType'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='FooType1'):
+        level += 1
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
+        if self.hasContent_():
+            self.exportLiteralChildren(outfile, level, name_)
+    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
+        pass
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.FooType is not None:
+            showIndent(outfile, level)
+            outfile.write('FooType=%s,\n' % quote_python(self.FooType).encode(ExternalEncoding))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'FooType':
+            FooType_ = child_.text
+            FooType_ = self.gds_validate_string(FooType_, node, 'FooType')
+            self.FooType = FooType_
+            self.validate_FooTypeType(self.FooType)    # validate type FooTypeType
+# end class FooType1
+
+
+GDSClassesMapping = {
+    'container': containerType,
+    'sample2_bad': simpleOneType,
+    'sample1': simpleOneType,
+    'sample3_bad': simpleOneType,
+    'sample2': simpleTwoType,
+    'Foo': FooType1,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    doc = parsexml_(StringIO(inString))
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    doc = parsexml_(inFileName)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from validate_simpletypes2_sup import *\n\n')
+        sys.stdout.write('import validate_simpletypes2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "FooType1",
+    "containerType",
+    "simpleOneType",
+    "simpleTwoType"
+]
diff --git a/tests/validate_simpletypes2_warnings.txt b/tests/validate_simpletypes2_warnings.txt
new file mode 100644
index 0000000000000000000000000000000000000000..39f77515058044c0e5ebed5561ebf2c1296410d0
--- /dev/null
+++ b/tests/validate_simpletypes2_warnings.txt
@@ -0,0 +1,20 @@
+tests/validate_simpletypes2_sup.py:889: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
+  warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:896: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
+  warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
+tests/validate_simpletypes2_sup.py:901: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
+  warnings.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
+tests/validate_simpletypes2_sup.py:908: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
+  warnings.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:915: UserWarning: Value "012345" does not match xsd length restriction on length_st
+  warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:925: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
+  warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+tests/validate_simpletypes2_sup.py:894: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
+  warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
+tests/validate_simpletypes2_sup.py:910: UserWarning: Value "asdf asdf asdf adf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
+  warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:915: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
+  warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
+tests/validate_simpletypes2_sup.py:927: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
+  warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index 4229ff0389cb521dbff0011e11f149f05c3835ae..4ede248ee3eae4014f50dbe89a93b689b3d93375 100644
--- a/tutorial/generateds_tutorial.html
+++ b/tutorial/generateds_tutorial.html
@@ -219,7 +219,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.14a</td>
 </tr>
 </tbody>
 </table>
@@ -228,7 +228,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">October 08, 2014</td>
 </tr>
 </tbody>
 </table>
@@ -1210,7 +1210,7 @@ named <tt class="docutils literal">garden_api.py</tt>, you can create an instanc
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateds_tutorial.txt">View document source</a>.
-Generated on: 2014-09-09 19:14 UTC.
+Generated on: 2014-10-08 22:22 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index 46348ce28b43e0d40a9c67523c0b9e625d12a898..7f91fd9f9d084a5850275558d92409a430db33f5 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.13b
+:revision: 2.14a
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 157eecae050a3a0201ce0ca0984aaeb93fe97c59..8a4d0465c6f1bb77ab1c106245753ca94932221a 100644
Binary files a/tutorial/generateds_tutorial.zip and b/tutorial/generateds_tutorial.zip differ