diff --git a/Demos/Outline/README b/Demos/Outline/README
deleted file mode 100644
index 735e13681f9d6911c7f2c7b2fae30b1ff11e0e0e..0000000000000000000000000000000000000000
--- a/Demos/Outline/README
+++ /dev/null
@@ -1,32 +0,0 @@
-
-This directory contains a small example of the use of
-generateDS.py.  It contains the following:
-
-- outline.xsd -- The XML Schema file used to generate Python data
-  representation classes.
-
-- outline.py -- This file was generated by running:
-
-    python generateDS.py -o outline.py outline.xsd
-
-- outline_extended.py -- This file was produced by generating a
-  subclass file, then adding methods that show the outline in a
-  brief format.  It was initially generated by running:
-
-    python generateDS.py -s outline_extended.py outline.xsd
-
-  and then was edited to add the extensions.
-  
-- outline.xml -- A sample data file used the test the generated
-  Python code.  Run either of the following:
-
-    python outline.py outline.xml
-    python outline_extended.py outline.xml
-
-
-
-Dave Kuhlman
-dkuhlman@rexx.com
-http://www.rexx.com/~dkuhlman
-
-
diff --git a/Demos/Outline/README.txt b/Demos/Outline/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5d871ddb3c073447a9188f5c8771f67a13fca0be
--- /dev/null
+++ b/Demos/Outline/README.txt
@@ -0,0 +1,32 @@
+Outline -- a demo for generateDS.py
+=====================================
+
+This directory contains a small example of the use of `generateDS.py`.
+It demonstrates the use of a generated subclass file to add extended
+behavior to the code generated by `generateDS.py`.  It contains the
+following:
+
+- outline.xsd -- The XML Schema file used to generate Python data
+  representation classes.
+
+- outline.py -- This file was generated by using the "-o" command
+  line option for `generateDS.py`.
+
+	  python ../../generateDS.py -o outline.py outline.xsd
+
+- outline_extended.py -- This file was produced by generating a
+  subclass file.  See use of "-s" and "--super" command line
+  options, above.  Then we add methods that show the outline in a
+  brief format.  The file was originally produced with the following
+  command, *but* you might want to save the extensions in that file
+  before regenerating it:
+
+	  python ../../generateDS.py -o outline.py -s outline_extended.py --super="outline" outline.xsd
+
+- outline.xml -- A sample data file used to test the generated
+  Python code.  Run either of the following:
+
+    python outline.py outline.xml
+    python outline_extended.py outline.xml
+
+.. vim:ft=rst:
diff --git a/Demos/Outline/outline.py b/Demos/Outline/outline.py
index 3f874fabd642b77dd644ae0a90b2a025366d8e13..33e658cb50b14313cf9217f1f7e9dc572c311cb8 100644
--- a/Demos/Outline/outline.py
+++ b/Demos/Outline/outline.py
@@ -1,212 +1,1066 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 #
-# Generated Mon Aug 18 17:09:37 2003 by generateDS.py.
+# Generated Thu Jul 19 13:39:44 2018 by generateDS.py version 2.29.17.
+# Python 2.7.15 |Anaconda custom (64-bit)| (default, May  1 2018, 23:32:55)  [GCC 7.2.0]
+#
+# Command line options:
+#   ('-o', 'outline.py')
+#   ('-s', 'outline_extended.py')
+#   ('--super', 'outline')
+#
+# Command line arguments:
+#   outline.xsd
+#
+# Command line:
+#   ../../generateDS.py -o "outline.py" -s "outline_extended.py" --super="outline" outline.xsd
+#
+# Current working directory (os.getcwd()):
+#   Outline
 #
 
 import sys
-import getopt
-from xml.dom import minidom
-from xml.dom import Node
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+def parsexmlstring_(instring, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    element = etree_.fromstring(instring, parser=parser, **kwargs)
+    return element
+
+#
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
+#
+# The root super-class for element type classes
+#
+# 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 as 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=None, 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=None, 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=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, 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=None, 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
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @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()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                if ExternalEncoding:
+                    encoding = ExternalEncoding
+                else:
+                    encoding = 'utf-8'
+                return instring.encode(encoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+        def __eq__(self, other):
+            if type(self) != type(other):
+                return False
+            return self.__dict__ == other.__dict__
+        def __ne__(self, other):
+            return not self.__eq__(other)
+    
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
 
 #
 # If you have installed IPython you can uncomment and use the following.
-# IPython is available from http://www-hep.colorado.edu/~fperez/ipython.
+# IPython is available from http://ipython.scipy.org/.
 #
-#from IPython.Shell import IPythonShellEmbed
-#IPShell = IPythonShellEmbed('-nosep',
-#    banner = 'Entering interpreter.  Ctrl-D to exit.',
-#    exit_msg = 'Leaving Interpreter.')
 
-# Use the following line where and when you want to drop into the
+## 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(vars(), '<a msg>')
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = ''
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
 #
 
-def showIndent(outfile, level):
-    for idx in range(level):
-        outfile.write('    ')
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
 
 def quote_xml(inStr):
-    s1 = inStr
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) 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):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    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=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,
+            optional=0, child_attrs=None, choice=None):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+        self.child_attrs = child_attrs
+        self.choice = choice
+        self.optional = optional
+    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 set_child_attrs(self, child_attrs): self.child_attrs = child_attrs
+    def get_child_attrs(self): return self.child_attrs
+    def set_choice(self, choice): self.choice = choice
+    def get_choice(self): return self.choice
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
 #
 # Data representation classes.
 #
 
-class outline:
+
+class outline(GeneratedsSuper):
     subclass = None
-    def __init__(self, name='', description='', children=None):
+    superclass = None
+    def __init__(self, name=None, description=None, child=None):
+        self.original_tagname_ = None
         self.name = name
         self.description = description
-        if children is None:
-            self.children = []
+        if child is None:
+            self.child = []
         else:
-            self.children = children
-    def factory(*args):
+            self.child = child
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, outline)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if outline.subclass:
-            return apply(outline.subclass, args)
+            return outline.subclass(*args_, **kwargs_)
         else:
-            return apply(outline, args)
+            return outline(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def getName(self): return self.name
-    def setName(self, name): self.name = name
-    def getDescription(self): return self.description
-    def setDescription(self, description): self.description = description
-    def getChildren(self): return self.children
-    def addChildren(self, value): self.children.append(value)
-    def setChildren(self, index, value): self.children[index] = value
-    def export(self, outfile, level):
-        showIndent(outfile, level)
-        outfile.write('<outline>\n')
-        level += 1
-        showIndent(outfile, level)
-        outfile.write('<name>%s</name>\n' % quote_xml(self.getName()))
-        showIndent(outfile, level)
-        outfile.write('<description>%s</description>\n' % quote_xml(self.getDescription()))
-        for children in self.children:
-            children.export(outfile, level)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('</outline>\n')
-    def build(self, node_):
-        attrs = node_.attributes
-        for child in node_.childNodes:
-            if child.nodeType == Node.ELEMENT_NODE and \
-                child.nodeName == 'name':
-                name = ''
-                for text_ in child.childNodes:
-                    name += text_.nodeValue
-                self.name = name
-            elif child.nodeType == Node.ELEMENT_NODE and \
-                child.nodeName == 'description':
-                description = ''
-                for text_ in child.childNodes:
-                    description += text_.nodeValue
-                self.description = description
-            elif child.nodeType == Node.ELEMENT_NODE and \
-                child.nodeName == 'node':
-                obj = node.factory()
-                obj.build(child)
-                self.children.append(obj)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_description(self): return self.description
+    def set_description(self, description): self.description = description
+    def get_child(self): return self.child
+    def set_child(self, child): self.child = child
+    def add_child(self, value): self.child.append(value)
+    def insert_child_at(self, index, value): self.child.insert(index, value)
+    def replace_child_at(self, index, value): self.child[index] = value
+    def hasContent_(self):
+        if (
+            self.name is not None or
+            self.description is not None or
+            self.child
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='outline', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('outline')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='outline')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='outline', 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_='outline'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='outline', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.name is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<name>%s</name>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), eol_))
+        if self.description is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<description>%s</description>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), eol_))
+        for child_ in self.child:
+            child_.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print)
+    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_ == 'name':
+            name_ = child_.text
+            name_ = self.gds_validate_string(name_, node, 'name')
+            self.name = name_
+        elif nodeName_ == 'description':
+            description_ = child_.text
+            description_ = self.gds_validate_string(description_, node, 'description')
+            self.description = description_
+        elif nodeName_ == 'child':
+            obj_ = nodeType.factory()
+            obj_.build(child_)
+            self.child.append(obj_)
+            obj_.original_tagname_ = 'child'
 # end class outline
 
 
-class node:
+class nodeType(GeneratedsSuper):
     subclass = None
-    def __init__(self, label='', text='', children=None, hidden=''):
+    superclass = None
+    def __init__(self, hidden=None, label=None, text=None, child=None):
+        self.original_tagname_ = None
+        self.hidden = _cast(None, hidden)
         self.label = label
         self.text = text
-        if children is None:
-            self.children = []
+        if child is None:
+            self.child = []
         else:
-            self.children = children
-        self.hidden = hidden
-    def factory(*args):
-        if node.subclass:
-            return apply(node.subclass, args)
+            self.child = child
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, nodeType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if nodeType.subclass:
+            return nodeType.subclass(*args_, **kwargs_)
         else:
-            return apply(node, args)
+            return nodeType(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def getLabel(self): return self.label
-    def setLabel(self, label): self.label = label
-    def getText(self): return self.text
-    def setText(self, text): self.text = text
-    def getChildren(self): return self.children
-    def addChildren(self, value): self.children.append(value)
-    def setChildren(self, index, value): self.children[index] = value
-    def getHidden(self): return self.hidden
-    def setHidden(self, hidden): self.hidden = hidden
-    def export(self, outfile, level):
-        showIndent(outfile, level)
-        if self.hidden:
-            outfile.write('<node hidden="%s">\n' % (self.hidden, ))
-        else:
-            outfile.write('<node>\n')
-        level += 1
-        showIndent(outfile, level)
-        outfile.write('<label>%s</label>\n' % quote_xml(self.getLabel()))
-        showIndent(outfile, level)
-        outfile.write('<text>%s</text>\n' % quote_xml(self.getText()))
-        for children in self.children:
-            children.export(outfile, level)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('</node>\n')
-    def build(self, node_):
-        attrs = node_.attributes
-        if attrs.get('hidden'):
-            self.hidden = attrs.get('hidden').value
-        for child in node_.childNodes:
-            if child.nodeType == Node.ELEMENT_NODE and \
-                child.nodeName == 'label':
-                label = ''
-                for text_ in child.childNodes:
-                    label += text_.nodeValue
-                self.label = label
-            elif child.nodeType == Node.ELEMENT_NODE and \
-                child.nodeName == 'text':
-                text = ''
-                for text_ in child.childNodes:
-                    text += text_.nodeValue
-                self.text = text
-            elif child.nodeType == Node.ELEMENT_NODE and \
-                child.nodeName == 'node':
-                obj = node.factory()
-                obj.build(child)
-                self.children.append(obj)
-# end class node
+    def get_label(self): return self.label
+    def set_label(self, label): self.label = label
+    def get_text(self): return self.text
+    def set_text(self, text): self.text = text
+    def get_child(self): return self.child
+    def set_child(self, child): self.child = child
+    def add_child(self, value): self.child.append(value)
+    def insert_child_at(self, index, value): self.child.insert(index, value)
+    def replace_child_at(self, index, value): self.child[index] = value
+    def get_hidden(self): return self.hidden
+    def set_hidden(self, hidden): self.hidden = hidden
+    def hasContent_(self):
+        if (
+            self.label is not None or
+            self.text is not None or
+            self.child
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='nodeType', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('nodeType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='nodeType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='nodeType', 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_='nodeType'):
+        if self.hidden is not None and 'hidden' not in already_processed:
+            already_processed.add('hidden')
+            outfile.write(' hidden=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.hidden), input_name='hidden')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='nodeType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.label is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<label>%s</label>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.label), input_name='label')), eol_))
+        if self.text is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<text>%s</text>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.text), input_name='text')), eol_))
+        for child_ in self.child:
+            child_.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print)
+    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):
+        value = find_attr_value_('hidden', node)
+        if value is not None and 'hidden' not in already_processed:
+            already_processed.add('hidden')
+            self.hidden = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'label':
+            label_ = child_.text
+            label_ = self.gds_validate_string(label_, node, 'label')
+            self.label = label_
+        elif nodeName_ == 'text':
+            text_ = child_.text
+            text_ = self.gds_validate_string(text_, node, 'text')
+            self.text = text_
+        elif nodeName_ == 'child':
+            obj_ = nodeType.factory()
+            obj_.build(child_)
+            self.child.append(obj_)
+            obj_.original_tagname_ = 'child'
+# end class nodeType
+
+
+GDSClassesMapping = {
+}
 
 
 USAGE_TEXT = """
-Usage: python <Parser>.py <in_xml_file>
+Usage: python <Parser>.py [ -s ] <in_xml_file>
 """
 
+
 def usage():
-    print USAGE_TEXT
-    sys.exit(-1)
+    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):
-    doc = minidom.parse(inFileName)
-    rootNode = doc.childNodes[0]
-    rootObj = outline.factory()
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'outline'
+        rootClass = outline
+    rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('<?xml version="1.0" ?>')
-    rootObj.export(sys.stdout, 0)
+    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 parseString(inString):
-    doc = minidom.parseString(inString)
-    rootNode = doc.childNodes[0]
-    rootObj = outline.factory()
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'outline'
+        rootClass = outline
+    rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0)
+    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):
+    '''Parse a string, create the object tree, and export it.
+
+    Arguments:
+    - inString -- A string.  This XML fragment should not start
+      with an XML declaration containing an encoding.
+    - silence -- A boolean.  If False, export the object.
+    Returns -- The root object in the tree.
+    '''
+    parser = None
+    rootNode= parsexmlstring_(inString, parser)
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'outline'
+        rootClass = outline
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    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):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'outline'
+        rootClass = outline
+    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 outline import *\n\n')
+        sys.stdout.write('import outline 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:
+    if len(args) == 1:
+        parse(args[0])
+    else:
         usage()
-    parse(args[0])
 
 
 if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
     main()
-    #import pdb
-    #pdb.run('main()')
 
+
+__all__ = [
+    "nodeType",
+    "outline"
+]
diff --git a/Demos/Outline/outline.xsd b/Demos/Outline/outline.xsd
index 029adea88218a88df6db4439c0010629d839df46..e46077467ddbf45c26306297a1a9e1d73fc1984d 100644
--- a/Demos/Outline/outline.xsd
+++ b/Demos/Outline/outline.xsd
@@ -6,17 +6,17 @@
             <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:element name="description" type="xs:string"/>
-                <xs:element name="child" maxOccurs="unbounded" type="node"/>
+                <xs:element name="child" maxOccurs="unbounded" type="nodeType"/>
 			</xs:sequence>
         </xs:complexType>
     </xs:element>
 
-    <xs:element name="node">
+    <xs:element name="nodeType">
         <xs:complexType>
             <xs:sequence>
                 <xs:element name="label" type="xs:string"/>
                 <xs:element name="text" type="xs:string"/>
-                <xs:element name="child" type="node" maxOccurs="unbounded"/>
+                <xs:element name="child" type="nodeType" maxOccurs="unbounded"/>
 			</xs:sequence>
             <xs:attribute name="hidden" type="xs:string" />
         </xs:complexType>
diff --git a/Demos/Outline/outline_extended.py b/Demos/Outline/outline_extended.py
index c06b218020d70299280c3eeec6743c7637d68041..698c103b9242f866d3603641e0dd71333c2f2f7a 100644
--- a/Demos/Outline/outline_extended.py
+++ b/Demos/Outline/outline_extended.py
@@ -1,14 +1,43 @@
 #!/usr/bin/env python
 
 #
-# Generated Mon Aug 18 17:12:21 2003 by generateDS.py.
+# Generated Thu Jul 19 13:39:44 2018 by generateDS.py version 2.29.17.
+# Python 2.7.15 |Anaconda custom (64-bit)| (default, May  1 2018, 23:32:55)  [GCC 7.2.0]
+#
+# Command line options:
+#   ('-o', 'outline.py')
+#   ('-s', 'outline_extended.py')
+#   ('--super', 'outline')
+#
+# Command line arguments:
+#   outline.xsd
+#
+# Command line:
+#   ../../generateDS.py -o "outline.py" -s "outline_extended.py" --super="outline" outline.xsd
+#
+# Current working directory (os.getcwd()):
+#   Outline
 #
 
 import sys
-from xml.dom import minidom
+from lxml import etree as etree_
 
 import outline as supermod
 
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = ''
+
 #
 # Support/utility functions.
 #
@@ -18,59 +47,147 @@ def showIndent(outfile, level):
         outfile.write('    ')
 
 
+#
+# Data representation classes
+#
+
+
 class outlineSub(supermod.outline):
-    def __init__(self, name='', description='', children=None):
-        supermod.outline.__init__(self, name, description, children)
+    def __init__(self, name=None, description=None, child=None):
+        super(outlineSub, self).__init__(name, description, child, )
     def show(self, outfile, level):
         outfile.write('==========================================\n')
         outfile.write('Outline name: %s\n' % self.name)
         outfile.write('Outline description: %s\n' % self.description)
         outfile.write('==========================================\n')
-        for child in self.children:
+        for child in self.child:
             child.show(outfile, level)
         outfile.write('==========================================\n')
 supermod.outline.subclass = outlineSub
 # end class outlineSub
 
 
-class nodeSub(supermod.node):
-    def __init__(self, label='', text='', children=None, hidden=''):
-        supermod.node.__init__(self, label, text, children, hidden)
+class nodeTypeSub(supermod.nodeType):
+    def __init__(self, hidden=None, label=None, text=None, child=None):
+        super(nodeTypeSub, self).__init__(hidden, label, text, child, )
     def show(self, outfile, level):
         if self.hidden == 't':
             return
         showIndent(outfile, level)
         outfile.write('%s.  %s\n' % (self.label, self.text))
-        for child in self.children:
+        for child in self.child:
             child.show(outfile, level + 1)
-supermod.node.subclass = nodeSub
-# end class nodeSub
-
+supermod.nodeType.subclass = nodeTypeSub
+# end class nodeTypeSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'outline'
+        rootClass = supermod.outline
+    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 parse(inFilename):
-    doc = minidom.parse(inFilename)
-    rootNode = doc.childNodes[0]
-    rootObj = supermod.outline.factory()
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'outline'
+        rootClass = supermod.outline
+    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):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'outline'
+        rootClass = supermod.outline
+    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 parseString(inString):
-    doc = minidom.parseString(inString)
-    rootNode = doc.childNodes[0]
-    rootObj = supermod.outline.factory()
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'outline'
+        rootClass = supermod.outline
+    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 outline import *\n\n')
+        sys.stdout.write('import outline as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
     return rootObj
 
 
 USAGE_TEXT = """
-Usage: python outline_extended.py <infilename>
+Usage: python ???.py <infilename>
 """
 
+
 def usage():
-    print USAGE_TEXT
-    sys.exit(-1)
+    print(USAGE_TEXT)
+    sys.exit(1)
 
 
 def main():
@@ -79,13 +196,9 @@ def main():
         usage()
     infilename = args[0]
     root = parse(infilename)
-    sys.stdout.write('<?xml version="1.0" ?>\n')
     root.show(sys.stdout, 0)
 
 
 if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
     main()
-    #import pdb
-    #pdb.run('main()')
-
-
diff --git a/Demos/People/README b/Demos/People/README
deleted file mode 100644
index 6e63a91c9d3b840b3db90c17303705ade633aea2..0000000000000000000000000000000000000000
--- a/Demos/People/README
+++ /dev/null
@@ -1,49 +0,0 @@
-This directory contains a simple example of the use of
-generateDS.py.  The following files are provided:
-
-- people_7.xsd -- This is the XML Schema file used to generate
-  peoplesup.py and peoplesub.py
-
-- peoplesup.py and peoplesub.py -- Generated from people.xsd.
-  peoplesup.py contains the superclasses; peoplesub.py contains
-  the generated subclasses. They were generated by running the
-  following:
-
-      $ generateDS.py --session=a7.session
-
-  Or:
-
-      $ ../../generateDS.py -f -m \
-        --namespacedef='xmlns:pl="http://kuhlman.com/people.xsd"' \
-        --super=peoplesup -o peoplesup.py -s peoplesub.py \
-        --member-specs=dict \
-        people_7.xsd
-
-  Or, if you want validator bodies:
-
-      $ ../../generateDS.py -f -m \
-        --validator-bodies=Validators \
-        --namespacedef='xmlns:pl="http://kuhlman.com/people.xsd"' \
-        --super=peoplesup -o peoplesup.py -s peoplesub.py \
-        --member-specs=dict \
-        people_7.xsd
-
-  Notice that because the validator bodies sub-directory
-  Validators contains a file named percent.py, you should see that
-  the method validate_percent in class person in the generated
-  file peoplesup.py as been filled in with a body.
-
-- people_7.xml -- A data file used to test peoplesup.py and
-  peoplesub.py.  Run the following to test it:
-
-      $ python peoplesup.py people_7.xml
-
-  Or,
-
-      $ python peoplesub.py people_7.xml
-
-  Note that you might need to edit the subclass file
-  (peoplesub.py), changing the import supermod statement, and run
-  that modified file.  This modification is possibly not needed if
-  you used the --super= flag.
-
diff --git a/Demos/People/README.txt b/Demos/People/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bbbb4cc47041c2c6af6e4ba05a996952cc9b210d
--- /dev/null
+++ b/Demos/People/README.txt
@@ -0,0 +1,32 @@
+======================
+A generateDS.py demo
+======================
+
+Running the example
+=====================
+
+This directory contains a simple example of the use of
+generateDS.py.
+
+On Linux, you can run a test with the shell script
+`run-full-test.sh` as follows:
+
+    $ ./run-full-test.sh test
+
+The above shell script will use `people.xsd` to produce `testsup.py`
+(with the "-o" command line option) and `testsub.py` (with the "-s"
+command line option).  It then runs the generated subclass
+(`testsub.py`) file to parse and export `people.xml`.
+
+
+Generating validator bodies
+=============================
+
+You can generate code containing validator bodies by running
+`run-full-test-validators.sh`.  After running that shell script, the
+code in `Validators/FlowType.py` will have been copying into the
+method `validate_FlowType`.  (`Validators/percent.py` is not used in
+this example.)
+
+
+.. vim:ft=rst:
diff --git a/Demos/People/a1.session b/Demos/People/a1.session
deleted file mode 100644
index cfdfbc88fe34abdd163f76a940a87fcfa7c5fe77..0000000000000000000000000000000000000000
--- a/Demos/People/a1.session
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" ?>
-<session>
-    <input_schema>people.xsd</input_schema>
-    <output_superclass>peoplesup.py</output_superclass>
-    <output_subclass>peoplesub.py</output_subclass>
-    <force>true</force>
-    <prefix></prefix>
-    <namespace_prefix></namespace_prefix>
-    <empty_namespace_prefix>false</empty_namespace_prefix>
-    <behavior_filename></behavior_filename>
-    <properties>true</properties>
-    <subclass_suffix></subclass_suffix>
-    <root_element></root_element>
-    <superclass_module>peoplesup</superclass_module>
-    <auto_super>true</auto_super>
-    <old_getters_setters>false</old_getters_setters>
-    <validator_bodies></validator_bodies>
-    <user_methods></user_methods>
-    <no_dates>false</no_dates>
-    <no_versions>false</no_versions>
-    <no_process_includes>false</no_process_includes>
-    <silence>false</silence>
-    <namespace_defs>xmlns:pl="http://kuhlman.com/people.xsd"</namespace_defs>
-    <external_encoding></external_encoding>
-    <member_specs>dict</member_specs>
-</session>
diff --git a/Demos/People/people_catalog.xml b/Demos/People/people_catalog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7a835105d12c92171c19e2af82d93fb19375c929
--- /dev/null
+++ b/Demos/People/people_catalog.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!DOCTYPE catalog
+    PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
+        "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd">
+ 
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"
+   prefer="public">
+
+   <public publicId="http://www.generateds.com/people-part1"
+       uri="schemas/people-part1.xsd"/>
+
+</catalog>
diff --git a/Demos/People/peoplesub.py b/Demos/People/peoplesub.py
index 4e93ce6d63a3e307e57e2d984518fa89d231d063..43606b42cea047ef8171bda4df9b12a9183df382 100644
--- a/Demos/People/peoplesub.py
+++ b/Demos/People/peoplesub.py
@@ -1,171 +1,151 @@
 #!/usr/bin/env python
 
 #
-# Generated Tue Feb  1 14:34:02 2011 by generateDS.py version 2.5a.
+# Generated Thu Jul 19 14:09:57 2018 by generateDS.py version 2.29.17.
+# Python 2.7.15 |Anaconda custom (64-bit)| (default, May  1 2018, 23:32:55)  [GCC 7.2.0]
+#
+# Command line options:
+#   ('-f', '')
+#   ('-m', '')
+#   ('--namespacedef', 'xmlns:pl="http://kuhlman.com/people.xsd"')
+#   ('--super', 'peoplesup')
+#   ('-o', 'peoplesup.py')
+#   ('-s', 'peoplesub.py')
+#   ('--member-specs', 'dict')
+#   ('-m', '')
+#   ('--export', 'write etree literal')
+#   ('-c', 'people_catalog.xml')
+#
+# Command line arguments:
+#   people.xsd
+#
+# Command line:
+#   ../../generateDS.py -f -m --namespacedef="xmlns:pl="http://kuhlman.com/people.xsd"" --super="peoplesup" -o "peoplesup.py" -s "peoplesub.py" --member-specs="dict" -m --export="write etree literal" -c "people_catalog.xml" people.xsd
+#
+# Current working directory (os.getcwd()):
+#   People
 #
 
 import sys
+from lxml import etree as etree_
 
 import peoplesup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(   XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-    ) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError("Failed to import ElementTree from any known place")
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-        'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
 # Globals
 #
 
-ExternalEncoding = 'ascii'
+ExternalEncoding = ''
 
 #
 # Data representation classes
 #
 
-class peopleSub(supermod.people):
+
+class peopleTypeSub(supermod.peopleType):
     def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
-        super(peopleSub, self).__init__(comments, person, specialperson, programmer, python_programmer, java_programmer, )
-supermod.people.subclass = peopleSub
-# end class peopleSub
+        super(peopleTypeSub, self).__init__(comments, person, specialperson, programmer, python_programmer, java_programmer, )
+supermod.peopleType.subclass = peopleTypeSub
+# end class peopleTypeSub
 
 
-class commentsSub(supermod.comments):
+class commentsTypeSub(supermod.commentsType):
     def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
-        super(commentsSub, self).__init__(emp, bold, valueOf_, mixedclass_, content_, )
-supermod.comments.subclass = commentsSub
-# end class commentsSub
+        super(commentsTypeSub, self).__init__(emp, bold, valueOf_, mixedclass_, content_, )
+supermod.commentsType.subclass = commentsTypeSub
+# end class commentsTypeSub
 
 
-class personSub(supermod.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):
-        super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
-supermod.person.subclass = personSub
-# end class personSub
+class personTypeSub(supermod.personType):
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None, extensiontype_=None):
+        super(personTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, extensiontype_, )
+supermod.personType.subclass = personTypeSub
+# end class personTypeSub
 
 
 class specialpersonSub(supermod.specialperson):
-    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):
-        super(specialpersonSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None):
+        super(specialpersonSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, )
 supermod.specialperson.subclass = specialpersonSub
 # end class specialpersonSub
 
 
-class programmerSub(supermod.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):
-        super(programmerSub, 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, )
-supermod.programmer.subclass = programmerSub
-# end class programmerSub
+class programmerTypeSub(supermod.programmerType):
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=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):
+        super(programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
+supermod.programmerType.subclass = programmerTypeSub
+# end class programmerTypeSub
 
 
-class paramSub(supermod.param):
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, )
-supermod.param.subclass = paramSub
-# end class paramSub
+class paramTypeSub(supermod.paramType):
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        super(paramTypeSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, )
+supermod.paramType.subclass = paramTypeSub
+# end class paramTypeSub
 
 
-class python_programmerSub(supermod.python_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):
-        super(python_programmerSub, 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, nick_name, favorite_editor, )
-supermod.python_programmer.subclass = python_programmerSub
-# end class python_programmerSub
+class python_programmerTypeSub(supermod.python_programmerType):
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=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, nick_name=None, drcs_attr=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None):
+        super(python_programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, drcs_attr, gui_developer, favorite_editor, flowvalue, drcs, )
+supermod.python_programmerType.subclass = python_programmerTypeSub
+# end class python_programmerTypeSub
 
 
-class java_programmerSub(supermod.java_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):
-        super(java_programmerSub, 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, status, nick_name, favorite_editor, )
-supermod.java_programmer.subclass = java_programmerSub
-# end class java_programmerSub
+class java_programmerTypeSub(supermod.java_programmerType):
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=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, nick_name=None, status=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None):
+        super(java_programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, datetime1, datetime2, datetime3, datetime4, datetime5, )
+supermod.java_programmerType.subclass = java_programmerTypeSub
+# end class java_programmerTypeSub
 
 
-class agentSub(supermod.agent):
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
-        super(agentSub, self).__init__(firstname, lastname, priority, info, vehicle, )
-supermod.agent.subclass = agentSub
-# end class agentSub
+class agentTypeSub(supermod.agentType):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None, extensiontype_=None):
+        super(agentTypeSub, self).__init__(firstname, lastname, priority, info, vehicle, extensiontype_, )
+supermod.agentType.subclass = agentTypeSub
+# end class agentTypeSub
 
 
-class special_agentSub(supermod.special_agent):
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
-        super(special_agentSub, self).__init__(firstname, lastname, priority, info, )
-supermod.special_agent.subclass = special_agentSub
-# end class special_agentSub
+class special_agentTypeSub(supermod.special_agentType):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        super(special_agentTypeSub, self).__init__(firstname, lastname, priority, info, vehicle, )
+supermod.special_agentType.subclass = special_agentTypeSub
+# end class special_agentTypeSub
 
 
-class boosterSub(supermod.booster):
-    def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, classxx=None, other_value=None, type_=None, client_handler=None):
-        super(boosterSub, self).__init__(member_id, firstname, lastname, other_name, classxx, other_value, type_, client_handler, )
-supermod.booster.subclass = boosterSub
-# end class boosterSub
+class weird_agentTypeSub(supermod.weird_agentType):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        super(weird_agentTypeSub, self).__init__(firstname, lastname, priority, info, vehicle, )
+supermod.weird_agentType.subclass = weird_agentTypeSub
+# end class weird_agentTypeSub
 
 
-class client_handlerSub(supermod.client_handler):
-    def __init__(self, fullname=None, refid=None):
-        super(client_handlerSub, self).__init__(fullname, refid, )
-supermod.client_handler.subclass = client_handlerSub
-# end class client_handlerSub
+class boosterTypeSub(supermod.boosterType):
+    def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        super(boosterTypeSub, self).__init__(member_id, firstname, lastname, other_name, class_, other_value, type_, client_handler, )
+supermod.boosterType.subclass = boosterTypeSub
+# end class boosterTypeSub
 
 
-class infoSub(supermod.info):
-    def __init__(self, rating=None, type_=None, name=None, valueOf_=None):
-        super(infoSub, self).__init__(rating, type_, name, valueOf_, )
-supermod.info.subclass = infoSub
-# end class infoSub
+class infoTypeSub(supermod.infoType):
+    def __init__(self, name=None, type_=None, rating=None):
+        super(infoTypeSub, self).__init__(name, type_, rating, )
+supermod.infoType.subclass = infoTypeSub
+# end class infoTypeSub
 
 
-class vehicleSub(supermod.vehicle):
-    def __init__(self, wheelcount=None):
-        super(vehicleSub, self).__init__(wheelcount, )
-supermod.vehicle.subclass = vehicleSub
-# end class vehicleSub
+class vehicleTypeSub(supermod.vehicleType):
+    def __init__(self, wheelcount=None, extensiontype_=None):
+        super(vehicleTypeSub, self).__init__(wheelcount, extensiontype_, )
+supermod.vehicleType.subclass = vehicleTypeSub
+# end class vehicleTypeSub
 
 
 class automobileSub(supermod.automobile):
@@ -175,6 +155,13 @@ supermod.automobile.subclass = automobileSub
 # end class automobileSub
 
 
+class hot_agentSub(supermod.hot_agent):
+    def __init__(self, firstname='empty\\name', lastname='no \'last\' name', priority=None, startDate=None):
+        super(hot_agentSub, self).__init__(firstname, lastname, priority, startDate, )
+supermod.hot_agent.subclass = hot_agentSub
+# end class hot_agentSub
+
+
 class airplaneSub(supermod.airplane):
     def __init__(self, wheelcount=None, pilotname=None):
         super(airplaneSub, self).__init__(wheelcount, pilotname, )
@@ -182,67 +169,109 @@ supermod.airplane.subclass = airplaneSub
 # end class airplaneSub
 
 
+class client_handlerTypeSub(supermod.client_handlerType):
+    def __init__(self, fullname=None, refid=None):
+        super(client_handlerTypeSub, self).__init__(fullname, refid, )
+supermod.client_handlerType.subclass = client_handlerTypeSub
+# end class client_handlerTypeSub
+
 
 def get_root_tag(node):
     tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
     rootClass = None
-    if hasattr(supermod, tag):
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
         rootClass = getattr(supermod, tag)
     return tag, rootClass
 
 
-def parse(inFilename):
-    doc = parsexml_(inFilename)
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
+        rootTag = 'peopleType'
+        rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0, name_=rootTag,
-        namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
-    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"',
+            pretty_print=True)
     return rootObj
 
 
-def parseString(inString):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'peopleType'
+        rootClass = supermod.peopleType
+    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):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
+        rootTag = 'peopleType'
+        rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0, name_=rootTag,
-        namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
     return rootObj
 
 
-def parseLiteral(inFilename):
-    doc = parsexml_(inFilename)
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
+        rootTag = 'peopleType'
+        rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('#from peoplesup import *\n\n')
-    sys.stdout.write('import peoplesup as model_\n\n')
-    sys.stdout.write('rootObj = model_.people(\n')
-    rootObj.exportLiteral(sys.stdout, 0, name_="people")
-    sys.stdout.write(')\n')
+    if not silence:
+        sys.stdout.write('#from peoplesup import *\n\n')
+        sys.stdout.write('import peoplesup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
     return rootObj
 
 
@@ -250,8 +279,9 @@ USAGE_TEXT = """
 Usage: python ???.py <infilename>
 """
 
+
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -260,11 +290,9 @@ def main():
     if len(args) != 1:
         usage()
     infilename = args[0]
-    root = parse(infilename)
+    parse(infilename)
 
 
 if __name__ == '__main__':
     #import pdb; pdb.set_trace()
     main()
-
-
diff --git a/Demos/People/peoplesup.py b/Demos/People/peoplesup.py
index c3323581e97275b0242b99d5b2bb8f17ebe39c94..231b84c36b41df04952e5af6f9d608909dfb004a 100644
--- a/Demos/People/peoplesup.py
+++ b/Demos/People/peoplesup.py
@@ -1,68 +1,102 @@
 #!/usr/bin/env python
-# -*- coding: utf-8 -*- 
+# -*- coding: utf-8 -*-
 
 #
-# Generated Tue Feb  1 14:34:02 2011 by generateDS.py version 2.5a.
+# Generated Thu Jul 19 14:09:57 2018 by generateDS.py version 2.29.17.
+# Python 2.7.15 |Anaconda custom (64-bit)| (default, May  1 2018, 23:32:55)  [GCC 7.2.0]
+#
+# Command line options:
+#   ('-f', '')
+#   ('-m', '')
+#   ('--namespacedef', 'xmlns:pl="http://kuhlman.com/people.xsd"')
+#   ('--super', 'peoplesup')
+#   ('-o', 'peoplesup.py')
+#   ('-s', 'peoplesub.py')
+#   ('--member-specs', 'dict')
+#   ('-m', '')
+#   ('--export', 'write etree literal')
+#   ('-c', 'people_catalog.xml')
+#
+# Command line arguments:
+#   people.xsd
+#
+# Command line:
+#   ../../generateDS.py -f -m --namespacedef="xmlns:pl="http://kuhlman.com/people.xsd"" --super="peoplesup" -o "peoplesup.py" -s "peoplesub.py" --member-specs="dict" -m --export="write etree literal" -c "people_catalog.xml" people.xsd
+#
+# Current working directory (os.getcwd()):
+#   People
 #
 
 import sys
-import getopt
 import re as re_
-
-etree_ = None
-Verbose_import_ = False
-(   XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-    ) = range(3)
-XMLParser_import_library = None
+import base64
+import datetime as datetime_
+import warnings as warnings_
 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):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
+def parsexmlstring_(instring, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    element = etree_.fromstring(instring, parser=parser, **kwargs)
+    return element
+
+#
+# Namespace prefix definition table (and other attributes, too)
+#
+# The module generatedsnamespaces, if it is importable, must contain
+# a dictionary named GeneratedsNamespaceDefs.  This Python dictionary
+# should map element type names (strings) to XML schema namespace prefix
+# definitions.  The export method for any class for which there is
+# a namespace prefix definition, will export that definition in the
+# XML representation of that element.  See the export method of
+# any generated element type class for a example of the use of this
+# table.
+# A sample table is:
+#
+#     # File: generatedsnamespaces.py
+#
+#     GenerateDSNamespaceDefs = {
+#         "ElementtypeA": "http://www.xxx.com/namespaceA",
+#         "ElementtypeB": "http://www.xxx.com/namespaceB",
+#     }
+#
+
+try:
+    from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_
+except ImportError:
+    GenerateDSNamespaceDefs_ = {}
+
 #
-# User methods
+# The root super-class for element type classes
 #
 # Calls to the methods in these classes are generated by generateDS.py.
 # You can replace these methods by re-implementing the following class
@@ -70,23 +104,340 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
-
+except ImportError as 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=None, 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=None, 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=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
         def gds_format_float(self, input_data, input_name=''):
-            return '%f' % input_data
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
-            return '%s' % input_data
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, 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=None, 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
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @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()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                if ExternalEncoding:
+                    encoding = ExternalEncoding
+                else:
+                    encoding = 'utf-8'
+                return instring.encode(encoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+        def __eq__(self, other):
+            if type(self) != type(other):
+                return False
+            return self.__dict__ == other.__dict__
+        def __ne__(self, other):
+            return not self.__eq__(other)
+    
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
 
 #
 # If you have installed IPython you can uncomment and use the following.
@@ -107,31 +458,54 @@ except ImportError, exp:
 # Globals
 #
 
-ExternalEncoding = 'ascii'
+ExternalEncoding = ''
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
-STRING_CLEANUP_PAT = re_.compile(r"[\n\r\s]+")
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
 #
 
-def showIndent(outfile, level):
-    for idx in range(level):
-        outfile.write('    ')
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -144,6 +518,7 @@ def quote_attrib(inStr):
         s1 = '"%s"' % s1
     return s1
 
+
 def quote_python(inStr):
     s1 = inStr
     if s1.find("'") == -1:
@@ -171,14 +546,26 @@ def get_all_text_(node):
     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, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -197,6 +584,7 @@ class MixedContainer:
     TypeDecimal = 5
     TypeDouble = 6
     TypeBoolean = 7
+    TypeBase64 = 8
     def __init__(self, category, content_type, name, value):
         self.category = category
         self.content_type = content_type
@@ -210,49 +598,104 @@ class MixedContainer:
         return self.value
     def getName(self):
         return self.name
-    def export(self, outfile, level, name, namespace):
+    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(): 
+            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)
+            self.value.export(
+                outfile, level, namespace, name,
+                pretty_print=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))
+            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))
+            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))
+            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))
+            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))
+            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))
+            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,))
+            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):
+    def __init__(self, name='', data_type='', container=0,
+            optional=0, child_attrs=None, choice=None):
         self.name = name
         self.data_type = data_type
         self.container = container
+        self.child_attrs = child_attrs
+        self.choice = choice
+        self.optional = optional
     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
@@ -267,6 +710,13 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_child_attrs(self, child_attrs): self.child_attrs = child_attrs
+    def get_child_attrs(self): return self.child_attrs
+    def set_choice(self, choice): self.choice = choice
+    def get_choice(self): return self.choice
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
+
 
 def _cast(typ, value):
     if typ is None or value is None:
@@ -277,19 +727,27 @@ def _cast(typ, value):
 # Data representation classes.
 #
 
-class people(GeneratedsSuper):
-    """A list of people."""
+
+class ArrayTypes(object):
+    float_='float'
+    int='int'
+    Name='Name'
+    token='token'
+
+
+class peopleType(GeneratedsSuper):
     member_data_items_ = {
-        'comments': MemberSpec_('comments', 'comments', 1),
-        'person': MemberSpec_('person', 'person', 1),
-        'specialperson': MemberSpec_('specialperson', 'specialperson', 1),
-        'programmer': MemberSpec_('programmer', 'programmer', 1),
-        'python_programmer': MemberSpec_('python_programmer', 'python-programmer', 1),
-        'java_programmer': MemberSpec_('java_programmer', 'java-programmer', 1),
-        }
+        'comments': MemberSpec_('comments', 'commentsType', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'commentsType', u'name': u'comments'}, None),
+        'person': MemberSpec_('person', 'personType', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'personType', u'name': u'person'}, None),
+        'specialperson': MemberSpec_('specialperson', 'specialperson', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'specialperson', u'name': u'specialperson'}, None),
+        'programmer': MemberSpec_('programmer', 'programmerType', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'programmerType', u'name': u'programmer'}, None),
+        'python_programmer': MemberSpec_('python_programmer', 'python-programmerType', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'python-programmerType', u'name': u'python-programmer'}, None),
+        'java_programmer': MemberSpec_('java_programmer', 'java-programmerType', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'java-programmerType', u'name': u'java-programmer'}, None),
+    }
     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:
@@ -315,67 +773,52 @@ class people(GeneratedsSuper):
         else:
             self.java_programmer = java_programmer
     def factory(*args_, **kwargs_):
-        if people.subclass:
-            return people.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, peopleType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if peopleType.subclass:
+            return peopleType.subclass(*args_, **kwargs_)
         else:
-            return people(*args_, **kwargs_)
+            return peopleType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_comments(self): return self.comments
     def set_comments(self, comments): self.comments = comments
     def add_comments(self, value): self.comments.append(value)
-    def insert_comments(self, index, value): self.comments[index] = value
+    def insert_comments_at(self, index, value): self.comments.insert(index, value)
+    def replace_comments_at(self, index, value): self.comments[index] = value
     commentsProp = property(get_comments, set_comments)
     def get_person(self): return self.person
     def set_person(self, person): self.person = person
     def add_person(self, value): self.person.append(value)
-    def insert_person(self, index, value): self.person[index] = value
+    def insert_person_at(self, index, value): self.person.insert(index, value)
+    def replace_person_at(self, index, value): self.person[index] = value
     personProp = property(get_person, set_person)
     def get_specialperson(self): return self.specialperson
     def set_specialperson(self, specialperson): self.specialperson = specialperson
     def add_specialperson(self, value): self.specialperson.append(value)
-    def insert_specialperson(self, index, value): self.specialperson[index] = value
+    def insert_specialperson_at(self, index, value): self.specialperson.insert(index, value)
+    def replace_specialperson_at(self, index, value): self.specialperson[index] = value
     specialpersonProp = property(get_specialperson, set_specialperson)
     def get_programmer(self): return self.programmer
     def set_programmer(self, programmer): self.programmer = programmer
     def add_programmer(self, value): self.programmer.append(value)
-    def insert_programmer(self, index, value): self.programmer[index] = value
+    def insert_programmer_at(self, index, value): self.programmer.insert(index, value)
+    def replace_programmer_at(self, index, value): self.programmer[index] = value
     programmerProp = property(get_programmer, set_programmer)
     def get_python_programmer(self): return self.python_programmer
     def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer
     def add_python_programmer(self, value): self.python_programmer.append(value)
-    def insert_python_programmer(self, index, value): self.python_programmer[index] = value
+    def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value)
+    def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value
     python_programmerProp = property(get_python_programmer, set_python_programmer)
     def get_java_programmer(self): return self.java_programmer
     def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer
     def add_java_programmer(self, value): self.java_programmer.append(value)
-    def insert_java_programmer(self, index, value): self.java_programmer[index] = value
+    def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value)
+    def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value
     java_programmerProp = property(get_java_programmer, set_java_programmer)
-    def export(self, outfile, level, namespace_='', name_='people', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='people')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='people'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='people'):
-        for comments_ in self.comments:
-            comments_.export(outfile, level, namespace_, name_='comments')
-        for person_ in self.person:
-            person_.export(outfile, level, namespace_, name_='person')
-        for specialperson_ in self.specialperson:
-            specialperson_.export(outfile, level, namespace_, name_='specialperson')
-        for programmer_ in self.programmer:
-            programmer_.export(outfile, level, namespace_, name_='programmer')
-        for python_programmer_ in self.python_programmer:
-            python_programmer_.export(outfile, level, namespace_, name_='python-programmer')
-        for java_programmer_ in self.java_programmer:
-            java_programmer_.export(outfile, level, namespace_, name_='java-programmer')
     def hasContent_(self):
         if (
             self.comments or
@@ -384,13 +827,74 @@ class people(GeneratedsSuper):
             self.programmer or
             self.python_programmer or
             self.java_programmer
-            ):
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='people'):
+    def export(self, outfile, level, namespace_='', name_='peopleType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('peopleType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='peopleType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='peopleType', 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_='peopleType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='peopleType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for comments_ in self.comments:
+            comments_.export(outfile, level, namespace_, name_='comments', pretty_print=pretty_print)
+        for person_ in self.person:
+            person_.export(outfile, level, namespace_, name_='person', pretty_print=pretty_print)
+        for specialperson_ in self.specialperson:
+            specialperson_.export(outfile, level, namespace_, name_='specialperson', pretty_print=pretty_print)
+        for programmer_ in self.programmer:
+            programmer_.export(outfile, level, namespace_, name_='programmer', pretty_print=pretty_print)
+        for python_programmer_ in self.python_programmer:
+            python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print)
+        for java_programmer_ in self.java_programmer:
+            java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print)
+    def to_etree(self, parent_element=None, name_='peopleType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
+        else:
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        for comments_ in self.comments:
+            comments_.to_etree(element, name_='comments', mapping_=mapping_)
+        for person_ in self.person:
+            person_.to_etree(element, name_='person', mapping_=mapping_)
+        for specialperson_ in self.specialperson:
+            specialperson_.to_etree(element, name_='specialperson', mapping_=mapping_)
+        for programmer_ in self.programmer:
+            programmer_.to_etree(element, name_='programmer', mapping_=mapping_)
+        for python_programmer_ in self.python_programmer:
+            python_programmer_.to_etree(element, name_='python-programmer', mapping_=mapping_)
+        for java_programmer_ in self.java_programmer:
+            java_programmer_.to_etree(element, name_='java-programmer', mapping_=mapping_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='peopleType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
@@ -401,8 +905,8 @@ class people(GeneratedsSuper):
         level += 1
         for comments_ in self.comments:
             showIndent(outfile, level)
-            outfile.write('model_.comments(\n')
-            comments_.exportLiteral(outfile, level)
+            outfile.write('model_.commentsType(\n')
+            comments_.exportLiteral(outfile, level, name_='commentsType')
             showIndent(outfile, level)
             outfile.write('),\n')
         level -= 1
@@ -413,8 +917,8 @@ class people(GeneratedsSuper):
         level += 1
         for person_ in self.person:
             showIndent(outfile, level)
-            outfile.write('model_.person(\n')
-            person_.exportLiteral(outfile, level)
+            outfile.write('model_.personType(\n')
+            person_.exportLiteral(outfile, level, name_='personType')
             showIndent(outfile, level)
             outfile.write('),\n')
         level -= 1
@@ -437,8 +941,8 @@ class people(GeneratedsSuper):
         level += 1
         for programmer_ in self.programmer:
             showIndent(outfile, level)
-            outfile.write('model_.programmer(\n')
-            programmer_.exportLiteral(outfile, level)
+            outfile.write('model_.programmerType(\n')
+            programmer_.exportLiteral(outfile, level, name_='programmerType')
             showIndent(outfile, level)
             outfile.write('),\n')
         level -= 1
@@ -449,8 +953,8 @@ class people(GeneratedsSuper):
         level += 1
         for python_programmer_ in self.python_programmer:
             showIndent(outfile, level)
-            outfile.write('model_.python_programmer(\n')
-            python_programmer_.exportLiteral(outfile, level, name_='python-programmer')
+            outfile.write('model_.python_programmerType(\n')
+            python_programmer_.exportLiteral(outfile, level, name_='python-programmerType')
             showIndent(outfile, level)
             outfile.write('),\n')
         level -= 1
@@ -461,57 +965,68 @@ class people(GeneratedsSuper):
         level += 1
         for java_programmer_ in self.java_programmer:
             showIndent(outfile, level)
-            outfile.write('model_.java_programmer(\n')
-            java_programmer_.exportLiteral(outfile, level, name_='java-programmer')
+            outfile.write('model_.java_programmerType(\n')
+            java_programmer_.exportLiteral(outfile, level, name_='java-programmerType')
             showIndent(outfile, level)
             outfile.write('),\n')
         level -= 1
         showIndent(outfile, level)
         outfile.write('],\n')
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
-        if nodeName_ == 'comments': 
-            obj_ = comments.factory()
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'comments':
+            obj_ = commentsType.factory()
             obj_.build(child_)
             self.comments.append(obj_)
-        elif nodeName_ == 'person': 
-            obj_ = person.factory()
+            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_)
-        elif nodeName_ == 'specialperson': 
+            obj_.original_tagname_ = 'person'
+        elif nodeName_ == 'specialperson':
             obj_ = specialperson.factory()
             obj_.build(child_)
             self.specialperson.append(obj_)
-        elif nodeName_ == 'programmer': 
-            obj_ = programmer.factory()
+            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_)
-        elif nodeName_ == 'python-programmer': 
-            obj_ = python_programmer.factory()
+            obj_.original_tagname_ = 'programmer'
+        elif nodeName_ == 'python-programmer':
+            obj_ = python_programmerType.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
-        elif nodeName_ == 'java-programmer': 
-            obj_ = java_programmer.factory()
+            obj_.original_tagname_ = 'python-programmer'
+        elif nodeName_ == 'java-programmer':
+            obj_ = java_programmerType.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
-# end class people
+            obj_.original_tagname_ = 'java-programmer'
+# end class peopleType
 
 
-class comments(GeneratedsSuper):
+class commentsType(GeneratedsSuper):
     member_data_items_ = {
-        'emp': MemberSpec_('emp', 'xs:string', 1),
-        'bold': MemberSpec_('bold', 'xs:string', 1),
+        'emp': MemberSpec_('emp', 'xs:string', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'xs:string', u'name': u'emp'}, None),
+        'bold': MemberSpec_('bold', 'xs:string', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'xs:string', u'name': u'bold'}, None),
         'valueOf_': MemberSpec_('valueOf_', [], 0),
-        }
+    }
     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:
@@ -531,51 +1046,90 @@ class comments(GeneratedsSuper):
             self.content_ = content_
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
-        if comments.subclass:
-            return comments.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, commentsType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if commentsType.subclass:
+            return commentsType.subclass(*args_, **kwargs_)
         else:
-            return comments(*args_, **kwargs_)
+            return commentsType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_emp(self): return self.emp
     def set_emp(self, emp): self.emp = emp
     def add_emp(self, value): self.emp.append(value)
-    def insert_emp(self, index, value): self.emp[index] = value
+    def insert_emp_at(self, index, value): self.emp.insert(index, value)
+    def replace_emp_at(self, index, value): self.emp[index] = value
     empProp = property(get_emp, set_emp)
     def get_bold(self): return self.bold
     def set_bold(self, bold): self.bold = bold
     def add_bold(self, value): self.bold.append(value)
-    def insert_bold(self, index, value): self.bold[index] = value
+    def insert_bold_at(self, index, value): self.bold.insert(index, value)
+    def replace_bold_at(self, index, value): self.bold[index] = value
     boldProp = property(get_bold, set_bold)
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
-    def export(self, outfile, level, namespace_='', name_='comments', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='comments')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='comments'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='comments'):
-        for item_ in self.content_:
-            item_.export(outfile, level, item_.name, namespace_)
     def hasContent_(self):
         if (
             self.emp or
             self.bold or
-            self.valueOf_
-            ):
+            (1 if type(self.valueOf_) in [int,float] else self.valueOf_)
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='comments'):
+    def export(self, outfile, level, namespace_='', name_='commentsType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('commentsType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='commentsType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='commentsType', 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_='commentsType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='commentsType', fromsubclass_=False, pretty_print=True):
+        if not fromsubclass_:
+            for item_ in self.content_:
+                item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for emp_ in self.emp:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<emp>%s</emp>%s' % (self.gds_encode(self.gds_format_string(quote_xml(emp_), input_name='emp')), eol_))
+        for bold_ in self.bold:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<bold>%s</bold>%s' % (self.gds_encode(self.gds_format_string(quote_xml(bold_), input_name='bold')), eol_))
+    def to_etree(self, parent_element=None, name_='commentsType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
+        else:
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        for item_ in self.content_:
+            item_.to_etree(element)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='commentsType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
         if self.hasContent_():
             self.exportLiteralChildren(outfile, level, name_)
         showIndent(outfile, level)
@@ -597,7 +1151,8 @@ class comments(GeneratedsSuper):
         outfile.write('],\n')
         pass
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
         self.valueOf_ = get_all_text_(node)
         if node.text is not None:
             obj_ = self.mixedclass_(MixedContainer.CategoryText,
@@ -605,10 +1160,11 @@ class comments(GeneratedsSuper):
             self.content_.append(obj_)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'emp' and child_.text is not None:
             valuestr_ = child_.text
             obj_ = self.mixedclass_(MixedContainer.CategorySimple,
@@ -619,44 +1175,46 @@ class comments(GeneratedsSuper):
             obj_ = self.mixedclass_(MixedContainer.CategorySimple,
                 MixedContainer.TypeString, 'bold', valuestr_)
             self.content_.append(obj_)
-        if not from_subclass and child_.tail is not None:
+        if not fromsubclass_ and child_.tail is not None:
             obj_ = self.mixedclass_(MixedContainer.CategoryText,
                 MixedContainer.TypeNone, '', child_.tail)
             self.content_.append(obj_)
-# end class comments
+# end class commentsType
 
 
-class person(GeneratedsSuper):
-    """A generic person. This is the base for a number of different kinds
-    of people. They are each an extension of this base type of
-    person."""
+class personType(GeneratedsSuper):
     member_data_items_ = {
-        'vegetable': MemberSpec_('vegetable', 'xs:string', 0),
-        'fruit': MemberSpec_('fruit', 'xs:string', 0),
-        'ratio': MemberSpec_('ratio', 'xs:float', 0),
-        'id': MemberSpec_('id', 'xs:integer', 0),
-        'value': MemberSpec_('value', 'xs:string', 0),
-        'name': MemberSpec_('name', 'xs:string', 0),
-        'interest': MemberSpec_('interest', 'xs:string', 1),
-        'category': MemberSpec_('category', 'xs:integer', 0),
-        'agent': MemberSpec_('agent', 'agent', 1),
-        'promoter': MemberSpec_('promoter', 'booster', 1),
-        'description': MemberSpec_('description', 'xs:string', 0),
-        }
+        'value': MemberSpec_('value', 'xs:string', 0, 1, {'use': 'optional'}),
+        'id': MemberSpec_('id', 'xs:integer', 0, 1, {'use': 'optional'}),
+        'ratio': MemberSpec_('ratio', 'xs:float', 0, 1, {'use': 'optional'}),
+        'fruit': MemberSpec_('fruit', 'xs:string', 0, 1, {'use': 'optional'}),
+        'vegetable': MemberSpec_('vegetable', 'xs:string', 0, 1, {'use': 'optional'}),
+        'name': MemberSpec_('name', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'name'}, None),
+        'interest': MemberSpec_('interest', 'xs:string', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'xs:string', u'name': u'interest'}, None),
+        'category': MemberSpec_('category', 'xs:integer', 0, 1, {u'type': u'xs:integer', u'name': u'category', u'minOccurs': u'0'}, None),
+        'hot_agent': MemberSpec_('hot_agent', 'hot.agent', 0, 0, {u'type': u'hot.agent', u'name': u'hot.agent'}, None),
+        'agent': MemberSpec_('agent', 'agentType', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'agentType', u'name': u'agent'}, None),
+        'promoter': MemberSpec_('promoter', 'boosterType', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'boosterType', u'name': u'promoter'}, None),
+        'description': MemberSpec_('description', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'description'}, None),
+        'range_': MemberSpec_('range_', ['RangeType', 'xs:integer'], 0, 0, {u'type': u'xs:integer', u'name': u'range'}, None),
+        'with_': MemberSpec_('with_', 'boosterType', 0, 0, {u'type': u'boosterType', u'name': u'with'}, None),
+    }
     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):
-        self.vegetable = _cast(None, vegetable)
-        self.fruit = _cast(None, fruit)
-        self.ratio = _cast(float, ratio)
-        self.id = _cast(int, id)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.value = _cast(None, value)
+        self.id = _cast(int, id)
+        self.ratio = _cast(float, ratio)
+        self.fruit = _cast(None, fruit)
+        self.vegetable = _cast(None, vegetable)
         self.name = name
         if interest is None:
             self.interest = []
         else:
             self.interest = interest
         self.category = category
+        self.hot_agent = hot_agent
         if agent is None:
             self.agent = []
         else:
@@ -666,11 +1224,20 @@ class person(GeneratedsSuper):
         else:
             self.promoter = promoter
         self.description = description
+        self.range_ = range_
+        self.validate_RangeType(self.range_)
+        self.with_ = with_
+        self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
-        if person.subclass:
-            return person.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, personType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if personType.subclass:
+            return personType.subclass(*args_, **kwargs_)
         else:
-            return person(*args_, **kwargs_)
+            return personType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
@@ -678,144 +1245,241 @@ class person(GeneratedsSuper):
     def get_interest(self): return self.interest
     def set_interest(self, interest): self.interest = interest
     def add_interest(self, value): self.interest.append(value)
-    def insert_interest(self, index, value): self.interest[index] = value
+    def insert_interest_at(self, index, value): self.interest.insert(index, value)
+    def replace_interest_at(self, index, value): self.interest[index] = value
     interestProp = property(get_interest, set_interest)
     def get_category(self): return self.category
     def set_category(self, category): self.category = category
     categoryProp = property(get_category, set_category)
+    def get_hot_agent(self): return self.hot_agent
+    def set_hot_agent(self, hot_agent): self.hot_agent = hot_agent
+    hot_agentProp = property(get_hot_agent, set_hot_agent)
     def get_agent(self): return self.agent
     def set_agent(self, agent): self.agent = agent
     def add_agent(self, value): self.agent.append(value)
-    def insert_agent(self, index, value): self.agent[index] = value
+    def insert_agent_at(self, index, value): self.agent.insert(index, value)
+    def replace_agent_at(self, index, value): self.agent[index] = value
     agentProp = property(get_agent, set_agent)
     def get_promoter(self): return self.promoter
     def set_promoter(self, promoter): self.promoter = promoter
     def add_promoter(self, value): self.promoter.append(value)
-    def insert_promoter(self, index, value): self.promoter[index] = value
+    def insert_promoter_at(self, index, value): self.promoter.insert(index, value)
+    def replace_promoter_at(self, index, value): self.promoter[index] = value
     promoterProp = property(get_promoter, set_promoter)
     def get_description(self): return self.description
     def set_description(self, description): self.description = description
     descriptionProp = property(get_description, set_description)
-    def get_vegetable(self): return self.vegetable
-    def set_vegetable(self, vegetable): self.vegetable = vegetable
-    vegetableProp = property(get_vegetable, set_vegetable)
-    def get_fruit(self): return self.fruit
-    def set_fruit(self, fruit): self.fruit = fruit
-    fruitProp = property(get_fruit, set_fruit)
-    def get_ratio(self): return self.ratio
-    def set_ratio(self, ratio): self.ratio = ratio
-    ratioProp = property(get_ratio, set_ratio)
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
-    idProp = property(get_id, set_id)
+    def get_range(self): return self.range_
+    def set_range(self, range_): self.range_ = range_
+    rangeProp = property(get_range, set_range)
+    def get_with(self): return self.with_
+    def set_with(self, with_): self.with_ = with_
+    withProp = property(get_with, set_with)
     def get_value(self): return self.value
     def set_value(self, value): self.value = value
     valueProp = property(get_value, set_value)
-    def export(self, outfile, level, namespace_='', name_='person', namespacedef_=''):
-        showIndent(outfile, level)
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    idProp = property(get_id, set_id)
+    def get_ratio(self): return self.ratio
+    def set_ratio(self, ratio): self.ratio = ratio
+    ratioProp = property(get_ratio, set_ratio)
+    def get_fruit(self): return self.fruit
+    def set_fruit(self, fruit): self.fruit = fruit
+    fruitProp = property(get_fruit, set_fruit)
+    def get_vegetable(self): return self.vegetable
+    def set_vegetable(self, vegetable): self.vegetable = vegetable
+    vegetableProp = property(get_vegetable, set_vegetable)
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def validate_RangeType(self, value):
+        # Validate type RangeType, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+            pass
+    def hasContent_(self):
+        if (
+            self.name is not None or
+            self.interest or
+            self.category is not None or
+            self.hot_agent is not None or
+            self.agent or
+            self.promoter or
+            self.description is not None or
+            self.range_ is not None or
+            self.with_ is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='personType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('personType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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 '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='person')
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='personType')
         if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='personType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.append('vegetable')
-            outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), ))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.append('fruit')
-            outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), ))
-        if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.append('ratio')
-            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='personType'):
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            outfile.write(' value=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value), input_name='value')), ))
         if self.id is not None and 'id' not in already_processed:
-            already_processed.append('id')
+            already_processed.add('id')
             outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id'))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.append('value')
-            outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='person'):
+        if self.ratio is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            outfile.write(' fruit=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.fruit), input_name='fruit')), ))
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            outfile.write(' vegetable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.vegetable), input_name='vegetable')), ))
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+    def exportChildren(self, outfile, level, namespace_='', name_='personType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
         if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sname>%s</%sname>\n' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<name>%s</name>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), eol_))
         for interest_ in self.interest:
-            showIndent(outfile, level)
-            outfile.write('<%sinterest>%s</%sinterest>\n' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<interest>%s</interest>%s' % (self.gds_encode(self.gds_format_string(quote_xml(interest_), input_name='interest')), eol_))
         if self.category is not None:
-            showIndent(outfile, level)
-            outfile.write('<%scategory>%s</%scategory>\n' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<category>%s</category>%s' % (self.gds_format_integer(self.category, input_name='category'), eol_))
+        if self.hot_agent is not None:
+            self.hot_agent.export(outfile, level, namespace_, name_='hot.agent', pretty_print=pretty_print)
         for agent_ in self.agent:
-            agent_.export(outfile, level, namespace_, name_='agent')
+            agent_.export(outfile, level, namespace_, name_='agent', pretty_print=pretty_print)
         for promoter_ in self.promoter:
-            promoter_.export(outfile, level, namespace_, name_='promoter')
+            promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print)
         if self.description is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sdescription>%s</%sdescription>\n' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_))
-    def hasContent_(self):
-        if (
-            self.name is not None or
-            self.interest or
-            self.category is not None or
-            self.agent or
-            self.promoter or
-            self.description is not None
-            ):
-            return True
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<description>%s</description>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), eol_))
+        if self.range_ is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<range>%s</range>%s' % (self.gds_format_integer(self.range_, input_name='range'), eol_))
+        if self.with_ is not None:
+            self.with_.export(outfile, level, namespace_, name_='with', pretty_print=pretty_print)
+    def to_etree(self, parent_element=None, name_='personType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
         else:
-            return False
-    def exportLiteral(self, outfile, level, name_='person'):
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        if self.extensiontype_ is not None:
+            element.set('{http://www.w3.org/2001/XMLSchema-instance}type', self.extensiontype_)
+        if self.value is not None:
+            element.set('value', self.gds_format_string(self.value))
+        if self.id is not None:
+            element.set('id', self.gds_format_integer(self.id))
+        if self.ratio is not None:
+            element.set('ratio', self.gds_format_float(self.ratio))
+        if self.fruit is not None:
+            element.set('fruit', self.gds_format_string(self.fruit))
+        if self.vegetable is not None:
+            element.set('vegetable', self.gds_format_string(self.vegetable))
+        if self.name is not None:
+            name_ = self.name
+            etree_.SubElement(element, '{}name').text = self.gds_format_string(name_)
+        for interest_ in self.interest:
+            etree_.SubElement(element, '{}interest').text = self.gds_format_string(interest_)
+        if self.category is not None:
+            category_ = self.category
+            etree_.SubElement(element, '{}category').text = self.gds_format_integer(category_)
+        if self.hot_agent is not None:
+            hot_agent_ = self.hot_agent
+            hot_agent_.to_etree(element, name_='hot.agent', mapping_=mapping_)
+        for agent_ in self.agent:
+            agent_.to_etree(element, name_='agent', mapping_=mapping_)
+        for promoter_ in self.promoter:
+            promoter_.to_etree(element, name_='promoter', mapping_=mapping_)
+        if self.description is not None:
+            description_ = self.description
+            etree_.SubElement(element, '{}description').text = self.gds_format_string(description_)
+        if self.range_ is not None:
+            range__ = self.range_
+            etree_.SubElement(element, '{}range').text = self.gds_format_integer(range__)
+        if self.with_ is not None:
+            with__ = self.with_
+            with__.to_etree(element, name_='with', mapping_=mapping_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='personType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.append('vegetable')
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
             showIndent(outfile, level)
-            outfile.write('vegetable = "%s",\n' % (self.vegetable,))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.append('fruit')
+            outfile.write('value="%s",\n' % (self.value,))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
             showIndent(outfile, level)
-            outfile.write('fruit = "%s",\n' % (self.fruit,))
+            outfile.write('id=%d,\n' % (self.id,))
         if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.append('ratio')
+            already_processed.add('ratio')
             showIndent(outfile, level)
-            outfile.write('ratio = %f,\n' % (self.ratio,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.append('id')
+            outfile.write('ratio=%f,\n' % (self.ratio,))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
             showIndent(outfile, level)
-            outfile.write('id = %d,\n' % (self.id,))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.append('value')
+            outfile.write('fruit="%s",\n' % (self.fruit,))
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
             showIndent(outfile, level)
-            outfile.write('value = "%s",\n' % (self.value,))
+            outfile.write('vegetable="%s",\n' % (self.vegetable,))
     def exportLiteralChildren(self, outfile, level, name_):
         if self.name is not None:
             showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
+            outfile.write('name=%s,\n' % self.gds_encode(quote_python(self.name)))
         showIndent(outfile, level)
         outfile.write('interest=[\n')
         level += 1
         for interest_ in self.interest:
             showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding))
+            outfile.write('%s,\n' % self.gds_encode(quote_python(interest_)))
         level -= 1
         showIndent(outfile, level)
         outfile.write('],\n')
         if self.category is not None:
             showIndent(outfile, level)
             outfile.write('category=%d,\n' % self.category)
+        if self.hot_agent is not None:
+            showIndent(outfile, level)
+            outfile.write('hot_agent=model_.hot_agent(\n')
+            self.hot_agent.exportLiteral(outfile, level, name_='hot_agent')
+            showIndent(outfile, level)
+            outfile.write('),\n')
         showIndent(outfile, level)
         outfile.write('agent=[\n')
         level += 1
         for agent_ in self.agent:
             showIndent(outfile, level)
-            outfile.write('model_.agent(\n')
-            agent_.exportLiteral(outfile, level)
+            outfile.write('model_.agentType(\n')
+            agent_.exportLiteral(outfile, level, name_='agentType')
             showIndent(outfile, level)
             outfile.write('),\n')
         level -= 1
@@ -826,8 +1490,8 @@ class person(GeneratedsSuper):
         level += 1
         for promoter_ in self.promoter:
             showIndent(outfile, level)
-            outfile.write('model_.booster(\n')
-            promoter_.exportLiteral(outfile, level, name_='booster')
+            outfile.write('model_.boosterType(\n')
+            promoter_.exportLiteral(outfile, level, name_='boosterType')
             showIndent(outfile, level)
             outfile.write('),\n')
         level -= 1
@@ -835,108 +1499,169 @@ class person(GeneratedsSuper):
         outfile.write('],\n')
         if self.description is not None:
             showIndent(outfile, level)
-            outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding))
+            outfile.write('description=%s,\n' % self.gds_encode(quote_python(self.description)))
+        if self.range_ is not None:
+            showIndent(outfile, level)
+            outfile.write('range_=%d,\n' % self.range_)
+        if self.with_ is not None:
+            showIndent(outfile, level)
+            outfile.write('with_=model_.boosterType(\n')
+            self.with_.exportLiteral(outfile, level, name_='with')
+            showIndent(outfile, level)
+            outfile.write('),\n')
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = attrs.get('vegetable')
-        if value is not None and 'vegetable' not in already_processed:
-            already_processed.append('vegetable')
-            self.vegetable = value
-        value = attrs.get('fruit')
-        if value is not None and 'fruit' not in already_processed:
-            already_processed.append('fruit')
-            self.fruit = value
-        value = attrs.get('ratio')
-        if value is not None and 'ratio' not in already_processed:
-            already_processed.append('ratio')
-            try:
-                self.ratio = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
-        value = attrs.get('id')
+        value = find_attr_value_('value', node)
+        if value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            self.value = value
+        value = find_attr_value_('id', node)
         if value is not None and 'id' not in already_processed:
-            already_processed.append('id')
+            already_processed.add('id')
             try:
                 self.id = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = attrs.get('value')
-        if value is not None and 'value' not in already_processed:
-            already_processed.append('value')
-            self.value = value
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+        value = find_attr_value_('ratio', node)
+        if value is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            try:
+                self.ratio = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('fruit', node)
+        if value is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            self.fruit = value
+        value = find_attr_value_('vegetable', node)
+        if value is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            self.vegetable = value
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'name':
             name_ = child_.text
+            name_ = self.gds_validate_string(name_, node, 'name')
             self.name = name_
         elif nodeName_ == 'interest':
             interest_ = child_.text
+            interest_ = self.gds_validate_string(interest_, node, 'interest')
             self.interest.append(interest_)
         elif nodeName_ == 'category':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'category')
             self.category = ival_
-        elif nodeName_ == 'agent': 
-            obj_ = agent.factory()
+        elif nodeName_ == 'hot.agent':
+            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_)
-        elif nodeName_ == 'promoter': 
-            obj_ = booster.factory()
+            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')
             self.description = description_
-# end class person
+        elif nodeName_ == 'range':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'range')
+            self.range_ = ival_
+            # validate type RangeType
+            self.validate_RangeType(self.range_)
+        elif nodeName_ == 'with':
+            obj_ = boosterType.factory()
+            obj_.build(child_)
+            self.with_ = obj_
+            obj_.original_tagname_ = 'with'
+# end class personType
 
 
-class specialperson(person):
+class specialperson(personType):
     member_data_items_ = {
-        }
+    }
     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):
-        super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
-        pass
+    superclass = personType
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None):
+        self.original_tagname_ = None
+        super(specialperson, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, )
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, specialperson)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if specialperson.subclass:
             return specialperson.subclass(*args_, **kwargs_)
         else:
             return specialperson(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def export(self, outfile, level, namespace_='', name_='specialperson', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='specialperson')
-        outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-        outfile.write(' xsi:type="specialperson"')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='specialperson'):
-        super(specialperson, self).exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson')
-    def exportChildren(self, outfile, level, namespace_='', name_='specialperson'):
-        super(specialperson, self).exportChildren(outfile, level, namespace_, name_)
     def hasContent_(self):
         if (
             super(specialperson, self).hasContent_()
-            ):
+        ):
             return True
         else:
             return False
+    def export(self, outfile, level, namespace_='', name_='specialperson', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('specialperson')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='specialperson')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='specialperson', 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_='specialperson'):
+        super(specialperson, self).exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson')
+    def exportChildren(self, outfile, level, namespace_='', name_='specialperson', fromsubclass_=False, pretty_print=True):
+        super(specialperson, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+    def to_etree(self, parent_element=None, name_='specialperson', mapping_=None):
+        element = super(specialperson, self).to_etree(parent_element, name_, mapping_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
     def exportLiteral(self, outfile, level, name_='specialperson'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
@@ -944,66 +1669,90 @@ class specialperson(person):
     def exportLiteralChildren(self, outfile, level, name_):
         super(specialperson, self).exportLiteralChildren(outfile, level, name_)
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(specialperson, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
-        super(specialperson, self).buildChildren(child_, nodeName_, True)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        super(specialperson, self).buildChildren(child_, node, nodeName_, True)
         pass
 # end class specialperson
 
 
-class programmer(person):
-    """A programmer type of person. Programmers are very special but also a
-    little shy."""
+class programmerType(personType):
     member_data_items_ = {
-        'language': MemberSpec_('language', 'xs:string', 0),
-        'area': MemberSpec_('area', 'xs:string', 0),
-        'attrnegint': MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
-        'attrposint': MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        'attrnonnegint': MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0),
-        'attrnonposint': MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0),
-        'email': MemberSpec_('email', 'xs:string', 0),
-        'elposint': MemberSpec_('elposint', 'xs:positiveInteger', 0),
-        'elnonposint': MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0),
-        'elnegint': MemberSpec_('elnegint', 'xs:negativeInteger', 0),
-        'elnonnegint': MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0),
-        'eldate': MemberSpec_('eldate', 'xs:date', 0),
-        'eltoken': MemberSpec_('eltoken', 'xs:token', 0),
-        'elshort': MemberSpec_('elshort', 'xs:short', 0),
-        'ellong': MemberSpec_('ellong', 'xs:long', 0),
-        'elparam': MemberSpec_('elparam', 'param', 0),
-        'elarraytypes': MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0),
-        }
+        'language': MemberSpec_('language', 'xs:string', 0, 1, {'use': 'optional'}),
+        'area': MemberSpec_('area', 'xs:string', 0, 1, {'use': 'optional'}),
+        'attrposint': MemberSpec_('attrposint', 'xs:positiveInteger', 0, 1, {'use': 'optional'}),
+        'attrnonposint': MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0, 1, {'use': 'optional'}),
+        'attrnegint': MemberSpec_('attrnegint', 'xs:negativeInteger', 0, 1, {'use': 'optional'}),
+        'attrnonnegint': MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0, 1, {'use': 'optional'}),
+        'email': MemberSpec_('email', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'email'}, None),
+        'elposint': MemberSpec_('elposint', 'xs:positiveInteger', 0, 0, {u'type': u'xs:positiveInteger', u'name': u'elposint'}, None),
+        'elnonposint': MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0, 0, {u'type': u'xs:nonPositiveInteger', u'name': u'elnonposint'}, None),
+        'elnegint': MemberSpec_('elnegint', 'xs:negativeInteger', 0, 0, {u'type': u'xs:negativeInteger', u'name': u'elnegint'}, None),
+        'elnonnegint': MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0, 0, {u'type': u'xs:nonNegativeInteger', u'name': u'elnonnegint'}, None),
+        'eldate': MemberSpec_('eldate', 'xs:date', 0, 0, {u'type': u'xs:date', u'name': u'eldate'}, None),
+        'eldatetime': MemberSpec_('eldatetime', 'xs:dateTime', 0, 0, {u'type': u'xs:dateTime', u'name': u'eldatetime'}, None),
+        'eldatetime1': MemberSpec_('eldatetime1', 'xs:dateTime', 0, 0, {u'type': u'xs:dateTime', u'name': u'eldatetime1'}, None),
+        'eltoken': MemberSpec_('eltoken', 'xs:token', 0, 0, {u'type': u'xs:token', u'name': u'eltoken'}, None),
+        'elshort': MemberSpec_('elshort', 'xs:short', 0, 0, {u'type': u'xs:short', u'name': u'elshort'}, None),
+        'ellong': MemberSpec_('ellong', 'xs:long', 0, 0, {u'type': u'xs:long', u'name': u'ellong'}, None),
+        'elparam': MemberSpec_('elparam', 'paramType', 0, 0, {u'type': u'paramType', u'name': u'elparam'}, None),
+        'elarraytypes': MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0, 0, {u'type': u'xs:NMTOKEN', u'name': u'elarraytypes'}, None),
+    }
     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):
-        super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
+    superclass = personType
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=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__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
-        self.attrnegint = _cast(int, attrnegint)
         self.attrposint = _cast(int, attrposint)
-        self.attrnonnegint = _cast(int, attrnonnegint)
         self.attrnonposint = _cast(int, attrnonposint)
+        self.attrnegint = _cast(int, attrnegint)
+        self.attrnonnegint = _cast(int, attrnonnegint)
         self.email = email
         self.elposint = elposint
         self.elnonposint = elnonposint
         self.elnegint = elnegint
         self.elnonnegint = elnonnegint
-        self.eldate = eldate
-        self.eltoken = eltoken
+        if isinstance(eldate, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date()
+        else:
+            initvalue_ = eldate
+        self.eldate = initvalue_
+        if isinstance(eldatetime, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = eldatetime
+        self.eldatetime = initvalue_
+        if isinstance(eldatetime1, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(eldatetime1, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = eldatetime1
+        self.eldatetime1 = initvalue_
+        self.eltoken = eltoken
         self.elshort = elshort
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
+        self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
-        if programmer.subclass:
-            return programmer.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, programmerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if programmerType.subclass:
+            return programmerType.subclass(*args_, **kwargs_)
         else:
-            return programmer(*args_, **kwargs_)
+            return programmerType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_email(self): return self.email
     def set_email(self, email): self.email = email
@@ -1023,6 +1772,12 @@ class programmer(person):
     def get_eldate(self): return self.eldate
     def set_eldate(self, eldate): self.eldate = eldate
     eldateProp = property(get_eldate, set_eldate)
+    def get_eldatetime(self): return self.eldatetime
+    def set_eldatetime(self, eldatetime): self.eldatetime = eldatetime
+    eldatetimeProp = property(get_eldatetime, set_eldatetime)
+    def get_eldatetime1(self): return self.eldatetime1
+    def set_eldatetime1(self, eldatetime1): self.eldatetime1 = eldatetime1
+    eldatetime1Prop = property(get_eldatetime1, set_eldatetime1)
     def get_eltoken(self): return self.eltoken
     def set_eltoken(self, eltoken): self.eltoken = eltoken
     eltokenProp = property(get_eltoken, set_eltoken)
@@ -1044,139 +1799,236 @@ class programmer(person):
     def get_area(self): return self.area
     def set_area(self, area): self.area = area
     areaProp = property(get_area, set_area)
-    def get_attrnegint(self): return self.attrnegint
-    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
-    attrnegintProp = property(get_attrnegint, set_attrnegint)
     def get_attrposint(self): return self.attrposint
     def set_attrposint(self, attrposint): self.attrposint = attrposint
     attrposintProp = property(get_attrposint, set_attrposint)
-    def get_attrnonnegint(self): return self.attrnonnegint
-    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
-    attrnonnegintProp = property(get_attrnonnegint, set_attrnonnegint)
     def get_attrnonposint(self): return self.attrnonposint
     def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint
     attrnonposintProp = property(get_attrnonposint, set_attrnonposint)
-    def export(self, outfile, level, namespace_='', name_='programmer', namespacedef_=''):
-        showIndent(outfile, level)
+    def get_attrnegint(self): return self.attrnegint
+    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
+    attrnegintProp = property(get_attrnegint, set_attrnegint)
+    def get_attrnonnegint(self): return self.attrnonnegint
+    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
+    attrnonnegintProp = property(get_attrnonnegint, set_attrnonnegint)
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def validate_ArrayTypes(self, value):
+        # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['float', 'int', 'Name', 'token']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
+    def hasContent_(self):
+        if (
+            self.email is not None or
+            self.elposint is not None or
+            self.elnonposint is not None or
+            self.elnegint is not None or
+            self.elnonnegint is not None or
+            self.eldate is not None or
+            self.eldatetime is not None or
+            self.eldatetime1 is not None or
+            self.eltoken is not None or
+            self.elshort is not None or
+            self.ellong is not None or
+            self.elparam is not None or
+            self.elarraytypes is not None or
+            super(programmerType, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='programmerType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('programmerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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 '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='programmer')
-        outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-        outfile.write(' xsi:type="programmer"')
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmerType')
         if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='programmerType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='programmer'):
-        super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='programmerType'):
+        super(programmerType, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmerType')
         if self.language is not None and 'language' not in already_processed:
-            already_processed.append('language')
-            outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), ))
+            already_processed.add('language')
+            outfile.write(' language=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.language), input_name='language')), ))
         if self.area is not None and 'area' not in already_processed:
-            already_processed.append('area')
-            outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), ))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.append('attrnegint')
-            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+            already_processed.add('area')
+            outfile.write(' area=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.area), input_name='area')), ))
         if self.attrposint is not None and 'attrposint' not in already_processed:
-            already_processed.append('attrposint')
+            already_processed.add('attrposint')
             outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint'))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.append('attrnonnegint')
-            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
         if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
-            already_processed.append('attrnonposint')
+            already_processed.add('attrnonposint')
             outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint'))
-    def exportChildren(self, outfile, level, namespace_='', name_='programmer'):
-        super(programmer, self).exportChildren(outfile, level, namespace_, name_)
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+    def exportChildren(self, outfile, level, namespace_='', name_='programmerType', fromsubclass_=False, pretty_print=True):
+        super(programmerType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
         if self.email is not None:
-            showIndent(outfile, level)
-            outfile.write('<%semail>%s</%semail>\n' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<email>%s</email>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.email), input_name='email')), eol_))
         if self.elposint is not None:
-            showIndent(outfile, level)
-            outfile.write('<%selposint>%s</%selposint>\n' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<elposint>%s</elposint>%s' % (self.gds_format_integer(self.elposint, input_name='elposint'), eol_))
         if self.elnonposint is not None:
-            showIndent(outfile, level)
-            outfile.write('<%selnonposint>%s</%selnonposint>\n' % (namespace_, self.gds_format_integer(self.elnonposint, input_name='elnonposint'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<elnonposint>%s</elnonposint>%s' % (self.gds_format_integer(self.elnonposint, input_name='elnonposint'), eol_))
         if self.elnegint is not None:
-            showIndent(outfile, level)
-            outfile.write('<%selnegint>%s</%selnegint>\n' % (namespace_, self.gds_format_integer(self.elnegint, input_name='elnegint'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<elnegint>%s</elnegint>%s' % (self.gds_format_integer(self.elnegint, input_name='elnegint'), eol_))
         if self.elnonnegint is not None:
-            showIndent(outfile, level)
-            outfile.write('<%selnonnegint>%s</%selnonnegint>\n' % (namespace_, self.gds_format_integer(self.elnonnegint, input_name='elnonnegint'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<elnonnegint>%s</elnonnegint>%s' % (self.gds_format_integer(self.elnonnegint, input_name='elnonnegint'), eol_))
         if self.eldate is not None:
-            showIndent(outfile, level)
-            outfile.write('<%seldate>%s</%seldate>\n' % (namespace_, self.gds_format_string(quote_xml(self.eldate).encode(ExternalEncoding), input_name='eldate'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<eldate>%s</eldate>%s' % (self.gds_format_date(self.eldate, input_name='eldate'), eol_))
+        if self.eldatetime is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<eldatetime>%s</eldatetime>%s' % (self.gds_format_datetime(self.eldatetime, input_name='eldatetime'), eol_))
+        if self.eldatetime1 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<eldatetime1>%s</eldatetime1>%s' % (self.gds_format_datetime(self.eldatetime1, input_name='eldatetime1'), eol_))
         if self.eltoken is not None:
-            showIndent(outfile, level)
-            outfile.write('<%seltoken>%s</%seltoken>\n' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<eltoken>%s</eltoken>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.eltoken), input_name='eltoken')), eol_))
         if self.elshort is not None:
-            showIndent(outfile, level)
-            outfile.write('<%selshort>%s</%selshort>\n' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<elshort>%s</elshort>%s' % (self.gds_format_integer(self.elshort, input_name='elshort'), eol_))
         if self.ellong is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sellong>%s</%sellong>\n' % (namespace_, self.gds_format_integer(self.ellong, input_name='ellong'), namespace_))
-        if self.elparam:
-            self.elparam.export(outfile, level, namespace_, name_='elparam', )
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<ellong>%s</ellong>%s' % (self.gds_format_integer(self.ellong, input_name='ellong'), eol_))
+        if self.elparam is not None:
+            self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print)
         if self.elarraytypes is not None:
-            showIndent(outfile, level)
-            outfile.write('<%selarraytypes>%s</%selarraytypes>\n' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_))
-    def hasContent_(self):
-        if (
-            self.email is not None or
-            self.elposint is not None or
-            self.elnonposint is not None or
-            self.elnegint is not None or
-            self.elnonnegint is not None or
-            self.eldate is not None or
-            self.eltoken is not None or
-            self.elshort is not None or
-            self.ellong is not None or
-            self.elparam is not None or
-            self.elarraytypes is not None or
-            super(programmer, self).hasContent_()
-            ):
-            return True
-        else:
-            return False
-    def exportLiteral(self, outfile, level, name_='programmer'):
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<elarraytypes>%s</elarraytypes>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.elarraytypes), input_name='elarraytypes')), eol_))
+    def to_etree(self, parent_element=None, name_='programmerType', mapping_=None):
+        element = super(programmerType, self).to_etree(parent_element, name_, mapping_)
+        if self.extensiontype_ is not None:
+            element.set('{http://www.w3.org/2001/XMLSchema-instance}type', self.extensiontype_)
+        if self.language is not None:
+            element.set('language', self.gds_format_string(self.language))
+        if self.area is not None:
+            element.set('area', self.gds_format_string(self.area))
+        if self.attrposint is not None:
+            element.set('attrposint', self.gds_format_integer(self.attrposint))
+        if self.attrnonposint is not None:
+            element.set('attrnonposint', self.gds_format_integer(self.attrnonposint))
+        if self.attrnegint is not None:
+            element.set('attrnegint', self.gds_format_integer(self.attrnegint))
+        if self.attrnonnegint is not None:
+            element.set('attrnonnegint', self.gds_format_integer(self.attrnonnegint))
+        if self.email is not None:
+            email_ = self.email
+            etree_.SubElement(element, '{}email').text = self.gds_format_string(email_)
+        if self.elposint is not None:
+            elposint_ = self.elposint
+            etree_.SubElement(element, '{}elposint').text = self.gds_format_integer(elposint_)
+        if self.elnonposint is not None:
+            elnonposint_ = self.elnonposint
+            etree_.SubElement(element, '{}elnonposint').text = self.gds_format_integer(elnonposint_)
+        if self.elnegint is not None:
+            elnegint_ = self.elnegint
+            etree_.SubElement(element, '{}elnegint').text = self.gds_format_integer(elnegint_)
+        if self.elnonnegint is not None:
+            elnonnegint_ = self.elnonnegint
+            etree_.SubElement(element, '{}elnonnegint').text = self.gds_format_integer(elnonnegint_)
+        if self.eldate is not None:
+            eldate_ = self.eldate
+            etree_.SubElement(element, '{}eldate').text = self.gds_format_date(eldate_)
+        if self.eldatetime is not None:
+            eldatetime_ = self.eldatetime
+            etree_.SubElement(element, '{}eldatetime').text = self.gds_format_datetime(eldatetime_)
+        if self.eldatetime1 is not None:
+            eldatetime1_ = self.eldatetime1
+            etree_.SubElement(element, '{}eldatetime1').text = self.gds_format_datetime(eldatetime1_)
+        if self.eltoken is not None:
+            eltoken_ = self.eltoken
+            etree_.SubElement(element, '{}eltoken').text = self.gds_format_string(eltoken_)
+        if self.elshort is not None:
+            elshort_ = self.elshort
+            etree_.SubElement(element, '{}elshort').text = self.gds_format_integer(elshort_)
+        if self.ellong is not None:
+            ellong_ = self.ellong
+            etree_.SubElement(element, '{}ellong').text = self.gds_format_integer(ellong_)
+        if self.elparam is not None:
+            elparam_ = self.elparam
+            elparam_.to_etree(element, name_='elparam', mapping_=mapping_)
+        if self.elarraytypes is not None:
+            elarraytypes_ = self.elarraytypes
+            etree_.SubElement(element, '{}elarraytypes').text = self.gds_format_string(elarraytypes_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='programmerType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
         if self.language is not None and 'language' not in already_processed:
-            already_processed.append('language')
+            already_processed.add('language')
             showIndent(outfile, level)
-            outfile.write('language = "%s",\n' % (self.language,))
+            outfile.write('language="%s",\n' % (self.language,))
         if self.area is not None and 'area' not in already_processed:
-            already_processed.append('area')
-            showIndent(outfile, level)
-            outfile.write('area = "%s",\n' % (self.area,))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.append('attrnegint')
+            already_processed.add('area')
             showIndent(outfile, level)
-            outfile.write('attrnegint = %d,\n' % (self.attrnegint,))
+            outfile.write('area="%s",\n' % (self.area,))
         if self.attrposint is not None and 'attrposint' not in already_processed:
-            already_processed.append('attrposint')
+            already_processed.add('attrposint')
             showIndent(outfile, level)
-            outfile.write('attrposint = %d,\n' % (self.attrposint,))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.append('attrnonnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnonnegint = %d,\n' % (self.attrnonnegint,))
+            outfile.write('attrposint=%d,\n' % (self.attrposint,))
         if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
-            already_processed.append('attrnonposint')
+            already_processed.add('attrnonposint')
+            showIndent(outfile, level)
+            outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
             showIndent(outfile, level)
-            outfile.write('attrnonposint = %d,\n' % (self.attrnonposint,))
-        super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+            outfile.write('attrnegint=%d,\n' % (self.attrnegint,))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            showIndent(outfile, level)
+            outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,))
+        super(programmerType, self).exportLiteralAttributes(outfile, level, already_processed, name_)
     def exportLiteralChildren(self, outfile, level, name_):
-        super(programmer, self).exportLiteralChildren(outfile, level, name_)
+        super(programmerType, self).exportLiteralChildren(outfile, level, name_)
         if self.email is not None:
             showIndent(outfile, level)
-            outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding))
+            outfile.write('email=%s,\n' % self.gds_encode(quote_python(self.email)))
         if self.elposint is not None:
             showIndent(outfile, level)
             outfile.write('elposint=%d,\n' % self.elposint)
@@ -1191,10 +2043,16 @@ class programmer(person):
             outfile.write('elnonnegint=%d,\n' % self.elnonnegint)
         if self.eldate is not None:
             showIndent(outfile, level)
-            outfile.write('eldate=%s,\n' % quote_python(self.eldate).encode(ExternalEncoding))
+            outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate'))
+        if self.eldatetime is not None:
+            showIndent(outfile, level)
+            outfile.write('eldatetime=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.eldatetime, input_name='eldatetime'))
+        if self.eldatetime1 is not None:
+            showIndent(outfile, level)
+            outfile.write('eldatetime1=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.eldatetime1, input_name='eldatetime1'))
         if self.eltoken is not None:
             showIndent(outfile, level)
-            outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding))
+            outfile.write('eltoken=%s,\n' % self.gds_encode(quote_python(self.eltoken)))
         if self.elshort is not None:
             showIndent(outfile, level)
             outfile.write('elshort=%d,\n' % self.elshort)
@@ -1203,509 +2061,828 @@ class programmer(person):
             outfile.write('ellong=%d,\n' % self.ellong)
         if self.elparam is not None:
             showIndent(outfile, level)
-            outfile.write('elparam=model_.param(\n')
+            outfile.write('elparam=model_.paramType(\n')
             self.elparam.exportLiteral(outfile, level, name_='elparam')
             showIndent(outfile, level)
             outfile.write('),\n')
         if self.elarraytypes is not None:
             showIndent(outfile, level)
-            outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding))
+            outfile.write('elarraytypes=%s,\n' % self.gds_encode(quote_python(self.elarraytypes)))
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = attrs.get('language')
+        value = find_attr_value_('language', node)
         if value is not None and 'language' not in already_processed:
-            already_processed.append('language')
+            already_processed.add('language')
             self.language = value
-        value = attrs.get('area')
+        value = find_attr_value_('area', node)
         if value is not None and 'area' not in already_processed:
-            already_processed.append('area')
+            already_processed.add('area')
             self.area = value
-        value = attrs.get('attrnegint')
-        if value is not None and 'attrnegint' not in already_processed:
-            already_processed.append('attrnegint')
-            try:
-                self.attrnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnegint >= 0:
-                raise_parse_error(node, 'Invalid NegativeInteger')
-        value = attrs.get('attrposint')
+        value = find_attr_value_('attrposint', node)
         if value is not None and 'attrposint' not in already_processed:
-            already_processed.append('attrposint')
+            already_processed.add('attrposint')
             try:
                 self.attrposint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrposint <= 0:
                 raise_parse_error(node, 'Invalid PositiveInteger')
-        value = attrs.get('attrnonnegint')
-        if value is not None and 'attrnonnegint' not in already_processed:
-            already_processed.append('attrnonnegint')
-            try:
-                self.attrnonnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnonnegint < 0:
-                raise_parse_error(node, 'Invalid NonNegativeInteger')
-        value = attrs.get('attrnonposint')
+        value = find_attr_value_('attrnonposint', node)
         if value is not None and 'attrnonposint' not in already_processed:
-            already_processed.append('attrnonposint')
+            already_processed.add('attrnonposint')
             try:
                 self.attrnonposint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrnonposint > 0:
                 raise_parse_error(node, 'Invalid NonPositiveInteger')
-        super(programmer, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+        value = find_attr_value_('attrnegint', node)
+        if value is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            try:
+                self.attrnegint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnegint >= 0:
+                raise_parse_error(node, 'Invalid NegativeInteger')
+        value = find_attr_value_('attrnonnegint', node)
+        if value is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            try:
+                self.attrnonnegint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonnegint < 0:
+                raise_parse_error(node, 'Invalid NonNegativeInteger')
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+        super(programmerType, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'email':
             email_ = child_.text
+            email_ = self.gds_validate_string(email_, node, 'email')
             self.email = email_
         elif nodeName_ == 'elposint':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ <= 0:
                 raise_parse_error(child_, 'requires positiveInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elposint')
             self.elposint = ival_
         elif nodeName_ == 'elnonposint':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ > 0:
                 raise_parse_error(child_, 'requires nonPositiveInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnonposint')
             self.elnonposint = ival_
         elif nodeName_ == 'elnegint':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ >= 0:
                 raise_parse_error(child_, 'requires negativeInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnegint')
             self.elnegint = ival_
         elif nodeName_ == 'elnonnegint':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ < 0:
                 raise_parse_error(child_, 'requires nonNegativeInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'elnonnegint')
             self.elnonnegint = ival_
         elif nodeName_ == 'eldate':
-            eldate_ = child_.text
-            self.eldate = eldate_
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.eldate = dval_
+        elif nodeName_ == 'eldatetime':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.eldatetime = dval_
+        elif nodeName_ == 'eldatetime1':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.eldatetime1 = dval_
         elif nodeName_ == 'eltoken':
             eltoken_ = child_.text
-            eltoken_ = re_.sub(STRING_CLEANUP_PAT, " ", eltoken_).strip()
+            if eltoken_:
+                eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            else:
+                eltoken_ = ""
+            eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken')
             self.eltoken = eltoken_
         elif nodeName_ == 'elshort':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'elshort')
             self.elshort = ival_
         elif nodeName_ == 'ellong':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'ellong')
             self.ellong = ival_
-        elif nodeName_ == 'elparam': 
-            obj_ = param.factory()
+        elif nodeName_ == 'elparam':
+            obj_ = paramType.factory()
             obj_.build(child_)
-            self.set_elparam(obj_)
+            self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
+            elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
             self.elarraytypes = elarraytypes_
-        super(programmer, self).buildChildren(child_, nodeName_, True)
-# end class programmer
+            # validate type ArrayTypes
+            self.validate_ArrayTypes(self.elarraytypes)
+        super(programmerType, self).buildChildren(child_, node, nodeName_, True)
+# end class programmerType
 
 
-class param(GeneratedsSuper):
-    """Finding flow attribute unneccesary in practice. A unnamed parameter
-    is unbound/skipped."""
+class paramType(GeneratedsSuper):
     member_data_items_ = {
-        'semantic': MemberSpec_('semantic', 'xs:token', 0),
-        'name': MemberSpec_('name', 'xs:NCName', 0),
-        'flow': MemberSpec_('flow', 'FlowType', 0),
-        'sid': MemberSpec_('sid', 'xs:NCName', 0),
-        'type': MemberSpec_('type', 'xs:NMTOKEN', 0),
-        'id': MemberSpec_('id', 'xs:string', 0),
+        'id': MemberSpec_('id', 'xs:string', 0, 1, {'use': 'optional'}),
+        'name': MemberSpec_('name', 'xs:NCName', 0, 1, {'use': 'optional'}),
+        'sid': MemberSpec_('sid', 'xs:NCName', 0, 1, {'use': 'optional'}),
+        'flow': MemberSpec_('flow', 'FlowType', 0, 1, {'use': 'optional'}),
+        'semantic': MemberSpec_('semantic', 'xs:token', 0, 1, {'use': 'optional'}),
+        'type_': MemberSpec_('type_', 'xs:NMTOKEN', 0, 0, {'use': u'required'}),
         'valueOf_': MemberSpec_('valueOf_', 'xs:string', 0),
-        }
+    }
     subclass = None
     superclass = None
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        self.semantic = _cast(None, semantic)
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.id = _cast(None, id)
         self.name = _cast(None, name)
-        self.flow = _cast(None, flow)
         self.sid = _cast(None, sid)
+        self.flow = _cast(int, flow)
+        self.semantic = _cast(None, semantic)
         self.type_ = _cast(None, type_)
-        self.id = _cast(None, id)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
-        if param.subclass:
-            return param.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, paramType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if paramType.subclass:
+            return paramType.subclass(*args_, **kwargs_)
         else:
-            return param(*args_, **kwargs_)
+            return paramType(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_semantic(self): return self.semantic
-    def set_semantic(self, semantic): self.semantic = semantic
-    semanticProp = property(get_semantic, set_semantic)
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    idProp = property(get_id, set_id)
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
     nameProp = property(get_name, set_name)
-    def get_flow(self): return self.flow
-    def set_flow(self, flow): self.flow = flow
-    flowProp = property(get_flow, set_flow)
-    def validate_FlowType(self, value):
-        # Validate type FlowType, a restriction on xs:integer.
-        pass
     def get_sid(self): return self.sid
     def set_sid(self, sid): self.sid = sid
     sidProp = property(get_sid, set_sid)
+    def get_flow(self): return self.flow
+    def set_flow(self, flow): self.flow = flow
+    flowProp = property(get_flow, set_flow)
+    def get_semantic(self): return self.semantic
+    def set_semantic(self, semantic): self.semantic = semantic
+    semanticProp = property(get_semantic, set_semantic)
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
     typeProp = property(get_type, set_type)
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
-    idProp = property(get_id, set_id)
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
-    def export(self, outfile, level, namespace_='', name_='param', namespacedef_=''):
-        showIndent(outfile, level)
+    def validate_FlowType(self, value):
+        # Validate type FlowType, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+            pass
+    def hasContent_(self):
+        if (
+            (1 if type(self.valueOf_) in [int,float] else self.valueOf_)
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='paramType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('paramType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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 '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='param')
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='paramType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(self.valueOf_)
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='paramType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.append('semantic')
-            outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), ))
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='paramType'):
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
         if self.name is not None and 'name' not in already_processed:
-            already_processed.append('name')
+            already_processed.add('name')
             outfile.write(' name=%s' % (quote_attrib(self.name), ))
-        if self.flow is not None and 'flow' not in already_processed:
-            already_processed.append('flow')
-            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
         if self.sid is not None and 'sid' not in already_processed:
-            already_processed.append('sid')
+            already_processed.add('sid')
             outfile.write(' sid=%s' % (quote_attrib(self.sid), ))
-        outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), ))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.append('id')
-            outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='param'):
+        if self.flow is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            outfile.write(' semantic=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.semantic), input_name='semantic')), ))
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='paramType', fromsubclass_=False, pretty_print=True):
         pass
-    def hasContent_(self):
-        if (
-            self.valueOf_
-            ):
-            return True
+    def to_etree(self, parent_element=None, name_='paramType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
         else:
-            return False
-    def exportLiteral(self, outfile, level, name_='param'):
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        if self.id is not None:
+            element.set('id', self.gds_format_string(self.id))
+        if self.name is not None:
+            element.set('name', self.name)
+        if self.sid is not None:
+            element.set('sid', self.sid)
+        if self.flow is not None:
+            element.set('flow', self.flow)
+        if self.semantic is not None:
+            element.set('semantic', self.gds_format_string(self.semantic))
+        if self.type_ is not None:
+            element.set('type', self.gds_format_string(self.type_))
+        if self.hasContent_():
+            element.text = self.gds_format_string(self.get_valueOf_())
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='paramType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
         if self.hasContent_():
             self.exportLiteralChildren(outfile, level, name_)
         showIndent(outfile, level)
         outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
     def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.append('semantic')
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
             showIndent(outfile, level)
-            outfile.write('semantic = "%s",\n' % (self.semantic,))
+            outfile.write('id="%s",\n' % (self.id,))
         if self.name is not None and 'name' not in already_processed:
-            already_processed.append('name')
+            already_processed.add('name')
+            showIndent(outfile, level)
+            outfile.write('name="%s",\n' % (self.name,))
+        if self.sid is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
             showIndent(outfile, level)
-            outfile.write('name = "%s",\n' % (self.name,))
+            outfile.write('sid="%s",\n' % (self.sid,))
         if self.flow is not None and 'flow' not in already_processed:
-            already_processed.append('flow')
+            already_processed.add('flow')
             showIndent(outfile, level)
-            outfile.write('flow = %d,\n' % (self.flow,))
-        if self.sid is not None and 'sid' not in already_processed:
-            already_processed.append('sid')
+            outfile.write('flow=%d,\n' % (self.flow,))
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
             showIndent(outfile, level)
-            outfile.write('sid = "%s",\n' % (self.sid,))
+            outfile.write('semantic="%s",\n' % (self.semantic,))
         if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.append('type_')
-            showIndent(outfile, level)
-            outfile.write('type_ = "%s",\n' % (self.type_,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.append('id')
+            already_processed.add('type_')
             showIndent(outfile, level)
-            outfile.write('id = "%s",\n' % (self.id,))
+            outfile.write('type_="%s",\n' % (self.type_,))
     def exportLiteralChildren(self, outfile, level, name_):
         pass
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
         self.valueOf_ = get_all_text_(node)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = attrs.get('semantic')
-        if value is not None and 'semantic' not in already_processed:
-            already_processed.append('semantic')
-            self.semantic = value
-            self.semantic = ' '.join(self.semantic.split())
-        value = attrs.get('name')
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+        value = find_attr_value_('name', node)
         if value is not None and 'name' not in already_processed:
-            already_processed.append('name')
+            already_processed.add('name')
             self.name = value
-        value = attrs.get('flow')
+        value = find_attr_value_('sid', node)
+        if value is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            self.sid = value
+        value = find_attr_value_('flow', node)
         if value is not None and 'flow' not in already_processed:
-            already_processed.append('flow')
+            already_processed.add('flow')
             try:
                 self.flow = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             self.validate_FlowType(self.flow)    # validate type FlowType
-        value = attrs.get('sid')
-        if value is not None and 'sid' not in already_processed:
-            already_processed.append('sid')
-            self.sid = value
-        value = attrs.get('type')
+        value = find_attr_value_('semantic', node)
+        if value is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            self.semantic = value
+            self.semantic = ' '.join(self.semantic.split())
+        value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
-            already_processed.append('type')
+            already_processed.add('type')
             self.type_ = value
-        value = attrs.get('id')
-        if value is not None and 'id' not in already_processed:
-            already_processed.append('id')
-            self.id = value
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
-# end class param
+# end class paramType
 
 
-class python_programmer(programmer):
-    """A Python programmer type of person. Programmers are very special and
-    Python programmers are especially wonderful kinds of people."""
+class python_programmerType(programmerType):
     member_data_items_ = {
-        'nick-name': MemberSpec_('nick-name', 'xs:string', 0),
-        'favorite_editor': MemberSpec_('favorite_editor', 'xs:string', 0),
-        }
+        'nick-name': MemberSpec_('nick-name', 'xs:string', 0, 1, {'use': 'optional'}),
+        'drcs_attr': MemberSpec_('drcs_attr', 'xs:string', 0, 1, {'use': 'optional'}),
+        'gui_developer': MemberSpec_('gui_developer', 'xs:boolean', 0, 1, {'use': 'optional'}),
+        'favorite_editor': MemberSpec_('favorite_editor', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'favorite-editor'}, None),
+        'flowvalue': MemberSpec_('flowvalue', ['FlowType', 'xs:integer'], 0, 0, {u'type': u'xs:integer', u'name': u'flowvalue'}, None),
+        'drcs': MemberSpec_('drcs', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'drcs'}, None),
+    }
     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):
-        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, )
+    superclass = programmerType
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=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, nick_name=None, drcs_attr=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None):
+        self.original_tagname_ = None
+        super(python_programmerType, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
+        self.drcs_attr = _cast(None, drcs_attr)
+        self.gui_developer = _cast(bool, gui_developer)
         self.favorite_editor = favorite_editor
+        self.flowvalue = flowvalue
+        self.validate_FlowType(self.flowvalue)
+        self.drcs = drcs
     def factory(*args_, **kwargs_):
-        if python_programmer.subclass:
-            return python_programmer.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, python_programmerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if python_programmerType.subclass:
+            return python_programmerType.subclass(*args_, **kwargs_)
         else:
-            return python_programmer(*args_, **kwargs_)
+            return python_programmerType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_favorite_editor(self): return self.favorite_editor
     def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
     favorite_editorProp = property(get_favorite_editor, set_favorite_editor)
+    def get_flowvalue(self): return self.flowvalue
+    def set_flowvalue(self, flowvalue): self.flowvalue = flowvalue
+    flowvalueProp = property(get_flowvalue, set_flowvalue)
+    def get_drcs(self): return self.drcs
+    def set_drcs(self, drcs): self.drcs = drcs
+    drcsProp = property(get_drcs, set_drcs)
     def get_nick_name(self): return self.nick_name
     def set_nick_name(self, nick_name): self.nick_name = nick_name
     nick_nameProp = property(get_nick_name, set_nick_name)
-    def export(self, outfile, level, namespace_='', name_='python-programmer', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='python-programmer')
-        outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-        outfile.write(' xsi:type="python-programmer"')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='python-programmer'):
-        super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.append('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='python-programmer'):
-        super(python_programmer, self).exportChildren(outfile, level, namespace_, name_)
-        if self.favorite_editor is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>\n' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_))
+    def get_drcs_attr(self): return self.drcs_attr
+    def set_drcs_attr(self, drcs_attr): self.drcs_attr = drcs_attr
+    drcs_attrProp = property(get_drcs_attr, set_drcs_attr)
+    def get_gui_developer(self): return self.gui_developer
+    def set_gui_developer(self, gui_developer): self.gui_developer = gui_developer
+    gui_developerProp = property(get_gui_developer, set_gui_developer)
+    def validate_FlowType(self, value):
+        # Validate type FlowType, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+            pass
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
-            super(python_programmer, self).hasContent_()
-            ):
+            self.flowvalue is not None or
+            self.drcs is not None or
+            super(python_programmerType, self).hasContent_()
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='python-programmer'):
+    def export(self, outfile, level, namespace_='', name_='python-programmerType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('python-programmerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='python-programmerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmerType', 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_='python-programmerType'):
+        super(python_programmerType, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmerType')
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), ))
+        if self.drcs_attr is not None and 'drcs_attr' not in already_processed:
+            already_processed.add('drcs_attr')
+            outfile.write(' drcs=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.drcs_attr), input_name='drcs_attr')), ))
+        if self.gui_developer is not None and 'gui_developer' not in already_processed:
+            already_processed.add('gui_developer')
+            outfile.write(' gui_developer="%s"' % self.gds_format_boolean(self.gui_developer, input_name='gui_developer'))
+    def exportChildren(self, outfile, level, namespace_='', name_='python-programmerType', fromsubclass_=False, pretty_print=True):
+        super(python_programmerType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.favorite_editor is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<favorite-editor>%s</favorite-editor>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), eol_))
+        if self.flowvalue is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<flowvalue>%s</flowvalue>%s' % (self.gds_format_integer(self.flowvalue, input_name='flowvalue'), eol_))
+        if self.drcs is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<drcs>%s</drcs>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.drcs), input_name='drcs')), eol_))
+    def to_etree(self, parent_element=None, name_='python-programmerType', mapping_=None):
+        element = super(python_programmerType, self).to_etree(parent_element, name_, mapping_)
+        if self.nick_name is not None:
+            element.set('nick-name', self.gds_format_string(self.nick_name))
+        if self.drcs_attr is not None:
+            element.set('drcs_attr', self.gds_format_string(self.drcs_attr))
+        if self.gui_developer is not None:
+            element.set('gui_developer', self.gds_format_boolean(self.gui_developer))
+        if self.favorite_editor is not None:
+            favorite_editor_ = self.favorite_editor
+            etree_.SubElement(element, '{}favorite-editor').text = self.gds_format_string(favorite_editor_)
+        if self.flowvalue is not None:
+            flowvalue_ = self.flowvalue
+            etree_.SubElement(element, '{}flowvalue').text = self.gds_format_integer(flowvalue_)
+        if self.drcs is not None:
+            drcs_ = self.drcs
+            etree_.SubElement(element, '{}drcs').text = self.gds_format_string(drcs_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='python-programmerType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
         if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.append('nick_name')
+            already_processed.add('nick_name')
+            showIndent(outfile, level)
+            outfile.write('nick_name="%s",\n' % (self.nick_name,))
+        if self.drcs_attr is not None and 'drcs_attr' not in already_processed:
+            already_processed.add('drcs_attr')
             showIndent(outfile, level)
-            outfile.write('nick_name = "%s",\n' % (self.nick_name,))
-        super(python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+            outfile.write('drcs_attr="%s",\n' % (self.drcs_attr,))
+        if self.gui_developer is not None and 'gui_developer' not in already_processed:
+            already_processed.add('gui_developer')
+            showIndent(outfile, level)
+            outfile.write('gui_developer=%s,\n' % (self.gui_developer,))
+        super(python_programmerType, self).exportLiteralAttributes(outfile, level, already_processed, name_)
     def exportLiteralChildren(self, outfile, level, name_):
-        super(python_programmer, self).exportLiteralChildren(outfile, level, name_)
+        super(python_programmerType, self).exportLiteralChildren(outfile, level, name_)
         if self.favorite_editor is not None:
             showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+            outfile.write('favorite_editor=%s,\n' % self.gds_encode(quote_python(self.favorite_editor)))
+        if self.flowvalue is not None:
+            showIndent(outfile, level)
+            outfile.write('flowvalue=%d,\n' % self.flowvalue)
+        if self.drcs is not None:
+            showIndent(outfile, level)
+            outfile.write('drcs=%s,\n' % self.gds_encode(quote_python(self.drcs)))
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = attrs.get('nick-name')
+        value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
-            already_processed.append('nick-name')
+            already_processed.add('nick-name')
             self.nick_name = value
-        super(python_programmer, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+        value = find_attr_value_('drcs', node)
+        if value is not None and 'drcs_attr' not in already_processed:
+            already_processed.add('drcs_attr')
+            self.drcs_attr = value
+        value = find_attr_value_('gui_developer', node)
+        if value is not None and 'gui_developer' not in already_processed:
+            already_processed.add('gui_developer')
+            if value in ('true', '1'):
+                self.gui_developer = True
+            elif value in ('false', '0'):
+                self.gui_developer = False
+            else:
+                raise_parse_error(node, 'Bad boolean attribute')
+        super(python_programmerType, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'favorite-editor':
             favorite_editor_ = child_.text
+            favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
             self.favorite_editor = favorite_editor_
-        super(python_programmer, self).buildChildren(child_, nodeName_, True)
-# end class python_programmer
+        elif nodeName_ == 'flowvalue':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'flowvalue')
+            self.flowvalue = ival_
+            # validate type FlowType
+            self.validate_FlowType(self.flowvalue)
+        elif nodeName_ == 'drcs':
+            drcs_ = child_.text
+            drcs_ = self.gds_validate_string(drcs_, node, 'drcs')
+            self.drcs = drcs_
+        super(python_programmerType, self).buildChildren(child_, node, nodeName_, True)
+# end class python_programmerType
 
 
-class java_programmer(programmer):
-    """A Java programmer type of person. Programmers are very special and
-    Java programmers are nice also, but not as especially wonderful
-    as Python programmers, of course."""
+class java_programmerType(programmerType):
     member_data_items_ = {
-        'status': MemberSpec_('status', 'xs:string', 0),
-        'nick-name': MemberSpec_('nick-name', 'xs:string', 0),
-        'favorite_editor': MemberSpec_('favorite_editor', 'xs:string', 0),
-        }
+        'nick-name': MemberSpec_('nick-name', 'xs:string', 0, 1, {'use': 'optional'}),
+        'status': MemberSpec_('status', 'xs:string', 0, 1, {'use': 'optional'}),
+        'favorite_editor': MemberSpec_('favorite_editor', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'favorite-editor'}, None),
+        'datetime1': MemberSpec_('datetime1', 'xs:gYear', 0, 0, {u'type': u'xs:gYear', u'name': u'datetime1'}, None),
+        'datetime2': MemberSpec_('datetime2', 'xs:gYearMonth', 0, 0, {u'type': u'xs:gYearMonth', u'name': u'datetime2'}, None),
+        'datetime3': MemberSpec_('datetime3', 'xs:gMonth', 0, 0, {u'type': u'xs:gMonth', u'name': u'datetime3'}, None),
+        'datetime4': MemberSpec_('datetime4', 'xs:gMonthDay', 0, 0, {u'type': u'xs:gMonthDay', u'name': u'datetime4'}, None),
+        'datetime5': MemberSpec_('datetime5', 'xs:gDay', 0, 0, {u'type': u'xs:gDay', u'name': u'datetime5'}, None),
+    }
     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):
-        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)
+    superclass = programmerType
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, with_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=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, nick_name=None, status=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None):
+        self.original_tagname_ = None
+        super(java_programmerType, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, with_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
+        self.status = _cast(None, status)
         self.favorite_editor = favorite_editor
+        self.datetime1 = datetime1
+        self.datetime2 = datetime2
+        self.datetime3 = datetime3
+        self.datetime4 = datetime4
+        self.datetime5 = datetime5
     def factory(*args_, **kwargs_):
-        if java_programmer.subclass:
-            return java_programmer.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, java_programmerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if java_programmerType.subclass:
+            return java_programmerType.subclass(*args_, **kwargs_)
         else:
-            return java_programmer(*args_, **kwargs_)
+            return java_programmerType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_favorite_editor(self): return self.favorite_editor
     def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
     favorite_editorProp = property(get_favorite_editor, set_favorite_editor)
-    def get_status(self): return self.status
-    def set_status(self, status): self.status = status
-    statusProp = property(get_status, set_status)
+    def get_datetime1(self): return self.datetime1
+    def set_datetime1(self, datetime1): self.datetime1 = datetime1
+    datetime1Prop = property(get_datetime1, set_datetime1)
+    def get_datetime2(self): return self.datetime2
+    def set_datetime2(self, datetime2): self.datetime2 = datetime2
+    datetime2Prop = property(get_datetime2, set_datetime2)
+    def get_datetime3(self): return self.datetime3
+    def set_datetime3(self, datetime3): self.datetime3 = datetime3
+    datetime3Prop = property(get_datetime3, set_datetime3)
+    def get_datetime4(self): return self.datetime4
+    def set_datetime4(self, datetime4): self.datetime4 = datetime4
+    datetime4Prop = property(get_datetime4, set_datetime4)
+    def get_datetime5(self): return self.datetime5
+    def set_datetime5(self, datetime5): self.datetime5 = datetime5
+    datetime5Prop = property(get_datetime5, set_datetime5)
     def get_nick_name(self): return self.nick_name
     def set_nick_name(self, nick_name): self.nick_name = nick_name
     nick_nameProp = property(get_nick_name, set_nick_name)
-    def export(self, outfile, level, namespace_='', name_='java-programmer', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='java-programmer')
-        outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-        outfile.write(' xsi:type="java-programmer"')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'):
-        super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.append('status')
-            outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), ))
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.append('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='java-programmer'):
-        super(java_programmer, self).exportChildren(outfile, level, namespace_, name_)
-        if self.favorite_editor is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>\n' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_))
+    def get_status(self): return self.status
+    def set_status(self, status): self.status = status
+    statusProp = property(get_status, set_status)
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
-            super(java_programmer, self).hasContent_()
-            ):
+            self.datetime1 is not None or
+            self.datetime2 is not None or
+            self.datetime3 is not None or
+            self.datetime4 is not None or
+            self.datetime5 is not None or
+            super(java_programmerType, self).hasContent_()
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='java-programmer'):
+    def export(self, outfile, level, namespace_='', name_='java-programmerType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('java-programmerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='java-programmerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmerType', 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_='java-programmerType'):
+        super(java_programmerType, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmerType')
+        if self.nick_name is not None and 'nick_name' not in already_processed:
+            already_processed.add('nick_name')
+            outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), ))
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            outfile.write(' status=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.status), input_name='status')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='java-programmerType', fromsubclass_=False, pretty_print=True):
+        super(java_programmerType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.favorite_editor is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<favorite-editor>%s</favorite-editor>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), eol_))
+        if self.datetime1 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<datetime1>%s</datetime1>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.datetime1), input_name='datetime1')), eol_))
+        if self.datetime2 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<datetime2>%s</datetime2>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.datetime2), input_name='datetime2')), eol_))
+        if self.datetime3 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<datetime3>%s</datetime3>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.datetime3), input_name='datetime3')), eol_))
+        if self.datetime4 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<datetime4>%s</datetime4>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.datetime4), input_name='datetime4')), eol_))
+        if self.datetime5 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<datetime5>%s</datetime5>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.datetime5), input_name='datetime5')), eol_))
+    def to_etree(self, parent_element=None, name_='java-programmerType', mapping_=None):
+        element = super(java_programmerType, self).to_etree(parent_element, name_, mapping_)
+        if self.nick_name is not None:
+            element.set('nick-name', self.gds_format_string(self.nick_name))
+        if self.status is not None:
+            element.set('status', self.gds_format_string(self.status))
+        if self.favorite_editor is not None:
+            favorite_editor_ = self.favorite_editor
+            etree_.SubElement(element, '{}favorite-editor').text = self.gds_format_string(favorite_editor_)
+        if self.datetime1 is not None:
+            datetime1_ = self.datetime1
+            etree_.SubElement(element, '{}datetime1').text = self.gds_format_string(datetime1_)
+        if self.datetime2 is not None:
+            datetime2_ = self.datetime2
+            etree_.SubElement(element, '{}datetime2').text = self.gds_format_string(datetime2_)
+        if self.datetime3 is not None:
+            datetime3_ = self.datetime3
+            etree_.SubElement(element, '{}datetime3').text = self.gds_format_string(datetime3_)
+        if self.datetime4 is not None:
+            datetime4_ = self.datetime4
+            etree_.SubElement(element, '{}datetime4').text = self.gds_format_string(datetime4_)
+        if self.datetime5 is not None:
+            datetime5_ = self.datetime5
+            etree_.SubElement(element, '{}datetime5').text = self.gds_format_string(datetime5_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='java-programmerType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.append('status')
-            showIndent(outfile, level)
-            outfile.write('status = "%s",\n' % (self.status,))
         if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.append('nick_name')
+            already_processed.add('nick_name')
+            showIndent(outfile, level)
+            outfile.write('nick_name="%s",\n' % (self.nick_name,))
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
             showIndent(outfile, level)
-            outfile.write('nick_name = "%s",\n' % (self.nick_name,))
-        super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+            outfile.write('status="%s",\n' % (self.status,))
+        super(java_programmerType, self).exportLiteralAttributes(outfile, level, already_processed, name_)
     def exportLiteralChildren(self, outfile, level, name_):
-        super(java_programmer, self).exportLiteralChildren(outfile, level, name_)
+        super(java_programmerType, self).exportLiteralChildren(outfile, level, name_)
         if self.favorite_editor is not None:
             showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+            outfile.write('favorite_editor=%s,\n' % self.gds_encode(quote_python(self.favorite_editor)))
+        if self.datetime1 is not None:
+            showIndent(outfile, level)
+            outfile.write('datetime1=%s,\n' % self.gds_encode(quote_python(self.datetime1)))
+        if self.datetime2 is not None:
+            showIndent(outfile, level)
+            outfile.write('datetime2=%s,\n' % self.gds_encode(quote_python(self.datetime2)))
+        if self.datetime3 is not None:
+            showIndent(outfile, level)
+            outfile.write('datetime3=%s,\n' % self.gds_encode(quote_python(self.datetime3)))
+        if self.datetime4 is not None:
+            showIndent(outfile, level)
+            outfile.write('datetime4=%s,\n' % self.gds_encode(quote_python(self.datetime4)))
+        if self.datetime5 is not None:
+            showIndent(outfile, level)
+            outfile.write('datetime5=%s,\n' % self.gds_encode(quote_python(self.datetime5)))
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = attrs.get('status')
-        if value is not None and 'status' not in already_processed:
-            already_processed.append('status')
-            self.status = value
-        value = attrs.get('nick-name')
+        value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
-            already_processed.append('nick-name')
+            already_processed.add('nick-name')
             self.nick_name = value
-        super(java_programmer, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
-        if nodeName_ == 'favorite-editor':
+        value = find_attr_value_('status', node)
+        if value is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            self.status = value
+        super(java_programmerType, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'favorite-editor':
             favorite_editor_ = child_.text
+            favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
             self.favorite_editor = favorite_editor_
-        super(java_programmer, self).buildChildren(child_, nodeName_, True)
-# end class java_programmer
+        elif nodeName_ == 'datetime1':
+            datetime1_ = child_.text
+            datetime1_ = self.gds_validate_string(datetime1_, node, 'datetime1')
+            self.datetime1 = datetime1_
+        elif nodeName_ == 'datetime2':
+            datetime2_ = child_.text
+            datetime2_ = self.gds_validate_string(datetime2_, node, 'datetime2')
+            self.datetime2 = datetime2_
+        elif nodeName_ == 'datetime3':
+            datetime3_ = child_.text
+            datetime3_ = self.gds_validate_string(datetime3_, node, 'datetime3')
+            self.datetime3 = datetime3_
+        elif nodeName_ == 'datetime4':
+            datetime4_ = child_.text
+            datetime4_ = self.gds_validate_string(datetime4_, node, 'datetime4')
+            self.datetime4 = datetime4_
+        elif nodeName_ == 'datetime5':
+            datetime5_ = child_.text
+            datetime5_ = self.gds_validate_string(datetime5_, node, 'datetime5')
+            self.datetime5 = datetime5_
+        super(java_programmerType, self).buildChildren(child_, node, nodeName_, True)
+# end class java_programmerType
 
 
-class agent(GeneratedsSuper):
+class agentType(GeneratedsSuper):
     member_data_items_ = {
-        'firstname': MemberSpec_('firstname', 'xs:string', 0),
-        'lastname': MemberSpec_('lastname', 'xs:string', 0),
-        'priority': MemberSpec_('priority', 'xs:float', 0),
-        'info': MemberSpec_('info', 'info', 0),
-        'vehicle': MemberSpec_('vehicle', 'vehicle', 1),
-        }
+        'firstname': MemberSpec_('firstname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'firstname'}, None),
+        'lastname': MemberSpec_('lastname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'lastname'}, None),
+        'priority': MemberSpec_('priority', 'xs:float', 0, 1, {u'type': u'xs:float', u'name': u'priority', u'minOccurs': u'0'}, None),
+        'info': MemberSpec_('info', 'infoType', 0, 0, {u'type': u'infoType', u'name': u'info'}, None),
+        'vehicle': MemberSpec_('vehicle', 'vehicleType', 1, 1, {u'maxOccurs': u'unbounded', 'type': u'vehicle', u'ref': u'vehicle', 'name': u'vehicle', u'minOccurs': u'0'}, None),
+    }
     subclass = None
     superclass = None
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=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
@@ -1714,11 +2891,17 @@ class agent(GeneratedsSuper):
             self.vehicle = []
         else:
             self.vehicle = vehicle
+        self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
-        if agent.subclass:
-            return agent.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, agentType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if agentType.subclass:
+            return agentType.subclass(*args_, **kwargs_)
         else:
-            return agent(*args_, **kwargs_)
+            return agentType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_firstname(self): return self.firstname
     def set_firstname(self, firstname): self.firstname = firstname
@@ -1735,35 +2918,11 @@ class agent(GeneratedsSuper):
     def get_vehicle(self): return self.vehicle
     def set_vehicle(self, vehicle): self.vehicle = vehicle
     def add_vehicle(self, value): self.vehicle.append(value)
-    def insert_vehicle(self, index, value): self.vehicle[index] = value
+    def insert_vehicle_at(self, index, value): self.vehicle.insert(index, value)
+    def replace_vehicle_at(self, index, value): self.vehicle[index] = value
     vehicleProp = property(get_vehicle, set_vehicle)
-    def export(self, outfile, level, namespace_='', name_='agent', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='agent')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='agent'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='agent'):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sfirstname>%s</%sfirstname>\n' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('<%slastname>%s</%slastname>\n' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_))
-        if self.priority is not None:
-            showIndent(outfile, level)
-            outfile.write('<%spriority>%s</%spriority>\n' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_))
-        if self.info:
-            self.info.export(outfile, level, namespace_, name_='info', )
-        for vehicle_ in self.get_vehicle():
-            vehicle_.export(outfile, level, namespace_, name_='vehicle')
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def hasContent_(self):
         if (
             self.firstname is not None or
@@ -1771,13 +2930,83 @@ class agent(GeneratedsSuper):
             self.priority is not None or
             self.info is not None or
             self.vehicle
-            ):
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='agent'):
+    def export(self, outfile, level, namespace_='', name_='agentType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('agentType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='agentType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='agentType', 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_='agentType'):
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='agentType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<firstname>%s</firstname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<lastname>%s</lastname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), eol_))
+        if self.priority is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<priority>%s</priority>%s' % (self.gds_format_float(self.priority, input_name='priority'), eol_))
+        if self.info is not None:
+            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
+        for vehicle_ in self.vehicle:
+            vehicle_.export(outfile, level, namespace_, name_='vehicle', pretty_print=pretty_print)
+    def to_etree(self, parent_element=None, name_='agentType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
+        else:
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        if self.extensiontype_ is not None:
+            element.set('{http://www.w3.org/2001/XMLSchema-instance}type', self.extensiontype_)
+        if self.firstname is not None:
+            firstname_ = self.firstname
+            etree_.SubElement(element, '{}firstname').text = self.gds_format_string(firstname_)
+        if self.lastname is not None:
+            lastname_ = self.lastname
+            etree_.SubElement(element, '{}lastname').text = self.gds_format_string(lastname_)
+        if self.priority is not None:
+            priority_ = self.priority
+            etree_.SubElement(element, '{}priority').text = self.gds_format_float(priority_)
+        if self.info is not None:
+            info_ = self.info
+            info_.to_etree(element, name_='info', mapping_=mapping_)
+        for vehicle_ in self.vehicle:
+            vehicle_.to_etree(element, name_='vehicle', mapping_=mapping_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='agentType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
@@ -1785,17 +3014,17 @@ class agent(GeneratedsSuper):
     def exportLiteralChildren(self, outfile, level, name_):
         if self.firstname is not None:
             showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+            outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname)))
         if self.lastname is not None:
             showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+            outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname)))
         if self.priority is not None:
             showIndent(outfile, level)
             outfile.write('priority=%f,\n' % self.priority)
         if self.info is not None:
             showIndent(outfile, level)
-            outfile.write('info=model_.info(\n')
-            self.info.exportLiteral(outfile, level)
+            outfile.write('info=model_.infoType(\n')
+            self.info.exportLiteral(outfile, level, name_='info')
             showIndent(outfile, level)
             outfile.write('),\n')
         showIndent(outfile, level)
@@ -1811,32 +3040,42 @@ class agent(GeneratedsSuper):
         showIndent(outfile, level)
         outfile.write('],\n')
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'firstname':
             firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
             self.firstname = firstname_
         elif nodeName_ == 'lastname':
             lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
             self.lastname = lastname_
         elif nodeName_ == 'priority':
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
-        elif nodeName_ == 'info': 
-            obj_ = info.factory()
+        elif nodeName_ == 'info':
+            obj_ = infoType.factory()
             obj_.build(child_)
-            self.set_info(obj_)
-        elif nodeName_ == 'vehicle': 
-            type_name_ = child_.attrib.get('{http://www.w3.org/2001/XMLSchema-instance}type')
+            self.info = obj_
+            obj_.original_tagname_ = 'info'
+        elif nodeName_ == 'vehicle':
+            type_name_ = child_.attrib.get(
+                '{http://www.w3.org/2001/XMLSchema-instance}type')
             if type_name_ is None:
                 type_name_ = child_.attrib.get('type')
             if type_name_ is not None:
@@ -1852,30 +3091,38 @@ class agent(GeneratedsSuper):
                 raise NotImplementedError(
                     'Class not implemented for <vehicle> element')
             self.vehicle.append(obj_)
-# end class agent
+            obj_.original_tagname_ = 'vehicle'
+# end class agentType
 
 
-class special_agent(GeneratedsSuper):
+class special_agentType(agentType):
     """This is a good kind of agent for testing the generation of Python
     bindings for an XML schema."""
     member_data_items_ = {
-        'firstname': MemberSpec_('firstname', 'xs:string', 0),
-        'lastname': MemberSpec_('lastname', 'xs:string', 0),
-        'priority': MemberSpec_('priority', 'xs:float', 0),
-        'info': MemberSpec_('info', 'info', 0),
-        }
+        'firstname': MemberSpec_('firstname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'firstname'}, None),
+        'lastname': MemberSpec_('lastname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'lastname'}, None),
+        'priority': MemberSpec_('priority', 'xs:float', 0, 0, {u'type': u'xs:float', u'name': u'priority'}, None),
+        'info': MemberSpec_('info', 'infoType', 0, 0, {u'type': u'infoType', u'name': u'info'}, None),
+    }
     subclass = None
-    superclass = None
-    def __init__(self, firstname=None, lastname=None, priority=None, info=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
         self.priority = priority
         self.info = info
     def factory(*args_, **kwargs_):
-        if special_agent.subclass:
-            return special_agent.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, special_agentType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if special_agentType.subclass:
+            return special_agentType.subclass(*args_, **kwargs_)
         else:
-            return special_agent(*args_, **kwargs_)
+            return special_agentType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_firstname(self): return self.firstname
     def set_firstname(self, firstname): self.firstname = firstname
@@ -1889,111 +3136,323 @@ class special_agent(GeneratedsSuper):
     def get_info(self): return self.info
     def set_info(self, info): self.info = info
     infoProp = property(get_info, set_info)
-    def export(self, outfile, level, namespace_='', name_='special-agent', namespacedef_=''):
-        showIndent(outfile, level)
+    def hasContent_(self):
+        if (
+            self.firstname is not None or
+            self.lastname is not None or
+            self.priority is not None or
+            self.info is not None or
+            super(special_agentType, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='special-agentType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('special-agentType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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 '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='special-agent')
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agentType')
         if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='special-agentType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='special-agent'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='special-agent'):
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='special-agentType'):
+        super(special_agentType, self).exportAttributes(outfile, level, already_processed, namespace_, name_='special-agentType')
+    def exportChildren(self, outfile, level, namespace_='', name_='special-agentType', fromsubclass_=False, pretty_print=True):
+        super(special_agentType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<firstname>%s</firstname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<lastname>%s</lastname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), eol_))
+        if self.priority is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<priority>%s</priority>%s' % (self.gds_format_float(self.priority, input_name='priority'), eol_))
+        if self.info is not None:
+            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
+    def to_etree(self, parent_element=None, name_='special-agentType', mapping_=None):
+        element = super(special_agentType, self).to_etree(parent_element, name_, mapping_)
+        if self.firstname is not None:
+            firstname_ = self.firstname
+            etree_.SubElement(element, '{}firstname').text = self.gds_format_string(firstname_)
+        if self.lastname is not None:
+            lastname_ = self.lastname
+            etree_.SubElement(element, '{}lastname').text = self.gds_format_string(lastname_)
+        if self.priority is not None:
+            priority_ = self.priority
+            etree_.SubElement(element, '{}priority').text = self.gds_format_float(priority_)
+        if self.info is not None:
+            info_ = self.info
+            info_.to_etree(element, name_='info', mapping_=mapping_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='special-agentType'):
+        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_):
+        super(special_agentType, self).exportLiteralAttributes(outfile, level, already_processed, name_)
+    def exportLiteralChildren(self, outfile, level, name_):
+        super(special_agentType, self).exportLiteralChildren(outfile, level, name_)
         if self.firstname is not None:
             showIndent(outfile, level)
-            outfile.write('<%sfirstname>%s</%sfirstname>\n' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_))
+            outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname)))
         if self.lastname is not None:
             showIndent(outfile, level)
-            outfile.write('<%slastname>%s</%slastname>\n' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_))
+            outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname)))
         if self.priority is not None:
             showIndent(outfile, level)
-            outfile.write('<%spriority>%s</%spriority>\n' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_))
-        if self.info:
-            self.info.export(outfile, level, namespace_, name_='info', )
+            outfile.write('priority=%f,\n' % self.priority)
+        if self.info is not None:
+            showIndent(outfile, level)
+            outfile.write('info=model_.infoType(\n')
+            self.info.exportLiteral(outfile, level, name_='info')
+            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):
+        super(special_agentType, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'firstname':
+            firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
+            self.firstname = firstname_
+        elif nodeName_ == 'lastname':
+            lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
+            self.lastname = lastname_
+        elif nodeName_ == 'priority':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'priority')
+            self.priority = fval_
+        elif nodeName_ == 'info':
+            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
+
+
+class weird_agentType(agentType):
+    """This is a good kind of agent for testing the generation of Python
+    bindings for an XML schema."""
+    member_data_items_ = {
+        'firstname': MemberSpec_('firstname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'firstname'}, None),
+        'lastname': MemberSpec_('lastname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'lastname'}, None),
+        'priority': MemberSpec_('priority', 'xs:float', 0, 0, {u'type': u'xs:float', u'name': u'priority'}, None),
+        'info': MemberSpec_('info', 'infoType', 0, 0, {u'type': u'infoType', u'name': u'info'}, None),
+    }
+    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
+        self.priority = priority
+        self.info = info
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, weird_agentType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if weird_agentType.subclass:
+            return weird_agentType.subclass(*args_, **kwargs_)
+        else:
+            return weird_agentType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_firstname(self): return self.firstname
+    def set_firstname(self, firstname): self.firstname = firstname
+    firstnameProp = property(get_firstname, set_firstname)
+    def get_lastname(self): return self.lastname
+    def set_lastname(self, lastname): self.lastname = lastname
+    lastnameProp = property(get_lastname, set_lastname)
+    def get_priority(self): return self.priority
+    def set_priority(self, priority): self.priority = priority
+    priorityProp = property(get_priority, set_priority)
+    def get_info(self): return self.info
+    def set_info(self, info): self.info = info
+    infoProp = property(get_info, set_info)
     def hasContent_(self):
         if (
             self.firstname is not None or
             self.lastname is not None or
             self.priority is not None or
-            self.info is not None
-            ):
+            self.info is not None or
+            super(weird_agentType, self).hasContent_()
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='special-agent'):
+    def export(self, outfile, level, namespace_='', name_='weird-agentType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('weird-agentType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='weird-agentType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='weird-agentType', 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_='weird-agentType'):
+        super(weird_agentType, self).exportAttributes(outfile, level, already_processed, namespace_, name_='weird-agentType')
+    def exportChildren(self, outfile, level, namespace_='', name_='weird-agentType', fromsubclass_=False, pretty_print=True):
+        super(weird_agentType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<firstname>%s</firstname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<lastname>%s</lastname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), eol_))
+        if self.priority is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<priority>%s</priority>%s' % (self.gds_format_float(self.priority, input_name='priority'), eol_))
+        if self.info is not None:
+            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
+    def to_etree(self, parent_element=None, name_='weird-agentType', mapping_=None):
+        element = super(weird_agentType, self).to_etree(parent_element, name_, mapping_)
+        if self.firstname is not None:
+            firstname_ = self.firstname
+            etree_.SubElement(element, '{}firstname').text = self.gds_format_string(firstname_)
+        if self.lastname is not None:
+            lastname_ = self.lastname
+            etree_.SubElement(element, '{}lastname').text = self.gds_format_string(lastname_)
+        if self.priority is not None:
+            priority_ = self.priority
+            etree_.SubElement(element, '{}priority').text = self.gds_format_float(priority_)
+        if self.info is not None:
+            info_ = self.info
+            info_.to_etree(element, name_='info', mapping_=mapping_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='weird-agentType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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
+        super(weird_agentType, self).exportLiteralAttributes(outfile, level, already_processed, name_)
     def exportLiteralChildren(self, outfile, level, name_):
+        super(weird_agentType, self).exportLiteralChildren(outfile, level, name_)
         if self.firstname is not None:
             showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+            outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname)))
         if self.lastname is not None:
             showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+            outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname)))
         if self.priority is not None:
             showIndent(outfile, level)
             outfile.write('priority=%f,\n' % self.priority)
         if self.info is not None:
             showIndent(outfile, level)
-            outfile.write('info=model_.info(\n')
-            self.info.exportLiteral(outfile, level)
+            outfile.write('info=model_.infoType(\n')
+            self.info.exportLiteral(outfile, level, name_='info')
             showIndent(outfile, level)
             outfile.write('),\n')
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+        super(weird_agentType, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'firstname':
             firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
             self.firstname = firstname_
         elif nodeName_ == 'lastname':
             lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
             self.lastname = lastname_
         elif nodeName_ == 'priority':
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
-        elif nodeName_ == 'info': 
-            obj_ = info.factory()
+        elif nodeName_ == 'info':
+            obj_ = infoType.factory()
             obj_.build(child_)
-            self.set_info(obj_)
-# end class special_agent
+            self.info = obj_
+            obj_.original_tagname_ = 'info'
+        super(weird_agentType, self).buildChildren(child_, node, nodeName_, True)
+# end class weird_agentType
 
 
-class booster(GeneratedsSuper):
+class boosterType(GeneratedsSuper):
     member_data_items_ = {
-        'member-id': MemberSpec_('member-id', 'xs:string', 0),
-        'firstname': MemberSpec_('firstname', 'xs:string', 0),
-        'lastname': MemberSpec_('lastname', 'xs:string', 0),
-        'other_name': MemberSpec_('other_name', 'xs:float', 0),
-        'classxx': MemberSpec_('classxx', 'xs:float', 0),
-        'other_value': MemberSpec_('other_value', 'xs:float', 1),
-        'type_': MemberSpec_('type_', 'xs:float', 1),
-        'client_handler': MemberSpec_('client_handler', 'client-handler', 1),
-        }
+        'member-id': MemberSpec_('member-id', 'xs:string', 0, 1, {'use': 'optional'}),
+        'firstname': MemberSpec_('firstname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'firstname'}, None),
+        'lastname': MemberSpec_('lastname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'lastname'}, None),
+        'other_name': MemberSpec_('other_name', 'xs:float', 0, 0, {u'type': u'xs:float', u'name': u'other-name'}, None),
+        'class_': MemberSpec_('class_', 'xs:float', 0, 0, {u'type': u'xs:float', u'name': u'class'}, None),
+        'other_value': MemberSpec_('other_value', 'xs:float', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'xs:float', u'name': u'other-value'}, None),
+        'type_': MemberSpec_('type_', 'xs:float', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'xs:float', u'name': u'type'}, None),
+        'client_handler': MemberSpec_('client_handler', 'client-handlerType', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'client-handlerType', u'name': u'client-handler'}, None),
+    }
     subclass = None
     superclass = None
-    def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, classxx=None, other_value=None, type_=None, client_handler=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
         self.other_name = other_name
-        self.classxx = classxx
+        self.class_ = class_
         if other_value is None:
             self.other_value = []
         else:
@@ -2007,10 +3466,15 @@ class booster(GeneratedsSuper):
         else:
             self.client_handler = client_handler
     def factory(*args_, **kwargs_):
-        if booster.subclass:
-            return booster.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, boosterType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if boosterType.subclass:
+            return boosterType.subclass(*args_, **kwargs_)
         else:
-            return booster(*args_, **kwargs_)
+            return boosterType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_firstname(self): return self.firstname
     def set_firstname(self, firstname): self.firstname = firstname
@@ -2021,99 +3485,145 @@ class booster(GeneratedsSuper):
     def get_other_name(self): return self.other_name
     def set_other_name(self, other_name): self.other_name = other_name
     other_nameProp = property(get_other_name, set_other_name)
-    def get_class(self): return self.classxx
-    def set_class(self, classxx): self.classxx = classxx
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
     classProp = property(get_class, set_class)
     def get_other_value(self): return self.other_value
     def set_other_value(self, other_value): self.other_value = other_value
     def add_other_value(self, value): self.other_value.append(value)
-    def insert_other_value(self, index, value): self.other_value[index] = value
+    def insert_other_value_at(self, index, value): self.other_value.insert(index, value)
+    def replace_other_value_at(self, index, value): self.other_value[index] = value
     other_valueProp = property(get_other_value, set_other_value)
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
     def add_type(self, value): self.type_.append(value)
-    def insert_type(self, index, value): self.type_[index] = value
+    def insert_type_at(self, index, value): self.type_.insert(index, value)
+    def replace_type_at(self, index, value): self.type_[index] = value
     typeProp = property(get_type, set_type)
     def get_client_handler(self): return self.client_handler
     def set_client_handler(self, client_handler): self.client_handler = client_handler
     def add_client_handler(self, value): self.client_handler.append(value)
-    def insert_client_handler(self, index, value): self.client_handler[index] = value
+    def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value)
+    def replace_client_handler_at(self, index, value): self.client_handler[index] = value
     client_handlerProp = property(get_client_handler, set_client_handler)
     def get_member_id(self): return self.member_id
     def set_member_id(self, member_id): self.member_id = member_id
     member_idProp = property(get_member_id, set_member_id)
-    def export(self, outfile, level, namespace_='', name_='booster', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='booster')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='booster'):
-        if self.member_id is not None and 'member_id' not in already_processed:
-            already_processed.append('member_id')
-            outfile.write(' member-id=%s' % (self.gds_format_string(quote_attrib(self.member_id).encode(ExternalEncoding), input_name='member-id'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='booster'):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sfirstname>%s</%sfirstname>\n' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('<%slastname>%s</%slastname>\n' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_))
-        if self.other_name is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sother-name>%s</%sother-name>\n' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_))
-        if self.classxx is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sclass>%s</%sclass>\n' % (namespace_, self.gds_format_float(self.classxx, input_name='class'), namespace_))
-        for other_value_ in self.other_value:
-            showIndent(outfile, level)
-            outfile.write('<%sother-value>%s</%sother-value>\n' % (namespace_, self.gds_format_float(other_value_, input_name='other-value'), namespace_))
-        for type_ in self.type_:
-            showIndent(outfile, level)
-            outfile.write('<%stype>%s</%stype>\n' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_))
-        for client_handler_ in self.client_handler:
-            client_handler_.export(outfile, level, namespace_, name_='client-handler')
     def hasContent_(self):
         if (
             self.firstname is not None or
             self.lastname is not None or
             self.other_name is not None or
-            self.classxx is not None or
+            self.class_ is not None or
             self.other_value or
             self.type_ or
             self.client_handler
-            ):
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='booster'):
+    def export(self, outfile, level, namespace_='', name_='boosterType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('boosterType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='boosterType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='boosterType', 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_='boosterType'):
+        if self.member_id is not None and 'member_id' not in already_processed:
+            already_processed.add('member_id')
+            outfile.write(' member-id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.member_id), input_name='member-id')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='boosterType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<firstname>%s</firstname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<lastname>%s</lastname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), eol_))
+        if self.other_name is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<other-name>%s</other-name>%s' % (self.gds_format_float(self.other_name, input_name='other-name'), eol_))
+        if self.class_ is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<class>%s</class>%s' % (self.gds_format_float(self.class_, input_name='class'), eol_))
+        for other_value_ in self.other_value:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<other-value>%s</other-value>%s' % (self.gds_format_float(other_value_, input_name='other-value'), eol_))
+        for type_ in self.type_:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<type>%s</type>%s' % (self.gds_format_float(type_, input_name='type'), eol_))
+        for client_handler_ in self.client_handler:
+            client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print)
+    def to_etree(self, parent_element=None, name_='boosterType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
+        else:
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        if self.member_id is not None:
+            element.set('member-id', self.gds_format_string(self.member_id))
+        if self.firstname is not None:
+            firstname_ = self.firstname
+            etree_.SubElement(element, '{}firstname').text = self.gds_format_string(firstname_)
+        if self.lastname is not None:
+            lastname_ = self.lastname
+            etree_.SubElement(element, '{}lastname').text = self.gds_format_string(lastname_)
+        if self.other_name is not None:
+            other_name_ = self.other_name
+            etree_.SubElement(element, '{}other-name').text = self.gds_format_float(other_name_)
+        if self.class_ is not None:
+            class__ = self.class_
+            etree_.SubElement(element, '{}class').text = self.gds_format_float(class__)
+        for other_value_ in self.other_value:
+            etree_.SubElement(element, '{}other-value').text = self.gds_format_float(other_value_)
+        for type__ in self.type_:
+            etree_.SubElement(element, '{}type').text = self.gds_format_float(type__)
+        for client_handler_ in self.client_handler:
+            client_handler_.to_etree(element, name_='client-handler', mapping_=mapping_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='boosterType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
         if self.member_id is not None and 'member_id' not in already_processed:
-            already_processed.append('member_id')
+            already_processed.add('member_id')
             showIndent(outfile, level)
-            outfile.write('member_id = "%s",\n' % (self.member_id,))
+            outfile.write('member_id="%s",\n' % (self.member_id,))
     def exportLiteralChildren(self, outfile, level, name_):
         if self.firstname is not None:
             showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+            outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname)))
         if self.lastname is not None:
             showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+            outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname)))
         if self.other_name is not None:
             showIndent(outfile, level)
             outfile.write('other_name=%f,\n' % self.other_name)
-        if self.classxx is not None:
+        if self.class_ is not None:
             showIndent(outfile, level)
-            outfile.write('classxx=%f,\n' % self.classxx)
+            outfile.write('class_=%f,\n' % self.class_)
         showIndent(outfile, level)
         outfile.write('other_value=[\n')
         level += 1
@@ -2137,307 +3647,297 @@ class booster(GeneratedsSuper):
         level += 1
         for client_handler_ in self.client_handler:
             showIndent(outfile, level)
-            outfile.write('model_.client_handler(\n')
-            client_handler_.exportLiteral(outfile, level, name_='client-handler')
+            outfile.write('model_.client_handlerType(\n')
+            client_handler_.exportLiteral(outfile, level, name_='client-handlerType')
             showIndent(outfile, level)
             outfile.write('),\n')
         level -= 1
         showIndent(outfile, level)
         outfile.write('],\n')
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = attrs.get('member-id')
+        value = find_attr_value_('member-id', node)
         if value is not None and 'member-id' not in already_processed:
-            already_processed.append('member-id')
+            already_processed.add('member-id')
             self.member_id = value
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'firstname':
             firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
             self.firstname = firstname_
         elif nodeName_ == 'lastname':
             lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
             self.lastname = lastname_
         elif nodeName_ == 'other-name':
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'other_name')
             self.other_name = fval_
         elif nodeName_ == 'class':
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
-            self.classxx = fval_
+            fval_ = self.gds_validate_float(fval_, node, 'class')
+            self.class_ = fval_
         elif nodeName_ == 'other-value':
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'other_value')
             self.other_value.append(fval_)
         elif nodeName_ == 'type':
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'type')
             self.type_.append(fval_)
-        elif nodeName_ == 'client-handler': 
-            obj_ = client_handler.factory()
+        elif nodeName_ == 'client-handler':
+            obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
-# end class booster
+            obj_.original_tagname_ = 'client-handler'
+# end class boosterType
 
 
-class client_handler(GeneratedsSuper):
+class infoType(GeneratedsSuper):
     member_data_items_ = {
-        'fullname': MemberSpec_('fullname', 'xs:string', 0),
-        'refid': MemberSpec_('refid', 'xs:integer', 0),
-        }
+        'name': MemberSpec_('name', 'xs:string', 0, 1, {'use': 'optional'}),
+        'type_': MemberSpec_('type_', 'xs:integer', 0, 1, {'use': 'optional'}),
+        'rating': MemberSpec_('rating', 'xs:float', 0, 1, {'use': 'optional'}),
+    }
     subclass = None
     superclass = None
-    def __init__(self, fullname=None, refid=None):
-        self.fullname = fullname
-        self.refid = refid
+    def __init__(self, name=None, type_=None, rating=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.type_ = _cast(int, type_)
+        self.rating = _cast(float, rating)
     def factory(*args_, **kwargs_):
-        if client_handler.subclass:
-            return client_handler.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, infoType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if infoType.subclass:
+            return infoType.subclass(*args_, **kwargs_)
         else:
-            return client_handler(*args_, **kwargs_)
+            return infoType(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_fullname(self): return self.fullname
-    def set_fullname(self, fullname): self.fullname = fullname
-    fullnameProp = property(get_fullname, set_fullname)
-    def get_refid(self): return self.refid
-    def set_refid(self, refid): self.refid = refid
-    refidProp = property(get_refid, set_refid)
-    def export(self, outfile, level, namespace_='', name_='client-handler', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='client-handler')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='client-handler'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='client-handler'):
-        if self.fullname is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sfullname>%s</%sfullname>\n' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_))
-        if self.refid is not None:
-            showIndent(outfile, level)
-            outfile.write('<%srefid>%s</%srefid>\n' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_))
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    nameProp = property(get_name, set_name)
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    typeProp = property(get_type, set_type)
+    def get_rating(self): return self.rating
+    def set_rating(self, rating): self.rating = rating
+    ratingProp = property(get_rating, set_rating)
     def hasContent_(self):
         if (
-            self.fullname is not None or
-            self.refid is not None
-            ):
+
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='client-handler'):
-        level += 1
-        self.exportLiteralAttributes(outfile, level, [], 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.fullname is not None:
-            showIndent(outfile, level)
-            outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding))
-        if self.refid is not None:
-            showIndent(outfile, level)
-            outfile.write('refid=%d,\n' % self.refid)
-    def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
-        if nodeName_ == 'fullname':
-            fullname_ = child_.text
-            self.fullname = fullname_
-        elif nodeName_ == 'refid':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            self.refid = ival_
-# end class client_handler
-
-
-class info(GeneratedsSuper):
-    member_data_items_ = {
-        'rating': MemberSpec_('rating', 'xs:float', 0),
-        'type': MemberSpec_('type', 'xs:integer', 0),
-        'name': MemberSpec_('name', 'xs:string', 0),
-        'valueOf_': MemberSpec_('valueOf_', [], 0),
-        }
-    subclass = None
-    superclass = None
-    def __init__(self, rating=None, type_=None, name=None, valueOf_=None):
-        self.rating = _cast(float, rating)
-        self.type_ = _cast(int, type_)
-        self.name = _cast(None, name)
-        self.valueOf_ = valueOf_
-    def factory(*args_, **kwargs_):
-        if info.subclass:
-            return info.subclass(*args_, **kwargs_)
+    def export(self, outfile, level, namespace_='', name_='infoType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('infoType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        if pretty_print:
+            eol_ = '\n'
         else:
-            return info(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_rating(self): return self.rating
-    def set_rating(self, rating): self.rating = rating
-    ratingProp = property(get_rating, set_rating)
-    def get_type(self): return self.type_
-    def set_type(self, type_): self.type_ = type_
-    typeProp = property(get_type, set_type)
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    nameProp = property(get_name, set_name)
-    def get_valueOf_(self): return self.valueOf_
-    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
-    def export(self, outfile, level, namespace_='', name_='info', namespacedef_=''):
-        showIndent(outfile, level)
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='info')
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='infoType')
         if self.hasContent_():
-            outfile.write('>')
-            outfile.write(self.valueOf_)
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='infoType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
-        if self.rating is not None and 'rating' not in already_processed:
-            already_processed.append('rating')
-            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='infoType'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
         if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.append('type_')
+            already_processed.add('type_')
             outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type'))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.append('name')
-            outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='info'):
+        if self.rating is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+    def exportChildren(self, outfile, level, namespace_='', name_='infoType', fromsubclass_=False, pretty_print=True):
         pass
-    def hasContent_(self):
-        if (
-            self.valueOf_
-            ):
-            return True
+    def to_etree(self, parent_element=None, name_='infoType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
         else:
-            return False
-    def exportLiteral(self, outfile, level, name_='info'):
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        if self.name is not None:
+            element.set('name', self.gds_format_string(self.name))
+        if self.type_ is not None:
+            element.set('type', self.gds_format_integer(self.type_))
+        if self.rating is not None:
+            element.set('rating', self.gds_format_float(self.rating))
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='infoType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        already_processed = set()
+        self.exportLiteralAttributes(outfile, level, already_processed, name_)
         if self.hasContent_():
             self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
     def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.rating is not None and 'rating' not in already_processed:
-            already_processed.append('rating')
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
             showIndent(outfile, level)
-            outfile.write('rating = %f,\n' % (self.rating,))
+            outfile.write('name="%s",\n' % (self.name,))
         if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.append('type_')
+            already_processed.add('type_')
             showIndent(outfile, level)
-            outfile.write('type_ = %d,\n' % (self.type_,))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.append('name')
+            outfile.write('type_=%d,\n' % (self.type_,))
+        if self.rating is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
             showIndent(outfile, level)
-            outfile.write('name = "%s",\n' % (self.name,))
+            outfile.write('rating=%f,\n' % (self.rating,))
     def exportLiteralChildren(self, outfile, level, name_):
         pass
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
-        self.valueOf_ = get_all_text_(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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = attrs.get('rating')
-        if value is not None and 'rating' not in already_processed:
-            already_processed.append('rating')
-            try:
-                self.rating = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (rating): %s' % exp)
-        value = attrs.get('type')
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
-            already_processed.append('type')
+            already_processed.add('type')
             try:
                 self.type_ = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = attrs.get('name')
-        if value is not None and 'name' not in already_processed:
-            already_processed.append('name')
-            self.name = value
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+        value = find_attr_value_('rating', node)
+        if value is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            try:
+                self.rating = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (rating): %s' % exp)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
-# end class info
+# end class infoType
 
 
-class vehicle(GeneratedsSuper):
+class vehicleType(GeneratedsSuper):
     member_data_items_ = {
-        'wheelcount': MemberSpec_('wheelcount', 'xs:integer', 0),
-        }
+        'wheelcount': MemberSpec_('wheelcount', 'xs:integer', 0, 0, {u'type': u'xs:integer', u'name': u'wheelcount'}, None),
+    }
     subclass = None
     superclass = None
-    def __init__(self, wheelcount=None):
+    def __init__(self, wheelcount=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.wheelcount = wheelcount
+        self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
-        if vehicle.subclass:
-            return vehicle.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, vehicleType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if vehicleType.subclass:
+            return vehicleType.subclass(*args_, **kwargs_)
         else:
-            return vehicle(*args_, **kwargs_)
+            return vehicleType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_wheelcount(self): return self.wheelcount
     def set_wheelcount(self, wheelcount): self.wheelcount = wheelcount
     wheelcountProp = property(get_wheelcount, set_wheelcount)
-    def export(self, outfile, level, namespace_='', name_='vehicle', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='vehicle')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='vehicle'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='vehicle'):
-        if self.wheelcount is not None:
-            showIndent(outfile, level)
-            outfile.write('<%swheelcount>%s</%swheelcount>\n' % (namespace_, self.gds_format_integer(self.wheelcount, input_name='wheelcount'), namespace_))
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def hasContent_(self):
         if (
             self.wheelcount is not None
-            ):
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='vehicle'):
+    def export(self, outfile, level, namespace_='', name_='vehicleType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('vehicleType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='vehicleType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='vehicleType', 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_='vehicleType'):
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='vehicleType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.wheelcount is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<wheelcount>%s</wheelcount>%s' % (self.gds_format_integer(self.wheelcount, input_name='wheelcount'), eol_))
+    def to_etree(self, parent_element=None, name_='vehicleType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
+        else:
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        if self.extensiontype_ is not None:
+            element.set('{http://www.w3.org/2001/XMLSchema-instance}type', self.extensiontype_)
+        if self.wheelcount is not None:
+            wheelcount_ = self.wheelcount
+            etree_.SubElement(element, '{}wheelcount').text = self.gds_format_integer(wheelcount_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='vehicleType'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
@@ -2447,33 +3947,45 @@ class vehicle(GeneratedsSuper):
             showIndent(outfile, level)
             outfile.write('wheelcount=%d,\n' % self.wheelcount)
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'wheelcount':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'wheelcount')
             self.wheelcount = ival_
-# end class vehicle
+# end class vehicleType
 
 
-class automobile(vehicle):
+class automobile(vehicleType):
     member_data_items_ = {
-        'drivername': MemberSpec_('drivername', 'xs:string', 0),
-        }
+        'drivername': MemberSpec_('drivername', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'drivername'}, None),
+    }
     subclass = None
-    superclass = vehicle
+    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_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, automobile)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if automobile.subclass:
             return automobile.subclass(*args_, **kwargs_)
         else:
@@ -2482,37 +3994,58 @@ class automobile(vehicle):
     def get_drivername(self): return self.drivername
     def set_drivername(self, drivername): self.drivername = drivername
     drivernameProp = property(get_drivername, set_drivername)
-    def export(self, outfile, level, namespace_='', name_='automobile', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='automobile')
-        outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-        outfile.write(' xsi:type="automobile"')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='automobile'):
-        super(automobile, self).exportAttributes(outfile, level, already_processed, namespace_, name_='automobile')
-    def exportChildren(self, outfile, level, namespace_='', name_='automobile'):
-        super(automobile, self).exportChildren(outfile, level, namespace_, name_)
-        if self.drivername is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sdrivername>%s</%sdrivername>\n' % (namespace_, self.gds_format_string(quote_xml(self.drivername).encode(ExternalEncoding), input_name='drivername'), namespace_))
     def hasContent_(self):
         if (
             self.drivername is not None or
             super(automobile, self).hasContent_()
-            ):
+        ):
             return True
         else:
             return False
+    def export(self, outfile, level, namespace_='', name_='automobile', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('automobile')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='automobile')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='automobile', 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_='automobile'):
+        super(automobile, self).exportAttributes(outfile, level, already_processed, namespace_, name_='automobile')
+    def exportChildren(self, outfile, level, namespace_='', name_='automobile', fromsubclass_=False, pretty_print=True):
+        super(automobile, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.drivername is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<drivername>%s</drivername>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.drivername), input_name='drivername')), eol_))
+    def to_etree(self, parent_element=None, name_='automobile', mapping_=None):
+        element = super(automobile, self).to_etree(parent_element, name_, mapping_)
+        if self.drivername is not None:
+            drivername_ = self.drivername
+            etree_.SubElement(element, '{}drivername').text = self.gds_format_string(drivername_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
     def exportLiteral(self, outfile, level, name_='automobile'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
@@ -2521,32 +4054,246 @@ class automobile(vehicle):
         super(automobile, self).exportLiteralChildren(outfile, level, name_)
         if self.drivername is not None:
             showIndent(outfile, level)
-            outfile.write('drivername=%s,\n' % quote_python(self.drivername).encode(ExternalEncoding))
+            outfile.write('drivername=%s,\n' % self.gds_encode(quote_python(self.drivername)))
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(automobile, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'drivername':
             drivername_ = child_.text
+            drivername_ = self.gds_validate_string(drivername_, node, 'drivername')
             self.drivername = drivername_
-        super(automobile, self).buildChildren(child_, nodeName_, True)
+        super(automobile, self).buildChildren(child_, node, nodeName_, True)
 # end class automobile
 
 
-class airplane(vehicle):
+class hot_agent(GeneratedsSuper):
+    member_data_items_ = {
+        'firstname': MemberSpec_('firstname', 'xs:string', 0, 0, {u'default': u'empty\\name', u'type': u'xs:string', u'name': u'firstname'}, None),
+        'lastname': MemberSpec_('lastname', 'xs:string', 0, 0, {u'default': u"no 'last' name", u'type': u'xs:string', u'name': u'lastname'}, None),
+        'priority': MemberSpec_('priority', 'xs:float', 0, 0, {u'type': u'xs:float', u'name': u'priority'}, None),
+        'startDate': MemberSpec_('startDate', 'xs:date', 0, 0, {u'type': u'xs:date', u'name': u'startDate'}, None),
+    }
+    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
+        if isinstance(startDate, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(startDate, '%Y-%m-%d').date()
+        else:
+            initvalue_ = startDate
+        self.startDate = initvalue_
+        self.anyAttributes_ = {}
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, hot_agent)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if hot_agent.subclass:
+            return hot_agent.subclass(*args_, **kwargs_)
+        else:
+            return hot_agent(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_firstname(self): return self.firstname
+    def set_firstname(self, firstname): self.firstname = firstname
+    firstnameProp = property(get_firstname, set_firstname)
+    def get_lastname(self): return self.lastname
+    def set_lastname(self, lastname): self.lastname = lastname
+    lastnameProp = property(get_lastname, set_lastname)
+    def get_priority(self): return self.priority
+    def set_priority(self, priority): self.priority = priority
+    priorityProp = property(get_priority, set_priority)
+    def get_startDate(self): return self.startDate
+    def set_startDate(self, startDate): self.startDate = startDate
+    startDateProp = property(get_startDate, set_startDate)
+    def get_anyAttributes_(self): return self.anyAttributes_
+    def set_anyAttributes_(self, anyAttributes_): self.anyAttributes_ = anyAttributes_
+    def hasContent_(self):
+        if (
+            self.firstname != "empty\name" or
+            self.lastname != "no 'last' name" or
+            self.priority is not None or
+            self.startDate is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='hot.agent', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('hot.agent')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='hot.agent')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='hot.agent', 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_='hot.agent'):
+        unique_counter = 0
+        for name, value in self.anyAttributes_.items():
+            xsinamespaceprefix = 'xsi'
+            xsinamespace1 = 'http://www.w3.org/2001/XMLSchema-instance'
+            xsinamespace2 = '{%s}' % (xsinamespace1, )
+            if name.startswith(xsinamespace2):
+                name1 = name[len(xsinamespace2):]
+                name2 = '%s:%s' % (xsinamespaceprefix, name1, )
+                if name2 not in already_processed:
+                    already_processed.add(name2)
+                    outfile.write(' %s=%s' % (name2, quote_attrib(value), ))
+            else:
+                mo = re_.match(Namespace_extract_pat_, name)
+                if mo is not None:
+                    namespace, name = mo.group(1, 2)
+                    if name not in already_processed:
+                        already_processed.add(name)
+                        if namespace == 'http://www.w3.org/XML/1998/namespace':
+                            outfile.write(' %s=%s' % (
+                                name, quote_attrib(value), ))
+                        else:
+                            unique_counter += 1
+                            outfile.write(' xmlns:%d="%s"' % (
+                                unique_counter, namespace, ))
+                            outfile.write(' %d:%s=%s' % (
+                                unique_counter, name, quote_attrib(value), ))
+                else:
+                    if name not in already_processed:
+                        already_processed.add(name)
+                        outfile.write(' %s=%s' % (
+                            name, quote_attrib(value), ))
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='hot.agent', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.firstname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<firstname>%s</firstname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), eol_))
+        if self.lastname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<lastname>%s</lastname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), eol_))
+        if self.priority is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<priority>%s</priority>%s' % (self.gds_format_float(self.priority, input_name='priority'), eol_))
+        if self.startDate is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<startDate>%s</startDate>%s' % (self.gds_format_date(self.startDate, input_name='startDate'), eol_))
+    def to_etree(self, parent_element=None, name_='hot.agent', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
+        else:
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        if self.firstname is not None:
+            firstname_ = self.firstname
+            etree_.SubElement(element, '{}firstname').text = self.gds_format_string(firstname_)
+        if self.lastname is not None:
+            lastname_ = self.lastname
+            etree_.SubElement(element, '{}lastname').text = self.gds_format_string(lastname_)
+        if self.priority is not None:
+            priority_ = self.priority
+            etree_.SubElement(element, '{}priority').text = self.gds_format_float(priority_)
+        if self.startDate is not None:
+            startDate_ = self.startDate
+            etree_.SubElement(element, '{}startDate').text = self.gds_format_date(startDate_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='hot.agent'):
+        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_):
+        for name, value in self.anyAttributes_.items():
+            showIndent(outfile, level)
+            outfile.write('%s="%s",\n' % (name, value,))
+    def exportLiteralChildren(self, outfile, level, name_):
+        if self.firstname is not None:
+            showIndent(outfile, level)
+            outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname)))
+        if self.lastname is not None:
+            showIndent(outfile, level)
+            outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname)))
+        if self.priority is not None:
+            showIndent(outfile, level)
+            outfile.write('priority=%f,\n' % self.priority)
+        if self.startDate is not None:
+            showIndent(outfile, level)
+            outfile.write('startDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.startDate, input_name='startDate'))
+    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):
+        self.anyAttributes_ = {}
+        for name, value in attrs.items():
+            if name not in already_processed:
+                self.anyAttributes_[name] = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'firstname':
+            firstname_ = child_.text
+            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
+            self.firstname = firstname_
+        elif nodeName_ == 'lastname':
+            lastname_ = child_.text
+            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
+            self.lastname = lastname_
+        elif nodeName_ == 'priority':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'priority')
+            self.priority = fval_
+        elif nodeName_ == 'startDate':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.startDate = dval_
+# end class hot_agent
+
+
+class airplane(vehicleType):
     member_data_items_ = {
-        'pilotname': MemberSpec_('pilotname', 'xs:string', 0),
-        }
+        'pilotname': MemberSpec_('pilotname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'pilotname'}, None),
+    }
     subclass = None
-    superclass = vehicle
+    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_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, airplane)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if airplane.subclass:
             return airplane.subclass(*args_, **kwargs_)
         else:
@@ -2555,37 +4302,58 @@ class airplane(vehicle):
     def get_pilotname(self): return self.pilotname
     def set_pilotname(self, pilotname): self.pilotname = pilotname
     pilotnameProp = property(get_pilotname, set_pilotname)
-    def export(self, outfile, level, namespace_='', name_='airplane', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='airplane')
-        outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-        outfile.write(' xsi:type="airplane"')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='airplane'):
-        super(airplane, self).exportAttributes(outfile, level, already_processed, namespace_, name_='airplane')
-    def exportChildren(self, outfile, level, namespace_='', name_='airplane'):
-        super(airplane, self).exportChildren(outfile, level, namespace_, name_)
-        if self.pilotname is not None:
-            showIndent(outfile, level)
-            outfile.write('<%spilotname>%s</%spilotname>\n' % (namespace_, self.gds_format_string(quote_xml(self.pilotname).encode(ExternalEncoding), input_name='pilotname'), namespace_))
     def hasContent_(self):
         if (
             self.pilotname is not None or
             super(airplane, self).hasContent_()
-            ):
+        ):
             return True
         else:
             return False
+    def export(self, outfile, level, namespace_='', name_='airplane', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('airplane')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='airplane')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='airplane', 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_='airplane'):
+        super(airplane, self).exportAttributes(outfile, level, already_processed, namespace_, name_='airplane')
+    def exportChildren(self, outfile, level, namespace_='', name_='airplane', fromsubclass_=False, pretty_print=True):
+        super(airplane, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.pilotname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<pilotname>%s</pilotname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.pilotname), input_name='pilotname')), eol_))
+    def to_etree(self, parent_element=None, name_='airplane', mapping_=None):
+        element = super(airplane, self).to_etree(parent_element, name_, mapping_)
+        if self.pilotname is not None:
+            pilotname_ = self.pilotname
+            etree_.SubElement(element, '{}pilotname').text = self.gds_format_string(pilotname_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
     def exportLiteral(self, outfile, level, name_='airplane'):
         level += 1
-        self.exportLiteralAttributes(outfile, level, [], name_)
+        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_):
@@ -2594,88 +4362,273 @@ class airplane(vehicle):
         super(airplane, self).exportLiteralChildren(outfile, level, name_)
         if self.pilotname is not None:
             showIndent(outfile, level)
-            outfile.write('pilotname=%s,\n' % quote_python(self.pilotname).encode(ExternalEncoding))
+            outfile.write('pilotname=%s,\n' % self.gds_encode(quote_python(self.pilotname)))
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        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, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(airplane, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'pilotname':
             pilotname_ = child_.text
+            pilotname_ = self.gds_validate_string(pilotname_, node, 'pilotname')
             self.pilotname = pilotname_
-        super(airplane, self).buildChildren(child_, nodeName_, True)
+        super(airplane, self).buildChildren(child_, node, nodeName_, True)
 # end class airplane
 
 
+class client_handlerType(GeneratedsSuper):
+    member_data_items_ = {
+        'fullname': MemberSpec_('fullname', 'xs:string', 0, 0, {u'type': u'xs:string', u'name': u'fullname'}, None),
+        'refid': MemberSpec_('refid', 'xs:integer', 0, 0, {u'type': u'xs:integer', u'name': u'refid'}, None),
+    }
+    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_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, client_handlerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if client_handlerType.subclass:
+            return client_handlerType.subclass(*args_, **kwargs_)
+        else:
+            return client_handlerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_fullname(self): return self.fullname
+    def set_fullname(self, fullname): self.fullname = fullname
+    fullnameProp = property(get_fullname, set_fullname)
+    def get_refid(self): return self.refid
+    def set_refid(self, refid): self.refid = refid
+    refidProp = property(get_refid, set_refid)
+    def hasContent_(self):
+        if (
+            self.fullname is not None or
+            self.refid is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='client-handlerType', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('client-handlerType')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        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_='client-handlerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', 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_='client-handlerType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='client-handlerType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.fullname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<fullname>%s</fullname>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.fullname), input_name='fullname')), eol_))
+        if self.refid is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<refid>%s</refid>%s' % (self.gds_format_integer(self.refid, input_name='refid'), eol_))
+    def to_etree(self, parent_element=None, name_='client-handlerType', mapping_=None):
+        if parent_element is None:
+            element = etree_.Element('{}' + name_)
+        else:
+            element = etree_.SubElement(parent_element, '{}' + name_)
+        if self.fullname is not None:
+            fullname_ = self.fullname
+            etree_.SubElement(element, '{}fullname').text = self.gds_format_string(fullname_)
+        if self.refid is not None:
+            refid_ = self.refid
+            etree_.SubElement(element, '{}refid').text = self.gds_format_integer(refid_)
+        if mapping_ is not None:
+            mapping_[self] = element
+        return element
+    def exportLiteral(self, outfile, level, name_='client-handlerType'):
+        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.fullname is not None:
+            showIndent(outfile, level)
+            outfile.write('fullname=%s,\n' % self.gds_encode(quote_python(self.fullname)))
+        if self.refid is not None:
+            showIndent(outfile, level)
+            outfile.write('refid=%d,\n' % self.refid)
+    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_ == 'fullname':
+            fullname_ = child_.text
+            fullname_ = self.gds_validate_string(fullname_, node, 'fullname')
+            self.fullname = fullname_
+        elif nodeName_ == 'refid':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'refid')
+            self.refid = ival_
+# end class client_handlerType
+
+
+GDSClassesMapping = {
+    'agent': agentType,
+    'booster': boosterType,
+    'comments': commentsType,
+    'info': infoType,
+    'java-programmer': java_programmerType,
+    'param': paramType,
+    'people': peopleType,
+    'person': personType,
+    'programmer': programmerType,
+    'python-programmer': python_programmerType,
+    'special-agent': special_agentType,
+    'vehicle': vehicleType,
+    'weird-agent': weird_agentType,
+}
+
+
 USAGE_TEXT = """
 Usage: python <Parser>.py [ -s ] <in_xml_file>
 """
 
+
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
 def get_root_tag(node):
     tag = Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = globals().get(tag)
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
     return tag, rootClass
 
 
-def parse(inFileName):
-    doc = parsexml_(inFileName)
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
-        rootClass = people
+        rootTag = 'peopleType'
+        rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0, name_=rootTag, 
-        namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"',
+            pretty_print=True)
     return rootObj
 
 
-def parseString(inString):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
-        rootClass = people
+        rootTag = 'peopleType'
+        rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0, name_="people",
-        namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
+    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):
+    '''Parse a string, create the object tree, and export it.
+
+    Arguments:
+    - inString -- A string.  This XML fragment should not start
+      with an XML declaration containing an encoding.
+    - silence -- A boolean.  If False, export the object.
+    Returns -- The root object in the tree.
+    '''
+    parser = None
+    rootNode= parsexmlstring_(inString, parser)
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'peopleType'
+        rootClass = peopleType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
     return rootObj
 
 
-def parseLiteral(inFileName):
-    doc = parsexml_(inFileName)
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
-        rootClass = people
+        rootTag = 'peopleType'
+        rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('#from peoplesup import *\n\n')
-    sys.stdout.write('import peoplesup as model_\n\n')
-    sys.stdout.write('rootObj = model_.rootTag(\n')
-    rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
-    sys.stdout.write(')\n')
+    if not silence:
+        sys.stdout.write('#from peoplesup import *\n\n')
+        sys.stdout.write('import peoplesup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
     return rootObj
 
 
@@ -2693,20 +4646,22 @@ if __name__ == '__main__':
 
 
 __all__ = [
-    "agent",
+    "agentType",
     "airplane",
     "automobile",
-    "booster",
-    "client_handler",
-    "comments",
-    "info",
-    "java_programmer",
-    "param",
-    "people",
-    "person",
-    "programmer",
-    "python_programmer",
-    "special_agent",
+    "boosterType",
+    "client_handlerType",
+    "commentsType",
+    "hot_agent",
+    "infoType",
+    "java_programmerType",
+    "paramType",
+    "peopleType",
+    "personType",
+    "programmerType",
+    "python_programmerType",
+    "special_agentType",
     "specialperson",
-    "vehicle"
-    ]
+    "vehicleType",
+    "weird_agentType"
+]
diff --git a/Demos/People/run-full-test-validators.sh b/Demos/People/run-full-test-validators.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9f7f5bd451dab2af3b25d58a2acdbbf13efe4cce
--- /dev/null
+++ b/Demos/People/run-full-test-validators.sh
@@ -0,0 +1,21 @@
+#!/bin/sh -x
+
+if [ $# -ne 1 ]; then
+    echo
+    echo Usage: run-ful-test-validators.sh out_file_name_stem
+    echo
+    exit 0
+fi
+
+python ../../generateDS.py -f -m \
+  --validator-bodies=Validators \
+  --use-old-simpletype-validators \
+  --namespacedef='xmlns:pl="http://kuhlman.com/people.xsd"' \
+  --super=$1sup -o $1sup.py -s $1sub.py \
+  --member-specs=dict \
+  -m \
+  --export="write etree literal" \
+  -c people_catalog.xml \
+  people.xsd
+
+python $1sub.py people.xml 2> $1_warnings.txt | tee $1.xml
diff --git a/Demos/People/run_test b/Demos/People/run-full-test.sh
similarity index 51%
rename from Demos/People/run_test
rename to Demos/People/run-full-test.sh
index 86ada738ffefdc27097a1fcc6b1853a62a1608b8..cc8124a037b47d6bb897d7d4a9138a8b7a8abe2d 100755
--- a/Demos/People/run_test
+++ b/Demos/People/run-full-test.sh
@@ -2,16 +2,18 @@
 
 if [ $# -ne 1 ]; then
     echo
-    echo Usage: run_full_test out_file_name_stem
+    echo Usage: run-ful-test.sh out_file_name_stem
     echo
     exit 0
 fi
 
-../../generateDS.py -f -m \
+python ../../generateDS.py -f -m \
   --namespacedef='xmlns:pl="http://kuhlman.com/people.xsd"' \
   --super=$1sup -o $1sup.py -s $1sub.py \
   --member-specs=dict \
   -m \
+  --export="write etree literal" \
+  -c people_catalog.xml \
   people.xsd
 
-python $1sub.py people.xml | tee $1.xml
+python $1sub.py people.xml 2> $1_warnings.txt | tee $1.xml
diff --git a/Demos/People/schemas/people-part1.xsd b/Demos/People/schemas/people-part1.xsd
new file mode 100644
index 0000000000000000000000000000000000000000..bf4a6eacaf6193d70cafb5791c9a3e4d2284c7bd
--- /dev/null
+++ b/Demos/People/schemas/people-part1.xsd
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <xs:complexType name="airplane">
+        <xs:complexContent>
+            <xs:extension base="vehicleType" >
+                <xs:sequence>
+                    <xs:element name="pilotname" type="xs:string" />
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+</xs:schema>
diff --git a/Demos/Xmlbehavior/README b/Demos/Xmlbehavior/README.txt
similarity index 93%
rename from Demos/Xmlbehavior/README
rename to Demos/Xmlbehavior/README.txt
index 36a4a5082d7d0f1dd4deee363b33698c61530b9c..5e9e11f2feeed5c78a1caf6e40bebc96b6584be7 100644
--- a/Demos/Xmlbehavior/README
+++ b/Demos/Xmlbehavior/README.txt
@@ -1,6 +1,11 @@
+============
 XMLBehaviors
 ============
 
+*Under repair*
+
+*Notice:* The example in this directory is currently not working.
+
 This sub-directory contains a simple example of the use of
 the XMLBehavior capability of generateDS.py.
 
@@ -41,3 +46,4 @@ Files of interest in the directory/example are:
   instance documents.  It was used by generateDS.py to generate
   xmlbehavior.py and xmlbehavior_sub.py.
 
+.. vim:ft=rst:
diff --git a/Demos/Xmlbehavior/run-test.sh b/Demos/Xmlbehavior/run-test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c49c175687bed3eb4117889774c0c209ed755e50
--- /dev/null
+++ b/Demos/Xmlbehavior/run-test.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+if [ $# -ne 1 ]; then
+    echo
+    echo Usage: run-test.sh out_file_name_stem
+    echo
+    exit 0
+fi
+
+python ../../generateDS.py \
+    -f \
+    -o $1sup.py \
+    -s $1sub.py \
+    --super="$1sup" \
+    -b xmlbehavior_po.xml \
+    po.xsd
diff --git a/Demos/Xmlbehavior/xmlbehavior.py b/Demos/Xmlbehavior/xmlbehavior.py
index f29c6782d80bf17ed2a351820b15d8bf98979197..f3a88451e37eeddf4a5f35d739474a8df378440f 100644
--- a/Demos/Xmlbehavior/xmlbehavior.py
+++ b/Demos/Xmlbehavior/xmlbehavior.py
@@ -4,6 +4,7 @@
 # Generated Wed Jun 30 10:34:05 2004 by generateDS.py.
 #
 
+from __future__ import print_function
 import sys
 import getopt
 from xml.dom import minidom
@@ -562,7 +563,7 @@ class SaxXml_behaviorHandler(handler.ContentHandler):
         self.locator = locator
     
     def showError(self, msg):
-        print '*** (showError):', msg
+        print('*** (showError):', msg)
         sys.exit(-1)
 
     def startElement(self, name, attrs):
@@ -736,7 +737,7 @@ Options:
 """
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(-1)
 
 
diff --git a/Demos/Xmlbehavior/xmlbehavior_sub.py b/Demos/Xmlbehavior/xmlbehavior_sub.py
index 739cf5cef651b80c94ad5e1718bdff7484c54f14..86ea66ec6361d3c91467eb0c7d65fa5c723e5527 100644
--- a/Demos/Xmlbehavior/xmlbehavior_sub.py
+++ b/Demos/Xmlbehavior/xmlbehavior_sub.py
@@ -4,6 +4,7 @@
 # Generated Tue Jun 29 16:14:16 2004 by generateDS.py.
 #
 
+from __future__ import print_function
 import sys
 from xml.dom import minidom
 from xml.sax import handler, make_parser
@@ -150,7 +151,7 @@ Usage: python ???.py <infilename>
 """
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(-1)
 
 
diff --git a/README.rst b/README.rst
index 93dcbfece409ce17f233710572dc57a034b383b3..e63529e4fa89556187dc347060f21a3fc7a32694 100644
--- a/README.rst
+++ b/README.rst
@@ -141,6 +141,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.29.18 (07/19/2018)
+
+- Fixes to the example code underneath `Demos/`.  Thanks to Witold
+  Jarzynka for reporting this.
+
 Version 2.29.17 (07/11/2018)
 
 - Merged pull request that generates enum classes for each simpleType.
@@ -149,7 +154,6 @@ Version 2.29.17 (07/11/2018)
   ForeignKey declarations.  (2) Added relative import (dot) to
   generated admin.py.
 
-
 Version 2.29.16 (06/21/2018)
 
 - Added dependencies to ``setup.py``.  Thanks to Laszlo for this
diff --git a/generateDS.py b/generateDS.py
index df4185276966e0e4d62eaaa093874c873264678c..d0549916e63060f2fa1b03edf11d8bc2250a64cf 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -225,7 +225,7 @@ _log = logging.getLogger(__name__)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.17'
+VERSION = '2.29.18'
 ##VERSION##
 
 BaseStrTypes = six.string_types
diff --git a/generateDS.txt b/generateDS.txt
index 25433971682411ba239015f6dd89539936f8aeb6..ca608772ee1049c235cecf211b0134c61ab76d5d 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.29.17
+:revision: 2.29.18
 
 .. version
 
diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt
index d7144ebbe785838c0d83a5e281ab7d70ac64f3b6..8eb6a5bbe4ab71beb96cda1839d3ff6da5f340d4 100644
--- a/generateds_gui_notes.txt
+++ b/generateds_gui_notes.txt
@@ -12,7 +12,7 @@ GenerateDS GUI Notes
 
 .. version
 
-:revision: 2.29.17
+:revision: 2.29.18
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index e835a64952aa9fbb99fe7f142cb45c8e043d46ba..03b8d9e27113f2a45f175342eeb3838c6921f348 100644
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -41,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.17'
+VERSION = '2.29.18'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index ce71a030aca1edc4aa467a598a872700b18672ea..deb8be97eda4522f353e0b8919e0ce4883e6e68b 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.29.17
+:revision: 2.29.18
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index b41168b51f7c75b2dc558949c5ec26bb64a8d918..6bbf3f9aa27d96738a8c7172b661493ffa5c6fa5 100755
--- a/process_includes.py
+++ b/process_includes.py
@@ -40,7 +40,7 @@ except ImportError:
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.17'
+VERSION = '2.29.18'
 ##VERSION##
 
 CatalogDict = {}
diff --git a/setup.py b/setup.py
index cc0d760651f836a4fde0b37540a4ecea78d62721..ee9a65afd50356ecdb6ce77c91b7e742fd296c85 100644
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,7 @@ setup(
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.29.17",
+    version="2.29.18",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index 2501e5bc652b6344b7286449c0d062e64e6fe0cb..29795adc3cc304002e6e44f3545985982621327b 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.29.17
+:revision: 2.29.18
 
 .. version