diff --git a/README b/README
index 59de3a66d4c732d9b4414961389276694df12b02..ff0b7838bd02a68857b7bb85425529fab34d5f3e 100644
--- a/README
+++ b/README
@@ -141,6 +141,36 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.12c (03/19/2014)
+- Fix for  "one module per XSD file" to handle an include or import
+  element that refers to a remote schema on the Net (i.e. the
+  location is "http:..." or "ftp:...") rather than a file on the
+  local file system.  Added ability to access include/import file
+  across the Net.  Thanks to Jinquan Liu for reporting this.
+- Added schema to unit test for "one module per XSD file" that is
+  read from remote site (http://www.davekuhlman.org).
+- Fix to process_includes.py -- When run directly from the command
+  line (as opposed to imported and called from another python
+  module), the fixtypenames option was not being intialized.
+- Fix for error in order of generation of classes that have
+  superclasses.  When an anonymous simpleType occured, the name of
+  the enclosing complexType was used, which caused generateDS.py to
+  believe that the superclass had already been generated.  Thanks
+  again to Jinquan Liu for reporting this issue.
+- Fix for handling of xs:substitutionGroup -- Namespace prefix was
+  causing gDS to fail to match on substitutionGroup name.
+- Added code so that an instance of a generated class can remember
+  the tag from which it was built.  This is needed for instances of
+  a class that represents an element type that is a member of a
+  xs:substitutionGroup.  But, in fact, generated code now uses this
+  feature to remember and export the tag name of all complex
+  elements.
+- Enhanced command line option --root-element so that both the root
+  tag and the root class can be specified (separated by a vertical
+  bar).
+- Added support for the ability of an element definition to inherit
+  minOccurs and maxOccurs from the xs:sequence that contains it.
+
 Version 2.12b (02/10/2014)
 - Fix to the aliasing capability.  You should now be able to alias
   one element to another, and by doing so, only generate the
diff --git a/generateDS.html b/generateDS.html
index 1dee987d4f389a66ce8026a27032e109cfa6352d..29646502b44262edb6433b63bb3b46e07820c53b 100644
--- a/generateDS.html
+++ b/generateDS.html
@@ -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.12b</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12c</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">February 10, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 19, 2014</td>
 </tr>
 </tbody>
 </table>
@@ -542,9 +542,11 @@ Options:
                              Append XXX to the end of each file created.
     --subclass-suffix=&quot;XXX&quot;  Append XXX to the generated subclass names.
                              Default=&quot;Sub&quot;.
-    --root-element=&quot;XXX&quot;     Assume XXX is root element of instance docs.
-                             Default is first element defined in schema.
-                             Also see section &quot;Recognizing the top level
+    --root-element=&quot;XX&quot;      When parsing, assume XX is root element of
+    --root-element=&quot;XX|YY&quot;   instance docs.  Default is first element defined
+                             in schema.  If YY is added, then YY is used as the
+                             top level class; if YY omitted XX is the default.
+                             class. Also see section &quot;Recognizing the top level
                              element&quot; in the documentation.
     --super=&quot;XXX&quot;            Super module name in generated in subclass
                              module. Default=&quot;???&quot;
@@ -624,7 +626,7 @@ creates (with force over-write) sample_lib.py from sample_api.xsd.
 creates sample_lib.py superclass and sample_app1.py subclass modules;
 also generates member specifications in each class (in a dictionary).
 </pre>
-<p>The following command line flags are recognized by <tt class="docutils literal">generateDS.py</tt>:</p>
+<p>The following command line options are recognized by <tt class="docutils literal">generateDS.py</tt>:</p>
 <dl class="docutils">
 <dt>o &lt;filename&gt;</dt>
 <dd>Write the data representation classes to file filename.</dd>
@@ -698,11 +700,16 @@ and subclass names the same:</p>
 generateDS.py --subclass-suffix=&quot;&quot; -s actions.py mydef.xsd
 </pre>
 </dd>
-<dt>root-element=&lt;element_name&gt;</dt>
-<dd>Make element_name the assumed root of instance documents.  The
-default is the name of the element whose definition is first
-in the XML Schema document.  This flag effects the parsing
-functions (for example, parse(), parseString()).</dd>
+<dt>root-element=&lt;element_name&gt; -OR- &lt;element_name&gt;|&lt;class_name&gt;</dt>
+<dd>Make <tt class="docutils literal">element_name</tt> the assumed root of instance documents.
+The default is the name of the element whose definition is first
+in the XML Schema document.  If <tt class="docutils literal">class_name</tt> is also present
+(after a vertical bar), then <tt class="docutils literal">class_name</tt> is assumed to be the
+name of the class to be created from the root (top level)
+element when parsing an XML instance document.  If
+<tt class="docutils literal">class_name</tt> is omitted, the default class name is the same as
+<tt class="docutils literal">element_name</tt>.  This flag effects the parsing functions (for
+example, parse(), parseString(), etc).</dd>
 <dt>super=&lt;module_name&gt;</dt>
 <dd><p class="first">Make module_name the name of the superclass module imported
 by the subclass module.  If this flag is omitted, the
@@ -2865,7 +2872,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-02-10 22:19 UTC.
+Generated on: 2014-03-19 16:03 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 b3356e6837d89c04264f648b67baaaedc65a1d2e..cc7a168e81f000d22a487fdbadffea803c22ea02 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -25,9 +25,11 @@ Options:
                              Append XXX to the end of each file created.
     --subclass-suffix="XXX"  Append XXX to the generated subclass names.
                              Default="Sub".
-    --root-element="XXX"     Assume XXX is root element of instance docs.
-                             Default is first element defined in schema.
-                             Also see section "Recognizing the top level
+    --root-element="XX"      When parsing, assume XX is root element of
+    --root-element="XX|YY"   instance docs.  Default is first element defined
+                             in schema.  If YY is added, then YY is used as the
+                             top level class; if YY omitted XX is the default.
+                             class. Also see section "Recognizing the top level
                              element" in the documentation.
     --super="XXX"            Super module name in generated in subclass
                              module. Default="???"
@@ -177,7 +179,7 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.12b'
+VERSION = '2.12c'
 ##VERSION##
 
 GenerateProperties = 0
@@ -541,11 +543,7 @@ class SimpleTypeElement(XschemaElementBase):
         s1 = '<"%s" SimpleTypeElement instance at 0x%x>' % \
             (self.getName(), id(self))
         return s1
-
-    def __repr__(self):
-        s1 = '<"%s" SimpleTypeElement instance at 0x%x>' % \
-            (self.getName(), id(self))
-        return s1
+    __repr__ = __str__
 
     def resolve_list_type(self):
         if self.isListType():
@@ -1376,6 +1374,7 @@ class XschemaHandler(handler.ContentHandler):
         self.inComplexType = 0
         self.inNonanonymousComplexType = 0
         self.inSequence = 0
+        self.sequenceStack = []
         self.inChoice = 1
         self.inAttribute = 0
         self.attributeGroupLevel = 0
@@ -1449,6 +1448,13 @@ class XschemaHandler(handler.ContentHandler):
             if element.prefix in prefixToNamespaceMap:
                 element.namespace = prefixToNamespaceMap[element.prefix]
 
+            if self.sequenceStack:
+                minOccurs, maxOccurs = self.sequenceStack[-1]
+                if 'minOccurs' not in attrs and minOccurs is not None:
+                    element.attrs['minOccurs'] = minOccurs
+                if 'maxOccurs' not in attrs and maxOccurs is not None:
+                    element.attrs['maxOccurs'] = maxOccurs
+
             if not 'type' in attrs.keys() and not 'ref' in attrs.keys():
                 element.setExplicitDefine(1)
             if len(self.stack) == 1:
@@ -1456,6 +1462,7 @@ class XschemaHandler(handler.ContentHandler):
             if 'substitutionGroup' in attrs.keys() and 'name' in attrs.keys():
                 substituteName = attrs['name']
                 headName = attrs['substitutionGroup']
+                _, headName = get_prefix_and_value(headName)
                 if headName not in SubstitutionGroups:
                     SubstitutionGroups[headName] = []
                 SubstitutionGroups[headName].append(substituteName)
@@ -1483,6 +1490,8 @@ class XschemaHandler(handler.ContentHandler):
             self.stack.append(element)
         elif name == SequenceType:
             self.inSequence = 1
+            self.sequenceStack.append(
+                [attrs.get('minOccurs'), attrs.get('maxOccurs')])
         elif name == ChoiceType:
             self.currentChoice = XschemaElement(attrs)
             self.inChoice = 1
@@ -1692,6 +1701,7 @@ class XschemaHandler(handler.ContentHandler):
             self.inComplexType = 0
         elif name == SequenceType:
             self.inSequence = 0
+            self.sequenceStack.pop()
         elif name == ChoiceType:
             self.currentChoice = None
             self.inChoice = 0
@@ -1826,7 +1836,6 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
             namespace = 'namespace_'
             if child.prefix and 'ref' in child.attrs:
                 namespace = "'%s:'" % child.prefix
-
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
                 "(%s, self.gds_format_string(quote_xml(self.%s)." \
                 "encode(ExternalEncoding), input_name='%s'), " \
@@ -2542,6 +2551,9 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
     wrt("            eol_ = '\\n'\n")
     wrt('        else:\n')
     wrt("            eol_ = ''\n")
+    # We need to be able to export the original tag name.
+    wrt("        if self.original_tagname_ is not None:\n")
+    wrt("            name_ = self.original_tagname_\n")
     wrt('        showIndent(outfile, level, pretty_print)\n')
     wrt("        outfile.write('<%s%s%s' % (namespace_, name_, "
         "namespacedef_ and ' ' + namespacedef_ or '', ))\n")
@@ -3479,7 +3491,7 @@ def generateBuildStandard_1(
         if headChild.getMaxOccurs() > 1:
             substitutionGroup = child.getAttrs().get('substitutionGroup')
             if substitutionGroup is not None:
-                name = substitutionGroup
+                _, name = get_prefix_and_value(substitutionGroup)
             else:
                 name = mappedName
             s1 = "            self.%s.append(obj_)\n" % (name, )
@@ -3491,6 +3503,7 @@ def generateBuildStandard_1(
                 name = headName
             s1 = "            self.%s = obj_\n" % (mappedName, )
         wrt(s1)
+        wrt("            obj_.original_tagname_ = '%s'\n" % (origName, ))
     #
     # If this child is defined in a simpleType, then generate
     #   a validator method.
@@ -3794,6 +3807,11 @@ def generateCtor(wrt, element):
     childCount = countChildren(element, 0)
     s2 = buildCtorArgs_multilevel(element, childCount)
     wrt('    def __init__(self%s):\n' % s2)
+    # Save the original tag name.  This is needed when there is a
+    # xs:substitutionGroup and we later (e.g. during export) do not know
+    # which member of the xs:substitutionGroup this specific element
+    # came from.
+    wrt('        self.original_tagname_ = None\n')
     parentName, parent = getParentName(element)
     if parentName:
         if parentName in AlreadyGenerated:
@@ -3836,9 +3854,7 @@ def generateCtor(wrt, element):
             pythonType = SchemaToPythonTypeMap.get(attrDef.getType())
             attrVal = "_cast(%s, %s)" % (pythonType, name, )
             wrt('        self.%s = %s\n' % (name, attrVal, ))
-        member = 1
     # Generate member initializers in ctor.
-    member = 0
     for child in element.getChildren():
         name = cleanupName(child.getCleanName())
         logging.debug("Constructor child: %s" % name)
@@ -3900,22 +3916,16 @@ def generateCtor(wrt, element):
                     wrt('            self.%s = %s\n' % (name, name))
                 else:
                     wrt('        self.%s = %s\n' % (name, name))
-        member = 1
     eltype = element.getType()
     if (element.getSimpleContent() or
             element.isMixed() or
             eltype in SimpleTypeDict or
             CurrentNamespacePrefix + eltype in OtherSimpleTypes):
         wrt('        self.valueOf_ = valueOf_\n')
-        member = 1
     if element.getAnyAttribute():
         wrt('        self.anyAttributes_ = {}\n')
-        member = 1
     if element.getExtended():
         wrt('        self.extensiontype_ = extensiontype_\n')
-        member = 1
-    if not member:
-        wrt('        pass\n')
     if element.isMixed():
         wrt(MixedCtorInitializers)
 # end generateCtor
@@ -4190,8 +4200,7 @@ def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''):
     # If this element is an extension (has a base) and the base has
     #   not been generated, then postpone it.
     if parentName:
-        if (parentName not in AlreadyGenerated and
-                parentName not in SimpleTypeDict):
+        if parentName not in AlreadyGenerated:
             PostponedExtensions.append(element)
             return
     if mapName(element.getName()) in AlreadyGenerated:
@@ -4917,8 +4926,8 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = %(prefix)s%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = %(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -4937,8 +4946,8 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = %(prefix)s%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = %(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -4959,10 +4968,10 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = %(prefix)s%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = %(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -4970,7 +4979,7 @@ def parseString(inString, silence=False):
 #silence#    if not silence:
 #silence#        sys.stdout.write('<?xml version="1.0" ?>\\n')
 #silence#        rootObj.export(
-#silence#            sys.stdout, 0, name_="%(name)s",
+#silence#            sys.stdout, 0, name_=rootTag,
 #silence#            namespacedef_='%(namespacedef)s')
     return rootObj
 
@@ -4980,8 +4989,8 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = %(prefix)s%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = %(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -4989,7 +4998,7 @@ def parseLiteral(inFileName, silence=False):
 #silence#    if not silence:
 #silence#        sys.stdout.write('#from %(module_name)s import *\\n\\n')
 #silence#        sys.stdout.write('import %(module_name)s as model_\\n\\n')
-#silence#        sys.stdout.write('rootObj = model_.rootTag(\\n')
+#silence#        sys.stdout.write('rootObj = model_.rootClass(\\n')
 #silence#        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 #silence#        sys.stdout.write(')\\n')
     return rootObj
@@ -5024,19 +5033,32 @@ def generateMain(outfile, prefix, root):
     exportDictLine += "}\n\n\n"
     outfile.write(exportDictLine)
     children = root.getChildren()
+    rootClass = None
     if children:
         name = RootElement or children[0].getName()
         elType = cleanupName(children[0].getType())
         if RootElement:
-            rootElement = RootElement
+            roots = RootElement.split('|')
+            if len(roots) > 1:
+                rootElement = roots[0]
+                rootClass = roots[1]
+            else:
+                rootElement = roots[0]
         else:
             rootElement = elType
     else:
         name = ''
         if RootElement:
-            rootElement = RootElement
+            roots = RootElement.split('|')
+            if len(roots) > 1:
+                rootElement = roots[0]
+                rootClass = roots[1]
+            else:
+                rootElement = roots[0]
         else:
             rootElement = ''
+    if rootClass is None:
+        rootClass = rootElement
     if Namespacedef:
         namespace = Namespacedef
     elif Targetnamespace:
@@ -5053,7 +5075,8 @@ def generateMain(outfile, prefix, root):
         'name': name,
         'cleanname': cleanupName(name),
         'module_name': os.path.splitext(os.path.basename(outfile.name))[0],
-        'root': rootElement,
+        'rootElement': rootElement,
+        'rootClass': rootClass,
         'namespacedef': namespace,
     }
     s1 = TEMPLATE_MAIN % params
@@ -5355,8 +5378,8 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = supermod.%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = supermod.%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5375,8 +5398,8 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = supermod.%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = supermod.%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5399,8 +5422,8 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = supermod.%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = supermod.%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5416,10 +5439,10 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = supermod.%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = supermod.%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5427,8 +5450,8 @@ def parseLiteral(inFilename, silence=False):
 #silence#    if not silence:
 #silence#        sys.stdout.write('#from %(super)s import *\\n\\n')
 #silence#        sys.stdout.write('import %(super)s as model_\\n\\n')
-#silence#        sys.stdout.write('rootObj = model_.%(cleanname)s(\\n')
-#silence#        rootObj.exportLiteral(sys.stdout, 0, name_="%(cleanname)s")
+#silence#        sys.stdout.write('rootObj = model_.rootClass(\\n')
+#silence#        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 #silence#        sys.stdout.write(')\\n')
     return rootObj
 
@@ -5518,7 +5541,6 @@ def getNamespace(element):
             namespace = 'xmlns:%s="%s"' % (
                 NamespacesDict[Targetnamespace].rstrip(':'),
                 Targetnamespace, )
-
     return namespace
 
 
@@ -5559,19 +5581,32 @@ def generateSubclasses(root, subclassFilename, behaviorFilename,
             generateSubclass(
                 wrt, element, prefix, xmlbehavior, behaviors, baseUrl)
         children = root.getChildren()
+        rootClass = None
         if children:
             name = children[0].getName()
             elType = cleanupName(children[0].getType())
             if RootElement:
-                rootElement = RootElement
+                roots = RootElement.split('|')
+                if len(roots) > 1:
+                    rootElement = roots[0]
+                    rootClass = roots[1]
+                else:
+                    rootElement = roots[0]
             else:
                 rootElement = elType
         else:
             name = ''
             if RootElement:
-                rootElement = RootElement
+                roots = RootElement.split('|')
+                if len(roots) > 1:
+                    rootElement = roots[0]
+                    rootClass = roots[1]
+                else:
+                    rootElement = roots[0]
             else:
                 rootElement = ''
+        if rootClass is None:
+            rootClass = rootElement
         if Namespacedef:
             namespace = Namespacedef
         elif Targetnamespace:
@@ -5589,7 +5624,9 @@ def generateSubclasses(root, subclassFilename, behaviorFilename,
             'cleanname': cleanupName(name),
             'module_name': os.path.splitext(
                 os.path.basename(subclassFilename))[0],
-            'root': rootElement,
+            'root': root,
+            'rootElement': rootElement,
+            'rootClass': rootClass,
             'namespacedef': namespace,
             'super': superModule,
         }
@@ -5653,7 +5690,6 @@ def getImportsForExternalXsds(root):
                                             type))
             for subChild in child.getChildren():
                 childStack.append(subChild)
-
     return externalImports
 
 
@@ -5674,9 +5710,7 @@ def generate(outfileName, subclassFilename, behaviorFilename,
         outfile = os.tmpfile()
     wrt = outfile.write
     processed = []
-
     externalImports = getImportsForExternalXsds(root)
-
     generateHeader(wrt, prefix, externalImports)
     #generateSimpleTypes(outfile, prefix, SimpleTypeDict)
     DelayedElements = []
@@ -5767,7 +5801,6 @@ def strip_namespace(val):
 def get_prefix_and_value(val):
     if ':' in val:
         return val.split(':')
-
     return None, val
 
 
@@ -5865,13 +5898,11 @@ def parseAndGenerate(
         infile = sys.stdin
     else:
         infile = open(xschemaFileName, 'r')
-
     if SingleFileOutput:
         parser = make_parser()
         dh = XschemaHandler()
     ##    parser.setDocumentHandler(dh)
         parser.setContentHandler(dh)
-
         if processIncludes:
             import process_includes
             outfile = StringIO.StringIO()
@@ -5885,7 +5916,6 @@ def parseAndGenerate(
         parser.parse(infile)
         root = dh.getRoot()
         root.annotate()
-
 ##     print '-' * 60
 ##     root.show(sys.stdout, 0)
 ##     print '-' * 60
@@ -5906,7 +5936,6 @@ def parseAndGenerate(
             outfile = open(outfileName, "a")
             outfile.write(exportLine)
             outfile.close()
-
     else:
         import process_includes
         rootPaths = process_includes.get_all_root_file_paths(
@@ -5915,23 +5944,30 @@ def parseAndGenerate(
         roots = []
         rootInfos = []
         for path in rootPaths:
-            rootFile = open(path, 'r')
-
+            if path.startswith('http:') or path.startswith('ftp:'):
+                try:
+                    urlfile = urllib2.urlopen(path)
+                    content = urlfile.read()
+                    urlfile.close()
+                    rootFile = StringIO.StringIO()
+                    rootFile.write(content)
+                    rootFile.seek(0)
+                except urllib2.HTTPError:
+                    msg = "Can't find file %s." % (path, )
+                    raise IOError(msg)
+            else:
+                rootFile = open(path, 'r')
             parser = make_parser()
             dh = XschemaHandler()
             parser.setContentHandler(dh)
             parser.parse(rootFile)
-
             root = dh.getRoot()
             roots.append(root)
             rootFile.close()
-
         for root in roots:
             root.annotate()
-
             moduleName = None
             modulePath = None
-
             # use the first root element to set
             # up the module name and path
             for child in root.getChildren():
@@ -5941,33 +5977,26 @@ def parseAndGenerate(
                         # no need to create a module for
                         # xs: types
                         continue
-
                     # convert to lower camel case if needed.
                     if "-" in typeName:
                         tokens = typeName.split("-")
                         typeName = ''.join([t.title() for t in tokens])
-
                     moduleName = typeName[0].lower() + typeName[1:]
-
                     modulePath = (
                         OutputDirectory +
                         os.sep + moduleName +
                         ModuleSuffix + ".py")
-
                     fqnToModuleNameMap[child.getFullyQualifiedType()] = \
                         moduleName
                     fqnToModuleNameMap[child.getFullyQualifiedName()] = \
                         moduleName
                     break
-
             rootInfos.append((root, modulePath))
-
         for root, modulePath in rootInfos:
             if modulePath:
                 generate(
                     modulePath, subclassFilename, behaviorFilename,
                     prefix, root, superModule)
-
                 # Generate __all__.  When using the parser as a module
                 # it is useful
                 # to isolate important classes from internal ones. This way one
@@ -6249,7 +6278,6 @@ def main():
             OutputDirectory = option[1]
         elif option[0] == "--module-suffix":
             ModuleSuffix = option[1]
-
     if showVersion:
         print 'generateDS.py version %s' % VERSION
         sys.exit(0)
diff --git a/generateDS.txt b/generateDS.txt
index fd36e6d940e664f7797733c7ec90309538746c09..0f2f866d9cbd9b442b33273e2186eef93749aa6a 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.12b
+:revision: 2.12c
 
 .. version
 
@@ -243,9 +243,11 @@ Here is the usage message displayed by ``generateDS.py``::
                                  Append XXX to the end of each file created.
         --subclass-suffix="XXX"  Append XXX to the generated subclass names.
                                  Default="Sub".
-        --root-element="XXX"     Assume XXX is root element of instance docs.
-                                 Default is first element defined in schema.
-                                 Also see section "Recognizing the top level
+        --root-element="XX"      When parsing, assume XX is root element of
+        --root-element="XX|YY"   instance docs.  Default is first element defined
+                                 in schema.  If YY is added, then YY is used as the
+                                 top level class; if YY omitted XX is the default.
+                                 class. Also see section "Recognizing the top level
                                  element" in the documentation.
         --super="XXX"            Super module name in generated in subclass
                                  module. Default="???"
@@ -326,7 +328,7 @@ Here is the usage message displayed by ``generateDS.py``::
     also generates member specifications in each class (in a dictionary).
 
 
-The following command line flags are recognized by ``generateDS.py``:
+The following command line options are recognized by ``generateDS.py``:
 
 o <filename>
     Write the data representation classes to file filename.
@@ -409,11 +411,16 @@ subclass-suffix=<suffix>
 
         generateDS.py --subclass-suffix="" -s actions.py mydef.xsd
 
-root-element=<element_name>
-    Make element_name the assumed root of instance documents.  The
-    default is the name of the element whose definition is first
-    in the XML Schema document.  This flag effects the parsing
-    functions (for example, parse(), parseString()).
+root-element=<element_name> -OR- <element_name>|<class_name>
+    Make ``element_name`` the assumed root of instance documents.
+    The default is the name of the element whose definition is first
+    in the XML Schema document.  If ``class_name`` is also present
+    (after a vertical bar), then ``class_name`` is assumed to be the
+    name of the class to be created from the root (top level)
+    element when parsing an XML instance document.  If
+    ``class_name`` is omitted, the default class name is the same as
+    ``element_name``.  This flag effects the parsing functions (for
+    example, parse(), parseString(), etc).
 
 super=<module_name>
     Make module_name the name of the superclass module imported
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index da34cc6697fa9b7931fb298b0994a29d54f99474..f080d53c20b5e5c3b1e8dc86d4b7fed401564916 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.12b'
+VERSION = '2.12c'
 ##VERSION##
 
 
diff --git a/libgenerateDS/gui/generateds_gui.py b/libgenerateDS/gui/generateds_gui.py
index da34cc6697fa9b7931fb298b0994a29d54f99474..f080d53c20b5e5c3b1e8dc86d4b7fed401564916 100755
--- a/libgenerateDS/gui/generateds_gui.py
+++ b/libgenerateDS/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.12b'
+VERSION = '2.12c'
 ##VERSION##
 
 
diff --git a/librarytemplate-1.0a.zip b/librarytemplate-1.0a.zip
index 36313a504fbc4cd9ecbd5edd471eb7dc426c432f..923b5eced18b3effd91ec92351f94936e3905014 100644
Binary files a/librarytemplate-1.0a.zip and b/librarytemplate-1.0a.zip differ
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 90c68872316255c8756f9a67ceac2b4c5fe50fc4..f6402d70f4eb2c07a0263e862aaf1ab0205191a6 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.12b</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12c</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">February 10, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 18, 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-02-10 22:19 UTC.
+Generated on: 2014-03-18 20:35 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 121f1b1e67a2a3ea91e4389b3c877389e89146a8..7cacd251507ca11c68c798e8d61b93511a21f924 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.12b
+:revision: 2.12c
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 47867760b42d58ed41e395f3da3163e1761c0323..93804d7966e34a97893dbc0fbae71c262de5d689 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.12b'
+VERSION = '2.12c'
 ##VERSION##
 
 CatalogDict = {}
@@ -309,14 +309,23 @@ def prep_schema(inpath, outpath, options):
 
 
 def process_groups(root):
-    namespaces = {root.prefix: root.nsmap[root.prefix]}
     # Get all the xs:group definitions at top level.
-    pattern = './%s:group' % (root.prefix, )
-    defs = root.xpath(pattern, namespaces=namespaces)
+    if root.prefix:
+        namespaces = {root.prefix: root.nsmap[root.prefix]}
+        pattern = './%s:group' % (root.prefix, )
+        defs = root.xpath(pattern, namespaces=namespaces)
+    else:
+        pattern = './group'
+        defs = root.xpath(pattern)
     defs = [node for node in defs if node.get('name') is not None]
     # Get all the xs:group references (below top level).
-    pattern = './*//%s:group' % (root.prefix, )
-    refs = root.xpath(pattern, namespaces=namespaces)
+    if root.prefix:
+        namespaces = {root.prefix: root.nsmap[root.prefix]}
+        pattern = './*//%s:group' % (root.prefix, )
+        refs = root.xpath(pattern, namespaces=namespaces)
+    else:
+        pattern = './*//group'
+        refs = root.xpath(pattern)
     refs = [node for node in refs if node.get('ref') is not None]
     # Create a dictionary of the named model groups (definitions).
     def_dict = {}
@@ -417,15 +426,16 @@ def replace_group_defs(def_dict, refs):
                 content = content[0]
                 parent = ref_node.getparent()
                 for node in content:
-                    new_node = deepcopy(node)
-                    # Copy minOccurs and maxOccurs attributes to new node.
-                    value = ref_node.get('minOccurs')
-                    if value is not None:
-                        new_node.set('minOccurs', value)
-                    value = ref_node.get('maxOccurs')
-                    if value is not None:
-                        new_node.set('maxOccurs', value)
-                    ref_node.addprevious(new_node)
+                    if not isinstance(node, etree._Comment):
+                        new_node = deepcopy(node)
+                        # Copy minOccurs and maxOccurs attributes to new node.
+                        value = ref_node.get('minOccurs')
+                        if value is not None:
+                            new_node.set('minOccurs', value)
+                        value = ref_node.get('maxOccurs')
+                        if value is not None:
+                            new_node.set('maxOccurs', value)
+                        ref_node.addprevious(new_node)
                 parent.remove(ref_node)
 
 
@@ -450,11 +460,12 @@ def raise_anon_complextypes(root):
         pattern = './*/*//%s:complexType|./*/*//%s:simpleType' % (
             prefix, prefix, )
         element_tag = '{%s}element' % (root.nsmap[prefix], )
+        namespaces = {prefix: root.nsmap[prefix]}
+        defs = root.xpath(pattern, namespaces=namespaces)
     else:
         pattern = './*/*//complexType|./*/*//simpleType'
         element_tag = 'element'
-    namespaces = {prefix: root.nsmap[prefix]}
-    defs = root.xpath(pattern, namespaces=namespaces)
+        defs = root.xpath(pattern)
     for node in defs:
         parent = node.getparent()
         if parent.tag != element_tag:
@@ -527,6 +538,10 @@ def main():
         "-f", "--force", action="store_true",
         dest="force", default=False,
         help="force overwrite without asking")
+    parser.add_option(
+        "--fix-type-names", action="store",
+        dest="fixtypenames", default=None,
+        help="Fix up (replace) complex type names.")
     (options, args) = parser.parse_args()
     if len(args) == 2:
         inpath = args[0]
@@ -544,4 +559,8 @@ def main():
 
 if __name__ == "__main__":
     #import pdb; pdb.set_trace()
-    main()
+    #main()
+    try:
+        main()
+    except:
+        import pdb; pdb.post_mortem()
diff --git a/setup.py b/setup.py
index e914720f412596453b40433001ae9df0f80cffdf..994ca23158d139e3843af64b562dca3a5ee187e9 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.12b",
+    version="2.12c",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@rexx.com",
diff --git a/tests/OnePer/oneperType00_1One.py b/tests/OnePer/oneperType00_1One.py
index b6e3ec6b7dac0912b328fe98a33bd8f8900c739a..62995b45b5ffaeb31f8c884f5d18787f757f505e 100644
--- a/tests/OnePer/oneperType00_1One.py
+++ b/tests/OnePer/oneperType00_1One.py
@@ -619,6 +619,7 @@ class oneperType00_1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, inner01=None, inner02=None):
+        self.original_tagname_ = None
         self.inner01 = inner01
         self.inner02 = inner02
     def factory(*args_, **kwargs_):
@@ -644,6 +645,8 @@ class oneperType00_1(GeneratedsSuper):
             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()
@@ -701,10 +704,12 @@ class oneperType00_1(GeneratedsSuper):
             obj_ = oneperType01_1.factory()
             obj_.build(child_)
             self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
         elif nodeName_ == 'inner02':
             obj_ = oneperType01_2.factory()
             obj_.build(child_)
             self.inner02 = obj_
+            obj_.original_tagname_ = 'inner02'
 # end class oneperType00_1
 
 
@@ -736,7 +741,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root00'
+        rootTag = 'oneperType00_1'
         rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -756,7 +761,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root00'
+        rootTag = 'oneperType00_1'
         rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -778,9 +783,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'oneperType00_1'
         rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -789,7 +794,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="root00",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -799,7 +804,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root00'
+        rootTag = 'oneperType00_1'
         rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -808,7 +813,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from oneperType00_1One import *\n\n')
 ##         sys.stdout.write('import oneperType00_1One as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py
index b6e3ec6b7dac0912b328fe98a33bd8f8900c739a..62995b45b5ffaeb31f8c884f5d18787f757f505e 100644
--- a/tests/OnePer/oneperType00_2One.py
+++ b/tests/OnePer/oneperType00_2One.py
@@ -619,6 +619,7 @@ class oneperType00_1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, inner01=None, inner02=None):
+        self.original_tagname_ = None
         self.inner01 = inner01
         self.inner02 = inner02
     def factory(*args_, **kwargs_):
@@ -644,6 +645,8 @@ class oneperType00_1(GeneratedsSuper):
             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()
@@ -701,10 +704,12 @@ class oneperType00_1(GeneratedsSuper):
             obj_ = oneperType01_1.factory()
             obj_.build(child_)
             self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
         elif nodeName_ == 'inner02':
             obj_ = oneperType01_2.factory()
             obj_.build(child_)
             self.inner02 = obj_
+            obj_.original_tagname_ = 'inner02'
 # end class oneperType00_1
 
 
@@ -736,7 +741,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root00'
+        rootTag = 'oneperType00_1'
         rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -756,7 +761,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root00'
+        rootTag = 'oneperType00_1'
         rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -778,9 +783,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'oneperType00_1'
         rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -789,7 +794,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="root00",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -799,7 +804,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root00'
+        rootTag = 'oneperType00_1'
         rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -808,7 +813,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from oneperType00_1One import *\n\n')
 ##         sys.stdout.write('import oneperType00_1One as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/OnePer/oneperType01_1One.py b/tests/OnePer/oneperType01_1One.py
index 8ba5e590511e0a353215cd0dc484faf29379e388..1778f19ea0fef100a83a3e8171135804d1858950 100644
--- a/tests/OnePer/oneperType01_1One.py
+++ b/tests/OnePer/oneperType01_1One.py
@@ -619,6 +619,7 @@ class oneperType01_1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, username=None, inner01=None):
+        self.original_tagname_ = None
         self.username = username
         self.inner01 = inner01
     def factory(*args_, **kwargs_):
@@ -644,6 +645,8 @@ class oneperType01_1(GeneratedsSuper):
             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()
@@ -703,6 +706,7 @@ class oneperType01_1(GeneratedsSuper):
             obj_ = oneperType01_2.factory()
             obj_.build(child_)
             self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
 # end class oneperType01_1
 
 
@@ -713,6 +717,7 @@ class oneperType01_2(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, userdescription=None):
+        self.original_tagname_ = None
         self.userdescription = userdescription
     def factory(*args_, **kwargs_):
         if oneperType01_2.subclass:
@@ -734,6 +739,8 @@ class oneperType01_2(GeneratedsSuper):
             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()
@@ -813,7 +820,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root01'
+        rootTag = 'oneperType01_1'
         rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -833,7 +840,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root01'
+        rootTag = 'oneperType01_1'
         rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -855,9 +862,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'oneperType01_1'
         rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -866,7 +873,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="root01",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -876,7 +883,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root01'
+        rootTag = 'oneperType01_1'
         rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -885,7 +892,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from oneperType01_1One import *\n\n')
 ##         sys.stdout.write('import oneperType01_1One as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py
index 8ba5e590511e0a353215cd0dc484faf29379e388..1778f19ea0fef100a83a3e8171135804d1858950 100644
--- a/tests/OnePer/oneperType01_2One.py
+++ b/tests/OnePer/oneperType01_2One.py
@@ -619,6 +619,7 @@ class oneperType01_1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, username=None, inner01=None):
+        self.original_tagname_ = None
         self.username = username
         self.inner01 = inner01
     def factory(*args_, **kwargs_):
@@ -644,6 +645,8 @@ class oneperType01_1(GeneratedsSuper):
             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()
@@ -703,6 +706,7 @@ class oneperType01_1(GeneratedsSuper):
             obj_ = oneperType01_2.factory()
             obj_.build(child_)
             self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
 # end class oneperType01_1
 
 
@@ -713,6 +717,7 @@ class oneperType01_2(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, userdescription=None):
+        self.original_tagname_ = None
         self.userdescription = userdescription
     def factory(*args_, **kwargs_):
         if oneperType01_2.subclass:
@@ -734,6 +739,8 @@ class oneperType01_2(GeneratedsSuper):
             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()
@@ -813,7 +820,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root01'
+        rootTag = 'oneperType01_1'
         rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -833,7 +840,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root01'
+        rootTag = 'oneperType01_1'
         rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -855,9 +862,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'oneperType01_1'
         rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -866,7 +873,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="root01",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -876,7 +883,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root01'
+        rootTag = 'oneperType01_1'
         rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -885,7 +892,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from oneperType01_1One import *\n\n')
 ##         sys.stdout.write('import oneperType01_1One as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/OnePer/oneperType02_1One.py b/tests/OnePer/oneperType02_1One.py
index cebe79b39da5d2088b08b4da5933b13aa3f1a1ff..7c16cb5f924e8df6b73f55fc3a85ef573f51e224 100644
--- a/tests/OnePer/oneperType02_1One.py
+++ b/tests/OnePer/oneperType02_1One.py
@@ -619,6 +619,7 @@ class oneperType02_1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, clientname=None, inner01=None):
+        self.original_tagname_ = None
         self.clientname = clientname
         self.inner01 = inner01
     def factory(*args_, **kwargs_):
@@ -644,6 +645,8 @@ class oneperType02_1(GeneratedsSuper):
             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()
@@ -703,6 +706,7 @@ class oneperType02_1(GeneratedsSuper):
             obj_ = oneperType02_2.factory()
             obj_.build(child_)
             self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
 # end class oneperType02_1
 
 
@@ -713,6 +717,7 @@ class oneperType02_2(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, clientdescription=None):
+        self.original_tagname_ = None
         self.clientdescription = clientdescription
     def factory(*args_, **kwargs_):
         if oneperType02_2.subclass:
@@ -734,6 +739,8 @@ class oneperType02_2(GeneratedsSuper):
             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()
@@ -813,7 +820,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root02'
+        rootTag = 'oneperType02_1'
         rootClass = oneperType02_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -833,7 +840,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root02'
+        rootTag = 'oneperType02_1'
         rootClass = oneperType02_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -855,9 +862,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'oneperType02_1'
         rootClass = oneperType02_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -866,7 +873,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="root02",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -876,7 +883,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root02'
+        rootTag = 'oneperType02_1'
         rootClass = oneperType02_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -885,7 +892,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from oneperType02_1One import *\n\n')
 ##         sys.stdout.write('import oneperType02_1One as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py
index cebe79b39da5d2088b08b4da5933b13aa3f1a1ff..7c16cb5f924e8df6b73f55fc3a85ef573f51e224 100644
--- a/tests/OnePer/oneperType02_2One.py
+++ b/tests/OnePer/oneperType02_2One.py
@@ -619,6 +619,7 @@ class oneperType02_1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, clientname=None, inner01=None):
+        self.original_tagname_ = None
         self.clientname = clientname
         self.inner01 = inner01
     def factory(*args_, **kwargs_):
@@ -644,6 +645,8 @@ class oneperType02_1(GeneratedsSuper):
             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()
@@ -703,6 +706,7 @@ class oneperType02_1(GeneratedsSuper):
             obj_ = oneperType02_2.factory()
             obj_.build(child_)
             self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
 # end class oneperType02_1
 
 
@@ -713,6 +717,7 @@ class oneperType02_2(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, clientdescription=None):
+        self.original_tagname_ = None
         self.clientdescription = clientdescription
     def factory(*args_, **kwargs_):
         if oneperType02_2.subclass:
@@ -734,6 +739,8 @@ class oneperType02_2(GeneratedsSuper):
             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()
@@ -813,7 +820,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root02'
+        rootTag = 'oneperType02_1'
         rootClass = oneperType02_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -833,7 +840,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root02'
+        rootTag = 'oneperType02_1'
         rootClass = oneperType02_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -855,9 +862,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'oneperType02_1'
         rootClass = oneperType02_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -866,7 +873,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="root02",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -876,7 +883,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'root02'
+        rootTag = 'oneperType02_1'
         rootClass = oneperType02_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -885,7 +892,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from oneperType02_1One import *\n\n')
 ##         sys.stdout.write('import oneperType02_1One as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/OnePer/oneperType03_1One.py b/tests/OnePer/oneperType03_1One.py
new file mode 100644
index 0000000000000000000000000000000000000000..bc8778e31e36017191332406a4ccc16f9c25001a
--- /dev/null
+++ b/tests/OnePer/oneperType03_1One.py
@@ -0,0 +1,916 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+
+import sys
+import getopt
+import re as re_
+import base64
+import datetime as datetime_
+
+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' % 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 input_data
+        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' % 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 input_data
+        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' % 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 input_data
+        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' % 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 input_data
+        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]
+            if len(input_data.split('.')) > 1:
+                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 oneperType03_1(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('helpername', 'xs:string', 0),
+        MemberSpec_('inner01', 'oneperType02_2', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, helpername=None, inner01=None):
+        self.original_tagname_ = None
+        self.helpername = helpername
+        self.inner01 = inner01
+    def factory(*args_, **kwargs_):
+        if oneperType03_1.subclass:
+            return oneperType03_1.subclass(*args_, **kwargs_)
+        else:
+            return oneperType03_1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_helpername(self): return self.helpername
+    def set_helpername(self, helpername): self.helpername = helpername
+    def get_inner01(self): return self.inner01
+    def set_inner01(self, inner01): self.inner01 = inner01
+    def hasContent_(self):
+        if (
+            self.helpername is not None or
+            self.inner01 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='oneperType03_1', 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_='oneperType03_1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType03_1', 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_='oneperType03_1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType03_1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.helpername is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%shelpername>%s</%shelpername>%s' % (namespace_, self.gds_format_string(quote_xml(self.helpername).encode(ExternalEncoding), input_name='helpername'), namespace_, eol_))
+        if self.inner01 is not None:
+            self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='oneperType03_1'):
+        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.helpername is not None:
+            showIndent(outfile, level)
+            outfile.write('helpername=%s,\n' % quote_python(self.helpername).encode(ExternalEncoding))
+        if self.inner01 is not None:
+            showIndent(outfile, level)
+            outfile.write('inner01=model_.oneperType02_2(\n')
+            self.inner01.exportLiteral(outfile, level, name_='inner01')
+            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_ == 'helpername':
+            helpername_ = child_.text
+            helpername_ = self.gds_validate_string(helpername_, node, 'helpername')
+            self.helpername = helpername_
+        elif nodeName_ == 'inner01':
+            obj_ = oneperType02_2.factory()
+            obj_.build(child_)
+            self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
+# end class oneperType03_1
+
+
+class oneperType03_2(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('helperdescription', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, helperdescription=None):
+        self.original_tagname_ = None
+        self.helperdescription = helperdescription
+    def factory(*args_, **kwargs_):
+        if oneperType03_2.subclass:
+            return oneperType03_2.subclass(*args_, **kwargs_)
+        else:
+            return oneperType03_2(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_helperdescription(self): return self.helperdescription
+    def set_helperdescription(self, helperdescription): self.helperdescription = helperdescription
+    def hasContent_(self):
+        if (
+            self.helperdescription is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='oneperType03_2', 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_='oneperType03_2')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType03_2', 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_='oneperType03_2'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType03_2', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.helperdescription is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%shelperdescription>%s</%shelperdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.helperdescription).encode(ExternalEncoding), input_name='helperdescription'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='oneperType03_2'):
+        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.helperdescription is not None:
+            showIndent(outfile, level)
+            outfile.write('helperdescription=%s,\n' % quote_python(self.helperdescription).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_ == 'helperdescription':
+            helperdescription_ = child_.text
+            helperdescription_ = self.gds_validate_string(helperdescription_, node, 'helperdescription')
+            self.helperdescription = helperdescription_
+# end class oneperType03_2
+
+
+GDSClassesMapping = {
+    'root03': oneperType03_1,
+}
+
+
+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 = 'oneperType03_1'
+        rootClass = oneperType03_1
+    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 = 'oneperType03_1'
+        rootClass = oneperType03_1
+    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 = 'oneperType03_1'
+        rootClass = oneperType03_1
+    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 = 'oneperType03_1'
+        rootClass = oneperType03_1
+    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 oneperType03_1One import *\n\n')
+##         sys.stdout.write('import oneperType03_1One 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__ = [
+    "oneperType03_1",
+    "oneperType03_2"
+]
diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py
new file mode 100644
index 0000000000000000000000000000000000000000..bc8778e31e36017191332406a4ccc16f9c25001a
--- /dev/null
+++ b/tests/OnePer/oneperType03_2One.py
@@ -0,0 +1,916 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+
+import sys
+import getopt
+import re as re_
+import base64
+import datetime as datetime_
+
+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' % 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 input_data
+        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' % 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 input_data
+        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' % 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 input_data
+        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' % 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 input_data
+        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]
+            if len(input_data.split('.')) > 1:
+                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 oneperType03_1(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('helpername', 'xs:string', 0),
+        MemberSpec_('inner01', 'oneperType02_2', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, helpername=None, inner01=None):
+        self.original_tagname_ = None
+        self.helpername = helpername
+        self.inner01 = inner01
+    def factory(*args_, **kwargs_):
+        if oneperType03_1.subclass:
+            return oneperType03_1.subclass(*args_, **kwargs_)
+        else:
+            return oneperType03_1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_helpername(self): return self.helpername
+    def set_helpername(self, helpername): self.helpername = helpername
+    def get_inner01(self): return self.inner01
+    def set_inner01(self, inner01): self.inner01 = inner01
+    def hasContent_(self):
+        if (
+            self.helpername is not None or
+            self.inner01 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='oneperType03_1', 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_='oneperType03_1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType03_1', 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_='oneperType03_1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType03_1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.helpername is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%shelpername>%s</%shelpername>%s' % (namespace_, self.gds_format_string(quote_xml(self.helpername).encode(ExternalEncoding), input_name='helpername'), namespace_, eol_))
+        if self.inner01 is not None:
+            self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print)
+    def exportLiteral(self, outfile, level, name_='oneperType03_1'):
+        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.helpername is not None:
+            showIndent(outfile, level)
+            outfile.write('helpername=%s,\n' % quote_python(self.helpername).encode(ExternalEncoding))
+        if self.inner01 is not None:
+            showIndent(outfile, level)
+            outfile.write('inner01=model_.oneperType02_2(\n')
+            self.inner01.exportLiteral(outfile, level, name_='inner01')
+            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_ == 'helpername':
+            helpername_ = child_.text
+            helpername_ = self.gds_validate_string(helpername_, node, 'helpername')
+            self.helpername = helpername_
+        elif nodeName_ == 'inner01':
+            obj_ = oneperType02_2.factory()
+            obj_.build(child_)
+            self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
+# end class oneperType03_1
+
+
+class oneperType03_2(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('helperdescription', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, helperdescription=None):
+        self.original_tagname_ = None
+        self.helperdescription = helperdescription
+    def factory(*args_, **kwargs_):
+        if oneperType03_2.subclass:
+            return oneperType03_2.subclass(*args_, **kwargs_)
+        else:
+            return oneperType03_2(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_helperdescription(self): return self.helperdescription
+    def set_helperdescription(self, helperdescription): self.helperdescription = helperdescription
+    def hasContent_(self):
+        if (
+            self.helperdescription is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='oneperType03_2', 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_='oneperType03_2')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType03_2', 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_='oneperType03_2'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType03_2', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.helperdescription is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%shelperdescription>%s</%shelperdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.helperdescription).encode(ExternalEncoding), input_name='helperdescription'), namespace_, eol_))
+    def exportLiteral(self, outfile, level, name_='oneperType03_2'):
+        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.helperdescription is not None:
+            showIndent(outfile, level)
+            outfile.write('helperdescription=%s,\n' % quote_python(self.helperdescription).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_ == 'helperdescription':
+            helperdescription_ = child_.text
+            helperdescription_ = self.gds_validate_string(helperdescription_, node, 'helperdescription')
+            self.helperdescription = helperdescription_
+# end class oneperType03_2
+
+
+GDSClassesMapping = {
+    'root03': oneperType03_1,
+}
+
+
+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 = 'oneperType03_1'
+        rootClass = oneperType03_1
+    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 = 'oneperType03_1'
+        rootClass = oneperType03_1
+    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 = 'oneperType03_1'
+        rootClass = oneperType03_1
+    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 = 'oneperType03_1'
+        rootClass = oneperType03_1
+    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 oneperType03_1One import *\n\n')
+##         sys.stdout.write('import oneperType03_1One 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__ = [
+    "oneperType03_1",
+    "oneperType03_2"
+]
diff --git a/tests/abstract_type1_sub.py b/tests/abstract_type1_sub.py
index c8c5af40fe0d5a254e9f7242a33fdf3cdb3b0ff1..296f07aaa6c0d6ae37f736069be740e2ed3ffd21 100644
--- a/tests/abstract_type1_sub.py
+++ b/tests/abstract_type1_sub.py
@@ -116,7 +116,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -136,7 +136,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -160,7 +160,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -177,9 +177,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -188,8 +188,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from abstract_type2_sup import *\n\n')
 ##         sys.stdout.write('import abstract_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.carrier(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="carrier")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py
index fda613f234c17415f35289a83dbdd4948a83bcd4..0ef7f20ed4cf5000867d30b228b4d3dfb59239c9 100644
--- a/tests/abstract_type1_sup.py
+++ b/tests/abstract_type1_sup.py
@@ -618,6 +618,7 @@ class carrierType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fleet=None):
+        self.original_tagname_ = None
         if fleet is None:
             self.fleet = []
         else:
@@ -644,6 +645,8 @@ class carrierType(GeneratedsSuper):
             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()
@@ -713,6 +716,7 @@ class carrierType(GeneratedsSuper):
                 raise NotImplementedError(
                     'Class not implemented for <fleet> element')
             self.fleet.append(obj_)
+            obj_.original_tagname_ = 'fleet'
 # end class carrierType
 
 
@@ -722,6 +726,7 @@ class Vehicle(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, extensiontype_=None):
+        self.original_tagname_ = None
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if Vehicle.subclass:
@@ -743,6 +748,8 @@ class Vehicle(GeneratedsSuper):
             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()
@@ -794,8 +801,8 @@ class Car(Vehicle):
     subclass = None
     superclass = Vehicle
     def __init__(self):
+        self.original_tagname_ = None
         super(Car, self).__init__()
-        pass
     def factory(*args_, **kwargs_):
         if Car.subclass:
             return Car.subclass(*args_, **kwargs_)
@@ -814,6 +821,8 @@ class Car(Vehicle):
             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()
@@ -861,8 +870,8 @@ class Plane(Vehicle):
     subclass = None
     superclass = Vehicle
     def __init__(self):
+        self.original_tagname_ = None
         super(Plane, self).__init__()
-        pass
     def factory(*args_, **kwargs_):
         if Plane.subclass:
             return Plane.subclass(*args_, **kwargs_)
@@ -881,6 +890,8 @@ class Plane(Vehicle):
             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()
@@ -951,7 +962,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -971,7 +982,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -993,9 +1004,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1004,7 +1015,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="carrier",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='xmlns:target="http://cars.example.com/schema"')
     return rootObj
 
@@ -1014,7 +1025,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1023,7 +1034,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from abstract_type2_sup import *\n\n')
 ##         sys.stdout.write('import abstract_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/abstract_type2_sub.py b/tests/abstract_type2_sub.py
index c8c5af40fe0d5a254e9f7242a33fdf3cdb3b0ff1..296f07aaa6c0d6ae37f736069be740e2ed3ffd21 100644
--- a/tests/abstract_type2_sub.py
+++ b/tests/abstract_type2_sub.py
@@ -116,7 +116,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -136,7 +136,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -160,7 +160,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -177,9 +177,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -188,8 +188,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from abstract_type2_sup import *\n\n')
 ##         sys.stdout.write('import abstract_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.carrier(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="carrier")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/abstract_type2_sup.py b/tests/abstract_type2_sup.py
index fda613f234c17415f35289a83dbdd4948a83bcd4..0ef7f20ed4cf5000867d30b228b4d3dfb59239c9 100644
--- a/tests/abstract_type2_sup.py
+++ b/tests/abstract_type2_sup.py
@@ -618,6 +618,7 @@ class carrierType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fleet=None):
+        self.original_tagname_ = None
         if fleet is None:
             self.fleet = []
         else:
@@ -644,6 +645,8 @@ class carrierType(GeneratedsSuper):
             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()
@@ -713,6 +716,7 @@ class carrierType(GeneratedsSuper):
                 raise NotImplementedError(
                     'Class not implemented for <fleet> element')
             self.fleet.append(obj_)
+            obj_.original_tagname_ = 'fleet'
 # end class carrierType
 
 
@@ -722,6 +726,7 @@ class Vehicle(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, extensiontype_=None):
+        self.original_tagname_ = None
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
         if Vehicle.subclass:
@@ -743,6 +748,8 @@ class Vehicle(GeneratedsSuper):
             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()
@@ -794,8 +801,8 @@ class Car(Vehicle):
     subclass = None
     superclass = Vehicle
     def __init__(self):
+        self.original_tagname_ = None
         super(Car, self).__init__()
-        pass
     def factory(*args_, **kwargs_):
         if Car.subclass:
             return Car.subclass(*args_, **kwargs_)
@@ -814,6 +821,8 @@ class Car(Vehicle):
             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()
@@ -861,8 +870,8 @@ class Plane(Vehicle):
     subclass = None
     superclass = Vehicle
     def __init__(self):
+        self.original_tagname_ = None
         super(Plane, self).__init__()
-        pass
     def factory(*args_, **kwargs_):
         if Plane.subclass:
             return Plane.subclass(*args_, **kwargs_)
@@ -881,6 +890,8 @@ class Plane(Vehicle):
             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()
@@ -951,7 +962,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -971,7 +982,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -993,9 +1004,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1004,7 +1015,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="carrier",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='xmlns:target="http://cars.example.com/schema"')
     return rootObj
 
@@ -1014,7 +1025,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1023,7 +1034,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from abstract_type2_sup import *\n\n')
 ##         sys.stdout.write('import abstract_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/annotations1_sub.py b/tests/annotations1_sub.py
index 63d361b63e0246fca280a3622739e3943776f1c9..4e78079e343bab9b178b205818dc8f58b3412058 100644
--- a/tests/annotations1_sub.py
+++ b/tests/annotations1_sub.py
@@ -109,7 +109,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -129,7 +129,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -153,7 +153,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -170,9 +170,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -181,8 +181,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from annotations2_sup import *\n\n')
 ##         sys.stdout.write('import annotations2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.document1(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="document1")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py
index 8cb90a948bbe74e90e33b52080bfa3f5b924e8d7..9dc54cff24f93cb4c52c1a4ac42f438de9e68d36 100644
--- a/tests/annotations1_sup.py
+++ b/tests/annotations1_sup.py
@@ -622,6 +622,7 @@ class document1Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, otherdoc=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.otherdoc = otherdoc
     def factory(*args_, **kwargs_):
@@ -647,6 +648,8 @@ class document1Type(GeneratedsSuper):
             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()
@@ -706,6 +709,7 @@ class document1Type(GeneratedsSuper):
             obj_ = document2Type.factory()
             obj_.build(child_)
             self.otherdoc = obj_
+            obj_.original_tagname_ = 'otherdoc'
 # end class document1Type
 
 
@@ -721,6 +725,7 @@ class document2Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, rating=None, anotherdoc=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.rating = rating
         self.anotherdoc = anotherdoc
@@ -750,6 +755,8 @@ class document2Type(GeneratedsSuper):
             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()
@@ -823,6 +830,7 @@ class document2Type(GeneratedsSuper):
             obj_ = document3Type.factory()
             obj_.build(child_)
             self.anotherdoc = obj_
+            obj_.original_tagname_ = 'anotherdoc'
 # end class document2Type
 
 
@@ -835,6 +843,7 @@ class document3Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, rating=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.rating = rating
     def factory(*args_, **kwargs_):
@@ -860,6 +869,8 @@ class document3Type(GeneratedsSuper):
             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()
@@ -954,7 +965,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -974,7 +985,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -996,9 +1007,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1007,7 +1018,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="document1",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1017,7 +1028,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1026,7 +1037,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from annotations2_sup import *\n\n')
 ##         sys.stdout.write('import annotations2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/annotations2_sub.py b/tests/annotations2_sub.py
index 63d361b63e0246fca280a3622739e3943776f1c9..4e78079e343bab9b178b205818dc8f58b3412058 100644
--- a/tests/annotations2_sub.py
+++ b/tests/annotations2_sub.py
@@ -109,7 +109,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -129,7 +129,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -153,7 +153,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -170,9 +170,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -181,8 +181,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from annotations2_sup import *\n\n')
 ##         sys.stdout.write('import annotations2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.document1(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="document1")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/annotations2_sup.py b/tests/annotations2_sup.py
index 8cb90a948bbe74e90e33b52080bfa3f5b924e8d7..9dc54cff24f93cb4c52c1a4ac42f438de9e68d36 100644
--- a/tests/annotations2_sup.py
+++ b/tests/annotations2_sup.py
@@ -622,6 +622,7 @@ class document1Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, otherdoc=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.otherdoc = otherdoc
     def factory(*args_, **kwargs_):
@@ -647,6 +648,8 @@ class document1Type(GeneratedsSuper):
             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()
@@ -706,6 +709,7 @@ class document1Type(GeneratedsSuper):
             obj_ = document2Type.factory()
             obj_.build(child_)
             self.otherdoc = obj_
+            obj_.original_tagname_ = 'otherdoc'
 # end class document1Type
 
 
@@ -721,6 +725,7 @@ class document2Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, rating=None, anotherdoc=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.rating = rating
         self.anotherdoc = anotherdoc
@@ -750,6 +755,8 @@ class document2Type(GeneratedsSuper):
             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()
@@ -823,6 +830,7 @@ class document2Type(GeneratedsSuper):
             obj_ = document3Type.factory()
             obj_.build(child_)
             self.anotherdoc = obj_
+            obj_.original_tagname_ = 'anotherdoc'
 # end class document2Type
 
 
@@ -835,6 +843,7 @@ class document3Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, rating=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.rating = rating
     def factory(*args_, **kwargs_):
@@ -860,6 +869,8 @@ class document3Type(GeneratedsSuper):
             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()
@@ -954,7 +965,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -974,7 +985,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -996,9 +1007,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1007,7 +1018,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="document1",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1017,7 +1028,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1026,7 +1037,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from annotations2_sup import *\n\n')
 ##         sys.stdout.write('import annotations2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anonymous_type1_sub.py b/tests/anonymous_type1_sub.py
index f6087774e745f0bb310542ae385230b515fe2e68..6e42385d9159dfa9441b1878f6b5864aab64bd94 100644
--- a/tests/anonymous_type1_sub.py
+++ b/tests/anonymous_type1_sub.py
@@ -177,9 +177,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'FooList'
         rootClass = supermod.FooList
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -188,8 +188,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anonymous_type2_sup import *\n\n')
 ##         sys.stdout.write('import anonymous_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.FooList(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="FooList")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py
index 075399babc47b577ec8b18644caf256f92431677..e387d1dcd88f1030148d3f0d2fcceb4b10e9d3c5 100644
--- a/tests/anonymous_type1_sup.py
+++ b/tests/anonymous_type1_sup.py
@@ -620,6 +620,7 @@ class FooList(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, Foo=None, Bar=None, Baz=None):
+        self.original_tagname_ = None
         self.Foo = Foo
         self.Bar = Bar
         self.Baz = Baz
@@ -649,6 +650,8 @@ class FooList(GeneratedsSuper):
             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()
@@ -714,14 +717,17 @@ class FooList(GeneratedsSuper):
             obj_ = FooType1.factory()
             obj_.build(child_)
             self.Foo = obj_
+            obj_.original_tagname_ = 'Foo'
         elif nodeName_ == 'Bar':
             obj_ = BarType2.factory()
             obj_.build(child_)
             self.Bar = obj_
+            obj_.original_tagname_ = 'Bar'
         elif nodeName_ == 'Baz':
             obj_ = BazType3.factory()
             obj_.build(child_)
             self.Baz = obj_
+            obj_.original_tagname_ = 'Baz'
 # end class FooList
 
 
@@ -732,6 +738,7 @@ class FooType1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, FooType=None):
+        self.original_tagname_ = None
         self.FooType = FooType
     def factory(*args_, **kwargs_):
         if FooType1.subclass:
@@ -756,6 +763,8 @@ class FooType1(GeneratedsSuper):
             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()
@@ -814,6 +823,7 @@ class BarType2(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BarType=None):
+        self.original_tagname_ = None
         self.BarType = BarType
     def factory(*args_, **kwargs_):
         if BarType2.subclass:
@@ -838,6 +848,8 @@ class BarType2(GeneratedsSuper):
             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()
@@ -896,6 +908,7 @@ class BazType3(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BazType=None):
+        self.original_tagname_ = None
         self.BazType = BazType
     def factory(*args_, **kwargs_):
         if BazType3.subclass:
@@ -920,6 +933,8 @@ class BazType3(GeneratedsSuper):
             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()
@@ -1043,9 +1058,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'FooList'
         rootClass = FooList
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1054,7 +1069,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="FooList",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1073,7 +1088,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anonymous_type2_sup import *\n\n')
 ##         sys.stdout.write('import anonymous_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anonymous_type2_sub.py b/tests/anonymous_type2_sub.py
index f6087774e745f0bb310542ae385230b515fe2e68..6e42385d9159dfa9441b1878f6b5864aab64bd94 100644
--- a/tests/anonymous_type2_sub.py
+++ b/tests/anonymous_type2_sub.py
@@ -177,9 +177,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'FooList'
         rootClass = supermod.FooList
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -188,8 +188,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anonymous_type2_sup import *\n\n')
 ##         sys.stdout.write('import anonymous_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.FooList(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="FooList")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/anonymous_type2_sup.py b/tests/anonymous_type2_sup.py
index 075399babc47b577ec8b18644caf256f92431677..e387d1dcd88f1030148d3f0d2fcceb4b10e9d3c5 100644
--- a/tests/anonymous_type2_sup.py
+++ b/tests/anonymous_type2_sup.py
@@ -620,6 +620,7 @@ class FooList(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, Foo=None, Bar=None, Baz=None):
+        self.original_tagname_ = None
         self.Foo = Foo
         self.Bar = Bar
         self.Baz = Baz
@@ -649,6 +650,8 @@ class FooList(GeneratedsSuper):
             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()
@@ -714,14 +717,17 @@ class FooList(GeneratedsSuper):
             obj_ = FooType1.factory()
             obj_.build(child_)
             self.Foo = obj_
+            obj_.original_tagname_ = 'Foo'
         elif nodeName_ == 'Bar':
             obj_ = BarType2.factory()
             obj_.build(child_)
             self.Bar = obj_
+            obj_.original_tagname_ = 'Bar'
         elif nodeName_ == 'Baz':
             obj_ = BazType3.factory()
             obj_.build(child_)
             self.Baz = obj_
+            obj_.original_tagname_ = 'Baz'
 # end class FooList
 
 
@@ -732,6 +738,7 @@ class FooType1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, FooType=None):
+        self.original_tagname_ = None
         self.FooType = FooType
     def factory(*args_, **kwargs_):
         if FooType1.subclass:
@@ -756,6 +763,8 @@ class FooType1(GeneratedsSuper):
             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()
@@ -814,6 +823,7 @@ class BarType2(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BarType=None):
+        self.original_tagname_ = None
         self.BarType = BarType
     def factory(*args_, **kwargs_):
         if BarType2.subclass:
@@ -838,6 +848,8 @@ class BarType2(GeneratedsSuper):
             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()
@@ -896,6 +908,7 @@ class BazType3(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BazType=None):
+        self.original_tagname_ = None
         self.BazType = BazType
     def factory(*args_, **kwargs_):
         if BazType3.subclass:
@@ -920,6 +933,8 @@ class BazType3(GeneratedsSuper):
             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()
@@ -1043,9 +1058,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'FooList'
         rootClass = FooList
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1054,7 +1069,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="FooList",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1073,7 +1088,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anonymous_type2_sup import *\n\n')
 ##         sys.stdout.write('import anonymous_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anysimpletype1_sub.py b/tests/anysimpletype1_sub.py
index e79e857b331dc353c31b668b8eeb8c3063f19070..77a78a829e64d01f13b3ba97b83092f706262b28 100644
--- a/tests/anysimpletype1_sub.py
+++ b/tests/anysimpletype1_sub.py
@@ -163,9 +163,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'test1element'
         rootClass = supermod.test1element
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +174,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anysimpletype2_sup import *\n\n')
 ##         sys.stdout.write('import anysimpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.test1element(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="test1element")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py
index acb7ba3157df07ee20e24d2f2a735bb703562137..e00caa9cd19ea12b5062fe81b30091308137814f 100644
--- a/tests/anysimpletype1_sup.py
+++ b/tests/anysimpletype1_sup.py
@@ -619,6 +619,7 @@ class test1element(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, test1attribute=None, test1member=None):
+        self.original_tagname_ = None
         self.test1attribute = _cast(None, test1attribute)
         self.test1member = test1member
     def factory(*args_, **kwargs_):
@@ -643,6 +644,8 @@ class test1element(GeneratedsSuper):
             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()
@@ -700,6 +703,7 @@ class test1element(GeneratedsSuper):
             obj_ = cimAnySimpleType.factory()
             obj_.build(child_)
             self.test1member = obj_
+            obj_.original_tagname_ = 'test1member'
 # end class test1element
 
 
@@ -710,6 +714,7 @@ class cimAnySimpleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, valueOf_=None):
+        self.original_tagname_ = None
         self.valueOf_ = valueOf_
         self.anyAttributes_ = {}
     def factory(*args_, **kwargs_):
@@ -734,6 +739,8 @@ class cimAnySimpleType(GeneratedsSuper):
             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()
@@ -882,9 +889,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'test1element'
         rootClass = test1element
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -893,7 +900,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="test1element",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -912,7 +919,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anysimpletype2_sup import *\n\n')
 ##         sys.stdout.write('import anysimpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anysimpletype2_sub.py b/tests/anysimpletype2_sub.py
index e79e857b331dc353c31b668b8eeb8c3063f19070..77a78a829e64d01f13b3ba97b83092f706262b28 100644
--- a/tests/anysimpletype2_sub.py
+++ b/tests/anysimpletype2_sub.py
@@ -163,9 +163,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'test1element'
         rootClass = supermod.test1element
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +174,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anysimpletype2_sup import *\n\n')
 ##         sys.stdout.write('import anysimpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.test1element(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="test1element")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/anysimpletype2_sup.py b/tests/anysimpletype2_sup.py
index acb7ba3157df07ee20e24d2f2a735bb703562137..e00caa9cd19ea12b5062fe81b30091308137814f 100644
--- a/tests/anysimpletype2_sup.py
+++ b/tests/anysimpletype2_sup.py
@@ -619,6 +619,7 @@ class test1element(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, test1attribute=None, test1member=None):
+        self.original_tagname_ = None
         self.test1attribute = _cast(None, test1attribute)
         self.test1member = test1member
     def factory(*args_, **kwargs_):
@@ -643,6 +644,8 @@ class test1element(GeneratedsSuper):
             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()
@@ -700,6 +703,7 @@ class test1element(GeneratedsSuper):
             obj_ = cimAnySimpleType.factory()
             obj_.build(child_)
             self.test1member = obj_
+            obj_.original_tagname_ = 'test1member'
 # end class test1element
 
 
@@ -710,6 +714,7 @@ class cimAnySimpleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, valueOf_=None):
+        self.original_tagname_ = None
         self.valueOf_ = valueOf_
         self.anyAttributes_ = {}
     def factory(*args_, **kwargs_):
@@ -734,6 +739,8 @@ class cimAnySimpleType(GeneratedsSuper):
             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()
@@ -882,9 +889,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'test1element'
         rootClass = test1element
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -893,7 +900,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="test1element",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -912,7 +919,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anysimpletype2_sup import *\n\n')
 ##         sys.stdout.write('import anysimpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anywildcard1_sub.py b/tests/anywildcard1_sub.py
index cc4939ca40b3de95b0a3123243890f9a6ad94f26..bc32d2750905fc92e8b418fd927d96a32dcc1b6b 100644
--- a/tests/anywildcard1_sub.py
+++ b/tests/anywildcard1_sub.py
@@ -191,9 +191,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PlantType_single'
         rootClass = supermod.PlantType_single
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -202,8 +202,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anywildcard2_sup import *\n\n')
 ##         sys.stdout.write('import anywildcard2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.PlantType_single(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="PlantType_single")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py
index b7314e18aaca5b3e59c1c05dbc9e887ece855887..029710edf4ac3fef3185641bc95bc14d3c05f9ac 100644
--- a/tests/anywildcard1_sup.py
+++ b/tests/anywildcard1_sup.py
@@ -620,6 +620,7 @@ class PlantType_single(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, anytypeobjs_=None, description=None):
+        self.original_tagname_ = None
         self.name = name
         self.anytypeobjs_ = anytypeobjs_
         self.description = description
@@ -649,6 +650,8 @@ class PlantType_single(GeneratedsSuper):
             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()
@@ -716,6 +719,7 @@ class PlantType_single(GeneratedsSuper):
             obj_ = DescriptionType.factory()
             obj_.build(child_)
             self.description = obj_
+            obj_.original_tagname_ = 'description'
         else:
             obj_ = self.gds_build_any(child_, 'PlantType_single')
             if obj_ is not None:
@@ -732,6 +736,7 @@ class PlantType_multiple(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, anytypeobjs_=None, description=None):
+        self.original_tagname_ = None
         self.name = name
         if anytypeobjs_ is None:
             self.anytypeobjs_ = []
@@ -766,6 +771,8 @@ class PlantType_multiple(GeneratedsSuper):
             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()
@@ -835,6 +842,7 @@ class PlantType_multiple(GeneratedsSuper):
             obj_ = DescriptionType.factory()
             obj_.build(child_)
             self.description = obj_
+            obj_.original_tagname_ = 'description'
         else:
             obj_ = self.gds_build_any(child_, 'PlantType_multiple')
             if obj_ is not None:
@@ -851,6 +859,7 @@ class DescriptionType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, size=None):
+        self.original_tagname_ = None
         self.name = name
         self.size = size
     def factory(*args_, **kwargs_):
@@ -876,6 +885,8 @@ class DescriptionType(GeneratedsSuper):
             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()
@@ -945,6 +956,7 @@ class CatalogType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, catagory=None):
+        self.original_tagname_ = None
         self.name = name
         self.catagory = catagory
     def factory(*args_, **kwargs_):
@@ -970,6 +982,8 @@ class CatalogType(GeneratedsSuper):
             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()
@@ -1041,6 +1055,7 @@ class PlantType_single_nochild(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, anytypeobjs_=None):
+        self.original_tagname_ = None
         self.anytypeobjs_ = anytypeobjs_
     def factory(*args_, **kwargs_):
         if PlantType_single_nochild.subclass:
@@ -1062,6 +1077,8 @@ class PlantType_single_nochild(GeneratedsSuper):
             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()
@@ -1120,6 +1137,7 @@ class PlantType_multiple_nochild(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, anytypeobjs_=None):
+        self.original_tagname_ = None
         if anytypeobjs_ is None:
             self.anytypeobjs_ = []
         else:
@@ -1146,6 +1164,8 @@ class PlantType_multiple_nochild(GeneratedsSuper):
             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()
@@ -1269,9 +1289,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PlantType_single'
         rootClass = PlantType_single
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1280,7 +1300,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="PlantType_single",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1299,7 +1319,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anywildcard2_sup import *\n\n')
 ##         sys.stdout.write('import anywildcard2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anywildcard2_sub.py b/tests/anywildcard2_sub.py
index cc4939ca40b3de95b0a3123243890f9a6ad94f26..bc32d2750905fc92e8b418fd927d96a32dcc1b6b 100644
--- a/tests/anywildcard2_sub.py
+++ b/tests/anywildcard2_sub.py
@@ -191,9 +191,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PlantType_single'
         rootClass = supermod.PlantType_single
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -202,8 +202,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anywildcard2_sup import *\n\n')
 ##         sys.stdout.write('import anywildcard2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.PlantType_single(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="PlantType_single")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/anywildcard2_sup.py b/tests/anywildcard2_sup.py
index b7314e18aaca5b3e59c1c05dbc9e887ece855887..029710edf4ac3fef3185641bc95bc14d3c05f9ac 100644
--- a/tests/anywildcard2_sup.py
+++ b/tests/anywildcard2_sup.py
@@ -620,6 +620,7 @@ class PlantType_single(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, anytypeobjs_=None, description=None):
+        self.original_tagname_ = None
         self.name = name
         self.anytypeobjs_ = anytypeobjs_
         self.description = description
@@ -649,6 +650,8 @@ class PlantType_single(GeneratedsSuper):
             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()
@@ -716,6 +719,7 @@ class PlantType_single(GeneratedsSuper):
             obj_ = DescriptionType.factory()
             obj_.build(child_)
             self.description = obj_
+            obj_.original_tagname_ = 'description'
         else:
             obj_ = self.gds_build_any(child_, 'PlantType_single')
             if obj_ is not None:
@@ -732,6 +736,7 @@ class PlantType_multiple(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, anytypeobjs_=None, description=None):
+        self.original_tagname_ = None
         self.name = name
         if anytypeobjs_ is None:
             self.anytypeobjs_ = []
@@ -766,6 +771,8 @@ class PlantType_multiple(GeneratedsSuper):
             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()
@@ -835,6 +842,7 @@ class PlantType_multiple(GeneratedsSuper):
             obj_ = DescriptionType.factory()
             obj_.build(child_)
             self.description = obj_
+            obj_.original_tagname_ = 'description'
         else:
             obj_ = self.gds_build_any(child_, 'PlantType_multiple')
             if obj_ is not None:
@@ -851,6 +859,7 @@ class DescriptionType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, size=None):
+        self.original_tagname_ = None
         self.name = name
         self.size = size
     def factory(*args_, **kwargs_):
@@ -876,6 +885,8 @@ class DescriptionType(GeneratedsSuper):
             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()
@@ -945,6 +956,7 @@ class CatalogType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, catagory=None):
+        self.original_tagname_ = None
         self.name = name
         self.catagory = catagory
     def factory(*args_, **kwargs_):
@@ -970,6 +982,8 @@ class CatalogType(GeneratedsSuper):
             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()
@@ -1041,6 +1055,7 @@ class PlantType_single_nochild(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, anytypeobjs_=None):
+        self.original_tagname_ = None
         self.anytypeobjs_ = anytypeobjs_
     def factory(*args_, **kwargs_):
         if PlantType_single_nochild.subclass:
@@ -1062,6 +1077,8 @@ class PlantType_single_nochild(GeneratedsSuper):
             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()
@@ -1120,6 +1137,7 @@ class PlantType_multiple_nochild(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, anytypeobjs_=None):
+        self.original_tagname_ = None
         if anytypeobjs_ is None:
             self.anytypeobjs_ = []
         else:
@@ -1146,6 +1164,8 @@ class PlantType_multiple_nochild(GeneratedsSuper):
             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()
@@ -1269,9 +1289,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PlantType_single'
         rootClass = PlantType_single
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1280,7 +1300,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="PlantType_single",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1299,7 +1319,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anywildcard2_sup import *\n\n')
 ##         sys.stdout.write('import anywildcard2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/attr_groups1_sub.py b/tests/attr_groups1_sub.py
index bc8d0a6cf61647fe67b55f6ec67d19e375a74a66..f2af2d9ba775791a7634aaee0b5501eb983ad50e 100644
--- a/tests/attr_groups1_sub.py
+++ b/tests/attr_groups1_sub.py
@@ -95,7 +95,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -115,7 +115,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -139,7 +139,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -156,9 +156,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -167,8 +167,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from attr_groups2_sup import *\n\n')
 ##         sys.stdout.write('import attr_groups2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.getUser(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="getUser")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py
index 6ee84284491b8a7614c1ce836cf698bb236711c7..4b82c99e18906848fa330acf489bdc4844e44e0d 100644
--- a/tests/attr_groups1_sup.py
+++ b/tests/attr_groups1_sup.py
@@ -626,6 +626,7 @@ class GetUserReq(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None):
+        self.original_tagname_ = None
         self.value04 = _cast(int, value04)
         self.value05 = _cast(None, value05)
         self.value06 = _cast(int, value06)
@@ -671,6 +672,8 @@ class GetUserReq(GeneratedsSuper):
             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()
@@ -849,7 +852,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -869,7 +872,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -891,9 +894,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -902,7 +905,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="getUser",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -912,7 +915,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -921,7 +924,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from attr_groups2_sup import *\n\n')
 ##         sys.stdout.write('import attr_groups2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/attr_groups2_sub.py b/tests/attr_groups2_sub.py
index bc8d0a6cf61647fe67b55f6ec67d19e375a74a66..f2af2d9ba775791a7634aaee0b5501eb983ad50e 100644
--- a/tests/attr_groups2_sub.py
+++ b/tests/attr_groups2_sub.py
@@ -95,7 +95,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -115,7 +115,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -139,7 +139,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -156,9 +156,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -167,8 +167,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from attr_groups2_sup import *\n\n')
 ##         sys.stdout.write('import attr_groups2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.getUser(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="getUser")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/attr_groups2_sup.py b/tests/attr_groups2_sup.py
index 6ee84284491b8a7614c1ce836cf698bb236711c7..4b82c99e18906848fa330acf489bdc4844e44e0d 100644
--- a/tests/attr_groups2_sup.py
+++ b/tests/attr_groups2_sup.py
@@ -626,6 +626,7 @@ class GetUserReq(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None):
+        self.original_tagname_ = None
         self.value04 = _cast(int, value04)
         self.value05 = _cast(None, value05)
         self.value06 = _cast(int, value06)
@@ -671,6 +672,8 @@ class GetUserReq(GeneratedsSuper):
             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()
@@ -849,7 +852,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -869,7 +872,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -891,9 +894,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -902,7 +905,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="getUser",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -912,7 +915,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -921,7 +924,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from attr_groups2_sup import *\n\n')
 ##         sys.stdout.write('import attr_groups2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/catalogtest.xsd b/tests/catalogtest.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..adb07afb6ea0aca78b4a34d573cafe85a839a2c7
--- /dev/null
+++ b/tests/catalogtest.xsd
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:include namespace="http://www.generateds.com/catalog-part1"/>
+
+</xs:schema>
diff --git a/tests/catalogtest1_sub.py b/tests/catalogtest1_sub.py
index 0b153ec54fbb6d955b4c54735c667ccab5883172..21995ba5e9d685a8089c63dca4f827b91bef195c 100644
--- a/tests/catalogtest1_sub.py
+++ b/tests/catalogtest1_sub.py
@@ -156,9 +156,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'airplane'
         rootClass = supermod.airplane
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -167,8 +167,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from catalogtest2_sup import *\n\n')
 ##         sys.stdout.write('import catalogtest2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.airplane(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="airplane")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py
index 5baef460788e8361126d62809fcd221a53c60ce1..a2e8f03d6cba446dfd24dcf7c423b6976f162402 100644
--- a/tests/catalogtest1_sup.py
+++ b/tests/catalogtest1_sup.py
@@ -618,6 +618,7 @@ class airplane(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, pilotname=None):
+        self.original_tagname_ = None
         self.pilotname = pilotname
     def factory(*args_, **kwargs_):
         if airplane.subclass:
@@ -639,6 +640,8 @@ class airplane(GeneratedsSuper):
             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()
@@ -759,9 +762,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'airplane'
         rootClass = airplane
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -770,7 +773,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="airplane",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -789,7 +792,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from catalogtest2_sup import *\n\n')
 ##         sys.stdout.write('import catalogtest2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/catalogtest2_sub.py b/tests/catalogtest2_sub.py
index 0b153ec54fbb6d955b4c54735c667ccab5883172..21995ba5e9d685a8089c63dca4f827b91bef195c 100644
--- a/tests/catalogtest2_sub.py
+++ b/tests/catalogtest2_sub.py
@@ -156,9 +156,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'airplane'
         rootClass = supermod.airplane
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -167,8 +167,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from catalogtest2_sup import *\n\n')
 ##         sys.stdout.write('import catalogtest2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.airplane(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="airplane")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/catalogtest2_sup.py b/tests/catalogtest2_sup.py
index 5baef460788e8361126d62809fcd221a53c60ce1..a2e8f03d6cba446dfd24dcf7c423b6976f162402 100644
--- a/tests/catalogtest2_sup.py
+++ b/tests/catalogtest2_sup.py
@@ -618,6 +618,7 @@ class airplane(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, pilotname=None):
+        self.original_tagname_ = None
         self.pilotname = pilotname
     def factory(*args_, **kwargs_):
         if airplane.subclass:
@@ -639,6 +640,8 @@ class airplane(GeneratedsSuper):
             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()
@@ -759,9 +762,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'airplane'
         rootClass = airplane
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -770,7 +773,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="airplane",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -789,7 +792,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from catalogtest2_sup import *\n\n')
 ##         sys.stdout.write('import catalogtest2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/extensions1_sub.py b/tests/extensions1_sub.py
index 46cfd200e32b80b95ea36ee61f0cc0393a58e2fc..ad5c2678945fe6f085caae28677bc5c2eaa969cd 100644
--- a/tests/extensions1_sub.py
+++ b/tests/extensions1_sub.py
@@ -172,7 +172,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -192,7 +192,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -216,7 +216,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -233,9 +233,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -244,8 +244,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from extensions2_sup import *\n\n')
 ##         sys.stdout.write('import extensions2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.container(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="container")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index f3f137508a56cddf40c1ab078dfde3b2b44c282b..aa979fdff4eb326008bbec7a2afa0f84dad241e0 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -619,6 +619,7 @@ class SpecialDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, SpecialProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.SpecialProperty = _cast(None, SpecialProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -643,6 +644,8 @@ class SpecialDate(GeneratedsSuper):
             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()
@@ -701,6 +704,7 @@ class ExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -725,6 +729,8 @@ class ExtremeDate(GeneratedsSuper):
             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()
@@ -783,6 +789,7 @@ class singleExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -807,6 +814,8 @@ class singleExtremeDate(GeneratedsSuper):
             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()
@@ -865,6 +874,7 @@ class containerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, simplefactoid=None, mixedfactoid=None):
+        self.original_tagname_ = None
         if simplefactoid is None:
             self.simplefactoid = []
         else:
@@ -895,6 +905,8 @@ class containerType(GeneratedsSuper):
             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()
@@ -958,10 +970,12 @@ class containerType(GeneratedsSuper):
             obj_ = simpleFactoidType.factory()
             obj_.build(child_)
             self.simplefactoid.append(obj_)
+            obj_.original_tagname_ = 'simplefactoid'
         elif nodeName_ == 'mixedfactoid':
             obj_ = mixedFactoidType.factory()
             obj_.build(child_)
             self.mixedfactoid = obj_
+            obj_.original_tagname_ = 'mixedfactoid'
 # end class containerType
 
 
@@ -972,6 +986,7 @@ class simpleFactoidType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, relation=None):
+        self.original_tagname_ = None
         self.relation = relation
     def factory(*args_, **kwargs_):
         if simpleFactoidType.subclass:
@@ -996,6 +1011,8 @@ class simpleFactoidType(GeneratedsSuper):
             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()
@@ -1055,6 +1072,7 @@ class mixedFactoidType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, relation=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         self.relation = relation
         self.valueOf_ = valueOf_
         if mixedclass_ is None:
@@ -1092,6 +1110,8 @@ class mixedFactoidType(GeneratedsSuper):
             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()
@@ -1163,6 +1183,7 @@ class BaseType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BaseProperty1=None, BaseProperty2=None, valueOf_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.BaseProperty1 = _cast(None, BaseProperty1)
         self.BaseProperty2 = _cast(None, BaseProperty2)
         self.valueOf_ = valueOf_
@@ -1193,6 +1214,8 @@ class BaseType(GeneratedsSuper):
             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()
@@ -1271,6 +1294,7 @@ class DerivedType(BaseType):
     subclass = None
     superclass = BaseType
     def __init__(self, BaseProperty1=None, BaseProperty2=None, DerivedProperty1=None, DerivedProperty2=None, valueOf_=None):
+        self.original_tagname_ = None
         super(DerivedType, self).__init__(BaseProperty1, BaseProperty2, valueOf_, )
         self.DerivedProperty1 = _cast(None, DerivedProperty1)
         self.DerivedProperty2 = _cast(None, DerivedProperty2)
@@ -1300,6 +1324,8 @@ class DerivedType(BaseType):
             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()
@@ -1374,6 +1400,7 @@ class MyInteger(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -1398,6 +1425,8 @@ class MyInteger(GeneratedsSuper):
             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()
@@ -1456,6 +1485,7 @@ class MyBoolean(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -1480,6 +1510,8 @@ class MyBoolean(GeneratedsSuper):
             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()
@@ -1538,6 +1570,7 @@ class MyFloat(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -1562,6 +1595,8 @@ class MyFloat(GeneratedsSuper):
             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()
@@ -1620,6 +1655,7 @@ class MyDouble(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -1644,6 +1680,8 @@ class MyDouble(GeneratedsSuper):
             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()
@@ -1724,7 +1762,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1744,7 +1782,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1766,9 +1804,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1777,7 +1815,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="container",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1787,7 +1825,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1796,7 +1834,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from extensions2_sup import *\n\n')
 ##         sys.stdout.write('import extensions2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/extensions2_sub.py b/tests/extensions2_sub.py
index 46cfd200e32b80b95ea36ee61f0cc0393a58e2fc..ad5c2678945fe6f085caae28677bc5c2eaa969cd 100644
--- a/tests/extensions2_sub.py
+++ b/tests/extensions2_sub.py
@@ -172,7 +172,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -192,7 +192,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -216,7 +216,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -233,9 +233,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -244,8 +244,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from extensions2_sup import *\n\n')
 ##         sys.stdout.write('import extensions2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.container(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="container")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/extensions2_sup.py b/tests/extensions2_sup.py
index f3f137508a56cddf40c1ab078dfde3b2b44c282b..aa979fdff4eb326008bbec7a2afa0f84dad241e0 100644
--- a/tests/extensions2_sup.py
+++ b/tests/extensions2_sup.py
@@ -619,6 +619,7 @@ class SpecialDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, SpecialProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.SpecialProperty = _cast(None, SpecialProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -643,6 +644,8 @@ class SpecialDate(GeneratedsSuper):
             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()
@@ -701,6 +704,7 @@ class ExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -725,6 +729,8 @@ class ExtremeDate(GeneratedsSuper):
             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()
@@ -783,6 +789,7 @@ class singleExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -807,6 +814,8 @@ class singleExtremeDate(GeneratedsSuper):
             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()
@@ -865,6 +874,7 @@ class containerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, simplefactoid=None, mixedfactoid=None):
+        self.original_tagname_ = None
         if simplefactoid is None:
             self.simplefactoid = []
         else:
@@ -895,6 +905,8 @@ class containerType(GeneratedsSuper):
             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()
@@ -958,10 +970,12 @@ class containerType(GeneratedsSuper):
             obj_ = simpleFactoidType.factory()
             obj_.build(child_)
             self.simplefactoid.append(obj_)
+            obj_.original_tagname_ = 'simplefactoid'
         elif nodeName_ == 'mixedfactoid':
             obj_ = mixedFactoidType.factory()
             obj_.build(child_)
             self.mixedfactoid = obj_
+            obj_.original_tagname_ = 'mixedfactoid'
 # end class containerType
 
 
@@ -972,6 +986,7 @@ class simpleFactoidType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, relation=None):
+        self.original_tagname_ = None
         self.relation = relation
     def factory(*args_, **kwargs_):
         if simpleFactoidType.subclass:
@@ -996,6 +1011,8 @@ class simpleFactoidType(GeneratedsSuper):
             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()
@@ -1055,6 +1072,7 @@ class mixedFactoidType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, relation=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         self.relation = relation
         self.valueOf_ = valueOf_
         if mixedclass_ is None:
@@ -1092,6 +1110,8 @@ class mixedFactoidType(GeneratedsSuper):
             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()
@@ -1163,6 +1183,7 @@ class BaseType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BaseProperty1=None, BaseProperty2=None, valueOf_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.BaseProperty1 = _cast(None, BaseProperty1)
         self.BaseProperty2 = _cast(None, BaseProperty2)
         self.valueOf_ = valueOf_
@@ -1193,6 +1214,8 @@ class BaseType(GeneratedsSuper):
             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()
@@ -1271,6 +1294,7 @@ class DerivedType(BaseType):
     subclass = None
     superclass = BaseType
     def __init__(self, BaseProperty1=None, BaseProperty2=None, DerivedProperty1=None, DerivedProperty2=None, valueOf_=None):
+        self.original_tagname_ = None
         super(DerivedType, self).__init__(BaseProperty1, BaseProperty2, valueOf_, )
         self.DerivedProperty1 = _cast(None, DerivedProperty1)
         self.DerivedProperty2 = _cast(None, DerivedProperty2)
@@ -1300,6 +1324,8 @@ class DerivedType(BaseType):
             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()
@@ -1374,6 +1400,7 @@ class MyInteger(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -1398,6 +1425,8 @@ class MyInteger(GeneratedsSuper):
             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()
@@ -1456,6 +1485,7 @@ class MyBoolean(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -1480,6 +1510,8 @@ class MyBoolean(GeneratedsSuper):
             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()
@@ -1538,6 +1570,7 @@ class MyFloat(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -1562,6 +1595,8 @@ class MyFloat(GeneratedsSuper):
             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()
@@ -1620,6 +1655,7 @@ class MyDouble(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -1644,6 +1680,8 @@ class MyDouble(GeneratedsSuper):
             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()
@@ -1724,7 +1762,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1744,7 +1782,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1766,9 +1804,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1777,7 +1815,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="container",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1787,7 +1825,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1796,7 +1834,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from extensions2_sup import *\n\n')
 ##         sys.stdout.write('import extensions2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/ipo1_sub.py b/tests/ipo1_sub.py
index f973bb78b9aadd2981a7c9e11091f10f029fc93c..8140d69b9325f3f7d1d25d31b027f2c08021e4c6 100644
--- a/tests/ipo1_sub.py
+++ b/tests/ipo1_sub.py
@@ -130,7 +130,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -150,7 +150,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,7 +174,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -191,9 +191,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -202,8 +202,8 @@ def parseLiteral(inFilename, silence=False):
     if not silence:
         sys.stdout.write('#from ipo2_sup import *\n\n')
         sys.stdout.write('import ipo2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.purchaseOrder(\n')
-        rootObj.exportLiteral(sys.stdout, 0, name_="purchaseOrder")
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py
index 47d0c7da97579ae18a7157dbb971ef8ec13d92fd..581fbea1d0e0303e22bedc171817cf04c770c2a8 100644
--- a/tests/ipo1_sup.py
+++ b/tests/ipo1_sup.py
@@ -622,6 +622,7 @@ class PurchaseOrderType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, orderDate=None, shipTo=None, billTo=None, comment=None, items=None):
+        self.original_tagname_ = None
         if isinstance(orderDate, basestring):
             initvalue_ = datetime_.datetime.strptime(orderDate, '%Y-%m-%d').date()
         else:
@@ -662,6 +663,8 @@ class PurchaseOrderType(GeneratedsSuper):
             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()
@@ -745,11 +748,13 @@ class PurchaseOrderType(GeneratedsSuper):
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.shipTo = obj_
+            obj_.original_tagname_ = 'shipTo'
         elif nodeName_ == 'billTo':
             class_obj_ = self.get_class_obj_(child_, Address)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.billTo = obj_
+            obj_.original_tagname_ = 'billTo'
         elif nodeName_ == 'comment':
             comment_ = child_.text
             comment_ = self.gds_validate_string(comment_, node, 'comment')
@@ -758,6 +763,7 @@ class PurchaseOrderType(GeneratedsSuper):
             obj_ = Items.factory()
             obj_.build(child_)
             self.items = obj_
+            obj_.original_tagname_ = 'items'
 # end class PurchaseOrderType
 
 
@@ -768,6 +774,7 @@ class Items(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, item=None):
+        self.original_tagname_ = None
         if item is None:
             self.item = []
         else:
@@ -794,6 +801,8 @@ class Items(GeneratedsSuper):
             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()
@@ -849,6 +858,7 @@ class Items(GeneratedsSuper):
             obj_ = item.factory()
             obj_.build(child_)
             self.item.append(obj_)
+            obj_.original_tagname_ = 'item'
 # end class Items
 
 
@@ -864,6 +874,7 @@ class item(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
+        self.original_tagname_ = None
         self.partNum = _cast(None, partNum)
         self.productName = productName
         self.quantity = quantity
@@ -908,6 +919,8 @@ class item(GeneratedsSuper):
             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()
@@ -1022,6 +1035,7 @@ class quantity(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, valueOf_=None):
+        self.original_tagname_ = None
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
         if quantity.subclass:
@@ -1041,6 +1055,8 @@ class quantity(GeneratedsSuper):
             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()
@@ -1088,6 +1104,7 @@ class Address(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, street=None, city=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.name = name
         self.street = street
         self.city = city
@@ -1120,6 +1137,8 @@ class Address(GeneratedsSuper):
             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()
@@ -1205,6 +1224,7 @@ class USAddress(Address):
     subclass = None
     superclass = Address
     def __init__(self, name=None, street=None, city=None, state=None, zip=None):
+        self.original_tagname_ = None
         super(USAddress, self).__init__(name, street, city, )
         self.state = state
         self.zip = zip
@@ -1235,6 +1255,8 @@ class USAddress(Address):
             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()
@@ -1315,6 +1337,7 @@ class UKAddress(Address):
     subclass = None
     superclass = Address
     def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None):
+        self.original_tagname_ = None
         super(UKAddress, self).__init__(name, street, city, )
         self.category_attr = _cast(None, category_attr)
         self.exportCode = _cast(int, exportCode)
@@ -1351,6 +1374,8 @@ class UKAddress(Address):
             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()
@@ -1473,7 +1498,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1493,7 +1518,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1515,9 +1540,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1526,7 +1551,7 @@ def parseString(inString, silence=False):
     if not silence:
         sys.stdout.write('<?xml version="1.0" ?>\n')
         rootObj.export(
-            sys.stdout, 0, name_="purchaseOrder",
+            sys.stdout, 0, name_=rootTag,
             namespacedef_='xmlns:ipo="http://www.example.com/IPO"')
     return rootObj
 
@@ -1536,7 +1561,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1545,7 +1570,7 @@ def parseLiteral(inFileName, silence=False):
     if not silence:
         sys.stdout.write('#from ipo2_sup import *\n\n')
         sys.stdout.write('import ipo2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.rootTag(\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/ipo2_sub.py b/tests/ipo2_sub.py
index f973bb78b9aadd2981a7c9e11091f10f029fc93c..8140d69b9325f3f7d1d25d31b027f2c08021e4c6 100644
--- a/tests/ipo2_sub.py
+++ b/tests/ipo2_sub.py
@@ -130,7 +130,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -150,7 +150,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,7 +174,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -191,9 +191,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -202,8 +202,8 @@ def parseLiteral(inFilename, silence=False):
     if not silence:
         sys.stdout.write('#from ipo2_sup import *\n\n')
         sys.stdout.write('import ipo2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.purchaseOrder(\n')
-        rootObj.exportLiteral(sys.stdout, 0, name_="purchaseOrder")
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py
index 47d0c7da97579ae18a7157dbb971ef8ec13d92fd..581fbea1d0e0303e22bedc171817cf04c770c2a8 100644
--- a/tests/ipo2_sup.py
+++ b/tests/ipo2_sup.py
@@ -622,6 +622,7 @@ class PurchaseOrderType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, orderDate=None, shipTo=None, billTo=None, comment=None, items=None):
+        self.original_tagname_ = None
         if isinstance(orderDate, basestring):
             initvalue_ = datetime_.datetime.strptime(orderDate, '%Y-%m-%d').date()
         else:
@@ -662,6 +663,8 @@ class PurchaseOrderType(GeneratedsSuper):
             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()
@@ -745,11 +748,13 @@ class PurchaseOrderType(GeneratedsSuper):
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.shipTo = obj_
+            obj_.original_tagname_ = 'shipTo'
         elif nodeName_ == 'billTo':
             class_obj_ = self.get_class_obj_(child_, Address)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.billTo = obj_
+            obj_.original_tagname_ = 'billTo'
         elif nodeName_ == 'comment':
             comment_ = child_.text
             comment_ = self.gds_validate_string(comment_, node, 'comment')
@@ -758,6 +763,7 @@ class PurchaseOrderType(GeneratedsSuper):
             obj_ = Items.factory()
             obj_.build(child_)
             self.items = obj_
+            obj_.original_tagname_ = 'items'
 # end class PurchaseOrderType
 
 
@@ -768,6 +774,7 @@ class Items(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, item=None):
+        self.original_tagname_ = None
         if item is None:
             self.item = []
         else:
@@ -794,6 +801,8 @@ class Items(GeneratedsSuper):
             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()
@@ -849,6 +858,7 @@ class Items(GeneratedsSuper):
             obj_ = item.factory()
             obj_.build(child_)
             self.item.append(obj_)
+            obj_.original_tagname_ = 'item'
 # end class Items
 
 
@@ -864,6 +874,7 @@ class item(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
+        self.original_tagname_ = None
         self.partNum = _cast(None, partNum)
         self.productName = productName
         self.quantity = quantity
@@ -908,6 +919,8 @@ class item(GeneratedsSuper):
             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()
@@ -1022,6 +1035,7 @@ class quantity(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, valueOf_=None):
+        self.original_tagname_ = None
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
         if quantity.subclass:
@@ -1041,6 +1055,8 @@ class quantity(GeneratedsSuper):
             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()
@@ -1088,6 +1104,7 @@ class Address(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, street=None, city=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.name = name
         self.street = street
         self.city = city
@@ -1120,6 +1137,8 @@ class Address(GeneratedsSuper):
             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()
@@ -1205,6 +1224,7 @@ class USAddress(Address):
     subclass = None
     superclass = Address
     def __init__(self, name=None, street=None, city=None, state=None, zip=None):
+        self.original_tagname_ = None
         super(USAddress, self).__init__(name, street, city, )
         self.state = state
         self.zip = zip
@@ -1235,6 +1255,8 @@ class USAddress(Address):
             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()
@@ -1315,6 +1337,7 @@ class UKAddress(Address):
     subclass = None
     superclass = Address
     def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None):
+        self.original_tagname_ = None
         super(UKAddress, self).__init__(name, street, city, )
         self.category_attr = _cast(None, category_attr)
         self.exportCode = _cast(int, exportCode)
@@ -1351,6 +1374,8 @@ class UKAddress(Address):
             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()
@@ -1473,7 +1498,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1493,7 +1518,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1515,9 +1540,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1526,7 +1551,7 @@ def parseString(inString, silence=False):
     if not silence:
         sys.stdout.write('<?xml version="1.0" ?>\n')
         rootObj.export(
-            sys.stdout, 0, name_="purchaseOrder",
+            sys.stdout, 0, name_=rootTag,
             namespacedef_='xmlns:ipo="http://www.example.com/IPO"')
     return rootObj
 
@@ -1536,7 +1561,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1545,7 +1570,7 @@ def parseLiteral(inFileName, silence=False):
     if not silence:
         sys.stdout.write('#from ipo2_sup import *\n\n')
         sys.stdout.write('import ipo2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.rootTag(\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/literal1.py b/tests/literal1.py
index 6e247027a3c23c9b0840c96521fd30a3921143f6..8c46e9282ea6aaf03a5a281e0b52b24e86169784 100644
--- a/tests/literal1.py
+++ b/tests/literal1.py
@@ -2,7 +2,7 @@
 
 import out2_sup as model_
 
-rootObj = model_.rootTag(
+rootObj = model_.rootClass(
     comments=[
         model_.comments(
             content_ = [
diff --git a/tests/oneper00.xsd b/tests/oneper00.xsd
index 0193a4b34a27038b30f3eb776b1ec9e4098bb88e..7456aef3b0f06c24e31f32fbf945f814ae101e5d 100644
--- a/tests/oneper00.xsd
+++ b/tests/oneper00.xsd
@@ -4,6 +4,7 @@
 
     <xs:include schemaLocation="oneper01.xsd"/>
     <xs:include schemaLocation="oneper02.xsd"/>
+    <xs:include schemaLocation="http://www.davekuhlman.org/oneper03.xsd"/>
 
     <xs:element name="root00" type="oneperType00_1" />
 
diff --git a/tests/oneper03.xsd b/tests/oneper03.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..dc4f1dfabd2ccdbb2c604b23f0c7adda1a7bdc88
--- /dev/null
+++ b/tests/oneper03.xsd
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+<!-- During unit tests, this schema file is actually read from
+     http://www.davekuhlman.org.
+     See xs:include element in oneper00.xsd.
+-->
+
+    <xs:element name="root03" type="oneperType03_1" />
+
+    <xs:complexType name="oneperType03_1">
+        <xs:sequence>
+            <xs:element name="helpername" type="xs:string"/>
+            <xs:element name="inner01" type="oneperType02_2" />
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="oneperType03_2">
+        <xs:sequence>
+            <xs:element name="helperdescription" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
+
diff --git a/tests/out1_sub.py b/tests/out1_sub.py
index ad7595f73d420d321faf77081c39fad7975629a9..2292a32252b38ea236cf72b06c6b66441cce1533 100644
--- a/tests/out1_sub.py
+++ b/tests/out1_sub.py
@@ -233,9 +233,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = supermod.people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -244,8 +244,8 @@ def parseLiteral(inFilename, silence=False):
     if not silence:
         sys.stdout.write('#from out2_sup import *\n\n')
         sys.stdout.write('import out2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.people(\n')
-        rootObj.exportLiteral(sys.stdout, 0, name_="people")
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index fcba530818ccc36be2427a200cbf015cfdd31fd0..4fee2b36600328e0fb63f766f19308cec99ac7f0 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -622,6 +622,7 @@ class people(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -684,6 +685,8 @@ class people(GeneratedsSuper):
             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()
@@ -795,24 +798,29 @@ class people(GeneratedsSuper):
             obj_ = comments.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, person)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmer)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmer.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmer.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
     def walk_and_update(self):
         members = people._member_data_items
         for member in members:
@@ -875,6 +883,7 @@ class comments(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -914,6 +923,8 @@ class comments(GeneratedsSuper):
             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()
@@ -1039,6 +1050,7 @@ class person(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.vegetable = _cast(None, vegetable)
         self.fruit = _cast(None, fruit)
         self.ratio = _cast(float, ratio)
@@ -1113,6 +1125,8 @@ class person(GeneratedsSuper):
             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()
@@ -1294,10 +1308,12 @@ class person(GeneratedsSuper):
             obj_ = agent.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = booster.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1375,6 +1391,7 @@ class programmer(person):
     subclass = None
     superclass = person
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
         super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
@@ -1474,6 +1491,8 @@ class programmer(person):
             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()
@@ -1758,6 +1777,7 @@ class programmer(person):
             obj_ = param.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
@@ -1828,6 +1848,7 @@ class param(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        self.original_tagname_ = None
         self.semantic = _cast(None, semantic)
         self.name = _cast(None, name)
         self.flow = _cast(None, flow)
@@ -1867,6 +1888,8 @@ class param(GeneratedsSuper):
             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()
@@ -2027,6 +2050,7 @@ class python_programmer(programmer):
     subclass = None
     superclass = programmer
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
         super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
         self.favorite_editor = favorite_editor
@@ -2053,6 +2077,8 @@ class python_programmer(programmer):
             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()
@@ -2172,6 +2198,7 @@ class java_programmer(programmer):
     subclass = None
     superclass = programmer
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
         super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.status = _cast(None, status)
         self.nick_name = _cast(None, nick_name)
@@ -2201,6 +2228,8 @@ class java_programmer(programmer):
             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()
@@ -2332,6 +2361,7 @@ class agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -2365,6 +2395,8 @@ class agent(GeneratedsSuper):
             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()
@@ -2448,6 +2480,7 @@ class agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
     def walk_and_update(self):
         members = agent._member_data_items
         for member in members:
@@ -2507,6 +2540,7 @@ class special_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -2540,6 +2574,8 @@ class special_agent(GeneratedsSuper):
             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()
@@ -2623,6 +2659,7 @@ class special_agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
     def walk_and_update(self):
         members = special_agent._member_data_items
         for member in members:
@@ -2685,6 +2722,7 @@ class booster(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.other_name = other_name
@@ -2745,6 +2783,8 @@ class booster(GeneratedsSuper):
             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()
@@ -2888,6 +2928,7 @@ class booster(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
     def walk_and_update(self):
         members = booster._member_data_items
         for member in members:
@@ -2946,10 +2987,10 @@ class info(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, rating=None, type_=None, name=None):
+        self.original_tagname_ = None
         self.rating = _cast(float, rating)
         self.type_ = _cast(int, type_)
         self.name = _cast(None, name)
-        pass
     def factory(*args_, **kwargs_):
         if info.subclass:
             return info.subclass(*args_, **kwargs_)
@@ -2974,6 +3015,8 @@ class info(GeneratedsSuper):
             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()
@@ -3102,6 +3145,7 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
@@ -3127,6 +3171,8 @@ class client_handlerType(GeneratedsSuper):
             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()
@@ -3309,9 +3355,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -3320,7 +3366,7 @@ def parseString(inString, silence=False):
     if not silence:
         sys.stdout.write('<?xml version="1.0" ?>\n')
         rootObj.export(
-            sys.stdout, 0, name_="people",
+            sys.stdout, 0, name_=rootTag,
             namespacedef_='')
     return rootObj
 
@@ -3339,7 +3385,7 @@ def parseLiteral(inFileName, silence=False):
     if not silence:
         sys.stdout.write('#from out2_sup import *\n\n')
         sys.stdout.write('import out2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.rootTag(\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/out2_sub.py b/tests/out2_sub.py
index ad7595f73d420d321faf77081c39fad7975629a9..2292a32252b38ea236cf72b06c6b66441cce1533 100644
--- a/tests/out2_sub.py
+++ b/tests/out2_sub.py
@@ -233,9 +233,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = supermod.people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -244,8 +244,8 @@ def parseLiteral(inFilename, silence=False):
     if not silence:
         sys.stdout.write('#from out2_sup import *\n\n')
         sys.stdout.write('import out2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.people(\n')
-        rootObj.exportLiteral(sys.stdout, 0, name_="people")
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/out2_sup.py b/tests/out2_sup.py
index fcba530818ccc36be2427a200cbf015cfdd31fd0..4fee2b36600328e0fb63f766f19308cec99ac7f0 100644
--- a/tests/out2_sup.py
+++ b/tests/out2_sup.py
@@ -622,6 +622,7 @@ class people(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -684,6 +685,8 @@ class people(GeneratedsSuper):
             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()
@@ -795,24 +798,29 @@ class people(GeneratedsSuper):
             obj_ = comments.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, person)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmer)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmer.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmer.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
     def walk_and_update(self):
         members = people._member_data_items
         for member in members:
@@ -875,6 +883,7 @@ class comments(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -914,6 +923,8 @@ class comments(GeneratedsSuper):
             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()
@@ -1039,6 +1050,7 @@ class person(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.vegetable = _cast(None, vegetable)
         self.fruit = _cast(None, fruit)
         self.ratio = _cast(float, ratio)
@@ -1113,6 +1125,8 @@ class person(GeneratedsSuper):
             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()
@@ -1294,10 +1308,12 @@ class person(GeneratedsSuper):
             obj_ = agent.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = booster.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1375,6 +1391,7 @@ class programmer(person):
     subclass = None
     superclass = person
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
         super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
@@ -1474,6 +1491,8 @@ class programmer(person):
             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()
@@ -1758,6 +1777,7 @@ class programmer(person):
             obj_ = param.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
@@ -1828,6 +1848,7 @@ class param(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        self.original_tagname_ = None
         self.semantic = _cast(None, semantic)
         self.name = _cast(None, name)
         self.flow = _cast(None, flow)
@@ -1867,6 +1888,8 @@ class param(GeneratedsSuper):
             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()
@@ -2027,6 +2050,7 @@ class python_programmer(programmer):
     subclass = None
     superclass = programmer
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
         super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
         self.favorite_editor = favorite_editor
@@ -2053,6 +2077,8 @@ class python_programmer(programmer):
             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()
@@ -2172,6 +2198,7 @@ class java_programmer(programmer):
     subclass = None
     superclass = programmer
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
         super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.status = _cast(None, status)
         self.nick_name = _cast(None, nick_name)
@@ -2201,6 +2228,8 @@ class java_programmer(programmer):
             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()
@@ -2332,6 +2361,7 @@ class agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -2365,6 +2395,8 @@ class agent(GeneratedsSuper):
             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()
@@ -2448,6 +2480,7 @@ class agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
     def walk_and_update(self):
         members = agent._member_data_items
         for member in members:
@@ -2507,6 +2540,7 @@ class special_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -2540,6 +2574,8 @@ class special_agent(GeneratedsSuper):
             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()
@@ -2623,6 +2659,7 @@ class special_agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
     def walk_and_update(self):
         members = special_agent._member_data_items
         for member in members:
@@ -2685,6 +2722,7 @@ class booster(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.other_name = other_name
@@ -2745,6 +2783,8 @@ class booster(GeneratedsSuper):
             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()
@@ -2888,6 +2928,7 @@ class booster(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
     def walk_and_update(self):
         members = booster._member_data_items
         for member in members:
@@ -2946,10 +2987,10 @@ class info(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, rating=None, type_=None, name=None):
+        self.original_tagname_ = None
         self.rating = _cast(float, rating)
         self.type_ = _cast(int, type_)
         self.name = _cast(None, name)
-        pass
     def factory(*args_, **kwargs_):
         if info.subclass:
             return info.subclass(*args_, **kwargs_)
@@ -2974,6 +3015,8 @@ class info(GeneratedsSuper):
             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()
@@ -3102,6 +3145,7 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
@@ -3127,6 +3171,8 @@ class client_handlerType(GeneratedsSuper):
             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()
@@ -3309,9 +3355,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -3320,7 +3366,7 @@ def parseString(inString, silence=False):
     if not silence:
         sys.stdout.write('<?xml version="1.0" ?>\n')
         rootObj.export(
-            sys.stdout, 0, name_="people",
+            sys.stdout, 0, name_=rootTag,
             namespacedef_='')
     return rootObj
 
@@ -3339,7 +3385,7 @@ def parseLiteral(inFileName, silence=False):
     if not silence:
         sys.stdout.write('#from out2_sup import *\n\n')
         sys.stdout.write('import out2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.rootTag(\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/people_procincl1_sub.py b/tests/people_procincl1_sub.py
index c3b5be6194abe2ee514f4655f3c989b427e9b07d..55e0f429d867b8a8a356ba36ee040e8179a5b72f 100644
--- a/tests/people_procincl1_sub.py
+++ b/tests/people_procincl1_sub.py
@@ -261,9 +261,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = supermod.people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -272,8 +272,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from people_procincl2_sup import *\n\n')
 ##         sys.stdout.write('import people_procincl2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.people(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="people")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index 87f7ddc9e00e7488bd566b0ce97456b7b5a9deb6..a3cc5d153df708e75a919bce7b984e659bee87e4 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -624,6 +624,7 @@ class people(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -695,6 +696,8 @@ class people(GeneratedsSuper):
             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()
@@ -820,28 +823,34 @@ class people(GeneratedsSuper):
             obj_ = comments.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, person)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'specialperson':
             obj_ = specialperson.factory()
             obj_.build(child_)
             self.specialperson.append(obj_)
+            obj_.original_tagname_ = 'specialperson'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmer)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmer.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmer.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
 # end class people
 
 
@@ -854,6 +863,7 @@ class comments(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -902,6 +912,8 @@ class comments(GeneratedsSuper):
             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()
@@ -995,6 +1007,7 @@ class person(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.vegetable = _cast(None, vegetable)
         self.fruit = _cast(None, fruit)
         self.ratio = _cast(float, ratio)
@@ -1069,6 +1082,8 @@ class person(GeneratedsSuper):
             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()
@@ -1250,10 +1265,12 @@ class person(GeneratedsSuper):
             obj_ = agent.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = booster.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1267,8 +1284,8 @@ class specialperson(person):
     subclass = None
     superclass = person
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None):
+        self.original_tagname_ = None
         super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
-        pass
     def factory(*args_, **kwargs_):
         if specialperson.subclass:
             return specialperson.subclass(*args_, **kwargs_)
@@ -1287,6 +1304,8 @@ class specialperson(person):
             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()
@@ -1342,6 +1361,7 @@ class param(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        self.original_tagname_ = None
         self.semantic = _cast(None, semantic)
         self.name = _cast(None, name)
         self.flow = _cast(None, flow)
@@ -1381,6 +1401,8 @@ class param(GeneratedsSuper):
             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()
@@ -1498,6 +1520,7 @@ class agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -1540,6 +1563,8 @@ class agent(GeneratedsSuper):
             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()
@@ -1637,6 +1662,7 @@ class agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         elif nodeName_ == 'vehicle':
             type_name_ = child_.attrib.get(
                 '{http://www.w3.org/2001/XMLSchema-instance}type')
@@ -1655,6 +1681,7 @@ class agent(GeneratedsSuper):
                 raise NotImplementedError(
                     'Class not implemented for <vehicle> element')
             self.vehicle.append(obj_)
+            obj_.original_tagname_ = 'vehicle'
 # end class agent
 
 
@@ -1670,6 +1697,7 @@ class special_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -1703,6 +1731,8 @@ class special_agent(GeneratedsSuper):
             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()
@@ -1786,6 +1816,7 @@ class special_agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
 # end class special_agent
 
 
@@ -1803,6 +1834,7 @@ class booster(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.member_id = _cast(None, member_id)
         self.firstname = firstname
         self.lastname = lastname
@@ -1866,6 +1898,8 @@ class booster(GeneratedsSuper):
             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()
@@ -2017,6 +2051,7 @@ class booster(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
 # end class booster
 
 
@@ -2029,10 +2064,10 @@ class info(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, rating=None, type_=None, name=None):
+        self.original_tagname_ = None
         self.rating = _cast(float, rating)
         self.type_ = _cast(int, type_)
         self.name = _cast(None, name)
-        pass
     def factory(*args_, **kwargs_):
         if info.subclass:
             return info.subclass(*args_, **kwargs_)
@@ -2057,6 +2092,8 @@ class info(GeneratedsSuper):
             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()
@@ -2138,6 +2175,7 @@ class vehicle(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, wheelcount=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.wheelcount = wheelcount
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
@@ -2162,6 +2200,8 @@ class vehicle(GeneratedsSuper):
             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()
@@ -2230,6 +2270,7 @@ class automobile(vehicle):
     subclass = None
     superclass = vehicle
     def __init__(self, wheelcount=None, drivername=None):
+        self.original_tagname_ = None
         super(automobile, self).__init__(wheelcount, )
         self.drivername = drivername
     def factory(*args_, **kwargs_):
@@ -2253,6 +2294,8 @@ class automobile(vehicle):
             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()
@@ -2313,6 +2356,7 @@ class airplane(vehicle):
     subclass = None
     superclass = vehicle
     def __init__(self, wheelcount=None, pilotname=None):
+        self.original_tagname_ = None
         super(airplane, self).__init__(wheelcount, )
         self.pilotname = pilotname
     def factory(*args_, **kwargs_):
@@ -2336,6 +2380,8 @@ class airplane(vehicle):
             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()
@@ -2414,6 +2460,7 @@ class programmer(person):
     subclass = None
     superclass = person
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
         super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
@@ -2505,6 +2552,8 @@ class programmer(person):
             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()
@@ -2779,6 +2828,7 @@ class programmer(person):
             obj_ = param.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
@@ -2796,6 +2846,7 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
@@ -2821,6 +2872,8 @@ class client_handlerType(GeneratedsSuper):
             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()
@@ -2897,6 +2950,7 @@ class java_programmer(programmer):
     subclass = None
     superclass = programmer
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
         super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.status = _cast(None, status)
         self.nick_name = _cast(None, nick_name)
@@ -2926,6 +2980,8 @@ class java_programmer(programmer):
             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()
@@ -3011,6 +3067,7 @@ class python_programmer(programmer):
     subclass = None
     superclass = programmer
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
         super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
         self.favorite_editor = favorite_editor
@@ -3037,6 +3094,8 @@ class python_programmer(programmer):
             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()
@@ -3173,9 +3232,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -3184,7 +3243,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="people",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -3203,7 +3262,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from people_procincl2_sup import *\n\n')
 ##         sys.stdout.write('import people_procincl2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/people_procincl2_sub.py b/tests/people_procincl2_sub.py
index c3b5be6194abe2ee514f4655f3c989b427e9b07d..55e0f429d867b8a8a356ba36ee040e8179a5b72f 100644
--- a/tests/people_procincl2_sub.py
+++ b/tests/people_procincl2_sub.py
@@ -261,9 +261,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = supermod.people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -272,8 +272,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from people_procincl2_sup import *\n\n')
 ##         sys.stdout.write('import people_procincl2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.people(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="people")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/people_procincl2_sup.py b/tests/people_procincl2_sup.py
index 87f7ddc9e00e7488bd566b0ce97456b7b5a9deb6..a3cc5d153df708e75a919bce7b984e659bee87e4 100644
--- a/tests/people_procincl2_sup.py
+++ b/tests/people_procincl2_sup.py
@@ -624,6 +624,7 @@ class people(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -695,6 +696,8 @@ class people(GeneratedsSuper):
             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()
@@ -820,28 +823,34 @@ class people(GeneratedsSuper):
             obj_ = comments.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, person)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'specialperson':
             obj_ = specialperson.factory()
             obj_.build(child_)
             self.specialperson.append(obj_)
+            obj_.original_tagname_ = 'specialperson'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmer)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmer.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmer.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
 # end class people
 
 
@@ -854,6 +863,7 @@ class comments(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -902,6 +912,8 @@ class comments(GeneratedsSuper):
             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()
@@ -995,6 +1007,7 @@ class person(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.vegetable = _cast(None, vegetable)
         self.fruit = _cast(None, fruit)
         self.ratio = _cast(float, ratio)
@@ -1069,6 +1082,8 @@ class person(GeneratedsSuper):
             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()
@@ -1250,10 +1265,12 @@ class person(GeneratedsSuper):
             obj_ = agent.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = booster.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1267,8 +1284,8 @@ class specialperson(person):
     subclass = None
     superclass = person
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None):
+        self.original_tagname_ = None
         super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
-        pass
     def factory(*args_, **kwargs_):
         if specialperson.subclass:
             return specialperson.subclass(*args_, **kwargs_)
@@ -1287,6 +1304,8 @@ class specialperson(person):
             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()
@@ -1342,6 +1361,7 @@ class param(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        self.original_tagname_ = None
         self.semantic = _cast(None, semantic)
         self.name = _cast(None, name)
         self.flow = _cast(None, flow)
@@ -1381,6 +1401,8 @@ class param(GeneratedsSuper):
             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()
@@ -1498,6 +1520,7 @@ class agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -1540,6 +1563,8 @@ class agent(GeneratedsSuper):
             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()
@@ -1637,6 +1662,7 @@ class agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         elif nodeName_ == 'vehicle':
             type_name_ = child_.attrib.get(
                 '{http://www.w3.org/2001/XMLSchema-instance}type')
@@ -1655,6 +1681,7 @@ class agent(GeneratedsSuper):
                 raise NotImplementedError(
                     'Class not implemented for <vehicle> element')
             self.vehicle.append(obj_)
+            obj_.original_tagname_ = 'vehicle'
 # end class agent
 
 
@@ -1670,6 +1697,7 @@ class special_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -1703,6 +1731,8 @@ class special_agent(GeneratedsSuper):
             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()
@@ -1786,6 +1816,7 @@ class special_agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
 # end class special_agent
 
 
@@ -1803,6 +1834,7 @@ class booster(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.member_id = _cast(None, member_id)
         self.firstname = firstname
         self.lastname = lastname
@@ -1866,6 +1898,8 @@ class booster(GeneratedsSuper):
             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()
@@ -2017,6 +2051,7 @@ class booster(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
 # end class booster
 
 
@@ -2029,10 +2064,10 @@ class info(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, rating=None, type_=None, name=None):
+        self.original_tagname_ = None
         self.rating = _cast(float, rating)
         self.type_ = _cast(int, type_)
         self.name = _cast(None, name)
-        pass
     def factory(*args_, **kwargs_):
         if info.subclass:
             return info.subclass(*args_, **kwargs_)
@@ -2057,6 +2092,8 @@ class info(GeneratedsSuper):
             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()
@@ -2138,6 +2175,7 @@ class vehicle(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, wheelcount=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.wheelcount = wheelcount
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
@@ -2162,6 +2200,8 @@ class vehicle(GeneratedsSuper):
             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()
@@ -2230,6 +2270,7 @@ class automobile(vehicle):
     subclass = None
     superclass = vehicle
     def __init__(self, wheelcount=None, drivername=None):
+        self.original_tagname_ = None
         super(automobile, self).__init__(wheelcount, )
         self.drivername = drivername
     def factory(*args_, **kwargs_):
@@ -2253,6 +2294,8 @@ class automobile(vehicle):
             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()
@@ -2313,6 +2356,7 @@ class airplane(vehicle):
     subclass = None
     superclass = vehicle
     def __init__(self, wheelcount=None, pilotname=None):
+        self.original_tagname_ = None
         super(airplane, self).__init__(wheelcount, )
         self.pilotname = pilotname
     def factory(*args_, **kwargs_):
@@ -2336,6 +2380,8 @@ class airplane(vehicle):
             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()
@@ -2414,6 +2460,7 @@ class programmer(person):
     subclass = None
     superclass = person
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
         super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
@@ -2505,6 +2552,8 @@ class programmer(person):
             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()
@@ -2779,6 +2828,7 @@ class programmer(person):
             obj_ = param.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
@@ -2796,6 +2846,7 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
@@ -2821,6 +2872,8 @@ class client_handlerType(GeneratedsSuper):
             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()
@@ -2897,6 +2950,7 @@ class java_programmer(programmer):
     subclass = None
     superclass = programmer
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
         super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.status = _cast(None, status)
         self.nick_name = _cast(None, nick_name)
@@ -2926,6 +2980,8 @@ class java_programmer(programmer):
             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()
@@ -3011,6 +3067,7 @@ class python_programmer(programmer):
     subclass = None
     superclass = programmer
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
         super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
         self.favorite_editor = favorite_editor
@@ -3037,6 +3094,8 @@ class python_programmer(programmer):
             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()
@@ -3173,9 +3232,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -3184,7 +3243,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="people",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -3203,7 +3262,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from people_procincl2_sup import *\n\n')
 ##         sys.stdout.write('import people_procincl2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/people_procincl_a.xsd b/tests/people_procincl_a.xsd
index 6fad49719cfdd1e6e92fbaf33dd907ac4db9a11c..d637f39b693c6088ea57c988c978a0d9c8d0a1d2 100644
--- a/tests/people_procincl_a.xsd
+++ b/tests/people_procincl_a.xsd
@@ -5,7 +5,7 @@
   <xs:include schemaLocation="people_10b.xsd" />
 -->
 
-  <xs:include schemaLocation="http://www.rexx.com/~dkuhlman/people_procincl_c.xsd" />
+  <xs:include schemaLocation="http://www.davekuhlman.org/people_procincl_c.xsd" />
 
     <xs:element name="comments">
         <xs:complexType mixed="true">
diff --git a/tests/recursive_simpletype1_sub.py b/tests/recursive_simpletype1_sub.py
index db59f2ae53181f0e1d1a07e3764a91992cf2d90b..48dee5dbdcfd48265c257b526270a218b47dd5a4 100644
--- a/tests/recursive_simpletype1_sub.py
+++ b/tests/recursive_simpletype1_sub.py
@@ -95,7 +95,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -115,7 +115,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -139,7 +139,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -156,9 +156,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -167,8 +167,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from recursive_simpletype2_sup import *\n\n')
 ##         sys.stdout.write('import recursive_simpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.person(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="person")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py
index 181be29c19a24fb9b7ff304225452e12835b8ba1..8e08f9b550848d705d13f7bde74c06d11ff0a644 100644
--- a/tests/recursive_simpletype1_sup.py
+++ b/tests/recursive_simpletype1_sup.py
@@ -620,6 +620,7 @@ class PersonType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, personId=None, fname=None, lname=None):
+        self.original_tagname_ = None
         self.personId = personId
         self.fname = fname
         self.lname = lname
@@ -649,6 +650,8 @@ class PersonType(GeneratedsSuper):
             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()
@@ -751,7 +754,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -771,7 +774,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -793,9 +796,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -804,7 +807,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="person",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -814,7 +817,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -823,7 +826,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from recursive_simpletype2_sup import *\n\n')
 ##         sys.stdout.write('import recursive_simpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/recursive_simpletype2_sub.py b/tests/recursive_simpletype2_sub.py
index db59f2ae53181f0e1d1a07e3764a91992cf2d90b..48dee5dbdcfd48265c257b526270a218b47dd5a4 100644
--- a/tests/recursive_simpletype2_sub.py
+++ b/tests/recursive_simpletype2_sub.py
@@ -95,7 +95,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -115,7 +115,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -139,7 +139,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -156,9 +156,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -167,8 +167,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from recursive_simpletype2_sup import *\n\n')
 ##         sys.stdout.write('import recursive_simpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.person(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="person")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/recursive_simpletype2_sup.py b/tests/recursive_simpletype2_sup.py
index 181be29c19a24fb9b7ff304225452e12835b8ba1..8e08f9b550848d705d13f7bde74c06d11ff0a644 100644
--- a/tests/recursive_simpletype2_sup.py
+++ b/tests/recursive_simpletype2_sup.py
@@ -620,6 +620,7 @@ class PersonType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, personId=None, fname=None, lname=None):
+        self.original_tagname_ = None
         self.personId = personId
         self.fname = fname
         self.lname = lname
@@ -649,6 +650,8 @@ class PersonType(GeneratedsSuper):
             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()
@@ -751,7 +754,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -771,7 +774,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -793,9 +796,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -804,7 +807,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="person",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -814,7 +817,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -823,7 +826,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from recursive_simpletype2_sup import *\n\n')
 ##         sys.stdout.write('import recursive_simpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/simplecontent_restriction1_sub.py b/tests/simplecontent_restriction1_sub.py
index f986e758b67a7366ba5e8959dd03ad5015832210..99b68bee78b2caa6c5289e4eb50f2ed63b2669cf 100644
--- a/tests/simplecontent_restriction1_sub.py
+++ b/tests/simplecontent_restriction1_sub.py
@@ -170,9 +170,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'IdentifierType'
         rootClass = supermod.IdentifierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -181,8 +181,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simplecontent_restriction2_sup import *\n\n')
 ##         sys.stdout.write('import simplecontent_restriction2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.IdentifierType(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="IdentifierType")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py
index 74e903201ad896ca84e3800f5efda614a5c0e403..e2498110404d7d90ad1fd47f0d2f053a42f3d411 100644
--- a/tests/simplecontent_restriction1_sup.py
+++ b/tests/simplecontent_restriction1_sup.py
@@ -625,6 +625,7 @@ class IdentifierType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.schemeDataURI = _cast(None, schemeDataURI)
         self.schemeID = _cast(None, schemeID)
         self.schemeAgencyName = _cast(None, schemeAgencyName)
@@ -670,6 +671,8 @@ class IdentifierType(GeneratedsSuper):
             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()
@@ -801,6 +804,7 @@ class BillOfResourcesIDType(IdentifierType):
     subclass = None
     superclass = IdentifierType
     def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None):
+        self.original_tagname_ = None
         super(BillOfResourcesIDType, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, )
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -824,6 +828,8 @@ class BillOfResourcesIDType(IdentifierType):
             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()
@@ -875,6 +881,7 @@ class BillOfMaterialIDType(IdentifierType):
     subclass = None
     superclass = IdentifierType
     def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None):
+        self.original_tagname_ = None
         super(BillOfMaterialIDType, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, )
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -898,6 +905,8 @@ class BillOfMaterialIDType(IdentifierType):
             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()
@@ -1011,9 +1020,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'IdentifierType'
         rootClass = IdentifierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1022,7 +1031,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="IdentifierType",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1041,7 +1050,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simplecontent_restriction2_sup import *\n\n')
 ##         sys.stdout.write('import simplecontent_restriction2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/simplecontent_restriction2_sub.py b/tests/simplecontent_restriction2_sub.py
index f986e758b67a7366ba5e8959dd03ad5015832210..99b68bee78b2caa6c5289e4eb50f2ed63b2669cf 100644
--- a/tests/simplecontent_restriction2_sub.py
+++ b/tests/simplecontent_restriction2_sub.py
@@ -170,9 +170,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'IdentifierType'
         rootClass = supermod.IdentifierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -181,8 +181,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simplecontent_restriction2_sup import *\n\n')
 ##         sys.stdout.write('import simplecontent_restriction2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.IdentifierType(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="IdentifierType")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/simplecontent_restriction2_sup.py b/tests/simplecontent_restriction2_sup.py
index 74e903201ad896ca84e3800f5efda614a5c0e403..e2498110404d7d90ad1fd47f0d2f053a42f3d411 100644
--- a/tests/simplecontent_restriction2_sup.py
+++ b/tests/simplecontent_restriction2_sup.py
@@ -625,6 +625,7 @@ class IdentifierType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.schemeDataURI = _cast(None, schemeDataURI)
         self.schemeID = _cast(None, schemeID)
         self.schemeAgencyName = _cast(None, schemeAgencyName)
@@ -670,6 +671,8 @@ class IdentifierType(GeneratedsSuper):
             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()
@@ -801,6 +804,7 @@ class BillOfResourcesIDType(IdentifierType):
     subclass = None
     superclass = IdentifierType
     def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None):
+        self.original_tagname_ = None
         super(BillOfResourcesIDType, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, )
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -824,6 +828,8 @@ class BillOfResourcesIDType(IdentifierType):
             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()
@@ -875,6 +881,7 @@ class BillOfMaterialIDType(IdentifierType):
     subclass = None
     superclass = IdentifierType
     def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None):
+        self.original_tagname_ = None
         super(BillOfMaterialIDType, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, )
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -898,6 +905,8 @@ class BillOfMaterialIDType(IdentifierType):
             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()
@@ -1011,9 +1020,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'IdentifierType'
         rootClass = IdentifierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1022,7 +1031,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="IdentifierType",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1041,7 +1050,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simplecontent_restriction2_sup import *\n\n')
 ##         sys.stdout.write('import simplecontent_restriction2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/simpletype_memberspecs1_sub.py b/tests/simpletype_memberspecs1_sub.py
index f917d7b94e834f63b96f262b690f0f75fec1f0db..91d67ee9b271dc22e13f99c47da52dc45539c8cd 100644
--- a/tests/simpletype_memberspecs1_sub.py
+++ b/tests/simpletype_memberspecs1_sub.py
@@ -163,9 +163,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'SpecialDate'
         rootClass = supermod.SpecialDate
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +174,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletype_memberspecs2_sup import *\n\n')
 ##         sys.stdout.write('import simpletype_memberspecs2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.SpecialDate(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="SpecialDate")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index 0ee76d83fabfda371e60ab86744b892fcd186b0f..77fe1ff1c607ff693d896f9686896ef85026143e 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -619,6 +619,7 @@ class SpecialDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, SpecialProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.SpecialProperty = _cast(None, SpecialProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -643,6 +644,8 @@ class SpecialDate(GeneratedsSuper):
             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()
@@ -701,6 +704,7 @@ class ExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -725,6 +729,8 @@ class ExtremeDate(GeneratedsSuper):
             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()
@@ -844,9 +850,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'SpecialDate'
         rootClass = SpecialDate
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -855,7 +861,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="SpecialDate",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
     return rootObj
 
@@ -874,7 +880,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletype_memberspecs2_sup import *\n\n')
 ##         sys.stdout.write('import simpletype_memberspecs2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/simpletype_memberspecs2_sub.py b/tests/simpletype_memberspecs2_sub.py
index f917d7b94e834f63b96f262b690f0f75fec1f0db..91d67ee9b271dc22e13f99c47da52dc45539c8cd 100644
--- a/tests/simpletype_memberspecs2_sub.py
+++ b/tests/simpletype_memberspecs2_sub.py
@@ -163,9 +163,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'SpecialDate'
         rootClass = supermod.SpecialDate
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +174,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletype_memberspecs2_sup import *\n\n')
 ##         sys.stdout.write('import simpletype_memberspecs2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.SpecialDate(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="SpecialDate")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/simpletype_memberspecs2_sup.py b/tests/simpletype_memberspecs2_sup.py
index 0ee76d83fabfda371e60ab86744b892fcd186b0f..77fe1ff1c607ff693d896f9686896ef85026143e 100644
--- a/tests/simpletype_memberspecs2_sup.py
+++ b/tests/simpletype_memberspecs2_sup.py
@@ -619,6 +619,7 @@ class SpecialDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, SpecialProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.SpecialProperty = _cast(None, SpecialProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -643,6 +644,8 @@ class SpecialDate(GeneratedsSuper):
             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()
@@ -701,6 +704,7 @@ class ExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
@@ -725,6 +729,8 @@ class ExtremeDate(GeneratedsSuper):
             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()
@@ -844,9 +850,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'SpecialDate'
         rootClass = SpecialDate
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -855,7 +861,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="SpecialDate",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
     return rootObj
 
@@ -874,7 +880,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletype_memberspecs2_sup import *\n\n')
 ##         sys.stdout.write('import simpletype_memberspecs2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/simpletypes_other1_sub.py b/tests/simpletypes_other1_sub.py
index 81260f7d724fc73e01de0f3dfd1732c505b06996..c2fae5de3105e00afced27f2c03d373a1aee6ba2 100644
--- a/tests/simpletypes_other1_sub.py
+++ b/tests/simpletypes_other1_sub.py
@@ -102,7 +102,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -122,7 +122,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -146,7 +146,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -163,9 +163,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +174,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletypes_other2_sup import *\n\n')
 ##         sys.stdout.write('import simpletypes_other2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.simpleTypeTests(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="simpleTypeTests")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py
index 3e58a68c7de6698092abbdcc597aa832b2387254..3088ea6edf203dc7c18bd87957eb195f7badbdd6 100644
--- a/tests/simpletypes_other1_sup.py
+++ b/tests/simpletypes_other1_sup.py
@@ -618,6 +618,7 @@ class simpleTypeTestsType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, simpleTypeTest=None):
+        self.original_tagname_ = None
         if simpleTypeTest is None:
             self.simpleTypeTest = []
         else:
@@ -644,6 +645,8 @@ class simpleTypeTestsType(GeneratedsSuper):
             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()
@@ -727,6 +730,7 @@ class simpleTypeTest(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None, integerVal1=None, integerVal2=None, stringVal1=None, stringVal2=None, booleanVal1=None, booleanVal2=None, decimalVal1=None, decimalVal2=None, doubleVal1=None, doubleVal2=None, floatVal1=None, floatVal2=None, dateVal1=None, dateVal2=None, dateTimeVal1=None, dateTimeVal2=None):
+        self.original_tagname_ = None
         self.datetime1 = datetime1
         self.datetime2 = datetime2
         self.datetime3 = datetime3
@@ -876,6 +880,8 @@ class simpleTypeTest(GeneratedsSuper):
             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()
@@ -1246,7 +1252,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1266,7 +1272,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1288,9 +1294,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1299,7 +1305,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="simpleTypeTests",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1309,7 +1315,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1318,7 +1324,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletypes_other2_sup import *\n\n')
 ##         sys.stdout.write('import simpletypes_other2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/simpletypes_other2_sub.py b/tests/simpletypes_other2_sub.py
index 81260f7d724fc73e01de0f3dfd1732c505b06996..c2fae5de3105e00afced27f2c03d373a1aee6ba2 100644
--- a/tests/simpletypes_other2_sub.py
+++ b/tests/simpletypes_other2_sub.py
@@ -102,7 +102,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -122,7 +122,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -146,7 +146,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -163,9 +163,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +174,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletypes_other2_sup import *\n\n')
 ##         sys.stdout.write('import simpletypes_other2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.simpleTypeTests(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="simpleTypeTests")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/simpletypes_other2_sup.py b/tests/simpletypes_other2_sup.py
index 3e58a68c7de6698092abbdcc597aa832b2387254..3088ea6edf203dc7c18bd87957eb195f7badbdd6 100644
--- a/tests/simpletypes_other2_sup.py
+++ b/tests/simpletypes_other2_sup.py
@@ -618,6 +618,7 @@ class simpleTypeTestsType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, simpleTypeTest=None):
+        self.original_tagname_ = None
         if simpleTypeTest is None:
             self.simpleTypeTest = []
         else:
@@ -644,6 +645,8 @@ class simpleTypeTestsType(GeneratedsSuper):
             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()
@@ -727,6 +730,7 @@ class simpleTypeTest(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None, integerVal1=None, integerVal2=None, stringVal1=None, stringVal2=None, booleanVal1=None, booleanVal2=None, decimalVal1=None, decimalVal2=None, doubleVal1=None, doubleVal2=None, floatVal1=None, floatVal2=None, dateVal1=None, dateVal2=None, dateTimeVal1=None, dateTimeVal2=None):
+        self.original_tagname_ = None
         self.datetime1 = datetime1
         self.datetime2 = datetime2
         self.datetime3 = datetime3
@@ -876,6 +880,8 @@ class simpleTypeTest(GeneratedsSuper):
             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()
@@ -1246,7 +1252,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1266,7 +1272,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1288,9 +1294,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1299,7 +1305,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="simpleTypeTests",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -1309,7 +1315,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1318,7 +1324,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletypes_other2_sup import *\n\n')
 ##         sys.stdout.write('import simpletypes_other2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/test.py b/tests/test.py
index 5d6762f8d0ab146994b7134face546b25f922de2..225770984b09b73bc52e4339c66f37f30a1c16c9 100755
--- a/tests/test.py
+++ b/tests/test.py
@@ -280,7 +280,7 @@ class GenTest(unittest.TestCase):
         result, err = self.execute(cmd)
         self.check_result(result, err, ())
 
-    def test_012_abstracttype(self):
+    def test_012_abstract_type(self):
         cmdTempl = (
             'python generateDS.py --no-dates --no-versions '
             '--silence --member-specs=list -f '
@@ -297,7 +297,7 @@ class GenTest(unittest.TestCase):
         result, err = self.execute(cmd)
         self.check_result(result, err, ())
 
-    def test_013_procincl(self):
+    def test_013_people_procincl(self):
         cmdTempl = (
             'python generateDS.py --no-dates --no-versions '
             '--silence --member-specs=list -f '
@@ -315,7 +315,7 @@ class GenTest(unittest.TestCase):
         result, err = self.execute(cmd)
         self.check_result(result, err, ())
 
-    def test_014_xsi_type(self):
+    def test_014_ipo(self):
         cmdTempl = (
             'python generateDS.py --no-dates --no-versions '
             '--member-specs=list -f '
@@ -494,6 +494,18 @@ class GenTest(unittest.TestCase):
             t_, t_, )
         result, err = self.execute(cmd)
         self.check_result(result, err, ('sys.stdout.write',))
+        cmd = 'diff OnePer/%sType01_1One.py OnePer/%sType01_2One.py' % (
+            t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ('sys.stdout.write',))
+        cmd = 'diff OnePer/%sType02_1One.py OnePer/%sType02_2One.py' % (
+            t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ('sys.stdout.write',))
+        cmd = 'diff OnePer/%sType03_1One.py OnePer/%sType03_2One.py' % (
+            t_, t_, )
+        result, err = self.execute(cmd)
+        self.check_result(result, err, ('sys.stdout.write',))
 
     def check_result(self, result, err, ignore_strings):
         self.failUnlessEqual(len(result), 0)
diff --git a/tests/to_etree1_sub.py b/tests/to_etree1_sub.py
index 1771174e34bcf18b74d5b7fc2b5608a114f8e7a1..c5dbe1b2573d5c49e478118f78ec79709b884b99 100644
--- a/tests/to_etree1_sub.py
+++ b/tests/to_etree1_sub.py
@@ -214,7 +214,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -234,7 +234,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -258,7 +258,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -275,9 +275,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -286,8 +286,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from to_etree2_sup import *\n\n')
 ##         sys.stdout.write('import to_etree2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.people(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="people")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index 9f729d22aa5fd10eacec0dfe51cfd7010a324fc9..3f0396272f6d4d9f249f491654572aa14454efb3 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -623,6 +623,7 @@ class peopleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -723,28 +724,34 @@ class peopleType(GeneratedsSuper):
             obj_ = commentsType.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, personType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'specialperson':
             obj_ = specialperson.factory()
             obj_.build(child_)
             self.specialperson.append(obj_)
+            obj_.original_tagname_ = 'specialperson'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmerType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmerType.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmerType.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
 # end class peopleType
 
 
@@ -757,6 +764,7 @@ class commentsType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -861,6 +869,7 @@ class personType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.vegetable = _cast(None, vegetable)
         self.fruit = _cast(None, fruit)
         self.ratio = _cast(float, ratio)
@@ -1041,15 +1050,18 @@ class personType(GeneratedsSuper):
             obj_ = hot_agent.factory()
             obj_.build(child_)
             self.hot_agent = obj_
+            obj_.original_tagname_ = 'hot.agent'
         elif nodeName_ == 'agent':
             class_obj_ = self.get_class_obj_(child_, agentType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = boosterType.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1072,8 +1084,8 @@ class specialperson(personType):
     subclass = None
     superclass = personType
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None):
+        self.original_tagname_ = None
         super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, )
-        pass
     def factory(*args_, **kwargs_):
         if specialperson.subclass:
             return specialperson.subclass(*args_, **kwargs_)
@@ -1132,6 +1144,7 @@ class programmerType(personType):
     subclass = None
     superclass = personType
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
         super(programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
@@ -1431,6 +1444,7 @@ class programmerType(personType):
             obj_ = paramType.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
@@ -1453,6 +1467,7 @@ class paramType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        self.original_tagname_ = None
         self.semantic = _cast(None, semantic)
         self.name = _cast(None, name)
         self.flow = _cast(None, flow)
@@ -1565,6 +1580,7 @@ class python_programmerType(programmerType):
     subclass = None
     superclass = programmerType
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, drcs_attr=None, nick_name=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None):
+        self.original_tagname_ = None
         super(python_programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.drcs_attr = _cast(None, drcs_attr)
         self.nick_name = _cast(None, nick_name)
@@ -1685,6 +1701,7 @@ class java_programmerType(programmerType):
     subclass = None
     superclass = programmerType
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None):
+        self.original_tagname_ = None
         super(java_programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.status = _cast(None, status)
         self.nick_name = _cast(None, nick_name)
@@ -1813,6 +1830,7 @@ class agentType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -1910,11 +1928,13 @@ class agentType(GeneratedsSuper):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         elif nodeName_ == 'vehicle':
             class_obj_ = self.get_class_obj_(child_, vehicleType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.vehicle.append(obj_)
+            obj_.original_tagname_ = 'vehicle'
 # end class agentType
 
 
@@ -1930,6 +1950,7 @@ class special_agentType(agentType):
     subclass = None
     superclass = agentType
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         super(special_agentType, self).__init__(firstname, lastname, priority, info, vehicle, )
         self.firstname = firstname
         self.lastname = lastname
@@ -2007,6 +2028,7 @@ class special_agentType(agentType):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         super(special_agentType, self).buildChildren(child_, node, nodeName_, True)
 # end class special_agentType
 
@@ -2023,6 +2045,7 @@ class weird_agentType(agentType):
     subclass = None
     superclass = agentType
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         super(weird_agentType, self).__init__(firstname, lastname, priority, info, vehicle, )
         self.firstname = firstname
         self.lastname = lastname
@@ -2100,6 +2123,7 @@ class weird_agentType(agentType):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         super(weird_agentType, self).buildChildren(child_, node, nodeName_, True)
 # end class weird_agentType
 
@@ -2118,6 +2142,7 @@ class boosterType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.member_id = _cast(None, member_id)
         self.firstname = firstname
         self.lastname = lastname
@@ -2261,6 +2286,7 @@ class boosterType(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
 # end class boosterType
 
 
@@ -2273,10 +2299,10 @@ class infoType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, rating=None, type_=None, name=None):
+        self.original_tagname_ = None
         self.rating = _cast(float, rating)
         self.type_ = _cast(int, type_)
         self.name = _cast(None, name)
-        pass
     def factory(*args_, **kwargs_):
         if infoType.subclass:
             return infoType.subclass(*args_, **kwargs_)
@@ -2348,6 +2374,7 @@ class vehicleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, wheelcount=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.wheelcount = wheelcount
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
@@ -2411,6 +2438,7 @@ class automobile(vehicleType):
     subclass = None
     superclass = vehicleType
     def __init__(self, wheelcount=None, drivername=None):
+        self.original_tagname_ = None
         super(automobile, self).__init__(wheelcount, )
         self.drivername = drivername
     def factory(*args_, **kwargs_):
@@ -2462,6 +2490,7 @@ class airplane(vehicleType):
     subclass = None
     superclass = vehicleType
     def __init__(self, wheelcount=None, pilotname=None):
+        self.original_tagname_ = None
         super(airplane, self).__init__(wheelcount, )
         self.pilotname = pilotname
     def factory(*args_, **kwargs_):
@@ -2516,6 +2545,7 @@ class hot_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname='empty\\name', lastname='no \'last\' name', priority=None, startDate=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -2615,6 +2645,7 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
@@ -2717,7 +2748,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2737,7 +2768,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2759,9 +2790,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2770,7 +2801,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="people",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -2780,7 +2811,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2789,7 +2820,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from to_etree2_sup import *\n\n')
 ##         sys.stdout.write('import to_etree2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/to_etree2_sub.py b/tests/to_etree2_sub.py
index 1771174e34bcf18b74d5b7fc2b5608a114f8e7a1..c5dbe1b2573d5c49e478118f78ec79709b884b99 100644
--- a/tests/to_etree2_sub.py
+++ b/tests/to_etree2_sub.py
@@ -214,7 +214,7 @@ def parse(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -234,7 +234,7 @@ def parseEtree(inFilename, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -258,7 +258,7 @@ def parseString(inString, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -275,9 +275,9 @@ def parseString(inString, silence=False):
 def parseLiteral(inFilename, silence=False):
     doc = parsexml_(inFilename)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -286,8 +286,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from to_etree2_sup import *\n\n')
 ##         sys.stdout.write('import to_etree2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.people(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="people")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
diff --git a/tests/to_etree2_sup.py b/tests/to_etree2_sup.py
index 9f729d22aa5fd10eacec0dfe51cfd7010a324fc9..3f0396272f6d4d9f249f491654572aa14454efb3 100644
--- a/tests/to_etree2_sup.py
+++ b/tests/to_etree2_sup.py
@@ -623,6 +623,7 @@ class peopleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -723,28 +724,34 @@ class peopleType(GeneratedsSuper):
             obj_ = commentsType.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, personType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'specialperson':
             obj_ = specialperson.factory()
             obj_.build(child_)
             self.specialperson.append(obj_)
+            obj_.original_tagname_ = 'specialperson'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmerType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmerType.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmerType.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
 # end class peopleType
 
 
@@ -757,6 +764,7 @@ class commentsType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -861,6 +869,7 @@ class personType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.vegetable = _cast(None, vegetable)
         self.fruit = _cast(None, fruit)
         self.ratio = _cast(float, ratio)
@@ -1041,15 +1050,18 @@ class personType(GeneratedsSuper):
             obj_ = hot_agent.factory()
             obj_.build(child_)
             self.hot_agent = obj_
+            obj_.original_tagname_ = 'hot.agent'
         elif nodeName_ == 'agent':
             class_obj_ = self.get_class_obj_(child_, agentType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = boosterType.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1072,8 +1084,8 @@ class specialperson(personType):
     subclass = None
     superclass = personType
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None):
+        self.original_tagname_ = None
         super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, )
-        pass
     def factory(*args_, **kwargs_):
         if specialperson.subclass:
             return specialperson.subclass(*args_, **kwargs_)
@@ -1132,6 +1144,7 @@ class programmerType(personType):
     subclass = None
     superclass = personType
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
         super(programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
@@ -1431,6 +1444,7 @@ class programmerType(personType):
             obj_ = paramType.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
@@ -1453,6 +1467,7 @@ class paramType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
+        self.original_tagname_ = None
         self.semantic = _cast(None, semantic)
         self.name = _cast(None, name)
         self.flow = _cast(None, flow)
@@ -1565,6 +1580,7 @@ class python_programmerType(programmerType):
     subclass = None
     superclass = programmerType
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, drcs_attr=None, nick_name=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None):
+        self.original_tagname_ = None
         super(python_programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.drcs_attr = _cast(None, drcs_attr)
         self.nick_name = _cast(None, nick_name)
@@ -1685,6 +1701,7 @@ class java_programmerType(programmerType):
     subclass = None
     superclass = programmerType
     def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None):
+        self.original_tagname_ = None
         super(java_programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.status = _cast(None, status)
         self.nick_name = _cast(None, nick_name)
@@ -1813,6 +1830,7 @@ class agentType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -1910,11 +1928,13 @@ class agentType(GeneratedsSuper):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         elif nodeName_ == 'vehicle':
             class_obj_ = self.get_class_obj_(child_, vehicleType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.vehicle.append(obj_)
+            obj_.original_tagname_ = 'vehicle'
 # end class agentType
 
 
@@ -1930,6 +1950,7 @@ class special_agentType(agentType):
     subclass = None
     superclass = agentType
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         super(special_agentType, self).__init__(firstname, lastname, priority, info, vehicle, )
         self.firstname = firstname
         self.lastname = lastname
@@ -2007,6 +2028,7 @@ class special_agentType(agentType):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         super(special_agentType, self).buildChildren(child_, node, nodeName_, True)
 # end class special_agentType
 
@@ -2023,6 +2045,7 @@ class weird_agentType(agentType):
     subclass = None
     superclass = agentType
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         super(weird_agentType, self).__init__(firstname, lastname, priority, info, vehicle, )
         self.firstname = firstname
         self.lastname = lastname
@@ -2100,6 +2123,7 @@ class weird_agentType(agentType):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         super(weird_agentType, self).buildChildren(child_, node, nodeName_, True)
 # end class weird_agentType
 
@@ -2118,6 +2142,7 @@ class boosterType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.member_id = _cast(None, member_id)
         self.firstname = firstname
         self.lastname = lastname
@@ -2261,6 +2286,7 @@ class boosterType(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
 # end class boosterType
 
 
@@ -2273,10 +2299,10 @@ class infoType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, rating=None, type_=None, name=None):
+        self.original_tagname_ = None
         self.rating = _cast(float, rating)
         self.type_ = _cast(int, type_)
         self.name = _cast(None, name)
-        pass
     def factory(*args_, **kwargs_):
         if infoType.subclass:
             return infoType.subclass(*args_, **kwargs_)
@@ -2348,6 +2374,7 @@ class vehicleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, wheelcount=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.wheelcount = wheelcount
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
@@ -2411,6 +2438,7 @@ class automobile(vehicleType):
     subclass = None
     superclass = vehicleType
     def __init__(self, wheelcount=None, drivername=None):
+        self.original_tagname_ = None
         super(automobile, self).__init__(wheelcount, )
         self.drivername = drivername
     def factory(*args_, **kwargs_):
@@ -2462,6 +2490,7 @@ class airplane(vehicleType):
     subclass = None
     superclass = vehicleType
     def __init__(self, wheelcount=None, pilotname=None):
+        self.original_tagname_ = None
         super(airplane, self).__init__(wheelcount, )
         self.pilotname = pilotname
     def factory(*args_, **kwargs_):
@@ -2516,6 +2545,7 @@ class hot_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname='empty\\name', lastname='no \'last\' name', priority=None, startDate=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -2615,6 +2645,7 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
@@ -2717,7 +2748,7 @@ def parse(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2737,7 +2768,7 @@ def parseEtree(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2759,9 +2790,9 @@ def parseString(inString, silence=False):
     from StringIO import StringIO
     doc = parsexml_(StringIO(inString))
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2770,7 +2801,7 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="people",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
@@ -2780,7 +2811,7 @@ def parseLiteral(inFileName, silence=False):
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2789,7 +2820,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from to_etree2_sup import *\n\n')
 ##         sys.stdout.write('import to_etree2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index 6bdd14579fbda62c8788871865f789159bc76ec5..20364ff954c383f4e55666177284be5ff9f7df16 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.12b</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12c</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">February 10, 2014</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 18, 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-02-10 22:19 UTC.
+Generated on: 2014-03-18 20:35 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 7ec816e0bbedd24bc9b4d380cfc3c982acff8e61..c84446bfb8bb06f2b0ca5789d3f31b01d9b205bd 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.12b
+:revision: 2.12c
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index cc32d31d335966a04b4b308df3cafcc208470ab2..bc1fc6b45e7b182561537dee010543f6c8cb9534 100644
Binary files a/tutorial/generateds_tutorial.zip and b/tutorial/generateds_tutorial.zip differ