diff --git a/README b/README
index 3c2805e1ca61a549504486c2b0543cc87467fffb..e70ab60ac94ce2ae8785817f66d5a34b3a1d72ec 100644
--- a/README
+++ b/README
@@ -141,6 +141,28 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.25a (03/21/2017)
+
+- Fixes to the Django support for Python 3.  Thanks to Shane Rigby
+  for all his help with all of these changes to the Django code.
+- Added `optional` to the MemberSpec so that when command line
+  option "--member-specs" is "dict" or "list", the generated code
+  specifies whether the member is optional or not.
+- In the Django support, `django/gends_run_gen_django.py` now has
+  new option "-s" ("--script") that can be used to write out the
+  command lines used internally by `django/gends_run_gen_django.py`.
+  This new flag can be used to generate a shell script that can be
+  run instead of `django/gends_run_gen_django.py`.  (Note: The
+  script might require a minor edit or two.)
+- In the Django support, there is now some attempt to treat optional
+  members specially and to generate "blank=True, null=True," in the
+  `models.py` file.
+- Fix to Django support so that we generate *unique* names for
+  `related_name`.
+- Added several date/time types for Django support: 'gYear',
+  'gYearMonth', 'gMonth', 'gMonthDay', 'gDay',
+
+
 Version 2.24b (01/02/2017)
 
 - Added several fixes to generateDS.py and process_includes.py that
diff --git a/django/gends_run_gen_django.py b/django/gends_run_gen_django.py
index 7eb8742bdb141e54a699490fb31ee52be1e038a3..2786368b40bba8b2d3f0cf75ce8b1c1722b019e8 100755
--- a/django/gends_run_gen_django.py
+++ b/django/gends_run_gen_django.py
@@ -16,6 +16,8 @@ Options:
     -p, --path-to-generateDS-script=/path/to/generateDS.py
                     Path to the generateDS.py script.
     -v, --verbose   Display additional information while running.
+    -s, --script    Write out (display) the command lines used.  Can
+                    be captured and used in a shell script, for example.
 Examples:
     python gends_run_gen_django.py my_schema.xsd
     python gends_run_gen_django.py -f -p ../generateDS.py my_other_schema.xsd
@@ -90,7 +92,10 @@ def generate(options, schema_file_name):
 
 
 def run_cmd(options, args):
-    dbg_msg(options, '*** running %s\n' % (' '.join(args), ))
+    msg = '%s\n' % (' '.join(args), )
+    dbg_msg(options, '*** running %s' % (msg, ))
+    if options['script']:
+        write_msg(options, msg)
     process = Popen(args, stderr=PIPE, stdout=PIPE)
     content1 = process.stderr.read()
     content2 = process.stdout.read()
@@ -117,7 +122,17 @@ def exists(file_name):
 
 def dbg_msg(options, msg):
     if options['verbose']:
+        if isinstance(msg, str):
+            sys.stdout.write(msg)
+        else:
+            sys.stdout.write(msg.decode('utf-8'))
+
+
+def write_msg(options, msg):
+    if isinstance(msg, str):
         sys.stdout.write(msg)
+    else:
+        sys.stdout.write(msg.decode('utf-8'))
 
 
 def usage():
@@ -127,8 +142,8 @@ def usage():
 def main():
     args = sys.argv[1:]
     try:
-        opts, args = getopt.getopt(args, 'hvfp:', [
-            'help', 'verbose',
+        opts, args = getopt.getopt(args, 'hvfp:s', [
+            'help', 'verbose', 'script',
             'force', 'path-to-generateDS-script=',
         ])
     except:
@@ -136,6 +151,7 @@ def main():
     options = {}
     options['force'] = False
     options['verbose'] = False
+    options['script'] = False
     options['path'] = './generateDS.py'
     for opt, val in opts:
         if opt in ('-h', '--help'):
@@ -144,6 +160,8 @@ def main():
             options['force'] = True
         elif opt in ('-v', '--verbose'):
             options['verbose'] = True
+        elif opt in ('-s', '--script'):
+            options['script'] = True
         elif opt in ('-p', '--path-to-generateDS-script'):
             options['path'] = val
     if not os.path.exists(options['path']):
diff --git a/django/generatedssuper.py b/django/generatedssuper.py
index 60c5b46198305a352e9170dd4bef8352f39a9874..741a499008be6384bf385fd9dd254d26eed854a7 100644
--- a/django/generatedssuper.py
+++ b/django/generatedssuper.py
@@ -172,7 +172,10 @@ class GeneratedsSuper(object):
                 name += 'x'
             data_type = cleanupName(data_type)
             if data_type in Simple_type_table:
-                options = 'blank=True'
+                if is_optional:
+                    options = 'blank=True, null=True'
+                else:
+                    options = ''
                 if data_type in Integer_type_table:
                     wrtmodels('    %s = models.IntegerField(%s)\n' % (
                         name, options, ))
@@ -218,8 +221,8 @@ class GeneratedsSuper(object):
                     '    %s = models.ForeignKey(\n        "%s_model",\n' % (
                         name, data_type, ))
                 wrtmodels(
-                    '        related_name="{}_{}",\n'.format(
-                        name, data_type, ))
+                    '        related_name="{}_{}_{}",\n'.format(
+                        class_name, name, data_type, ))
                 if is_optional:
                     wrtmodels(
                         '        blank=True, null=True,\n')
diff --git a/generateDS.html b/generateDS.html
index 1ee864e5614e1668266c452f280b4f67c2a7852f..360507346e871af15fbba0cff8a9fe9ba6d3172e 100644
--- a/generateDS.html
+++ b/generateDS.html
@@ -220,7 +220,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24c</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.25a</td>
 </tr>
 </tbody>
 </table>
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">March 01, 2017</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 21, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -3187,7 +3187,7 @@ following among others:</p>
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateDS.txt">View document source</a>.
-Generated on: 2017-03-01 22:05 UTC.
+Generated on: 2017-03-21 19:50 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/generateDS.py b/generateDS.py
index 52b6ebb66c3855b60a58d3b05c427e057f04ed1d..c26a2713b93e7a90139dc2f0031a1edb1dfe1f0e 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -204,7 +204,7 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.24c'
+VERSION = '2.25a'
 ##VERSION##
 
 if sys.version_info.major == 2:
@@ -4748,12 +4748,13 @@ def generateMemberSpec(wrt, element):
         item1 = attrName
         item2 = attrDef.getType()
         item3 = 0
+        item4 = 1 if attrDef.getUse() == 'optional' else 0
         if generateDict:
-            item = "        '%s': MemberSpec_('%s', '%s', %d)," % (
-                item1, item1, item2, item3, )
+            item = "        '%s': MemberSpec_('%s', '%s', %d, %d)," % (
+                item1, item1, item2, item3, item4, )
         else:
-            item = "        MemberSpec_('%s', '%s', %d)," % (
-                item1, item2, item3, )
+            item = "        MemberSpec_('%s', '%s', %d, %d)," % (
+                item1, item2, item3, item4, )
         add(item)
     for child in element.getChildren():
         name = cleanupName(child.getCleanName())
diff --git a/generateDS.txt b/generateDS.txt
index d64c9ee86f5198ec78c3234737ef42ef6d6bdfbd..f07e88dc665d369f7028aac154e752ac169363b6 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.24c
+:revision: 2.25a
 
 .. version
 
diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html
index 7c8b0d5a604089d10bea1a3bf5e4ee6467d46e5b..fd42cbb3287d28c6bc0ad35bfec1c09dbe967f6a 100644
--- a/generateds_gui_notes.html
+++ b/generateds_gui_notes.html
@@ -220,7 +220,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24c</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.25a</td>
 </tr>
 </tbody>
 </table>
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">March 01, 2017</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 21, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -401,7 +401,7 @@ $ mv generateds_gui.mo locale/ru/LC_MESSAGES/
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateds_gui_notes.txt">View document source</a>.
-Generated on: 2017-03-01 22:05 UTC.
+Generated on: 2017-03-21 19:50 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt
index 9afb38eef8b8501bb292a168b5fa226244a8d12b..ca2d1d2be71a91e64d0af2af45a29c21539df79d 100644
--- a/generateds_gui_notes.txt
+++ b/generateds_gui_notes.txt
@@ -12,7 +12,7 @@ GenerateDS GUI Notes
 
 .. version
 
-:revision: 2.24c
+:revision: 2.25a
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index c96bf5d4e0f94fdaba16a0f8597f1cf98fbdd8c4..d5cf4cdabcc493446f0e69bae3dada591dfbc337 100755
--- 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.24c'
+VERSION = '2.25a'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 570a071d52e1cfcd0620b2a981f9fe30f23de9b7..1790efe5a88b98c6dd7264cdf2c27b38c695d3e7 100644
--- a/librarytemplate_howto.html
+++ b/librarytemplate_howto.html
@@ -217,7 +217,7 @@ dkuhlman (at) davekuhlman (dot) org
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24c</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.25a</td>
 </tr>
 </tbody>
 </table>
@@ -226,7 +226,7 @@ dkuhlman (at) davekuhlman (dot) org
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">March 01, 2017</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 21, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -380,7 +380,7 @@ this command for your needs.  For example, you may need to use
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="librarytemplate_howto.txt">View document source</a>.
-Generated on: 2017-03-01 22:05 UTC.
+Generated on: 2017-03-21 19:50 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index 7a00efd2ce52795b8fde7944ad10080d4c29ad2c..a2a52cb06c982435ee0e2bf4099f2c6cb8e508e8 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.24c
+:revision: 2.25a
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 10f5317bae696fe2e38809b00ad3544c46915b47..bbdc026ab857ebcc4ea09d331d3c50b2c78b764e 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.24c'
+VERSION = '2.25a'
 ##VERSION##
 
 CatalogDict = {}
diff --git a/setup.py b/setup.py
index a9055fd7b1e86840e8badeabd975b71100790918..adfdbd1259b077d2021d38313768c058a609c19d 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ setup(name="generateDS",
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.24c",
+    version="2.25a",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py
index 99f1c66d91338fa210660a5a883d1334c303bcf4..96ad3987ec9b17b35e1d92e9a3901fa64aa99be3 100644
--- a/tests/OnePer/oneperType00_2One.py
+++ b/tests/OnePer/oneperType00_2One.py
@@ -631,10 +631,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -649,6 +650,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,8 +666,8 @@ def _cast(typ, value):
 
 class oneperType00_1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('inner01', 'oneperType01_1', 0),
-        MemberSpec_('inner02', 'oneperType01_2', 0),
+        MemberSpec_('inner01', 'oneperType01_1', 0, 0),
+        MemberSpec_('inner02', 'oneperType01_2', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py
index 652b9e635d13a8ed190b3446a469a7e8d2f08074..6b9aec3b013a81a01ffeb2bba977ddf2f5629371 100644
--- a/tests/OnePer/oneperType01_2One.py
+++ b/tests/OnePer/oneperType01_2One.py
@@ -631,10 +631,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -649,6 +650,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,8 +666,8 @@ def _cast(typ, value):
 
 class oneperType01_1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('username', 'xs:string', 0),
-        MemberSpec_('inner01', 'oneperType01_2', 0),
+        MemberSpec_('username', 'xs:string', 0, 0),
+        MemberSpec_('inner01', 'oneperType01_2', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -749,7 +752,7 @@ class oneperType01_1(GeneratedsSuper):
 
 class oneperType01_2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('userdescription', 'xs:string', 0),
+        MemberSpec_('userdescription', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py
index 06578e2eb366080841fe96054d801d532eee79e8..55cbdf0fda175b43586389201b5294f18756caa3 100644
--- a/tests/OnePer/oneperType02_2One.py
+++ b/tests/OnePer/oneperType02_2One.py
@@ -631,10 +631,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -649,6 +650,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,8 +666,8 @@ def _cast(typ, value):
 
 class oneperType02_1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('clientname', 'xs:string', 0),
-        MemberSpec_('inner01', 'oneperType02_2', 0),
+        MemberSpec_('clientname', 'xs:string', 0, 0),
+        MemberSpec_('inner01', 'oneperType02_2', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -749,7 +752,7 @@ class oneperType02_1(GeneratedsSuper):
 
 class oneperType02_2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('clientdescription', 'xs:string', 0),
+        MemberSpec_('clientdescription', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py
index 6bea073ef654d3a7e766156d4b222c02ca2f4608..f34f72684f352e525b8a8a551d8c66ad94e80a8a 100644
--- a/tests/OnePer/oneperType03_2One.py
+++ b/tests/OnePer/oneperType03_2One.py
@@ -631,10 +631,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -649,6 +650,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,8 +666,8 @@ def _cast(typ, value):
 
 class oneperType03_1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('helpername', 'xs:string', 0),
-        MemberSpec_('inner01', 'oneperType02_2', 0),
+        MemberSpec_('helpername', 'xs:string', 0, 0),
+        MemberSpec_('inner01', 'oneperType02_2', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -749,7 +752,7 @@ class oneperType03_1(GeneratedsSuper):
 
 class oneperType03_2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('helperdescription', 'xs:string', 0),
+        MemberSpec_('helperdescription', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py
index 08422d5be4373b97720393e753eedde37b7f7a44..7d63ed14bc9e10df05751191289f6f5a490d5482 100644
--- a/tests/abstract_type1_sup.py
+++ b/tests/abstract_type1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,7 +665,7 @@ def _cast(typ, value):
 
 class carrierType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('fleet', 'Vehicle', 1),
+        MemberSpec_('fleet', 'Vehicle', 1, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py
index 87aa8d70b223ad5ff70b3fa26b513b65d45e66b1..f7b7f4cb8d39d00351d49fd96ab4cf40c476baf9 100644
--- a/tests/annotations1_sup.py
+++ b/tests/annotations1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -665,8 +668,8 @@ class document1Type(GeneratedsSuper):
     test purposes. It should make a somewhat uninteresting
     docstring."""
     member_data_items_ = [
-        MemberSpec_('comments', 'xs:string', 0),
-        MemberSpec_('otherdoc', 'document2Type', 0),
+        MemberSpec_('comments', 'xs:string', 0, 0),
+        MemberSpec_('otherdoc', 'document2Type', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -754,9 +757,9 @@ class document2Type(GeneratedsSuper):
     test purposes. It should make a somewhat uninteresting
     docstring."""
     member_data_items_ = [
-        MemberSpec_('comments', 'xs:string', 0),
-        MemberSpec_('rating', 'xs:integer', 0),
-        MemberSpec_('anotherdoc', 'document3Type', 0),
+        MemberSpec_('comments', 'xs:string', 0, 0),
+        MemberSpec_('rating', 'xs:integer', 0, 0),
+        MemberSpec_('anotherdoc', 'document3Type', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -857,8 +860,8 @@ class document2Type(GeneratedsSuper):
 class document3Type(GeneratedsSuper):
     """This is a element of Type 3. It is short."""
     member_data_items_ = [
-        MemberSpec_('comments', 'xs:string', 0),
-        MemberSpec_('rating', 'xs:integer', 0),
+        MemberSpec_('comments', 'xs:string', 0, 0),
+        MemberSpec_('rating', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py
index e373bf8daab4da4cb32f052ec3e952f640d6dd49..54f4775c3bba0ae1c46ffa83be4af05db6904509 100644
--- a/tests/anonymous_type1_sup.py
+++ b/tests/anonymous_type1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,9 +665,9 @@ def _cast(typ, value):
 
 class FooList(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('Foo', 'FooType1', 0),
-        MemberSpec_('Bar', 'BarType2', 0),
-        MemberSpec_('Baz', 'BazType3', 0),
+        MemberSpec_('Foo', 'FooType1', 0, 0),
+        MemberSpec_('Bar', 'BarType2', 0, 0),
+        MemberSpec_('Baz', 'BazType3', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -760,7 +763,7 @@ class FooList(GeneratedsSuper):
 
 class FooType1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('FooType', ['FooTypeType', 'xs:string'], 0),
+        MemberSpec_('FooType', ['FooTypeType', 'xs:string'], 0, 0),
     ]
     subclass = None
     superclass = None
@@ -844,7 +847,7 @@ class FooType1(GeneratedsSuper):
 
 class BarType2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('BarType', ['BarTypeType', 'xs:string'], 0),
+        MemberSpec_('BarType', ['BarTypeType', 'xs:string'], 0, 0),
     ]
     subclass = None
     superclass = None
@@ -928,7 +931,7 @@ class BarType2(GeneratedsSuper):
 
 class BazType3(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('BazType', ['BazTypeType', 'xs:string'], 0),
+        MemberSpec_('BazType', ['BazTypeType', 'xs:string'], 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py
index 28a1450c1f979bd311552f72174fd520349812a9..37b25dcd83423207dd9c3c99b0f2cad559262ea7 100644
--- a/tests/anysimpletype1_sup.py
+++ b/tests/anysimpletype1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,8 +665,8 @@ def _cast(typ, value):
 
 class test1element(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('test1attribute', 'cimAnySimpleType', 0),
-        MemberSpec_('test1member', 'cimAnySimpleType', 0),
+        MemberSpec_('test1attribute', 'cimAnySimpleType', 0, 1),
+        MemberSpec_('test1member', 'cimAnySimpleType', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py
index 2d7a08cf10e7261a4848b3fc6c0d6981fc689e87..fc9d2dde41bfcf9e8007136d472b93635734383e 100644
--- a/tests/anywildcard1_sup.py
+++ b/tests/anywildcard1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,9 +665,9 @@ def _cast(typ, value):
 
 class PlantType_single(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('', 'xs:string', 0),
-        MemberSpec_('description', 'DescriptionType', 0),
+        MemberSpec_('name', 'xs:string', 0, 0),
+        MemberSpec_('', 'xs:string', 0, 0),
+        MemberSpec_('description', 'DescriptionType', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -759,9 +762,9 @@ class PlantType_single(GeneratedsSuper):
 
 class PlantType_multiple(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('', 'xs:string', 1),
-        MemberSpec_('description', 'DescriptionType', 0),
+        MemberSpec_('name', 'xs:string', 0, 0),
+        MemberSpec_('', 'xs:string', 1, 0),
+        MemberSpec_('description', 'DescriptionType', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -862,8 +865,8 @@ class PlantType_multiple(GeneratedsSuper):
 class DescriptionType(GeneratedsSuper):
     """A standard complexType."""
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('size', 'xs:string', 0),
+        MemberSpec_('name', 'xs:string', 0, 0),
+        MemberSpec_('size', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -949,8 +952,8 @@ class DescriptionType(GeneratedsSuper):
 class CatalogType(GeneratedsSuper):
     """A standard complexType."""
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('catagory', 'xs:integer', 0),
+        MemberSpec_('name', 'xs:string', 0, 0),
+        MemberSpec_('catagory', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1039,7 +1042,7 @@ class CatalogType(GeneratedsSuper):
 
 class PlantType_single_nochild(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('', 'xs:string', 0),
+        MemberSpec_('', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1111,7 +1114,7 @@ class PlantType_single_nochild(GeneratedsSuper):
 
 class PlantType_multiple_nochild(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('', 'xs:string', 1),
+        MemberSpec_('', 'xs:string', 1, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py
index c9f62ff4f295ad00ecf29aa8795e6951a9a1c8f4..064f970eabda9b9db679727f9d15e342b7cfa170 100644
--- a/tests/attr_groups1_sup.py
+++ b/tests/attr_groups1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,16 +665,16 @@ def _cast(typ, value):
 
 class GetUserReq(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('sequence', 'xsd:unsignedLong', 0),
-        MemberSpec_('value01', 'xsd:string', 0),
-        MemberSpec_('value02', 'xsd:integer', 0),
-        MemberSpec_('value03', 'xsd:string', 0),
-        MemberSpec_('value04', 'xsd:integer', 0),
-        MemberSpec_('value05', 'xsd:string', 0),
-        MemberSpec_('value06', 'xsd:integer', 0),
-        MemberSpec_('value07', 'xsd:integer', 0),
-        MemberSpec_('value08', 'xsd:string', 0),
-        MemberSpec_('returnedTags', 'xsd:string', 0),
+        MemberSpec_('sequence', 'xsd:unsignedLong', 0, 1),
+        MemberSpec_('value01', 'xsd:string', 0, 1),
+        MemberSpec_('value02', 'xsd:integer', 0, 1),
+        MemberSpec_('value03', 'xsd:string', 0, 1),
+        MemberSpec_('value04', 'xsd:integer', 0, 1),
+        MemberSpec_('value05', 'xsd:string', 0, 1),
+        MemberSpec_('value06', 'xsd:integer', 0, 1),
+        MemberSpec_('value07', 'xsd:integer', 0, 1),
+        MemberSpec_('value08', 'xsd:string', 0, 1),
+        MemberSpec_('returnedTags', 'xsd:string', 0, 1),
     ]
     subclass = None
     superclass = None
diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py
index 6fa48d3c4398afc861ecdceffc8b796ed3e69bcb..08226684ea68920263a68aba9c576fda0a64a6e7 100644
--- a/tests/catalogtest1_sup.py
+++ b/tests/catalogtest1_sup.py
@@ -631,10 +631,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -649,6 +650,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
diff --git a/tests/cdata1_sup.py b/tests/cdata1_sup.py
index af309dd2e35b4f36d105538709760913b123ed6a..3ddcfae17c801282c47548168177ef6e6f473e6f 100644
--- a/tests/cdata1_sup.py
+++ b/tests/cdata1_sup.py
@@ -631,10 +631,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -649,6 +650,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,7 +666,7 @@ def _cast(typ, value):
 
 class cdataListType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('cdatalist', 'cdataType', 1),
+        MemberSpec_('cdatalist', 'cdataType', 1, 1),
     ]
     subclass = None
     superclass = None
@@ -743,7 +746,7 @@ class cdataListType(GeneratedsSuper):
 
 class cdataType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('script', 'xs:string', 0),
+        MemberSpec_('script', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/check_results.rb b/tests/check_results.rb
index bdbec1e12a1bd16c2dceeddc35ca98d8ca4af072..f9ad8d8a969172380b39fcded3295e5356b87c81 100755
--- a/tests/check_results.rb
+++ b/tests/check_results.rb
@@ -65,6 +65,10 @@ $commands = [
   "diff -u cleanupname1_sup.py cleanupname2_sup.py",
   "diff -u rem_dup_elems1_sub.py rem_dup_elems2_sub.py",
   "diff -u rem_dup_elems1_sup.py rem_dup_elems2_sup.py",
+  "diff -u nested_def1_sub.py nested_def2_sub.py",
+  "diff -u nested_def1_sup.py nested_def2_sup.py",
+  "diff -u catalogtest1_sub.py catalogtest2_sub.py",
+  "diff -u catalogtest1_sup.py catalogtest2_sup.py",
 ]
 
 def check
diff --git a/tests/cleanupname1_sup.py b/tests/cleanupname1_sup.py
index 59f05e9dd604760d92d7d16331f583a76c39b5a8..ce85f41d7cceaf54d80bda393d31fc814b1dee73 100644
--- a/tests/cleanupname1_sup.py
+++ b/tests/cleanupname1_sup.py
@@ -631,10 +631,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -649,6 +650,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,11 +666,11 @@ def _cast(typ, value):
 
 class dataKind(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('data1', 'data1Type', 0),
-        MemberSpec_('data2', 'TypeData2', 0),
-        MemberSpec_('data3', 'RealTypeData3', 0),
-        MemberSpec_('data4', 'AABBCCdataType', 0),
-        MemberSpec_('data5', 'dataTypeXYZAXYZ', 0),
+        MemberSpec_('data1', 'data1Type', 0, 0),
+        MemberSpec_('data2', 'TypeData2', 0, 0),
+        MemberSpec_('data3', 'RealTypeData3', 0, 0),
+        MemberSpec_('data4', 'AABBCCdataType', 0, 0),
+        MemberSpec_('data5', 'dataTypeXYZAXYZ', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -785,7 +788,7 @@ class dataKind(GeneratedsSuper):
 
 class data1Kind(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('content1', 'xs:string', 0),
+        MemberSpec_('content1', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -859,7 +862,7 @@ class data1Kind(GeneratedsSuper):
 
 class MlassData2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('content1', 'xs:string', 0),
+        MemberSpec_('content1', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -933,7 +936,7 @@ class MlassData2(GeneratedsSuper):
 
 class RealTypeData3(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('content1', 'xs:string', 0),
+        MemberSpec_('content1', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1007,7 +1010,7 @@ class RealTypeData3(GeneratedsSuper):
 
 class MMMMMMdataKind(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('content1', 'xs:string', 0),
+        MemberSpec_('content1', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1081,7 +1084,7 @@ class MMMMMMdataKind(GeneratedsSuper):
 
 class dataTypeNNNMNNN(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('content1', 'xs:string', 0),
+        MemberSpec_('content1', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py
index 7eb901a6a4043631f36b1f956f351e8033507699..6a6b5dcc9bc2818c9104babb2a62e3cbdf10bc87 100644
--- a/tests/defaults_cases1_sup.py
+++ b/tests/defaults_cases1_sup.py
@@ -629,10 +629,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -647,6 +648,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -661,8 +664,8 @@ def _cast(typ, value):
 
 class DefaultTypes(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('default1', 'DefaultType1', 1),
-        MemberSpec_('default2', 'DefaultType2', 1),
+        MemberSpec_('default1', 'DefaultType1', 1, 0),
+        MemberSpec_('default2', 'DefaultType2', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -759,14 +762,14 @@ class DefaultTypes(GeneratedsSuper):
 
 class DefaultType1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('normal01', 'xs:integer', 0),
-        MemberSpec_('normal02', 'xs:string', 0),
-        MemberSpec_('default01', 'xs:integer', 0),
-        MemberSpec_('default02', 'xs:string', 0),
-        MemberSpec_('normal03', 'xs:float', 0),
-        MemberSpec_('normal04', 'xs:double', 0),
-        MemberSpec_('default03', 'xs:float', 0),
-        MemberSpec_('default04', 'xs:double', 0),
+        MemberSpec_('normal01', 'xs:integer', 0, 1),
+        MemberSpec_('normal02', 'xs:string', 0, 1),
+        MemberSpec_('default01', 'xs:integer', 0, 1),
+        MemberSpec_('default02', 'xs:string', 0, 1),
+        MemberSpec_('normal03', 'xs:float', 0, 0),
+        MemberSpec_('normal04', 'xs:double', 0, 0),
+        MemberSpec_('default03', 'xs:float', 0, 0),
+        MemberSpec_('default04', 'xs:double', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -941,10 +944,10 @@ class DefaultType1(GeneratedsSuper):
 
 class DefaultType2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('attrdefault01', 'xs:string', 0),
-        MemberSpec_('attrdefault02', 'xs:integer', 0),
-        MemberSpec_('attrnormal01', 'xs:string', 0),
-        MemberSpec_('attrnormal02', 'xs:integer', 0),
+        MemberSpec_('attrdefault01', 'xs:string', 0, 1),
+        MemberSpec_('attrdefault02', 'xs:integer', 0, 1),
+        MemberSpec_('attrnormal01', 'xs:string', 0, 1),
+        MemberSpec_('attrnormal02', 'xs:integer', 0, 1),
     ]
     subclass = None
     superclass = None
diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py
index 702722d4eb944107837cd372a23c5b4b07f7cf01..7808d170a06ea558b76055846b823af8e89ed1c5 100644
--- a/tests/defaults_coverage1_sup.py
+++ b/tests/defaults_coverage1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,8 +665,8 @@ def _cast(typ, value):
 
 class DefaultTypes(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('default1', 'DefaultType1', 0),
-        MemberSpec_('default2', 'DefaultType2', 0),
+        MemberSpec_('default1', 'DefaultType1', 0, 0),
+        MemberSpec_('default2', 'DefaultType2', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -748,23 +751,23 @@ class DefaultTypes(GeneratedsSuper):
 
 class DefaultType1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('default01', 'xs:integer', 0),
-        MemberSpec_('normal01', 'xs:integer', 0),
-        MemberSpec_('default02', 'xs:string', 0),
-        MemberSpec_('normal02', 'xs:string', 0),
-        MemberSpec_('default03', 'xs:float', 0),
-        MemberSpec_('normal03', 'xs:float', 0),
-        MemberSpec_('default04', 'xs:double', 0),
-        MemberSpec_('normal04', 'xs:double', 0),
-        MemberSpec_('default05a', 'xs:boolean', 0),
-        MemberSpec_('default05b', 'xs:boolean', 0),
-        MemberSpec_('normal05', 'xs:boolean', 0),
-        MemberSpec_('default06', 'xs:date', 0),
-        MemberSpec_('normal06', 'xs:date', 0),
-        MemberSpec_('default07', 'xs:time', 0),
-        MemberSpec_('normal07', 'xs:date', 0),
-        MemberSpec_('default08', 'xs:dateTime', 0),
-        MemberSpec_('normal08', 'xs:dateTime', 0),
+        MemberSpec_('default01', 'xs:integer', 0, 1),
+        MemberSpec_('normal01', 'xs:integer', 0, 1),
+        MemberSpec_('default02', 'xs:string', 0, 1),
+        MemberSpec_('normal02', 'xs:string', 0, 1),
+        MemberSpec_('default03', 'xs:float', 0, 1),
+        MemberSpec_('normal03', 'xs:float', 0, 1),
+        MemberSpec_('default04', 'xs:double', 0, 1),
+        MemberSpec_('normal04', 'xs:double', 0, 1),
+        MemberSpec_('default05a', 'xs:boolean', 0, 1),
+        MemberSpec_('default05b', 'xs:boolean', 0, 1),
+        MemberSpec_('normal05', 'xs:boolean', 0, 1),
+        MemberSpec_('default06', 'xs:date', 0, 1),
+        MemberSpec_('normal06', 'xs:date', 0, 1),
+        MemberSpec_('default07', 'xs:time', 0, 1),
+        MemberSpec_('normal07', 'xs:date', 0, 1),
+        MemberSpec_('default08', 'xs:dateTime', 0, 1),
+        MemberSpec_('normal08', 'xs:dateTime', 0, 1),
     ]
     subclass = None
     superclass = None
@@ -1080,23 +1083,23 @@ class DefaultType1(GeneratedsSuper):
 
 class DefaultType2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('default01', 'xs:integer', 0),
-        MemberSpec_('normal01', 'xs:integer', 0),
-        MemberSpec_('default02', 'xs:string', 0),
-        MemberSpec_('normal02', 'xs:string', 0),
-        MemberSpec_('default03', 'xs:float', 0),
-        MemberSpec_('normal03', 'xs:float', 0),
-        MemberSpec_('default04', 'xs:double', 0),
-        MemberSpec_('normal04', 'xs:double', 0),
-        MemberSpec_('default05a', 'xs:boolean', 0),
-        MemberSpec_('default05b', 'xs:boolean', 0),
-        MemberSpec_('normal05', 'xs:boolean', 0),
-        MemberSpec_('default06', 'xs:date', 0),
-        MemberSpec_('normal06', 'xs:date', 0),
-        MemberSpec_('default07', 'xs:time', 0),
-        MemberSpec_('normal07', 'xs:date', 0),
-        MemberSpec_('default08', 'xs:dateTime', 0),
-        MemberSpec_('normal08', 'xs:dateTime', 0),
+        MemberSpec_('default01', 'xs:integer', 0, 0),
+        MemberSpec_('normal01', 'xs:integer', 0, 0),
+        MemberSpec_('default02', 'xs:string', 0, 0),
+        MemberSpec_('normal02', 'xs:string', 0, 0),
+        MemberSpec_('default03', 'xs:float', 0, 0),
+        MemberSpec_('normal03', 'xs:float', 0, 0),
+        MemberSpec_('default04', 'xs:double', 0, 0),
+        MemberSpec_('normal04', 'xs:double', 0, 0),
+        MemberSpec_('default05a', 'xs:boolean', 0, 0),
+        MemberSpec_('default05b', 'xs:boolean', 0, 0),
+        MemberSpec_('normal05', 'xs:boolean', 0, 0),
+        MemberSpec_('default06', 'xs:date', 0, 0),
+        MemberSpec_('normal06', 'xs:date', 0, 0),
+        MemberSpec_('default07', 'xs:time', 0, 0),
+        MemberSpec_('normal07', 'xs:date', 0, 0),
+        MemberSpec_('default08', 'xs:dateTime', 0, 0),
+        MemberSpec_('normal08', 'xs:dateTime', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index 5f3cb9a235b796f9f913d8e1ddd42c931fef22b4..18b6c74ae3bda8a2d92c6b7ce32f255c554c4234 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,7 +665,7 @@ def _cast(typ, value):
 
 class SpecialDate(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('SpecialProperty', 'xs:string', 0),
+        MemberSpec_('SpecialProperty', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'xs:date', 0),
     ]
     subclass = None
@@ -737,7 +740,7 @@ class SpecialDate(GeneratedsSuper):
 
 class ExtremeDate(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('ExtremeProperty', 'xs:string', 0),
+        MemberSpec_('ExtremeProperty', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', ['RelationType', 'RelationType2', 'RelationType3', 'xs:string'], 0),
     ]
     subclass = None
@@ -812,7 +815,7 @@ class ExtremeDate(GeneratedsSuper):
 
 class singleExtremeDate(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('ExtremeProperty', 'xs:string', 0),
+        MemberSpec_('ExtremeProperty', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
@@ -887,8 +890,8 @@ class singleExtremeDate(GeneratedsSuper):
 
 class containerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('simplefactoid', 'simpleFactoidType', 1),
-        MemberSpec_('mixedfactoid', 'mixedFactoidType', 0),
+        MemberSpec_('simplefactoid', 'simpleFactoidType', 1, 0),
+        MemberSpec_('mixedfactoid', 'mixedFactoidType', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -979,7 +982,7 @@ class containerType(GeneratedsSuper):
 
 class simpleFactoidType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('relation', ['RelationType', 'RelationType2', 'RelationType3', 'xs:string'], 0),
+        MemberSpec_('relation', ['RelationType', 'RelationType2', 'RelationType3', 'xs:string'], 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1086,7 +1089,7 @@ class simpleFactoidType(GeneratedsSuper):
 
 class mixedFactoidType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('relation', ['RelationType', 'RelationType2', 'RelationType3', 'xs:string'], 0),
+        MemberSpec_('relation', ['RelationType', 'RelationType2', 'RelationType3', 'xs:string'], 0, 0),
         MemberSpec_('valueOf_', [], 0),
     ]
     subclass = None
@@ -1211,8 +1214,8 @@ class mixedFactoidType(GeneratedsSuper):
 
 class BaseType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('BaseProperty1', 'xs:string', 0),
-        MemberSpec_('BaseProperty2', 'xs:string', 0),
+        MemberSpec_('BaseProperty1', 'xs:string', 0, 1),
+        MemberSpec_('BaseProperty2', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
@@ -1308,8 +1311,8 @@ class BaseType(GeneratedsSuper):
 
 class DerivedType(BaseType):
     member_data_items_ = [
-        MemberSpec_('DerivedProperty1', 'xs:string', 0),
-        MemberSpec_('DerivedProperty2', 'xs:string', 0),
+        MemberSpec_('DerivedProperty1', 'xs:string', 0, 1),
+        MemberSpec_('DerivedProperty2', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'BaseType', 0),
     ]
     subclass = None
@@ -1399,7 +1402,7 @@ class DerivedType(BaseType):
 
 class MyInteger(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('MyAttr', 'xs:string', 0),
+        MemberSpec_('MyAttr', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'xs:integer', 0),
     ]
     subclass = None
@@ -1474,7 +1477,7 @@ class MyInteger(GeneratedsSuper):
 
 class MyBoolean(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('MyAttr', 'xs:string', 0),
+        MemberSpec_('MyAttr', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'xs:boolean', 0),
     ]
     subclass = None
@@ -1549,7 +1552,7 @@ class MyBoolean(GeneratedsSuper):
 
 class MyFloat(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('MyAttr', 'xs:string', 0),
+        MemberSpec_('MyAttr', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'xs:float', 0),
     ]
     subclass = None
@@ -1624,7 +1627,7 @@ class MyFloat(GeneratedsSuper):
 
 class MyDouble(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('MyAttr', 'xs:string', 0),
+        MemberSpec_('MyAttr', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'xs:double', 0),
     ]
     subclass = None
diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py
index 5a27592754e45bc90b47137af1daf1a986974597..a8103241d16d691fd4fa944621e02e07fb521236 100644
--- a/tests/ipo1_sup.py
+++ b/tests/ipo1_sup.py
@@ -629,10 +629,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -647,6 +648,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -661,11 +664,11 @@ def _cast(typ, value):
 
 class PurchaseOrderType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('orderDate', 'date', 0),
-        MemberSpec_('shipTo', 'Address', 0),
-        MemberSpec_('billTo', 'Address', 0),
-        MemberSpec_('comment', 'string', 0),
-        MemberSpec_('items', 'Items', 0),
+        MemberSpec_('orderDate', 'date', 0, 1),
+        MemberSpec_('shipTo', 'Address', 0, 0),
+        MemberSpec_('billTo', 'Address', 0, 0),
+        MemberSpec_('comment', 'string', 0, 1),
+        MemberSpec_('items', 'Items', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -789,7 +792,7 @@ class PurchaseOrderType(GeneratedsSuper):
 
 class Items(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('item', 'item', 1),
+        MemberSpec_('item', 'item', 1, 1),
     ]
     subclass = None
     superclass = None
@@ -869,12 +872,12 @@ class Items(GeneratedsSuper):
 
 class item(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('partNum', 'ipo:SKU', 0),
-        MemberSpec_('productName', 'string', 0),
-        MemberSpec_('quantity', ['quantity', 'positiveInteger'], 0),
-        MemberSpec_('USPrice', 'decimal', 0),
-        MemberSpec_('comment', 'string', 0),
-        MemberSpec_('shipDate', 'date', 0),
+        MemberSpec_('partNum', 'ipo:SKU', 0, 0),
+        MemberSpec_('productName', 'string', 0, 0),
+        MemberSpec_('quantity', ['quantity', 'positiveInteger'], 0, 0),
+        MemberSpec_('USPrice', 'decimal', 0, 0),
+        MemberSpec_('comment', 'string', 0, 1),
+        MemberSpec_('shipDate', 'date', 0, 1),
     ]
     subclass = None
     superclass = None
@@ -1075,9 +1078,9 @@ class quantity(GeneratedsSuper):
 
 class Address(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'string', 0),
-        MemberSpec_('street', 'string', 0),
-        MemberSpec_('city', 'string', 0),
+        MemberSpec_('name', 'string', 0, 0),
+        MemberSpec_('street', 'string', 0, 0),
+        MemberSpec_('city', 'string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1183,8 +1186,8 @@ class Address(GeneratedsSuper):
 
 class USAddress(Address):
     member_data_items_ = [
-        MemberSpec_('state', ['USState', 'string'], 0),
-        MemberSpec_('zip', 'positiveInteger', 0),
+        MemberSpec_('state', ['USState', 'string'], 0, 0),
+        MemberSpec_('zip', 'positiveInteger', 0, 0),
     ]
     subclass = None
     superclass = Address
@@ -1294,8 +1297,8 @@ class USAddress(Address):
 
 class UKAddress(Address):
     member_data_items_ = [
-        MemberSpec_('exportCode', 'positiveInteger', 0),
-        MemberSpec_('postcode', 'string', 0),
+        MemberSpec_('exportCode', 'positiveInteger', 0, 1),
+        MemberSpec_('postcode', 'string', 0, 0),
     ]
     subclass = None
     superclass = Address
diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py
index 5a27592754e45bc90b47137af1daf1a986974597..a8103241d16d691fd4fa944621e02e07fb521236 100644
--- a/tests/ipo2_sup.py
+++ b/tests/ipo2_sup.py
@@ -629,10 +629,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -647,6 +648,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -661,11 +664,11 @@ def _cast(typ, value):
 
 class PurchaseOrderType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('orderDate', 'date', 0),
-        MemberSpec_('shipTo', 'Address', 0),
-        MemberSpec_('billTo', 'Address', 0),
-        MemberSpec_('comment', 'string', 0),
-        MemberSpec_('items', 'Items', 0),
+        MemberSpec_('orderDate', 'date', 0, 1),
+        MemberSpec_('shipTo', 'Address', 0, 0),
+        MemberSpec_('billTo', 'Address', 0, 0),
+        MemberSpec_('comment', 'string', 0, 1),
+        MemberSpec_('items', 'Items', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -789,7 +792,7 @@ class PurchaseOrderType(GeneratedsSuper):
 
 class Items(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('item', 'item', 1),
+        MemberSpec_('item', 'item', 1, 1),
     ]
     subclass = None
     superclass = None
@@ -869,12 +872,12 @@ class Items(GeneratedsSuper):
 
 class item(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('partNum', 'ipo:SKU', 0),
-        MemberSpec_('productName', 'string', 0),
-        MemberSpec_('quantity', ['quantity', 'positiveInteger'], 0),
-        MemberSpec_('USPrice', 'decimal', 0),
-        MemberSpec_('comment', 'string', 0),
-        MemberSpec_('shipDate', 'date', 0),
+        MemberSpec_('partNum', 'ipo:SKU', 0, 0),
+        MemberSpec_('productName', 'string', 0, 0),
+        MemberSpec_('quantity', ['quantity', 'positiveInteger'], 0, 0),
+        MemberSpec_('USPrice', 'decimal', 0, 0),
+        MemberSpec_('comment', 'string', 0, 1),
+        MemberSpec_('shipDate', 'date', 0, 1),
     ]
     subclass = None
     superclass = None
@@ -1075,9 +1078,9 @@ class quantity(GeneratedsSuper):
 
 class Address(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'string', 0),
-        MemberSpec_('street', 'string', 0),
-        MemberSpec_('city', 'string', 0),
+        MemberSpec_('name', 'string', 0, 0),
+        MemberSpec_('street', 'string', 0, 0),
+        MemberSpec_('city', 'string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1183,8 +1186,8 @@ class Address(GeneratedsSuper):
 
 class USAddress(Address):
     member_data_items_ = [
-        MemberSpec_('state', ['USState', 'string'], 0),
-        MemberSpec_('zip', 'positiveInteger', 0),
+        MemberSpec_('state', ['USState', 'string'], 0, 0),
+        MemberSpec_('zip', 'positiveInteger', 0, 0),
     ]
     subclass = None
     superclass = Address
@@ -1294,8 +1297,8 @@ class USAddress(Address):
 
 class UKAddress(Address):
     member_data_items_ = [
-        MemberSpec_('exportCode', 'positiveInteger', 0),
-        MemberSpec_('postcode', 'string', 0),
+        MemberSpec_('exportCode', 'positiveInteger', 0, 1),
+        MemberSpec_('postcode', 'string', 0, 0),
     ]
     subclass = None
     superclass = Address
diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py
index 02e113620bfb1f7086686a1c1bcfb14b9a5b80fa..f6017af6ae1985ce90f15593977aa45383e494cd 100644
--- a/tests/mapcleanname1_sup.py
+++ b/tests/mapcleanname1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,10 +665,10 @@ def _cast(typ, value):
 
 class complex_type01(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('string_value01', 'xs:string', 0),
-        MemberSpec_('integer_value01', 'xs:integer', 1),
-        MemberSpec_('float_value01', 'xs:float', 0),
-        MemberSpec_('field01', 'complex-type02', 0),
+        MemberSpec_('string_value01', 'xs:string', 0, 0),
+        MemberSpec_('integer_value01', 'xs:integer', 1, 1),
+        MemberSpec_('float_value01', 'xs:float', 0, 0),
+        MemberSpec_('field01', 'complex-type02', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -786,9 +789,9 @@ class complex_type01(GeneratedsSuper):
 
 class complex_type02(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('string_value02', 'xs:string', 0),
-        MemberSpec_('integer_value02', 'xs:integer', 1),
-        MemberSpec_('float_value02', 'xs:float', 0),
+        MemberSpec_('string_value02', 'xs:string', 0, 0),
+        MemberSpec_('integer_value02', 'xs:integer', 1, 1),
+        MemberSpec_('float_value02', 'xs:float', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -908,9 +911,9 @@ class complex_type02(GeneratedsSuper):
 
 class complex_type03(complex_type02):
     member_data_items_ = [
-        MemberSpec_('string_value03', 'xs:string', 0),
-        MemberSpec_('integer_value03', 'xs:integer', 1),
-        MemberSpec_('float_value03', 'xs:float', 0),
+        MemberSpec_('string_value03', 'xs:string', 0, 0),
+        MemberSpec_('integer_value03', 'xs:integer', 1, 1),
+        MemberSpec_('float_value03', 'xs:float', 0, 0),
     ]
     subclass = None
     superclass = complex_type02
@@ -1024,9 +1027,9 @@ class complex_type03(complex_type02):
 
 class type_(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('string_value02', 'xs:string', 0),
-        MemberSpec_('integer_value02', 'xs:integer', 1),
-        MemberSpec_('float_value02', 'xs:float', 0),
+        MemberSpec_('string_value02', 'xs:string', 0, 0),
+        MemberSpec_('integer_value02', 'xs:integer', 1, 1),
+        MemberSpec_('float_value02', 'xs:float', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1146,9 +1149,9 @@ class type_(GeneratedsSuper):
 
 class complex_type04(type_):
     member_data_items_ = [
-        MemberSpec_('string_value03', 'xs:string', 0),
-        MemberSpec_('integer_value03', 'xs:integer', 1),
-        MemberSpec_('float_value03', 'xs:float', 0),
+        MemberSpec_('string_value03', 'xs:string', 0, 0),
+        MemberSpec_('integer_value03', 'xs:integer', 1, 1),
+        MemberSpec_('float_value03', 'xs:float', 0, 0),
     ]
     subclass = None
     superclass = type_
@@ -1262,9 +1265,9 @@ class complex_type04(type_):
 
 class build_(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('string_value02', 'xs:string', 0),
-        MemberSpec_('integer_value02', 'xs:integer', 1),
-        MemberSpec_('float_value02', 'xs:float', 0),
+        MemberSpec_('string_value02', 'xs:string', 0, 0),
+        MemberSpec_('integer_value02', 'xs:integer', 1, 1),
+        MemberSpec_('float_value02', 'xs:float', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1384,9 +1387,9 @@ class build_(GeneratedsSuper):
 
 class complex_type05(build_):
     member_data_items_ = [
-        MemberSpec_('string_value03', 'xs:string', 0),
-        MemberSpec_('integer_value03', 'xs:integer', 1),
-        MemberSpec_('float_value03', 'xs:float', 0),
+        MemberSpec_('string_value03', 'xs:string', 0, 0),
+        MemberSpec_('integer_value03', 'xs:integer', 1, 1),
+        MemberSpec_('float_value03', 'xs:float', 0, 0),
     ]
     subclass = None
     superclass = build_
diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py
index a0ca03d3cc37ea8c1c14a8f99d5baefe0240f748..86079794fe66bf243a5209cc045dd1cac5c1d855 100644
--- a/tests/nested_def1_sup.py
+++ b/tests/nested_def1_sup.py
@@ -629,10 +629,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -647,6 +648,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -661,8 +664,8 @@ def _cast(typ, value):
 
 class containerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('item1', 'classAType', 0),
-        MemberSpec_('item2', 'classBType', 0),
+        MemberSpec_('item1', 'classAType', 0, 0),
+        MemberSpec_('item2', 'classBType', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -747,7 +750,7 @@ class containerType(GeneratedsSuper):
 
 class classAType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('inner', 'innerType', 0),
+        MemberSpec_('inner', 'innerType', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -821,7 +824,7 @@ class classAType(GeneratedsSuper):
 
 class classBType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('inner', 'innerType1', 0),
+        MemberSpec_('inner', 'innerType1', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -895,8 +898,8 @@ class classBType(GeneratedsSuper):
 
 class innerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('attrA1', 'xs:string', 0),
-        MemberSpec_('attrA2', 'xs:string', 0),
+        MemberSpec_('attrA1', 'xs:string', 0, 1),
+        MemberSpec_('attrA2', 'xs:string', 0, 1),
     ]
     subclass = None
     superclass = None
@@ -975,8 +978,8 @@ class innerType(GeneratedsSuper):
 
 class innerType1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('attrB1', 'xs:string', 0),
-        MemberSpec_('attrB2', 'xs:string', 0),
+        MemberSpec_('attrB1', 'xs:string', 0, 1),
+        MemberSpec_('attrB2', 'xs:string', 0, 1),
     ]
     subclass = None
     superclass = None
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index 7d3900a737b2bc602834764aeed8b15f69d675ae..3530babe3909ec04d9d6225f39c647155e3ae096 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,11 +665,11 @@ def _cast(typ, value):
 
 class people(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('comments', 'comments', 1),
-        MemberSpec_('person', 'person', 1),
-        MemberSpec_('programmer', 'programmer', 1),
-        MemberSpec_('python_programmer', 'python-programmer', 1),
-        MemberSpec_('java_programmer', 'java-programmer', 1),
+        MemberSpec_('comments', 'comments', 1, 0),
+        MemberSpec_('person', 'person', 1, 0),
+        MemberSpec_('programmer', 'programmer', 1, 0),
+        MemberSpec_('python_programmer', 'python-programmer', 1, 0),
+        MemberSpec_('java_programmer', 'java-programmer', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -936,7 +939,7 @@ class people(GeneratedsSuper):
 
 class comments(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('emp', 'xs:string', 1),
+        MemberSpec_('emp', 'xs:string', 1, 0),
         MemberSpec_('valueOf_', [], 0),
     ]
     subclass = None
@@ -1100,17 +1103,17 @@ class comments(GeneratedsSuper):
 
 class person(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('value', 'xs:string', 0),
-        MemberSpec_('id', 'xs:integer', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('interest', 'xs:string', 1),
-        MemberSpec_('category', 'xs:integer', 0),
-        MemberSpec_('agent', 'agent', 1),
-        MemberSpec_('promoter', 'booster', 1),
-        MemberSpec_('description', 'xs:string', 0),
+        MemberSpec_('value', 'xs:string', 0, 1),
+        MemberSpec_('id', 'xs:integer', 0, 1),
+        MemberSpec_('ratio', 'xs:float', 0, 1),
+        MemberSpec_('fruit', 'xs:string', 0, 1),
+        MemberSpec_('vegetable', 'xs:string', 0, 1),
+        MemberSpec_('name', 'xs:string', 0, 0),
+        MemberSpec_('interest', 'xs:string', 1, 0),
+        MemberSpec_('category', 'xs:integer', 0, 0),
+        MemberSpec_('agent', 'agent', 1, 0),
+        MemberSpec_('promoter', 'booster', 1, 0),
+        MemberSpec_('description', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1442,24 +1445,24 @@ class person(GeneratedsSuper):
 
 class programmer(person):
     member_data_items_ = [
-        MemberSpec_('language', 'xs:string', 0),
-        MemberSpec_('area', 'xs:string', 0),
-        MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0),
-        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('email', 'xs:string', 0),
-        MemberSpec_('elposint', 'xs:positiveInteger', 0),
-        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0),
-        MemberSpec_('elnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('eldate', 'xs:date', 0),
-        MemberSpec_('eldatetime', 'xs:dateTime', 0),
-        MemberSpec_('eltoken', 'xs:token', 0),
-        MemberSpec_('elshort', 'xs:short', 0),
-        MemberSpec_('ellong', 'xs:long', 0),
-        MemberSpec_('elparam', 'param', 0),
-        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0),
+        MemberSpec_('language', 'xs:string', 0, 1),
+        MemberSpec_('area', 'xs:string', 0, 1),
+        MemberSpec_('attrposint', 'xs:positiveInteger', 0, 1),
+        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0, 1),
+        MemberSpec_('attrnegint', 'xs:negativeInteger', 0, 1),
+        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0, 1),
+        MemberSpec_('email', 'xs:string', 0, 0),
+        MemberSpec_('elposint', 'xs:positiveInteger', 0, 0),
+        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0, 0),
+        MemberSpec_('elnegint', 'xs:negativeInteger', 0, 0),
+        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0, 0),
+        MemberSpec_('eldate', 'xs:date', 0, 0),
+        MemberSpec_('eldatetime', 'xs:dateTime', 0, 0),
+        MemberSpec_('eltoken', 'xs:token', 0, 0),
+        MemberSpec_('elshort', 'xs:short', 0, 0),
+        MemberSpec_('ellong', 'xs:long', 0, 0),
+        MemberSpec_('elparam', 'param', 0, 0),
+        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0, 0),
     ]
     subclass = None
     superclass = person
@@ -1929,12 +1932,12 @@ class param(GeneratedsSuper):
     """Finding flow attribute unneccesary in practice. A unnamed parameter
     is unbound/skipped."""
     member_data_items_ = [
-        MemberSpec_('id', 'xs:string', 0),
-        MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('sid', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 0),
-        MemberSpec_('semantic', 'xs:token', 0),
-        MemberSpec_('type', 'xs:NMTOKEN', 0),
+        MemberSpec_('id', 'xs:string', 0, 1),
+        MemberSpec_('name', 'xs:NCName', 0, 1),
+        MemberSpec_('sid', 'xs:NCName', 0, 1),
+        MemberSpec_('flow', 'FlowType', 0, 1),
+        MemberSpec_('semantic', 'xs:token', 0, 1),
+        MemberSpec_('type', 'xs:NMTOKEN', 0, 0),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
@@ -2141,8 +2144,8 @@ class param(GeneratedsSuper):
 
 class python_programmer(programmer):
     member_data_items_ = [
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0, 1),
+        MemberSpec_('favorite_editor', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = programmer
@@ -2293,9 +2296,9 @@ class python_programmer(programmer):
 
 class java_programmer(programmer):
     member_data_items_ = [
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('status', 'xs:string', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0, 1),
+        MemberSpec_('status', 'xs:string', 0, 1),
+        MemberSpec_('favorite_editor', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = programmer
@@ -2460,10 +2463,10 @@ class java_programmer(programmer):
 
 class agent(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'info', 0),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'info', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -2644,10 +2647,10 @@ class agent(GeneratedsSuper):
 
 class special_agent(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'info', 0),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'info', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -2828,13 +2831,13 @@ class special_agent(GeneratedsSuper):
 
 class booster(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('other_name', 'xs:float', 0),
-        MemberSpec_('class_', 'xs:float', 0),
-        MemberSpec_('other_value', 'xs:float', 1),
-        MemberSpec_('type_', 'xs:float', 1),
-        MemberSpec_('client_handler', 'client-handlerType', 1),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('other_name', 'xs:float', 0, 0),
+        MemberSpec_('class_', 'xs:float', 0, 0),
+        MemberSpec_('other_value', 'xs:float', 1, 0),
+        MemberSpec_('type_', 'xs:float', 1, 0),
+        MemberSpec_('client_handler', 'client-handlerType', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -3105,9 +3108,9 @@ class booster(GeneratedsSuper):
 
 class info(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('type', 'xs:integer', 0),
-        MemberSpec_('rating', 'xs:float', 0),
+        MemberSpec_('name', 'xs:string', 0, 1),
+        MemberSpec_('type', 'xs:integer', 0, 1),
+        MemberSpec_('rating', 'xs:float', 0, 1),
     ]
     subclass = None
     superclass = None
@@ -3269,8 +3272,8 @@ class info(GeneratedsSuper):
 
 class client_handlerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('fullname', 'xs:string', 0),
-        MemberSpec_('refid', 'xs:integer', 0),
+        MemberSpec_('fullname', 'xs:string', 0, 0),
+        MemberSpec_('refid', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index dac3ff1ee9071ec36b27a023f71086dbc60f41b6..6898534bf8f60c78a48f378635a1f53d0725340b 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,12 +666,12 @@ def _cast(typ, value):
 class people(GeneratedsSuper):
     """A list of people."""
     member_data_items_ = [
-        MemberSpec_('comments', 'comments', 1),
-        MemberSpec_('person', 'person', 1),
-        MemberSpec_('specialperson', 'specialperson', 1),
-        MemberSpec_('programmer', 'programmer', 1),
-        MemberSpec_('python_programmer', 'python-programmer', 1),
-        MemberSpec_('java_programmer', 'java-programmer', 1),
+        MemberSpec_('comments', 'comments', 1, 0),
+        MemberSpec_('person', 'person', 1, 0),
+        MemberSpec_('specialperson', 'specialperson', 1, 0),
+        MemberSpec_('programmer', 'programmer', 1, 0),
+        MemberSpec_('python_programmer', 'python-programmer', 1, 0),
+        MemberSpec_('java_programmer', 'java-programmer', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -835,8 +838,8 @@ class people(GeneratedsSuper):
 
 class comments(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('emp', 'xs:string', 1),
-        MemberSpec_('bold', 'xs:string', 1),
+        MemberSpec_('emp', 'xs:string', 1, 0),
+        MemberSpec_('bold', 'xs:string', 1, 0),
         MemberSpec_('valueOf_', [], 0),
     ]
     subclass = None
@@ -954,17 +957,17 @@ class person(GeneratedsSuper):
     of people. They are each an extension of this base type of
     person."""
     member_data_items_ = [
-        MemberSpec_('value', 'xs:string', 0),
-        MemberSpec_('id', 'xs:integer', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('interest', 'xs:string', 1),
-        MemberSpec_('category', 'xs:integer', 0),
-        MemberSpec_('agent', 'agent', 1),
-        MemberSpec_('promoter', 'booster', 1),
-        MemberSpec_('description', 'xs:string', 0),
+        MemberSpec_('value', 'xs:string', 0, 1),
+        MemberSpec_('id', 'xs:integer', 0, 1),
+        MemberSpec_('ratio', 'xs:float', 0, 1),
+        MemberSpec_('fruit', 'xs:string', 0, 1),
+        MemberSpec_('vegetable', 'xs:string', 0, 1),
+        MemberSpec_('name', 'xs:string', 0, 0),
+        MemberSpec_('interest', 'xs:string', 1, 0),
+        MemberSpec_('category', 'xs:integer', 0, 0),
+        MemberSpec_('agent', 'agent', 1, 0),
+        MemberSpec_('promoter', 'booster', 1, 0),
+        MemberSpec_('description', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1245,12 +1248,12 @@ class param(GeneratedsSuper):
     """Finding flow attribute unneccesary in practice. A unnamed parameter
     is unbound/skipped."""
     member_data_items_ = [
-        MemberSpec_('id', 'xs:string', 0),
-        MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('sid', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 0),
-        MemberSpec_('semantic', 'xs:token', 0),
-        MemberSpec_('type', 'xs:NMTOKEN', 0),
+        MemberSpec_('id', 'xs:string', 0, 1),
+        MemberSpec_('name', 'xs:NCName', 0, 1),
+        MemberSpec_('sid', 'xs:NCName', 0, 1),
+        MemberSpec_('flow', 'FlowType', 0, 1),
+        MemberSpec_('semantic', 'xs:token', 0, 1),
+        MemberSpec_('type', 'xs:NMTOKEN', 0, 0),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
@@ -1376,11 +1379,11 @@ class param(GeneratedsSuper):
 
 class agent(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'info', 0),
-        MemberSpec_('vehicle', 'vehicle', 1),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'info', 0, 0),
+        MemberSpec_('vehicle', 'vehicle', 1, 1),
     ]
     subclass = None
     superclass = None
@@ -1524,10 +1527,10 @@ class special_agent(GeneratedsSuper):
     """This is a good kind of agent for testing the generation of Python
     bindings for an XML schema."""
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'info', 0),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'info', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1638,14 +1641,14 @@ class special_agent(GeneratedsSuper):
 
 class booster(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('member-id', 'xs:string', 0),
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('other_name', 'xs:float', 0),
-        MemberSpec_('class_', 'xs:float', 0),
-        MemberSpec_('other_value', 'xs:float', 1),
-        MemberSpec_('type_', 'xs:float', 1),
-        MemberSpec_('client_handler', 'client-handlerType', 1),
+        MemberSpec_('member-id', 'xs:string', 0, 1),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('other_name', 'xs:float', 0, 0),
+        MemberSpec_('class_', 'xs:float', 0, 0),
+        MemberSpec_('other_value', 'xs:float', 1, 0),
+        MemberSpec_('type_', 'xs:float', 1, 0),
+        MemberSpec_('client_handler', 'client-handlerType', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -1827,9 +1830,9 @@ class booster(GeneratedsSuper):
 
 class info(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('type', 'xs:integer', 0),
-        MemberSpec_('rating', 'xs:float', 0),
+        MemberSpec_('name', 'xs:string', 0, 1),
+        MemberSpec_('type', 'xs:integer', 0, 1),
+        MemberSpec_('rating', 'xs:float', 0, 1),
     ]
     subclass = None
     superclass = None
@@ -1924,7 +1927,7 @@ class info(GeneratedsSuper):
 
 class vehicle(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('wheelcount', 'xs:integer', 0),
+        MemberSpec_('wheelcount', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -2012,7 +2015,7 @@ class vehicle(GeneratedsSuper):
 
 class automobile(vehicle):
     member_data_items_ = [
-        MemberSpec_('drivername', 'xs:string', 0),
+        MemberSpec_('drivername', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = vehicle
@@ -2090,7 +2093,7 @@ class automobile(vehicle):
 
 class airplane(vehicle):
     member_data_items_ = [
-        MemberSpec_('pilotname', 'xs:string', 0),
+        MemberSpec_('pilotname', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = vehicle
@@ -2170,23 +2173,23 @@ class programmer(person):
     """A programmer type of person. Programmers are very special but also a
     little shy."""
     member_data_items_ = [
-        MemberSpec_('language', 'xs:string', 0),
-        MemberSpec_('area', 'xs:string', 0),
-        MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0),
-        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('email', 'xs:string', 0),
-        MemberSpec_('elposint', 'xs:positiveInteger', 0),
-        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0),
-        MemberSpec_('elnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('eldate', 'xs:date', 0),
-        MemberSpec_('eltoken', 'xs:token', 0),
-        MemberSpec_('elshort', 'xs:short', 0),
-        MemberSpec_('ellong', 'xs:long', 0),
-        MemberSpec_('elparam', 'param', 0),
-        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0),
+        MemberSpec_('language', 'xs:string', 0, 1),
+        MemberSpec_('area', 'xs:string', 0, 1),
+        MemberSpec_('attrposint', 'xs:positiveInteger', 0, 1),
+        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0, 1),
+        MemberSpec_('attrnegint', 'xs:negativeInteger', 0, 1),
+        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0, 1),
+        MemberSpec_('email', 'xs:string', 0, 0),
+        MemberSpec_('elposint', 'xs:positiveInteger', 0, 0),
+        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0, 0),
+        MemberSpec_('elnegint', 'xs:negativeInteger', 0, 0),
+        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0, 0),
+        MemberSpec_('eldate', 'xs:date', 0, 0),
+        MemberSpec_('eltoken', 'xs:token', 0, 0),
+        MemberSpec_('elshort', 'xs:short', 0, 0),
+        MemberSpec_('ellong', 'xs:long', 0, 0),
+        MemberSpec_('elparam', 'param', 0, 0),
+        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0, 0),
     ]
     subclass = None
     superclass = person
@@ -2520,8 +2523,8 @@ class programmer(person):
 
 class client_handlerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('fullname', 'xs:string', 0),
-        MemberSpec_('refid', 'xs:integer', 0),
+        MemberSpec_('fullname', 'xs:string', 0, 0),
+        MemberSpec_('refid', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -2613,9 +2616,9 @@ class java_programmer(programmer):
     Java programmers are nice also, but not as especially wonderful
     as Python programmers, of course."""
     member_data_items_ = [
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('status', 'xs:string', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0, 1),
+        MemberSpec_('status', 'xs:string', 0, 1),
+        MemberSpec_('favorite_editor', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = programmer
@@ -2715,8 +2718,8 @@ class python_programmer(programmer):
     """A Python programmer type of person. Programmers are very special and
     Python programmers are especially wonderful kinds of people."""
     member_data_items_ = [
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0, 1),
+        MemberSpec_('favorite_editor', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = programmer
diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py
index eddff8707c242b1a2f0c8a646a431cabd81efb0c..e0fa52d4e7e2e732abd726cb1ff29f8dff040592 100644
--- a/tests/prefix_classname1_sup.py
+++ b/tests/prefix_classname1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,11 +665,11 @@ def _cast(typ, value):
 
 class tomato_people(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('comments', 'comments', 1),
-        MemberSpec_('person', 'person', 1),
-        MemberSpec_('programmer', 'programmer', 1),
-        MemberSpec_('python_programmer', 'python-programmer', 1),
-        MemberSpec_('java_programmer', 'java-programmer', 1),
+        MemberSpec_('comments', 'comments', 1, 0),
+        MemberSpec_('person', 'person', 1, 0),
+        MemberSpec_('programmer', 'programmer', 1, 0),
+        MemberSpec_('python_programmer', 'python-programmer', 1, 0),
+        MemberSpec_('java_programmer', 'java-programmer', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -816,7 +819,7 @@ class tomato_people(GeneratedsSuper):
 
 class tomato_comments(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('emp', 'xs:string', 1),
+        MemberSpec_('emp', 'xs:string', 1, 0),
         MemberSpec_('valueOf_', [], 0),
     ]
     subclass = None
@@ -916,17 +919,17 @@ class tomato_comments(GeneratedsSuper):
 
 class tomato_person(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('value', 'xs:string', 0),
-        MemberSpec_('id', 'xs:integer', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('interest', 'xs:string', 1),
-        MemberSpec_('category', 'xs:integer', 0),
-        MemberSpec_('agent', 'agent', 1),
-        MemberSpec_('promoter', 'booster', 1),
-        MemberSpec_('description', 'xs:string', 0),
+        MemberSpec_('value', 'xs:string', 0, 1),
+        MemberSpec_('id', 'xs:integer', 0, 1),
+        MemberSpec_('ratio', 'xs:float', 0, 1),
+        MemberSpec_('fruit', 'xs:string', 0, 1),
+        MemberSpec_('vegetable', 'xs:string', 0, 1),
+        MemberSpec_('name', 'xs:string', 0, 0),
+        MemberSpec_('interest', 'xs:string', 1, 0),
+        MemberSpec_('category', 'xs:integer', 0, 0),
+        MemberSpec_('agent', 'agent', 1, 0),
+        MemberSpec_('promoter', 'booster', 1, 0),
+        MemberSpec_('description', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1142,24 +1145,24 @@ class tomato_person(GeneratedsSuper):
 
 class tomato_programmer(tomato_person):
     member_data_items_ = [
-        MemberSpec_('language', 'xs:string', 0),
-        MemberSpec_('area', 'xs:string', 0),
-        MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0),
-        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('email', 'xs:string', 0),
-        MemberSpec_('elposint', 'xs:positiveInteger', 0),
-        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0),
-        MemberSpec_('elnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('eldate', 'xs:date', 0),
-        MemberSpec_('eldatetime', 'xs:dateTime', 0),
-        MemberSpec_('eltoken', 'xs:token', 0),
-        MemberSpec_('elshort', 'xs:short', 0),
-        MemberSpec_('ellong', 'xs:long', 0),
-        MemberSpec_('elparam', 'param', 0),
-        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0),
+        MemberSpec_('language', 'xs:string', 0, 1),
+        MemberSpec_('area', 'xs:string', 0, 1),
+        MemberSpec_('attrposint', 'xs:positiveInteger', 0, 1),
+        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0, 1),
+        MemberSpec_('attrnegint', 'xs:negativeInteger', 0, 1),
+        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0, 1),
+        MemberSpec_('email', 'xs:string', 0, 0),
+        MemberSpec_('elposint', 'xs:positiveInteger', 0, 0),
+        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0, 0),
+        MemberSpec_('elnegint', 'xs:negativeInteger', 0, 0),
+        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0, 0),
+        MemberSpec_('eldate', 'xs:date', 0, 0),
+        MemberSpec_('eldatetime', 'xs:dateTime', 0, 0),
+        MemberSpec_('eltoken', 'xs:token', 0, 0),
+        MemberSpec_('elshort', 'xs:short', 0, 0),
+        MemberSpec_('ellong', 'xs:long', 0, 0),
+        MemberSpec_('elparam', 'param', 0, 0),
+        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0, 0),
     ]
     subclass = None
     superclass = tomato_person
@@ -1510,12 +1513,12 @@ class tomato_param(GeneratedsSuper):
     """Finding flow attribute unneccesary in practice. A unnamed parameter
     is unbound/skipped."""
     member_data_items_ = [
-        MemberSpec_('id', 'xs:string', 0),
-        MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('sid', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 0),
-        MemberSpec_('semantic', 'xs:token', 0),
-        MemberSpec_('type', 'xs:NMTOKEN', 0),
+        MemberSpec_('id', 'xs:string', 0, 1),
+        MemberSpec_('name', 'xs:NCName', 0, 1),
+        MemberSpec_('sid', 'xs:NCName', 0, 1),
+        MemberSpec_('flow', 'FlowType', 0, 1),
+        MemberSpec_('semantic', 'xs:token', 0, 1),
+        MemberSpec_('type', 'xs:NMTOKEN', 0, 0),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
@@ -1641,8 +1644,8 @@ class tomato_param(GeneratedsSuper):
 
 class tomato_python_programmer(tomato_programmer):
     member_data_items_ = [
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0, 1),
+        MemberSpec_('favorite_editor', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = tomato_programmer
@@ -1730,9 +1733,9 @@ class tomato_python_programmer(tomato_programmer):
 
 class tomato_java_programmer(tomato_programmer):
     member_data_items_ = [
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('status', 'xs:string', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0, 1),
+        MemberSpec_('status', 'xs:string', 0, 1),
+        MemberSpec_('favorite_editor', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = tomato_programmer
@@ -1830,10 +1833,10 @@ class tomato_java_programmer(tomato_programmer):
 
 class tomato_agent(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'info', 0),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'info', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1944,10 +1947,10 @@ class tomato_agent(GeneratedsSuper):
 
 class tomato_special_agent(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'info', 0),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'info', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -2058,13 +2061,13 @@ class tomato_special_agent(GeneratedsSuper):
 
 class tomato_booster(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('other_name', 'xs:float', 0),
-        MemberSpec_('class_', 'xs:float', 0),
-        MemberSpec_('other_value', 'xs:float', 1),
-        MemberSpec_('type_', 'xs:float', 1),
-        MemberSpec_('client_handler', 'client-handlerType', 1),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('other_name', 'xs:float', 0, 0),
+        MemberSpec_('class_', 'xs:float', 0, 0),
+        MemberSpec_('other_value', 'xs:float', 1, 0),
+        MemberSpec_('type_', 'xs:float', 1, 0),
+        MemberSpec_('client_handler', 'client-handlerType', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -2238,9 +2241,9 @@ class tomato_booster(GeneratedsSuper):
 
 class tomato_info(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('type', 'xs:integer', 0),
-        MemberSpec_('rating', 'xs:float', 0),
+        MemberSpec_('name', 'xs:string', 0, 1),
+        MemberSpec_('type', 'xs:integer', 0, 1),
+        MemberSpec_('rating', 'xs:float', 0, 1),
     ]
     subclass = None
     superclass = None
@@ -2335,8 +2338,8 @@ class tomato_info(GeneratedsSuper):
 
 class tomato_client_handlerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('fullname', 'xs:string', 0),
-        MemberSpec_('refid', 'xs:integer', 0),
+        MemberSpec_('fullname', 'xs:string', 0, 0),
+        MemberSpec_('refid', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py
index 571ffda4d5f45c04a1c0979408b58184df62d557..b4201cf5f875e2d9be06997dab32844db02e0431 100644
--- a/tests/recursive_simpletype1_sup.py
+++ b/tests/recursive_simpletype1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,9 +665,9 @@ def _cast(typ, value):
 
 class PersonType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('personId', 'xs:integer', 0),
-        MemberSpec_('fname', 'xs:string', 0),
-        MemberSpec_('lname', 'xs:string', 0),
+        MemberSpec_('personId', 'xs:integer', 0, 0),
+        MemberSpec_('fname', 'xs:string', 0, 0),
+        MemberSpec_('lname', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/reference_simpletype1_sup.py b/tests/reference_simpletype1_sup.py
index 849823adfcf3aeb327bfb20a723de97cd95a9b86..6b00823bfdb364811fda7c2bbd2d2e86baaa90b8 100644
--- a/tests/reference_simpletype1_sup.py
+++ b/tests/reference_simpletype1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,10 +666,10 @@ def _cast(typ, value):
 class dummy(GeneratedsSuper):
     """Comment describing your root element"""
     member_data_items_ = [
-        MemberSpec_('test_ref_attr', 'xs:integer', 0),
-        MemberSpec_('test_normal_attr', 'xs:integer', 0),
-        MemberSpec_('test_ref_element', 'xs:integer', 0),
-        MemberSpec_('test_normal_element', 'xs:integer', 0),
+        MemberSpec_('test_ref_attr', 'xs:integer', 0, 1),
+        MemberSpec_('test_normal_attr', 'xs:integer', 0, 1),
+        MemberSpec_('test_ref_element', 'xs:integer', 0, 0),
+        MemberSpec_('test_normal_element', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/rem_dup_elems1_sup.py b/tests/rem_dup_elems1_sup.py
index ee67fd213fd15f5b7eafdc09a58793b79da95739..3740da719fc5fe32da298e8c58f70a436d1e149a 100644
--- a/tests/rem_dup_elems1_sup.py
+++ b/tests/rem_dup_elems1_sup.py
@@ -631,10 +631,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -649,6 +650,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -663,8 +666,8 @@ def _cast(typ, value):
 
 class authorsType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('author', 'author', 1),
-        MemberSpec_('cooperation', 'xsd:string', 1),
+        MemberSpec_('author', 'author', 1, 1),
+        MemberSpec_('cooperation', 'xsd:string', 1, 1),
     ]
     subclass = None
     superclass = None
@@ -761,7 +764,7 @@ class authorsType(GeneratedsSuper):
 
 class author(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('description', 'xsd:string', 0),
+        MemberSpec_('description', 'xsd:string', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py
index 155013ff94b88b1c00a433885c7cf830bb413e91..1533d86af9247375d6aa4d01e1ba677f53de3b22 100644
--- a/tests/simplecontent_restriction1_sup.py
+++ b/tests/simplecontent_restriction1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,13 +665,13 @@ def _cast(typ, value):
 
 class IdentifierType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('schemeID', 'xsd:normalizedString', 0),
-        MemberSpec_('schemeName', 'xsd:string', 0),
-        MemberSpec_('schemeAgencyID', 'xsd:normalizedString', 0),
-        MemberSpec_('schemeAgencyName', 'xsd:string', 0),
-        MemberSpec_('schemeVersionID', 'xsd:normalizedString', 0),
-        MemberSpec_('schemeDataURI', 'xsd:anyURI', 0),
-        MemberSpec_('schemeURI', 'xsd:anyURI', 0),
+        MemberSpec_('schemeID', 'xsd:normalizedString', 0, 1),
+        MemberSpec_('schemeName', 'xsd:string', 0, 1),
+        MemberSpec_('schemeAgencyID', 'xsd:normalizedString', 0, 1),
+        MemberSpec_('schemeAgencyName', 'xsd:string', 0, 1),
+        MemberSpec_('schemeVersionID', 'xsd:normalizedString', 0, 1),
+        MemberSpec_('schemeDataURI', 'xsd:anyURI', 0, 1),
+        MemberSpec_('schemeURI', 'xsd:anyURI', 0, 1),
         MemberSpec_('valueOf_', 'xsd:normalizedString', 0),
     ]
     subclass = None
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index 75316542f57097044f726cedc393b76c55350029..1aa42644c94fb52f394ff08421ea4b8d0841198f 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,7 +665,7 @@ def _cast(typ, value):
 
 class SpecialDate(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('SpecialProperty', 'xs:string', 0),
+        MemberSpec_('SpecialProperty', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', 'xs:date', 0),
     ]
     subclass = None
@@ -737,7 +740,7 @@ class SpecialDate(GeneratedsSuper):
 
 class ExtremeDate(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('ExtremeProperty', 'xs:string', 0),
+        MemberSpec_('ExtremeProperty', 'xs:string', 0, 1),
         MemberSpec_('valueOf_', ['RelationType', 'RelationType2', 'RelationType3', 'xs:string'], 0),
     ]
     subclass = None
diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py
index 7efca4b554e8d8466c4b56fbf9b8056e34fe6e90..0c55d98700a4fa33ef8fff2298233c651324306d 100644
--- a/tests/simpletypes_other1_sup.py
+++ b/tests/simpletypes_other1_sup.py
@@ -630,10 +630,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -648,6 +649,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -662,7 +665,7 @@ def _cast(typ, value):
 
 class simpleTypeTestsType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('simpleTypeTest', 'simpleTypeTestDefs', 1),
+        MemberSpec_('simpleTypeTest', 'simpleTypeTestDefs', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -742,27 +745,27 @@ class simpleTypeTestsType(GeneratedsSuper):
 
 class simpleTypeTestDefs(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('datetime1', 'xs:gYear', 0),
-        MemberSpec_('datetime2', 'xs:gYearMonth', 0),
-        MemberSpec_('datetime3', 'xs:gMonth', 0),
-        MemberSpec_('datetime4', 'xs:gMonthDay', 0),
-        MemberSpec_('datetime5', 'xs:gDay', 0),
-        MemberSpec_('integerVal1', 'xs:integer', 0),
-        MemberSpec_('integerVal2', 'xs:integer', 1),
-        MemberSpec_('stringVal1', 'xs:string', 0),
-        MemberSpec_('stringVal2', 'xs:string', 1),
-        MemberSpec_('booleanVal1', 'xs:boolean', 0),
-        MemberSpec_('booleanVal2', 'xs:boolean', 1),
-        MemberSpec_('decimalVal1', 'xs:decimal', 0),
-        MemberSpec_('decimalVal2', 'xs:decimal', 1),
-        MemberSpec_('doubleVal1', 'xs:double', 0),
-        MemberSpec_('doubleVal2', 'xs:double', 1),
-        MemberSpec_('floatVal1', 'xs:float', 0),
-        MemberSpec_('floatVal2', 'xs:float', 1),
-        MemberSpec_('dateVal1', 'xs:date', 0),
-        MemberSpec_('dateVal2', 'xs:date', 1),
-        MemberSpec_('dateTimeVal1', 'xs:dateTime', 0),
-        MemberSpec_('dateTimeVal2', 'xs:dateTime', 1),
+        MemberSpec_('datetime1', 'xs:gYear', 0, 0),
+        MemberSpec_('datetime2', 'xs:gYearMonth', 0, 0),
+        MemberSpec_('datetime3', 'xs:gMonth', 0, 0),
+        MemberSpec_('datetime4', 'xs:gMonthDay', 0, 0),
+        MemberSpec_('datetime5', 'xs:gDay', 0, 0),
+        MemberSpec_('integerVal1', 'xs:integer', 0, 0),
+        MemberSpec_('integerVal2', 'xs:integer', 1, 1),
+        MemberSpec_('stringVal1', 'xs:string', 0, 0),
+        MemberSpec_('stringVal2', 'xs:string', 1, 1),
+        MemberSpec_('booleanVal1', 'xs:boolean', 0, 0),
+        MemberSpec_('booleanVal2', 'xs:boolean', 1, 1),
+        MemberSpec_('decimalVal1', 'xs:decimal', 0, 0),
+        MemberSpec_('decimalVal2', 'xs:decimal', 1, 1),
+        MemberSpec_('doubleVal1', 'xs:double', 0, 0),
+        MemberSpec_('doubleVal2', 'xs:double', 1, 1),
+        MemberSpec_('floatVal1', 'xs:float', 0, 0),
+        MemberSpec_('floatVal2', 'xs:float', 1, 1),
+        MemberSpec_('dateVal1', 'xs:date', 0, 0),
+        MemberSpec_('dateVal2', 'xs:date', 1, 1),
+        MemberSpec_('dateTimeVal1', 'xs:dateTime', 0, 0),
+        MemberSpec_('dateTimeVal2', 'xs:dateTime', 1, 1),
     ]
     subclass = None
     superclass = None
diff --git a/tests/test.py b/tests/test.py
index d76e2668b2f91ac259bce87fec57cb068a3e6a92..dea1aea507dd7513ca0795bbe727eee59db07af5 100755
--- a/tests/test.py
+++ b/tests/test.py
@@ -62,7 +62,7 @@ class GenTest(unittest.TestCase):
         self.compareFiles('out1_sup.py', 'out2_sup.py', ignore=())
         self.compareFiles('out1_sub.py', 'out2_sub.py')
         # cleanup generated files
-        #self.remove('out2_sup.py')
+        self.remove('out2_sup.py')
         self.remove('out2_sub.py')
 
     def test_003_element_groups(self):
@@ -276,7 +276,7 @@ class GenTest(unittest.TestCase):
         self.failUnlessEqual(content1, content2)
         # cleanup generated files
         self.remove('literal2.py')
-        #self.remove('out2_sup.py')
+        self.remove('out2_sup.py')
         self.remove('out2_sub.py')
 
     def test_010_simplecontent_restriction(self):
@@ -834,7 +834,8 @@ class GenTest(unittest.TestCase):
             self.fail("Files differed:\n{}".format(diffs))
 
     def remove(self, filename):
-        os.remove(filename)
+        if False:
+            os.remove(filename)
 
 
 # Make the test suite.
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index a91bf2159a7092e606515f019db4eeb21525af56..347dcdc86a8108578bd601d9ab42638be7bad203 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -632,10 +632,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -650,6 +651,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -664,12 +667,12 @@ def _cast(typ, value):
 
 class peopleType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('comments', 'commentsType', 1),
-        MemberSpec_('person', 'personType', 1),
-        MemberSpec_('specialperson', 'specialperson', 1),
-        MemberSpec_('programmer', 'programmerType', 1),
-        MemberSpec_('python_programmer', 'python-programmerType', 1),
-        MemberSpec_('java_programmer', 'java-programmerType', 1),
+        MemberSpec_('comments', 'commentsType', 1, 0),
+        MemberSpec_('person', 'personType', 1, 0),
+        MemberSpec_('specialperson', 'specialperson', 1, 0),
+        MemberSpec_('programmer', 'programmerType', 1, 0),
+        MemberSpec_('python_programmer', 'python-programmerType', 1, 0),
+        MemberSpec_('java_programmer', 'java-programmerType', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -819,8 +822,8 @@ class peopleType(GeneratedsSuper):
 
 class commentsType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('emp', 'xs:string', 1),
-        MemberSpec_('bold', 'xs:string', 1),
+        MemberSpec_('emp', 'xs:string', 1, 0),
+        MemberSpec_('bold', 'xs:string', 1, 0),
         MemberSpec_('valueOf_', [], 0),
     ]
     subclass = None
@@ -921,19 +924,19 @@ class commentsType(GeneratedsSuper):
 
 class personType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('value', 'xs:string', 0),
-        MemberSpec_('id', 'xs:integer', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('interest', 'xs:string', 1),
-        MemberSpec_('category', 'xs:integer', 0),
-        MemberSpec_('hot_agent', 'hot.agent', 0),
-        MemberSpec_('agent', 'agentType', 1),
-        MemberSpec_('promoter', 'boosterType', 1),
-        MemberSpec_('description', 'xs:string', 0),
-        MemberSpec_('range_', ['RangeType', 'xs:integer'], 0),
+        MemberSpec_('value', 'xs:string', 0, 1),
+        MemberSpec_('id', 'xs:integer', 0, 1),
+        MemberSpec_('ratio', 'xs:float', 0, 1),
+        MemberSpec_('fruit', 'xs:string', 0, 1),
+        MemberSpec_('vegetable', 'xs:string', 0, 1),
+        MemberSpec_('name', 'xs:string', 0, 0),
+        MemberSpec_('interest', 'xs:string', 1, 0),
+        MemberSpec_('category', 'xs:integer', 0, 0),
+        MemberSpec_('hot_agent', 'hot.agent', 0, 0),
+        MemberSpec_('agent', 'agentType', 1, 0),
+        MemberSpec_('promoter', 'boosterType', 1, 0),
+        MemberSpec_('description', 'xs:string', 0, 0),
+        MemberSpec_('range_', ['RangeType', 'xs:integer'], 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1206,25 +1209,25 @@ class specialperson(personType):
 
 class programmerType(personType):
     member_data_items_ = [
-        MemberSpec_('language', 'xs:string', 0),
-        MemberSpec_('area', 'xs:string', 0),
-        MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0),
-        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('email', 'xs:string', 0),
-        MemberSpec_('elposint', 'xs:positiveInteger', 0),
-        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0),
-        MemberSpec_('elnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('eldate', 'xs:date', 0),
-        MemberSpec_('eldatetime', 'xs:dateTime', 0),
-        MemberSpec_('eldatetime1', 'xs:dateTime', 0),
-        MemberSpec_('eltoken', 'xs:token', 0),
-        MemberSpec_('elshort', 'xs:short', 0),
-        MemberSpec_('ellong', 'xs:long', 0),
-        MemberSpec_('elparam', 'paramType', 0),
-        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0),
+        MemberSpec_('language', 'xs:string', 0, 1),
+        MemberSpec_('area', 'xs:string', 0, 1),
+        MemberSpec_('attrposint', 'xs:positiveInteger', 0, 1),
+        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0, 1),
+        MemberSpec_('attrnegint', 'xs:negativeInteger', 0, 1),
+        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0, 1),
+        MemberSpec_('email', 'xs:string', 0, 0),
+        MemberSpec_('elposint', 'xs:positiveInteger', 0, 0),
+        MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0, 0),
+        MemberSpec_('elnegint', 'xs:negativeInteger', 0, 0),
+        MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0, 0),
+        MemberSpec_('eldate', 'xs:date', 0, 0),
+        MemberSpec_('eldatetime', 'xs:dateTime', 0, 0),
+        MemberSpec_('eldatetime1', 'xs:dateTime', 0, 0),
+        MemberSpec_('eltoken', 'xs:token', 0, 0),
+        MemberSpec_('elshort', 'xs:short', 0, 0),
+        MemberSpec_('ellong', 'xs:long', 0, 0),
+        MemberSpec_('elparam', 'paramType', 0, 0),
+        MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0, 0),
     ]
     subclass = None
     superclass = personType
@@ -1560,12 +1563,12 @@ class programmerType(personType):
 
 class paramType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('id', 'xs:string', 0),
-        MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('sid', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 0),
-        MemberSpec_('semantic', 'xs:token', 0),
-        MemberSpec_('type', 'xs:NMTOKEN', 0),
+        MemberSpec_('id', 'xs:string', 0, 1),
+        MemberSpec_('name', 'xs:NCName', 0, 1),
+        MemberSpec_('sid', 'xs:NCName', 0, 1),
+        MemberSpec_('flow', 'FlowType', 0, 1),
+        MemberSpec_('semantic', 'xs:token', 0, 1),
+        MemberSpec_('type', 'xs:NMTOKEN', 0, 0),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
@@ -1682,12 +1685,12 @@ class paramType(GeneratedsSuper):
 
 class python_programmerType(programmerType):
     member_data_items_ = [
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('drcs_attr', 'xs:string', 0),
-        MemberSpec_('gui_developer', 'xs:boolean', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
-        MemberSpec_('flowvalue', ['FlowType', 'xs:integer'], 0),
-        MemberSpec_('drcs', 'xs:string', 0),
+        MemberSpec_('nick-name', 'xs:string', 0, 1),
+        MemberSpec_('drcs_attr', 'xs:string', 0, 1),
+        MemberSpec_('gui_developer', 'xs:boolean', 0, 1),
+        MemberSpec_('favorite_editor', 'xs:string', 0, 0),
+        MemberSpec_('flowvalue', ['FlowType', 'xs:integer'], 0, 0),
+        MemberSpec_('drcs', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = programmerType
@@ -1809,14 +1812,14 @@ class python_programmerType(programmerType):
 
 class java_programmerType(programmerType):
     member_data_items_ = [
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('status', 'xs:string', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
-        MemberSpec_('datetime1', 'xs:gYear', 0),
-        MemberSpec_('datetime2', 'xs:gYearMonth', 0),
-        MemberSpec_('datetime3', 'xs:gMonth', 0),
-        MemberSpec_('datetime4', 'xs:gMonthDay', 0),
-        MemberSpec_('datetime5', 'xs:gDay', 0),
+        MemberSpec_('nick-name', 'xs:string', 0, 1),
+        MemberSpec_('status', 'xs:string', 0, 1),
+        MemberSpec_('favorite_editor', 'xs:string', 0, 0),
+        MemberSpec_('datetime1', 'xs:gYear', 0, 0),
+        MemberSpec_('datetime2', 'xs:gYearMonth', 0, 0),
+        MemberSpec_('datetime3', 'xs:gMonth', 0, 0),
+        MemberSpec_('datetime4', 'xs:gMonthDay', 0, 0),
+        MemberSpec_('datetime5', 'xs:gDay', 0, 0),
     ]
     subclass = None
     superclass = programmerType
@@ -1946,11 +1949,11 @@ class java_programmerType(programmerType):
 
 class agentType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'infoType', 0),
-        MemberSpec_('vehicle', 'vehicleType', 1),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'infoType', 0, 0),
+        MemberSpec_('vehicle', 'vehicleType', 1, 1),
     ]
     subclass = None
     superclass = None
@@ -2073,10 +2076,10 @@ 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_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'infoType', 0),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'infoType', 0, 0),
     ]
     subclass = None
     superclass = agentType
@@ -2173,10 +2176,10 @@ 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_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('info', 'infoType', 0),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('info', 'infoType', 0, 0),
     ]
     subclass = None
     superclass = agentType
@@ -2271,14 +2274,14 @@ class weird_agentType(agentType):
 
 class boosterType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('member-id', 'xs:string', 0),
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('other_name', 'xs:float', 0),
-        MemberSpec_('class_', 'xs:float', 0),
-        MemberSpec_('other_value', 'xs:float', 1),
-        MemberSpec_('type_', 'xs:float', 1),
-        MemberSpec_('client_handler', 'client-handlerType', 1),
+        MemberSpec_('member-id', 'xs:string', 0, 1),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('other_name', 'xs:float', 0, 0),
+        MemberSpec_('class_', 'xs:float', 0, 0),
+        MemberSpec_('other_value', 'xs:float', 1, 0),
+        MemberSpec_('type_', 'xs:float', 1, 0),
+        MemberSpec_('client_handler', 'client-handlerType', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -2441,9 +2444,9 @@ class boosterType(GeneratedsSuper):
 
 class infoType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('type', 'xs:integer', 0),
-        MemberSpec_('rating', 'xs:float', 0),
+        MemberSpec_('name', 'xs:string', 0, 1),
+        MemberSpec_('type', 'xs:integer', 0, 1),
+        MemberSpec_('rating', 'xs:float', 0, 1),
     ]
     subclass = None
     superclass = None
@@ -2523,7 +2526,7 @@ class infoType(GeneratedsSuper):
 
 class vehicleType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('wheelcount', 'xs:integer', 0),
+        MemberSpec_('wheelcount', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -2592,7 +2595,7 @@ class vehicleType(GeneratedsSuper):
 
 class automobile(vehicleType):
     member_data_items_ = [
-        MemberSpec_('drivername', 'xs:string', 0),
+        MemberSpec_('drivername', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = vehicleType
@@ -2649,7 +2652,7 @@ class automobile(vehicleType):
 
 class airplane(vehicleType):
     member_data_items_ = [
-        MemberSpec_('pilotname', 'xs:string', 0),
+        MemberSpec_('pilotname', 'xs:string', 0, 0),
     ]
     subclass = None
     superclass = vehicleType
@@ -2706,10 +2709,10 @@ class airplane(vehicleType):
 
 class hot_agent(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('firstname', 'xs:string', 0),
-        MemberSpec_('lastname', 'xs:string', 0),
-        MemberSpec_('priority', 'xs:float', 0),
-        MemberSpec_('startDate', 'xs:date', 0),
+        MemberSpec_('firstname', 'xs:string', 0, 0),
+        MemberSpec_('lastname', 'xs:string', 0, 0),
+        MemberSpec_('priority', 'xs:float', 0, 0),
+        MemberSpec_('startDate', 'xs:date', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -2813,8 +2816,8 @@ class hot_agent(GeneratedsSuper):
 
 class client_handlerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('fullname', 'xs:string', 0),
-        MemberSpec_('refid', 'xs:integer', 0),
+        MemberSpec_('fullname', 'xs:string', 0, 0),
+        MemberSpec_('refid', 'xs:integer', 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py
index 7e215572433878292263f8af306afdb34f9297e1..bef973b3a41c570091e6f53aea60261ea4194bc7 100644
--- a/tests/validate_simpletypes1_sup.py
+++ b/tests/validate_simpletypes1_sup.py
@@ -629,10 +629,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -647,6 +648,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -661,11 +664,11 @@ def _cast(typ, value):
 
 class containerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('sample1', 'simpleOneType', 1),
-        MemberSpec_('sample2_bad', 'simpleOneType', 1),
-        MemberSpec_('sample3_bad', 'simpleOneType', 1),
-        MemberSpec_('sample4_bad', 'simpleOneType', 1),
-        MemberSpec_('sample2', 'simpleTwoType', 1),
+        MemberSpec_('sample1', 'simpleOneType', 1, 0),
+        MemberSpec_('sample2_bad', 'simpleOneType', 1, 0),
+        MemberSpec_('sample3_bad', 'simpleOneType', 1, 0),
+        MemberSpec_('sample4_bad', 'simpleOneType', 1, 0),
+        MemberSpec_('sample2', 'simpleTwoType', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -813,30 +816,30 @@ class containerType(GeneratedsSuper):
 
 class simpleOneType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('integer_range_1_value', ['integer_range_1_st', 'integer_range_2_st', 'xs:integer'], 0),
-        MemberSpec_('pattern_value', ['pattern_st', 'pattern_1_st', 'min_length_st', 'xs:string'], 0),
-        MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0),
-        MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0),
-        MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0),
-        MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0),
-        MemberSpec_('length_value', ['length_st', 'xs:string'], 0),
-        MemberSpec_('totalDigits_value', ['totalDigits_st', 'xs:decimal'], 0),
-        MemberSpec_('date_minincl_value', ['date_minincl_st', 'xs:date'], 0),
-        MemberSpec_('date_maxincl_value', ['date_maxincl_st', 'xs:date'], 0),
-        MemberSpec_('date_minexcl_value', ['date_minexcl_st', 'xs:date'], 0),
-        MemberSpec_('date_maxexcl_value', ['date_maxexcl_st', 'xs:date'], 0),
-        MemberSpec_('time_minincl_value', ['time_minincl_st', 'xs:time'], 0),
-        MemberSpec_('time_maxincl_value', ['time_maxincl_st', 'xs:time'], 0),
-        MemberSpec_('time_minexcl_value', ['time_minexcl_st', 'xs:time'], 0),
-        MemberSpec_('time_maxexcl_value', ['time_maxexcl_st', 'xs:time'], 0),
-        MemberSpec_('datetime_minincl_value', ['datetime_minincl_st', 'xs:dateTime'], 0),
-        MemberSpec_('datetime_maxincl_value', ['datetime_maxincl_st', 'xs:dateTime'], 0),
-        MemberSpec_('datetime_minexcl_value', ['datetime_minexcl_st', 'xs:dateTime'], 0),
-        MemberSpec_('datetime_maxexcl_value', ['datetime_maxexcl_st', 'xs:dateTime'], 0),
-        MemberSpec_('vbar_pattern_value', ['vbar_pattern_st', 'xs:string'], 0),
-        MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0),
-        MemberSpec_('primative_integer', 'xs:integer', 0),
-        MemberSpec_('primative_float', 'xs:float', 0),
+        MemberSpec_('integer_range_1_value', ['integer_range_1_st', 'integer_range_2_st', 'xs:integer'], 0, 0),
+        MemberSpec_('pattern_value', ['pattern_st', 'pattern_1_st', 'min_length_st', 'xs:string'], 0, 0),
+        MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0, 0),
+        MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0, 0),
+        MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0, 0),
+        MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0, 0),
+        MemberSpec_('length_value', ['length_st', 'xs:string'], 0, 0),
+        MemberSpec_('totalDigits_value', ['totalDigits_st', 'xs:decimal'], 0, 0),
+        MemberSpec_('date_minincl_value', ['date_minincl_st', 'xs:date'], 0, 0),
+        MemberSpec_('date_maxincl_value', ['date_maxincl_st', 'xs:date'], 0, 0),
+        MemberSpec_('date_minexcl_value', ['date_minexcl_st', 'xs:date'], 0, 0),
+        MemberSpec_('date_maxexcl_value', ['date_maxexcl_st', 'xs:date'], 0, 0),
+        MemberSpec_('time_minincl_value', ['time_minincl_st', 'xs:time'], 0, 0),
+        MemberSpec_('time_maxincl_value', ['time_maxincl_st', 'xs:time'], 0, 0),
+        MemberSpec_('time_minexcl_value', ['time_minexcl_st', 'xs:time'], 0, 0),
+        MemberSpec_('time_maxexcl_value', ['time_maxexcl_st', 'xs:time'], 0, 0),
+        MemberSpec_('datetime_minincl_value', ['datetime_minincl_st', 'xs:dateTime'], 0, 0),
+        MemberSpec_('datetime_maxincl_value', ['datetime_maxincl_st', 'xs:dateTime'], 0, 0),
+        MemberSpec_('datetime_minexcl_value', ['datetime_minexcl_st', 'xs:dateTime'], 0, 0),
+        MemberSpec_('datetime_maxexcl_value', ['datetime_maxexcl_st', 'xs:dateTime'], 0, 0),
+        MemberSpec_('vbar_pattern_value', ['vbar_pattern_st', 'xs:string'], 0, 0),
+        MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0, 0),
+        MemberSpec_('primative_integer', 'xs:integer', 0, 0),
+        MemberSpec_('primative_float', 'xs:float', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1426,7 +1429,7 @@ class simpleOneType(GeneratedsSuper):
 
 class simpleTwoType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0),
+        MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1500,7 +1503,7 @@ class simpleTwoType(GeneratedsSuper):
 
 class simpleTwoElementOneType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0),
+        MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt
index 0c0f47550ee76946f473860303d774cd86e24ec8..ff179792e61beeab9b8c8977b9c7897b1ad4064b 100644
--- a/tests/validate_simpletypes1_warnings.txt
+++ b/tests/validate_simpletypes1_warnings.txt
@@ -1,60 +1,60 @@
-tests/validate_simpletypes2_sup.py:990: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:993: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1000: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1003: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1013: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
+tests/validate_simpletypes2_sup.py:1016: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
   warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1020: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:1023: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1025: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
+tests/validate_simpletypes2_sup.py:1028: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1034: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:1037: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1039: UserWarning: Value "012345" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:1042: UserWarning: Value "012345" does not match xsd length restriction on length_st
   warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1116: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:1119: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1110: UserWarning: Value "efgh" does not match xsd pattern restrictions: [['^abcd$|^ef\\|gh$']]
+tests/validate_simpletypes2_sup.py:1113: UserWarning: Value "efgh" does not match xsd pattern restrictions: [['^abcd$|^ef\\|gh$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_vbar_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:992: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:995: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1000: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1003: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1018: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:1021: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1032: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:1035: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
   warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1039: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:1042: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
   warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1049: UserWarning: Value "2015-05-01" does not match xsd minInclusive restriction on date_minincl_st
+tests/validate_simpletypes2_sup.py:1052: UserWarning: Value "2015-05-01" does not match xsd minInclusive restriction on date_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1054: UserWarning: Value "2015-11-01" does not match xsd maxInclusive restriction on date_maxincl_st
+tests/validate_simpletypes2_sup.py:1057: UserWarning: Value "2015-11-01" does not match xsd maxInclusive restriction on date_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1059: UserWarning: Value "2015-05-01" does not match xsd minExclusive restriction on date_minexcl_st
+tests/validate_simpletypes2_sup.py:1062: UserWarning: Value "2015-05-01" does not match xsd minExclusive restriction on date_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1064: UserWarning: Value "2015-11-01" does not match xsd maxExclusive restriction on date_maxexcl_st
+tests/validate_simpletypes2_sup.py:1067: UserWarning: Value "2015-11-01" does not match xsd maxExclusive restriction on date_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1069: UserWarning: Value "13:30:00" does not match xsd minInclusive restriction on time_minincl_st
+tests/validate_simpletypes2_sup.py:1072: UserWarning: Value "13:30:00" does not match xsd minInclusive restriction on time_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1074: UserWarning: Value "17:00:00" does not match xsd maxInclusive restriction on time_maxincl_st
+tests/validate_simpletypes2_sup.py:1077: UserWarning: Value "17:00:00" does not match xsd maxInclusive restriction on time_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1079: UserWarning: Value "13:30:00" does not match xsd minExclusive restriction on time_minexcl_st
+tests/validate_simpletypes2_sup.py:1082: UserWarning: Value "13:30:00" does not match xsd minExclusive restriction on time_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1084: UserWarning: Value "17:00:00" does not match xsd maxExclusive restriction on time_maxexcl_st
+tests/validate_simpletypes2_sup.py:1087: UserWarning: Value "17:00:00" does not match xsd maxExclusive restriction on time_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1089: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minInclusive restriction on datetime_minincl_st
+tests/validate_simpletypes2_sup.py:1092: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minInclusive restriction on datetime_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1094: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxInclusive restriction on datetime_maxincl_st
+tests/validate_simpletypes2_sup.py:1097: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxInclusive restriction on datetime_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1099: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minExclusive restriction on datetime_minexcl_st
+tests/validate_simpletypes2_sup.py:1102: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minExclusive restriction on datetime_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1104: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxExclusive restriction on datetime_maxexcl_st
+tests/validate_simpletypes2_sup.py:1107: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxExclusive restriction on datetime_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1118: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:1121: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:997: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st
+tests/validate_simpletypes2_sup.py:1000: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1000: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1003: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1530: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
+tests/validate_simpletypes2_sup.py:1533: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py
index 7e215572433878292263f8af306afdb34f9297e1..bef973b3a41c570091e6f53aea60261ea4194bc7 100644
--- a/tests/validate_simpletypes2_sup.py
+++ b/tests/validate_simpletypes2_sup.py
@@ -629,10 +629,11 @@ class MixedContainer:
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, optional=0):
         self.name = name
         self.data_type = data_type
         self.container = container
+        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
@@ -647,6 +648,8 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_optional(self, optional): self.optional = optional
+    def get_optional(self): return self.optional
 
 
 def _cast(typ, value):
@@ -661,11 +664,11 @@ def _cast(typ, value):
 
 class containerType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('sample1', 'simpleOneType', 1),
-        MemberSpec_('sample2_bad', 'simpleOneType', 1),
-        MemberSpec_('sample3_bad', 'simpleOneType', 1),
-        MemberSpec_('sample4_bad', 'simpleOneType', 1),
-        MemberSpec_('sample2', 'simpleTwoType', 1),
+        MemberSpec_('sample1', 'simpleOneType', 1, 0),
+        MemberSpec_('sample2_bad', 'simpleOneType', 1, 0),
+        MemberSpec_('sample3_bad', 'simpleOneType', 1, 0),
+        MemberSpec_('sample4_bad', 'simpleOneType', 1, 0),
+        MemberSpec_('sample2', 'simpleTwoType', 1, 0),
     ]
     subclass = None
     superclass = None
@@ -813,30 +816,30 @@ class containerType(GeneratedsSuper):
 
 class simpleOneType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('integer_range_1_value', ['integer_range_1_st', 'integer_range_2_st', 'xs:integer'], 0),
-        MemberSpec_('pattern_value', ['pattern_st', 'pattern_1_st', 'min_length_st', 'xs:string'], 0),
-        MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0),
-        MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0),
-        MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0),
-        MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0),
-        MemberSpec_('length_value', ['length_st', 'xs:string'], 0),
-        MemberSpec_('totalDigits_value', ['totalDigits_st', 'xs:decimal'], 0),
-        MemberSpec_('date_minincl_value', ['date_minincl_st', 'xs:date'], 0),
-        MemberSpec_('date_maxincl_value', ['date_maxincl_st', 'xs:date'], 0),
-        MemberSpec_('date_minexcl_value', ['date_minexcl_st', 'xs:date'], 0),
-        MemberSpec_('date_maxexcl_value', ['date_maxexcl_st', 'xs:date'], 0),
-        MemberSpec_('time_minincl_value', ['time_minincl_st', 'xs:time'], 0),
-        MemberSpec_('time_maxincl_value', ['time_maxincl_st', 'xs:time'], 0),
-        MemberSpec_('time_minexcl_value', ['time_minexcl_st', 'xs:time'], 0),
-        MemberSpec_('time_maxexcl_value', ['time_maxexcl_st', 'xs:time'], 0),
-        MemberSpec_('datetime_minincl_value', ['datetime_minincl_st', 'xs:dateTime'], 0),
-        MemberSpec_('datetime_maxincl_value', ['datetime_maxincl_st', 'xs:dateTime'], 0),
-        MemberSpec_('datetime_minexcl_value', ['datetime_minexcl_st', 'xs:dateTime'], 0),
-        MemberSpec_('datetime_maxexcl_value', ['datetime_maxexcl_st', 'xs:dateTime'], 0),
-        MemberSpec_('vbar_pattern_value', ['vbar_pattern_st', 'xs:string'], 0),
-        MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0),
-        MemberSpec_('primative_integer', 'xs:integer', 0),
-        MemberSpec_('primative_float', 'xs:float', 0),
+        MemberSpec_('integer_range_1_value', ['integer_range_1_st', 'integer_range_2_st', 'xs:integer'], 0, 0),
+        MemberSpec_('pattern_value', ['pattern_st', 'pattern_1_st', 'min_length_st', 'xs:string'], 0, 0),
+        MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0, 0),
+        MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0, 0),
+        MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0, 0),
+        MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0, 0),
+        MemberSpec_('length_value', ['length_st', 'xs:string'], 0, 0),
+        MemberSpec_('totalDigits_value', ['totalDigits_st', 'xs:decimal'], 0, 0),
+        MemberSpec_('date_minincl_value', ['date_minincl_st', 'xs:date'], 0, 0),
+        MemberSpec_('date_maxincl_value', ['date_maxincl_st', 'xs:date'], 0, 0),
+        MemberSpec_('date_minexcl_value', ['date_minexcl_st', 'xs:date'], 0, 0),
+        MemberSpec_('date_maxexcl_value', ['date_maxexcl_st', 'xs:date'], 0, 0),
+        MemberSpec_('time_minincl_value', ['time_minincl_st', 'xs:time'], 0, 0),
+        MemberSpec_('time_maxincl_value', ['time_maxincl_st', 'xs:time'], 0, 0),
+        MemberSpec_('time_minexcl_value', ['time_minexcl_st', 'xs:time'], 0, 0),
+        MemberSpec_('time_maxexcl_value', ['time_maxexcl_st', 'xs:time'], 0, 0),
+        MemberSpec_('datetime_minincl_value', ['datetime_minincl_st', 'xs:dateTime'], 0, 0),
+        MemberSpec_('datetime_maxincl_value', ['datetime_maxincl_st', 'xs:dateTime'], 0, 0),
+        MemberSpec_('datetime_minexcl_value', ['datetime_minexcl_st', 'xs:dateTime'], 0, 0),
+        MemberSpec_('datetime_maxexcl_value', ['datetime_maxexcl_st', 'xs:dateTime'], 0, 0),
+        MemberSpec_('vbar_pattern_value', ['vbar_pattern_st', 'xs:string'], 0, 0),
+        MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0, 0),
+        MemberSpec_('primative_integer', 'xs:integer', 0, 0),
+        MemberSpec_('primative_float', 'xs:float', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1426,7 +1429,7 @@ class simpleOneType(GeneratedsSuper):
 
 class simpleTwoType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0),
+        MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0, 0),
     ]
     subclass = None
     superclass = None
@@ -1500,7 +1503,7 @@ class simpleTwoType(GeneratedsSuper):
 
 class simpleTwoElementOneType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0),
+        MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0, 0),
     ]
     subclass = None
     superclass = None
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index 546272d9f1355466fa30086c0f194d05a1f5468d..fc814ab5c9dff342cf0cce1a64e8c5fd1f50a8ff 100644
--- a/tutorial/generateds_tutorial.html
+++ b/tutorial/generateds_tutorial.html
@@ -219,7 +219,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24c</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.25a</td>
 </tr>
 </tbody>
 </table>
@@ -228,7 +228,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">March 01, 2017</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 21, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -1210,7 +1210,7 @@ named <tt class="docutils literal">garden_api.py</tt>, you can create an instanc
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateds_tutorial.txt">View document source</a>.
-Generated on: 2017-03-01 22:05 UTC.
+Generated on: 2017-03-21 19:50 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index d975b6adbb60f6670fd0af05fb5ff19fa89ff7f3..579236f1d1f31e314748d96700d734c61df1dcf9 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.24c
+:revision: 2.25a
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index e016af18c91626367e07b8bafd18518d7e037bfd..d8a4a2e108e95ab0d368063584e83ff7d400323a 100644
Binary files a/tutorial/generateds_tutorial.zip and b/tutorial/generateds_tutorial.zip differ