From b9a387bee39de8716f9bec58cd929f53cf20f49e Mon Sep 17 00:00:00 2001
From: dkuhlman <none@none>
Date: Thu, 20 Mar 2014 14:27:41 -0700
Subject: [PATCH] Preliminary to release of v 2.12c

---
 README                                  |  30 +
 generateDS.html                         |  31 +-
 generateDS.py                           | 172 +++--
 generateDS.txt                          |  27 +-
 gui/generateds_gui.py                   |   2 +-
 libgenerateDS/gui/generateds_gui.py     |   2 +-
 librarytemplate-1.0a.zip                | Bin 13398 -> 13463 bytes
 librarytemplate_howto.html              |   6 +-
 librarytemplate_howto.txt               |   2 +-
 process_includes.py                     |  55 +-
 setup.py                                |   2 +-
 tests/OnePer/oneperType00_1One.py       |  19 +-
 tests/OnePer/oneperType00_2One.py       |  19 +-
 tests/OnePer/oneperType01_1One.py       |  21 +-
 tests/OnePer/oneperType01_2One.py       |  21 +-
 tests/OnePer/oneperType02_1One.py       |  21 +-
 tests/OnePer/oneperType02_2One.py       |  21 +-
 tests/OnePer/oneperType03_1One.py       | 916 ++++++++++++++++++++++++
 tests/OnePer/oneperType03_2One.py       | 916 ++++++++++++++++++++++++
 tests/abstract_type1_sub.py             |  14 +-
 tests/abstract_type1_sup.py             |  29 +-
 tests/abstract_type2_sub.py             |  14 +-
 tests/abstract_type2_sup.py             |  29 +-
 tests/annotations1_sub.py               |  14 +-
 tests/annotations1_sup.py               |  25 +-
 tests/annotations2_sub.py               |  14 +-
 tests/annotations2_sup.py               |  25 +-
 tests/anonymous_type1_sub.py            |   8 +-
 tests/anonymous_type1_sup.py            |  23 +-
 tests/anonymous_type2_sub.py            |   8 +-
 tests/anonymous_type2_sup.py            |  23 +-
 tests/anysimpletype1_sub.py             |   8 +-
 tests/anysimpletype1_sup.py             |  15 +-
 tests/anysimpletype2_sub.py             |   8 +-
 tests/anysimpletype2_sup.py             |  15 +-
 tests/anywildcard1_sub.py               |   8 +-
 tests/anywildcard1_sup.py               |  28 +-
 tests/anywildcard2_sub.py               |   8 +-
 tests/anywildcard2_sup.py               |  28 +-
 tests/attr_groups1_sub.py               |  14 +-
 tests/attr_groups1_sup.py               |  17 +-
 tests/attr_groups2_sub.py               |  14 +-
 tests/attr_groups2_sup.py               |  17 +-
 tests/catalogtest.xsd                   |   6 +
 tests/catalogtest1_sub.py               |   8 +-
 tests/catalogtest1_sup.py               |  11 +-
 tests/catalogtest2_sub.py               |   8 +-
 tests/catalogtest2_sup.py               |  11 +-
 tests/extensions1_sub.py                |  14 +-
 tests/extensions1_sup.py                |  52 +-
 tests/extensions2_sub.py                |  14 +-
 tests/extensions2_sup.py                |  52 +-
 tests/ipo1_sub.py                       |  14 +-
 tests/ipo1_sup.py                       |  39 +-
 tests/ipo2_sub.py                       |  14 +-
 tests/ipo2_sup.py                       |  39 +-
 tests/literal1.py                       |   2 +-
 tests/oneper00.xsd                      |   1 +
 tests/oneper03.xsd                      |  26 +
 tests/out1_sub.py                       |   8 +-
 tests/out1_sup.py                       |  56 +-
 tests/out2_sub.py                       |   8 +-
 tests/out2_sup.py                       |  56 +-
 tests/people_procincl1_sub.py           |   8 +-
 tests/people_procincl1_sup.py           |  71 +-
 tests/people_procincl2_sub.py           |   8 +-
 tests/people_procincl2_sup.py           |  71 +-
 tests/people_procincl_a.xsd             |   2 +-
 tests/recursive_simpletype1_sub.py      |  14 +-
 tests/recursive_simpletype1_sup.py      |  17 +-
 tests/recursive_simpletype2_sub.py      |  14 +-
 tests/recursive_simpletype2_sup.py      |  17 +-
 tests/simplecontent_restriction1_sub.py |   8 +-
 tests/simplecontent_restriction1_sup.py |  17 +-
 tests/simplecontent_restriction2_sub.py |   8 +-
 tests/simplecontent_restriction2_sup.py |  17 +-
 tests/simpletype_memberspecs1_sub.py    |   8 +-
 tests/simpletype_memberspecs1_sup.py    |  14 +-
 tests/simpletype_memberspecs2_sub.py    |   8 +-
 tests/simpletype_memberspecs2_sup.py    |  14 +-
 tests/simpletypes_other1_sub.py         |  14 +-
 tests/simpletypes_other1_sup.py         |  20 +-
 tests/simpletypes_other2_sub.py         |  14 +-
 tests/simpletypes_other2_sup.py         |  20 +-
 tests/test.py                           |  18 +-
 tests/to_etree1_sub.py                  |  14 +-
 tests/to_etree1_sup.py                  |  49 +-
 tests/to_etree2_sub.py                  |  14 +-
 tests/to_etree2_sup.py                  |  49 +-
 tutorial/generateds_tutorial.html       |   6 +-
 tutorial/generateds_tutorial.txt        |   2 +-
 tutorial/generateds_tutorial.zip        | Bin 48768 -> 48764 bytes
 92 files changed, 3128 insertions(+), 536 deletions(-)
 create mode 100644 tests/OnePer/oneperType03_1One.py
 create mode 100644 tests/OnePer/oneperType03_2One.py
 create mode 100644 tests/catalogtest.xsd
 create mode 100644 tests/oneper03.xsd

diff --git a/README b/README
index 59de3a6..ff0b783 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 1dee987..2964650 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 b3356e6..cc7a168 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 fd36e6d..0f2f866 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 da34cc6..f080d53 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 da34cc6..f080d53 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
GIT binary patch
delta 892
zcmcbXF+Gznz?+$civa|jQnOtq@@aGMq{|1prpX6Sbo6C^#TV}b#1kE)Ca$+<ZCK#q
z(=d6Xp2%baHIB{vjCw-sR!Z(ZK)l&S_&FoHhO)a45N|dTJ;s8jSW@aRBm187E<Qj!
z`LXnTHi*faJ7jtp1s#AkpP3_i_6#EfLkkN7gTiD%Vadt%a{Tq|K(~N!X$3a}Bg+eB
z1_m&(G{`%Dwu8XF_v>dQR~sy`jrz23mGV;o@4z`;Z%;-|+gN_JR-uezfyV#6hn-}S
zidTpnX>6VO{$$$cmEL>yxGcSRvUxgReEeF?BhLlQopKCU-3m!*5*MGp?&Sj0YfWy^
zjRHyHSuBtH7uJ`3s;X!DDJ&Imso6EMy5Mk^j+1ji<GB^4>yAD>WKr$Zzg6YVyUnZS
ztC<FFJ@<KA?&cu7$M@Z$)oaCG1=~qqf1=a;k7wS6V3Fd?)!w{s3J%1tec<_c>Vcq1
zEr)(w`Vnm7t@SX1U7aB#@#*(>a>vYXGQ~O{JJ$I@++O<C!y6T*^(m5!o~Z|JItfoK
zR<|`UIPavbH>LNe%fzRt0fzDl+Z|2&e3$1nyl36cQ0~9G+D+G<CtGr%!x!V}o(K0`
zI##~tYuKfUj~SeKCU`yEeDv#*hXE$Xrv1F&a4z}AQX{pgizfxX5cpOdWXQ_3)=Voh
z?fc^WCv@VcNk3k*&*?PRJ=XncA3ee&ZI-;7ku|@s^Xw0gOWHQk{b$rVJDrb2Dmm01
z-Cy}<e$)9Httl3dt6z8)uX&lP^w3Y7(cS)xT`1QE_dgu7?eG1&@h;E!RflEk4&#YV
zce`))|NXn{^`{bksd>gfrrq^0jQh_p`GdSG`>a+MA0P%MwasA)&fF}Z<T!b*wj~QF
zJx=D=6`dTQ!#4S=wiDy4$^Z4`CWq<xGJ+DL+~z|%GK`E?lke+hFauNHWJUv-$!U6C
zV9A@zp!D`oS7!1`{ZO#R4}7SpZSr3OOBPTPgIf`5D92=|FnOVY<m5g>0mfOA=NsBE
z^+E*VjJPK=8aXk&gmJ@}wkZOYN=!a)6u=~+Hd)a)l__5hC?YpGLrq}vHe&}SP7SbG
PAgwYcCT!=lL75Ez5XEjO

delta 840
zcmbQ9c`bu4z?+$civa{ShOyaB<kRMm^NI0!0mKs>eOX`f#rvF@>|h`=xnF@};(B|I
z`UNgNr?+_mC51P0GMWf6T25ZbE512Y_!=X-y0W{^r0t%YjYN;JpePiUI?2es`@D;f
zz%|dwkEQ3cfs8%Lv$;d2mr?LQ^f#O3`2qIbj0_C_nHd-qCJPEnPPUihuUGH$@LBN8
z)2Fn8n}Lz#1yBx5ES+TUf7n3aXnB2?bYjLP<x&Tc&PK0}CYIo*R^d4h?I+d-N-g|!
zbEgHP*KEd>VQo(yRqro9Kkxkcs7H^LHGBQm?Je1HKYFv^bIo(D5eY#TucS1IyYKfa
zydahBxOlB2$3`B(gFkXR{Oad@>sMO8kWtk(V#>wl*U?YZOjz7st&#fZC1cK0eg8u8
zl$P$$!1Bj_z9I2bQ*Uo`J#u$lz`?2WuU0Q!J9(eYiwjS5Uf*N!f1%mwT)sJ3+9suc
z#@Pp+k2{ZhO={`=IQ3)x%j2P}w<YE<Ea;pz{i!X_)Fh_s6E<eD*nQr;kZ)UWczx|0
z&IuumGWsT*mQ|N*8!d&|A3I%*IMcCcO_Nuu{!Wfng*GL2au3pzZY@mJ;E(<LWdF9{
zd3;g1A<s5XWt?{7<k6CvoIgTQcFXSf?6bUdRqVQ@huhju>B}VNdsMXs^ez*=tYT=f
zr0&Igqk!<wTfP5#{%&9H)XKi6z0YL%#MP3jhZz02_&yudo)J%I{Sm&cX3yR@oqX<F
zg2t^oj60p)966{feO-LAp@J*N%vKkl?ch`)xp}&RGdBw;Els|sZ8=%lSbnmZjuYcc
zU?P&6JYC0^seZxahlb*l6O7n4GwaGQ0uzveUIvr8@?=Fl@yP}{Y?GJkc_As9ETF%e
zY4>@Up2@HDL&1i9;6qI~lkE&GnSm*0vcIm_<Ozl<%pc?#CL5}WPd;ZT$T)NI14A2T
z9|efWJR_dTPDW15E8zSH=2At7oPcov^JP^KTV-;)u>+&t<V0i1$&1y*CVw|}U_POa
OFd^2&gsoQ_lyLy=98Wd?

diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 90c6887..f6402d7 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 121f1b1..7cacd25 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 4786776..93804d7 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 e914720..994ca23 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 b6e3ec6..62995b4 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 b6e3ec6..62995b4 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 8ba5e59..1778f19 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 8ba5e59..1778f19 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 cebe79b..7c16cb5 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 cebe79b..7c16cb5 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 0000000..bc8778e
--- /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 0000000..bc8778e
--- /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 c8c5af4..296f07a 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 fda613f..0ef7f20 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 c8c5af4..296f07a 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 fda613f..0ef7f20 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 63d361b..4e78079 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 8cb90a9..9dc54cf 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 63d361b..4e78079 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 8cb90a9..9dc54cf 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 f608777..6e42385 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 075399b..e387d1d 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 f608777..6e42385 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 075399b..e387d1d 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 e79e857..77a78a8 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 acb7ba3..e00caa9 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 e79e857..77a78a8 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 acb7ba3..e00caa9 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 cc4939c..bc32d27 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 b7314e1..029710e 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 cc4939c..bc32d27 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 b7314e1..029710e 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 bc8d0a6..f2af2d9 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 6ee8428..4b82c99 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 bc8d0a6..f2af2d9 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 6ee8428..4b82c99 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 0000000..adb07af
--- /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 0b153ec..21995ba 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 5baef46..a2e8f03 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 0b153ec..21995ba 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 5baef46..a2e8f03 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 46cfd20..ad5c267 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 f3f1375..aa979fd 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 46cfd20..ad5c267 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 f3f1375..aa979fd 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 f973bb7..8140d69 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 47d0c7d..581fbea 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 f973bb7..8140d69 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 47d0c7d..581fbea 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 6e24702..8c46e92 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 0193a4b..7456aef 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 0000000..dc4f1df
--- /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 ad7595f..2292a32 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 fcba530..4fee2b3 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 ad7595f..2292a32 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 fcba530..4fee2b3 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 c3b5be6..55e0f42 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 87f7ddc..a3cc5d1 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 c3b5be6..55e0f42 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 87f7ddc..a3cc5d1 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 6fad497..d637f39 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 db59f2a..48dee5d 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 181be29..8e08f9b 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 db59f2a..48dee5d 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 181be29..8e08f9b 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 f986e75..99b68be 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 74e9032..e249811 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 f986e75..99b68be 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 74e9032..e249811 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 f917d7b..91d67ee 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 0ee76d8..77fe1ff 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 f917d7b..91d67ee 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 0ee76d8..77fe1ff 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 81260f7..c2fae5d 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 3e58a68..3088ea6 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 81260f7..c2fae5d 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 3e58a68..3088ea6 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 5d6762f..2257709 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 1771174..c5dbe1b 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 9f729d2..3f03962 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 1771174..c5dbe1b 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 9f729d2..3f03962 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 6bdd145..20364ff 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 7ec816e..c84446b 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
GIT binary patch
delta 11848
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

delta 11773
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

-- 
GitLab