From 84b3dd11649619e9df9aad8f75a66583bba2278c Mon Sep 17 00:00:00 2001
From: Alim Gokkaya <alim.gokkaya@gmail.com>
Date: Thu, 16 Mar 2017 18:15:20 +0300
Subject: [PATCH] Merge branch 'branches/default' of
 hg::https://alimg@bitbucket.org/dkuhlman/generateds

# Conflicts:
#	generateDS.py
* * *
Merge local changes
---
 .hgignore                                     |    1 +
 Demos/People/run_test                         |    2 +-
 Docs/objectify_notes.html                     |  858 ++++
 Docs/objectify_notes.txt                      |  633 +++
 MANIFEST.in                                   |   44 +-
 README                                        |  499 ++-
 build_dist                                    |   15 +
 django/gends_extract_simple_types.py          |   61 +-
 django/gends_generate_django.py               |   42 +-
 django/gends_run_gen_django.py                |   41 +-
 django/generatedssuper.py                     |   31 +-
 fix_subclass_refs.py                          |   89 +
 generateDS.html                               |  840 +++-
 generateDS.py                                 | 3206 +++++++++-----
 generateDS.txt                                |  571 ++-
 generateds_config.py                          |    4 +
 generateds_gui_notes.html                     |  409 ++
 generateds_gui_notes.txt                      |  188 +
 gui/README.txt                                |   74 +
 gui/en.dictionary                             |    0
 gui/forGUI.xsd                                |  287 ++
 gui/forgui.py                                 | 3911 +++++++++++++++++
 gui/generateds_gui.glade                      | 2552 ++++++-----
 gui/generateds_gui.py                         | 2995 ++++++++-----
 gui/generateds_gui_rus.glade                  | 1691 +++++++
 gui/generateds_gui_session.py                 | 1070 +++--
 gui/generateds_gui_session.xsd                |    6 +
 gui/run_generate_session                      |    5 +
 gui/rus.dictionary                            |  108 +
 libgenerateDS/gui/generateds_gui.py           | 2159 +--------
 libgenerateDS/gui/generateds_gui_session.py   |  863 +---
 librarytemplate-1.0a.zip                      |  Bin 13398 -> 13459 bytes
 librarytemplate_howto.html                    |   22 +-
 librarytemplate_howto.txt                     |   12 +-
 process_includes.py                           |  221 +-
 setup.py                                      |   21 +-
 tests/OnePer/compare                          |    7 +
 tests/OnePer/copy                             |    6 +
 .../oneperType00_2One.py}                     |  389 +-
 .../oneperType01_2One.py}                     |  578 +--
 tests/OnePer/oneperType02_2One.py             |  954 ++++
 tests/OnePer/oneperType03_2One.py             |  953 ++++
 tests/abstract_type1_sub.py                   |  103 +-
 tests/abstract_type1_sup.py                   |  372 +-
 tests/abstract_type2_sub.py                   |  217 -
 tests/address.xsd                             |   56 +
 tests/annotations1_sub.py                     |  103 +-
 tests/annotations1_sup.py                     |  360 +-
 tests/annotations2_sub.py                     |  210 -
 tests/anonymous_type.xsd                      |    6 +
 tests/anonymous_type1_sub.py                  |   97 +-
 tests/anonymous_type1_sup.py                  |  401 +-
 tests/anysimpletype1_sub.py                   |   97 +-
 tests/anysimpletype1_sup.py                   |  316 +-
 tests/anywildcard.xsd                         |    2 +
 tests/anywildcard1_sub.py                     |   97 +-
 tests/anywildcard1_sup.py                     |  445 +-
 tests/anywildcard2_sub.py                     |  231 -
 tests/attr_groups.xsd                         |    7 +
 tests/attr_groups1_sub.py                     |  107 +-
 tests/attr_groups1_sup.py                     |  436 +-
 tests/attr_groups2_sub.py                     |  196 -
 tests/catalog.xml                             |    4 +
 tests/catalogtest.xsd                         |    8 +
 tests/catalogtest1_sub.py                     |  167 +
 tests/catalogtest1_sup.py                     |  791 ++++
 tests/cdata.xsd                               |   20 +
 tests/cdata1.xml                              |    8 +
 tests/cdata1_sub.py                           |  181 +
 .../{abstract_type2_sup.py => cdata1_sup.py}  |  579 +--
 tests/check_results.rb                        |   95 +
 tests/cleanupname.xsd                         |   48 +
 tests/cleanupname1_sub.py                     |  209 +
 ...nywildcard2_sup.py => cleanupname1_sup.py} |  857 ++--
 tests/compare_sub                             |    3 +
 tests/compare_sup                             |    3 +
 tests/copy_all                                |   59 +
 tests/copy_both                               |    3 +
 tests/defaults_cases.xml                      |   31 +
 tests/defaults_cases.xsd                      |   97 +
 tests/defaults_cases1_out.xml                 |   16 +
 tests/defaults_cases1_sub.py                  |  186 +
 tests/defaults_cases1_sup.py                  | 1182 +++++
 tests/defaults_coverage.xsd                   |   78 +
 tests/defaults_coverage1_sub.py               |  187 +
 tests/defaults_coverage1_sup.py               | 1545 +++++++
 tests/extensions.xsd                          |    8 +-
 tests/extensions1_sub.py                      |  103 +-
 tests/extensions1_sup.py                      |  725 +--
 tests/gds_inner_name_map.py                   |    7 +
 tests/ipo1_out.xml                            |    9 +-
 tests/ipo1_sub.py                             |  120 +-
 tests/ipo1_sup.py                             |  948 ++--
 tests/ipo2_out.xml                            |   26 -
 tests/ipo2_sub.py                             |  120 +-
 tests/ipo2_sup.py                             |  948 ++--
 tests/literal1.py                             |   42 +-
 tests/mapcleanname.xsd                        |   74 +
 tests/mapcleanname1_sub.py                    |  215 +
 tests/mapcleanname1_sup.py                    | 1635 +++++++
 tests/nested_def.xml                          |    9 +
 tests/nested_def.xsd                          |   38 +
 tests/nested_def1_out.xml                     |    9 +
 tests/nested_def1_sub.py                      |  200 +
 tests/nested_def1_sup.py                      | 1193 +++++
 tests/oneper00.xsd                            |   18 +
 tests/oneper01.xsd                            |   21 +
 tests/oneper02.xsd                            |   21 +
 tests/oneper03.xsd                            |   26 +
 tests/out1_sub.py                             |  121 +-
 tests/out1_sup.py                             |  965 ++--
 tests/out2_sub.py                             |  273 --
 tests/people_procincl1_sub.py                 |  125 +-
 tests/people_procincl1_sup.py                 | 1435 +++---
 tests/people_procincl2_sub.py                 |  301 --
 tests/people_procincl2_sup.py                 | 3223 --------------
 tests/people_procincl_a.xsd                   |    2 +-
 tests/prefix_classname.xml                    |  118 +
 tests/prefix_classname.xsd                    |  203 +
 tests/prefix_classname1_out.xml               |   91 +
 tests/prefix_classname1_sub.py                |  250 ++
 .../{out2_sup.py => prefix_classname1_sup.py} | 2116 +++------
 tests/recursive_simpletype1_sub.py            |  103 +-
 tests/recursive_simpletype1_sup.py            |  294 +-
 tests/reference_simpletype.xsd                |   20 +
 ...e2_sub.py => reference_simpletype1_sub.py} |  129 +-
 ...s2_sup.py => reference_simpletype1_sup.py} |  512 +--
 tests/rem_dup_elems.xml                       |   18 +
 tests/rem_dup_elems.xsd                       |   22 +
 tests/rem_dup_elems1_out.xml                  |   18 +
 tests/rem_dup_elems1_sub.py                   |  181 +
 tests/rem_dup_elems1_sup.py                   |  965 ++++
 tests/simplecontent_restriction1_sub.py       |  109 +-
 tests/simplecontent_restriction1_sup.py       |  447 +-
 tests/simpletype_memberspecs1_sub.py          |   97 +-
 tests/simpletype_memberspecs1_sup.py          |  321 +-
 tests/simpletypes_other.xml                   |   15 +
 tests/simpletypes_other.xsd                   |    8 +-
 ...ther2_sub.py => simpletypes_other1_sub.py} |  111 +-
 tests/simpletypes_other1_sup.py               |  513 +--
 tests/simpletypes_other2_sup.py               | 1338 ------
 tests/test.py                                 |  682 ++-
 tests/to_etree.xsd                            |    1 -
 tests/to_etree1.xml                           |   18 +-
 tests/to_etree1_sub.py                        |  133 +-
 tests/to_etree1_sup.py                        |  892 ++--
 tests/validate_simpletypes.xml                |   84 +
 tests/validate_simpletypes.xsd                |  217 +
 tests/validate_simpletypes1_out.xml           |   72 +
 tests/validate_simpletypes1_sub.py            |  193 +
 tests/validate_simpletypes1_sup.py            | 1723 ++++++++
 tests/validate_simpletypes1_warnings.txt      |   60 +
 tests/validate_simpletypes2_sub.py            |  193 +
 tests/validate_simpletypes2_sup.py            | 1723 ++++++++
 tutorial/generateds_tutorial.html             |   20 +-
 tutorial/generateds_tutorial.txt              |    6 +-
 tutorial/generateds_tutorial.zip              |  Bin 48722 -> 48767 bytes
 tutorial/generateds_tutoriala.txt             |    4 +-
 updateversion.py                              |  139 +
 upload_pypi                                   |    4 +
 160 files changed, 41614 insertions(+), 22143 deletions(-)
 create mode 100644 .hgignore
 create mode 100644 Docs/objectify_notes.html
 create mode 100644 Docs/objectify_notes.txt
 create mode 100755 build_dist
 create mode 100755 fix_subclass_refs.py
 create mode 100644 generateds_config.py
 create mode 100644 generateds_gui_notes.html
 create mode 100644 generateds_gui_notes.txt
 create mode 100644 gui/README.txt
 create mode 100644 gui/en.dictionary
 create mode 100644 gui/forGUI.xsd
 create mode 100644 gui/forgui.py
 create mode 100644 gui/generateds_gui_rus.glade
 create mode 100755 gui/run_generate_session
 create mode 100644 gui/rus.dictionary
 mode change 100755 => 120000 libgenerateDS/gui/generateds_gui.py
 mode change 100644 => 120000 libgenerateDS/gui/generateds_gui_session.py
 create mode 100755 tests/OnePer/compare
 create mode 100755 tests/OnePer/copy
 rename tests/{recursive_simpletype2_sup.py => OnePer/oneperType00_2One.py} (73%)
 rename tests/{annotations2_sup.py => OnePer/oneperType01_2One.py} (62%)
 create mode 100644 tests/OnePer/oneperType02_2One.py
 create mode 100644 tests/OnePer/oneperType03_2One.py
 delete mode 100644 tests/abstract_type2_sub.py
 create mode 100644 tests/address.xsd
 delete mode 100644 tests/annotations2_sub.py
 delete mode 100644 tests/anywildcard2_sub.py
 delete mode 100644 tests/attr_groups2_sub.py
 create mode 100644 tests/catalog.xml
 create mode 100644 tests/catalogtest.xsd
 create mode 100644 tests/catalogtest1_sub.py
 create mode 100644 tests/catalogtest1_sup.py
 create mode 100644 tests/cdata.xsd
 create mode 100644 tests/cdata1.xml
 create mode 100644 tests/cdata1_sub.py
 rename tests/{abstract_type2_sup.py => cdata1_sup.py} (62%)
 create mode 100755 tests/check_results.rb
 create mode 100644 tests/cleanupname.xsd
 create mode 100644 tests/cleanupname1_sub.py
 rename tests/{anywildcard2_sup.py => cleanupname1_sup.py} (60%)
 create mode 100755 tests/compare_sub
 create mode 100755 tests/compare_sup
 create mode 100755 tests/copy_all
 create mode 100755 tests/copy_both
 create mode 100644 tests/defaults_cases.xml
 create mode 100644 tests/defaults_cases.xsd
 create mode 100644 tests/defaults_cases1_out.xml
 create mode 100644 tests/defaults_cases1_sub.py
 create mode 100644 tests/defaults_cases1_sup.py
 create mode 100644 tests/defaults_coverage.xsd
 create mode 100644 tests/defaults_coverage1_sub.py
 create mode 100644 tests/defaults_coverage1_sup.py
 create mode 100644 tests/gds_inner_name_map.py
 delete mode 100644 tests/ipo2_out.xml
 create mode 100644 tests/mapcleanname.xsd
 create mode 100644 tests/mapcleanname1_sub.py
 create mode 100644 tests/mapcleanname1_sup.py
 create mode 100644 tests/nested_def.xml
 create mode 100644 tests/nested_def.xsd
 create mode 100644 tests/nested_def1_out.xml
 create mode 100644 tests/nested_def1_sub.py
 create mode 100644 tests/nested_def1_sup.py
 create mode 100644 tests/oneper00.xsd
 create mode 100644 tests/oneper01.xsd
 create mode 100644 tests/oneper02.xsd
 create mode 100644 tests/oneper03.xsd
 delete mode 100644 tests/out2_sub.py
 delete mode 100644 tests/people_procincl2_sub.py
 delete mode 100644 tests/people_procincl2_sup.py
 create mode 100644 tests/prefix_classname.xml
 create mode 100644 tests/prefix_classname.xsd
 create mode 100644 tests/prefix_classname1_out.xml
 create mode 100644 tests/prefix_classname1_sub.py
 rename tests/{out2_sup.py => prefix_classname1_sup.py} (59%)
 create mode 100644 tests/reference_simpletype.xsd
 rename tests/{recursive_simpletype2_sub.py => reference_simpletype1_sub.py} (50%)
 rename tests/{attr_groups2_sup.py => reference_simpletype1_sup.py} (63%)
 create mode 100644 tests/rem_dup_elems.xml
 create mode 100644 tests/rem_dup_elems.xsd
 create mode 100644 tests/rem_dup_elems1_out.xml
 create mode 100644 tests/rem_dup_elems1_sub.py
 create mode 100644 tests/rem_dup_elems1_sup.py
 create mode 100644 tests/simpletypes_other.xml
 rename tests/{simpletypes_other2_sub.py => simpletypes_other1_sub.py} (58%)
 delete mode 100644 tests/simpletypes_other2_sup.py
 create mode 100644 tests/validate_simpletypes.xml
 create mode 100644 tests/validate_simpletypes.xsd
 create mode 100644 tests/validate_simpletypes1_out.xml
 create mode 100644 tests/validate_simpletypes1_sub.py
 create mode 100644 tests/validate_simpletypes1_sup.py
 create mode 100644 tests/validate_simpletypes1_warnings.txt
 create mode 100644 tests/validate_simpletypes2_sub.py
 create mode 100644 tests/validate_simpletypes2_sup.py
 create mode 100755 updateversion.py
 create mode 100755 upload_pypi

diff --git a/.hgignore b/.hgignore
new file mode 100644
index 0000000..2b0f609
--- /dev/null
+++ b/.hgignore
@@ -0,0 +1 @@
+.pyc
\ No newline at end of file
diff --git a/Demos/People/run_test b/Demos/People/run_test
index ca85c05..86ada73 100755
--- a/Demos/People/run_test
+++ b/Demos/People/run_test
@@ -7,7 +7,7 @@ if [ $# -ne 1 ]; then
     exit 0
 fi
 
-generateDS.py -f -m \
+../../generateDS.py -f -m \
   --namespacedef='xmlns:pl="http://kuhlman.com/people.xsd"' \
   --super=$1sup -o $1sup.py -s $1sub.py \
   --member-specs=dict \
diff --git a/Docs/objectify_notes.html b/Docs/objectify_notes.html
new file mode 100644
index 0000000..98be392
--- /dev/null
+++ b/Docs/objectify_notes.html
@@ -0,0 +1,858 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.13: http://docutils.sourceforge.net/" />
+<title>lxml.objectify notes</title>
+<meta name="author" content="Dave Kuhlman" />
+<meta name="date" content="July 06, 2015" />
+<style type="text/css">
+
+/* css */
+
+body {
+  font: 90% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+  background: #ffffff;
+  color: black;
+  margin: 2em;
+  padding: 2em;
+}
+
+a[href] {
+  color: #436976;
+  background-color: transparent;
+}
+
+a.toc-backref {
+  text-decoration: none;
+}
+
+h1 a[href] {
+  text-decoration: none;
+  color: #fcb100;
+  background-color: transparent;
+}
+
+a.strong {
+  font-weight: bold;
+}
+
+img {
+  margin: 0;
+  border: 0;
+}
+
+p {
+  margin: 0.5em 0 1em 0;
+  line-height: 1.5em;
+}
+p a {
+  text-decoration: underline;
+}
+p a:visited {
+  color: purple;
+  background-color: transparent;
+}
+p a:active {
+  color: red;
+  background-color: transparent;
+}
+a:hover {
+  text-decoration: none;
+}
+p img {
+  border: 0;
+  margin: 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  color: #003a6b;
+  background-color: transparent;
+  font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+  margin: 0;
+  padding-top: 0.5em;
+}
+
+h1 {
+  font-size: 160%;
+  margin-bottom: 0.5em;
+  border-bottom: 1px solid #fcb100;
+}
+h2 {
+  font-size: 140%;
+  margin-bottom: 0.5em;
+  border-bottom: 1px solid #aaa;
+}
+h3 {
+  font-size: 130%;
+  margin-bottom: 0.5em;
+  text-decoration: underline;
+}
+h4 {
+  font-size: 110%;
+  font-weight: bold;
+}
+h5 {
+  font-size: 100%;
+  font-weight: bold;
+}
+h6 {
+  font-size: 80%;
+  font-weight: bold;
+}
+
+ul a, ol a {
+  text-decoration: underline;
+}
+
+dt {
+  font-weight: bold;
+}
+dt a {
+  text-decoration: none;
+}
+
+dd {
+  line-height: 1.5em;
+  margin-bottom: 1em;
+}
+
+legend {
+  background: #ffffff;
+  padding: 0.5em;
+}
+
+form {
+  margin: 0;
+}
+
+
+dl.form {
+  margin: 0;
+  padding: 1em;
+}
+
+dl.form dt {
+  width: 30%;
+  float: left;
+  margin: 0;
+  padding: 0 0.5em 0.5em 0;
+  text-align: right;
+}
+
+input {
+  font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+  color: black;
+  background-color: white;
+  vertical-align: middle;
+}
+
+abbr, acronym, .explain {
+  color: black;
+  background-color: transparent;
+}
+
+q, blockquote {
+}
+
+code, pre {
+  font-family: monospace;
+  font-size: 1.2em;
+  display: block;
+  padding: 10px;
+  border: 1px solid #838183;
+  background-color: #eee;
+  color: #000;
+  overflow: auto;
+  margin: 0.5em 1em;
+}
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+tt.docutils {
+  background-color: #dddddd;
+}
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+</head>
+<body>
+<div class="document" id="lxml-objectify-notes">
+<h1 class="title">lxml.objectify notes</h1>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>Dave Kuhlman</td></tr>
+<tr><th class="docinfo-name">Address:</th>
+<td><pre class="address">
+dkuhlman (at) davekuhlman (dot) org
+</pre>
+</td></tr>
+<tr><th class="docinfo-name">Revision:</th>
+<td>1.1a</td></tr>
+<tr><th class="docinfo-name">Date:</th>
+<td>July 06, 2015</td></tr>
+</tbody>
+</table>
+<!-- vim:ft=rst: -->
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Copyright:</th><td class="field-body">Copyright (c) 2015 Dave Kuhlman.  All Rights Reserved.
+This software is subject to the provisions of the MIT License
+<a class="reference external" href="http://www.opensource.org/licenses/mit-license.php">http://www.opensource.org/licenses/mit-license.php</a>.</td>
+</tr>
+<tr class="field"><th class="field-name">Abstract:</th><td class="field-body">A document intended to help those getting started with
+<tt class="docutils literal">lxml.objectify</tt> and, in particular, to help those
+attempting to transition from <tt class="docutils literal">generateDS.py</tt>.</td>
+</tr>
+</tbody>
+</table>
+<div class="contents topic" id="contents">
+<p class="topic-title first">Contents</p>
+<ul class="auto-toc simple">
+<li><a class="reference internal" href="#introduction" id="id1">1&nbsp;&nbsp;&nbsp;Introduction</a></li>
+<li><a class="reference internal" href="#migrating-from-generateds-py-to-lxml-objectify" id="id2">2&nbsp;&nbsp;&nbsp;Migrating from generateDS.py to lxml.objectify</a><ul class="auto-toc">
+<li><a class="reference internal" href="#parsing-an-xml-instance-document" id="id3">2.1&nbsp;&nbsp;&nbsp;Parsing an XML instance document</a></li>
+<li><a class="reference internal" href="#exporting-an-xml-document" id="id4">2.2&nbsp;&nbsp;&nbsp;Exporting an XML document</a><ul class="auto-toc">
+<li><a class="reference internal" href="#exporting-without-ignorable-whitespace" id="id5">2.2.1&nbsp;&nbsp;&nbsp;Exporting without &quot;ignorable whitespace&quot;</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#the-lxml-objectify-api-access-to-children-and-attributes" id="id6">2.3&nbsp;&nbsp;&nbsp;The lxml.objectify API -- access to children and attributes</a></li>
+<li><a class="reference internal" href="#manipulating-and-modifying-the-element-tree" id="id7">2.4&nbsp;&nbsp;&nbsp;Manipulating and modifying the element tree</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#useful-tips-and-hints" id="id8">3&nbsp;&nbsp;&nbsp;Useful tips and hints</a><ul class="auto-toc">
+<li><a class="reference internal" href="#a-mini-library-of-helpful-functions" id="id9">3.1&nbsp;&nbsp;&nbsp;A mini-library of helpful functions</a></li>
+<li><a class="reference internal" href="#printing-a-more-readable-representation" id="id10">3.2&nbsp;&nbsp;&nbsp;Printing a (more) readable representation</a></li>
+<li><a class="reference internal" href="#exploring-element-specific-api" id="id11">3.3&nbsp;&nbsp;&nbsp;Exploring element-specific API</a></li>
+<li><a class="reference internal" href="#searching-an-xml-document" id="id12">3.4&nbsp;&nbsp;&nbsp;Searching an XML document</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#sample-applications-with-lxml-objectify" id="id13">4&nbsp;&nbsp;&nbsp;Sample applications with lxml.objectify</a></li>
+<li><a class="reference internal" href="#evaluation-and-comparison-lxml-objectify-vs-generateds-py" id="id14">5&nbsp;&nbsp;&nbsp;Evaluation and comparison -- lxml.objectify vs. generateDS.py</a><ul class="auto-toc">
+<li><a class="reference internal" href="#api-discovery" id="id15">5.1&nbsp;&nbsp;&nbsp;API discovery</a></li>
+<li><a class="reference internal" href="#namespaces" id="id16">5.2&nbsp;&nbsp;&nbsp;Namespaces</a></li>
+<li><a class="reference internal" href="#summary" id="id17">5.3&nbsp;&nbsp;&nbsp;Summary</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="introduction">
+<h1><a class="toc-backref" href="#id1">1&nbsp;&nbsp;&nbsp;Introduction</a></h1>
+<p>This document is an attempt to give a little help to those starting
+out with <tt class="docutils literal">lxml.objectify</tt>.  But, it does not attempt to replace
+the official doc, which you can find here:
+<a class="reference external" href="http://lxml.de/objectify.html">http://lxml.de/objectify.html</a>.</p>
+<p>Much of the code in this document assumes that you have done the
+following in your Python code:</p>
+<pre class="literal-block">
+from lxml import objectify
+</pre>
+</div>
+<div class="section" id="migrating-from-generateds-py-to-lxml-objectify">
+<h1><a class="toc-backref" href="#id2">2&nbsp;&nbsp;&nbsp;Migrating from generateDS.py to lxml.objectify</a></h1>
+<p>With <tt class="docutils literal">lxml.objectify</tt>, unlike <tt class="docutils literal">generateDS.py</tt>, there is no need
+to generate code before processing an XML instance document.</p>
+<div class="section" id="parsing-an-xml-instance-document">
+<h2><a class="toc-backref" href="#id3">2.1&nbsp;&nbsp;&nbsp;Parsing an XML instance document</a></h2>
+<p>Use something like the following:</p>
+<pre class="literal-block">
+def objectify_parse(infilename):
+    doctree = objectify.parse(infilename)
+    root = doctree.getroot()
+    return doctree, root
+</pre>
+<p>Or, when you want to validate against a schema while parsing, use:</p>
+<pre class="literal-block">
+def objectify_parse_with_schema(schemaname, infilename):
+    schema = etree.XMLSchema(file=schemaname)
+    parser = objectify.makeparser(schema=schema)
+    doctree = objectify.parse(infilename, parser=parser)
+    root = doctree.getroot()
+    return doctree, root
+</pre>
+<p>And, if validation against a schema is one of your needs, don't
+forget the <tt class="docutils literal">xmllint</tt> command line tool.  For example:</p>
+<pre class="literal-block">
+$ xmllint --noout --schema my_schema.xsd my_instancedoc.xml
+</pre>
+</div>
+<div class="section" id="exporting-an-xml-document">
+<h2><a class="toc-backref" href="#id4">2.2&nbsp;&nbsp;&nbsp;Exporting an XML document</a></h2>
+<p>There are several ways:</p>
+<pre class="literal-block">
+&gt;&gt;&gt; print etree.tostring(doctree)
+&gt;&gt;&gt; print etree.tostring(root)
+&gt;&gt;&gt; doctree.write(sys.stdout)
+&gt;&gt;&gt; doctree.write(sys.stdout, pretty_print=True)
+</pre>
+<p>You can also export a sub-tree:</p>
+<pre class="literal-block">
+In [163]: person = root.person[1]
+In [164]: print etree.tostring(person, pretty_print=True)
+</pre>
+<p>And, with optional pretty printing (indenting) and an XML
+declaration:</p>
+<pre class="literal-block">
+&gt;&gt;&gt; doctree.write(my_output_file, pretty_print=True)
+&gt;&gt;&gt; doctree.write(my_output_file, xml_declaration=True)
+&gt;&gt;&gt; doctree.write(my_output_file, pretty_print=True, xml_declaration=True)
+</pre>
+<p>Yet more examples:</p>
+<pre class="literal-block">
+&gt;&gt;&gt; a = obj.fromstring('&lt;aaa&gt;&lt;bbb&gt;111&lt;/bbb&gt;&lt;bbb&gt;&lt;ccc&gt;222&lt;/ccc&gt;&lt;/bbb&gt;&lt;/aaa&gt;')
+&gt;&gt;&gt; etree.tostring(a)
+&gt;&gt;&gt; print etree.tostring(a)
+&gt;&gt;&gt; print etree.tostring(a, pretty_print=True)
+&gt;&gt;&gt; print etree.tostring(a.bbb[1], pretty_print=True)    # pretty print a subtree
+</pre>
+<div class="section" id="exporting-without-ignorable-whitespace">
+<h3><a class="toc-backref" href="#id5">2.2.1&nbsp;&nbsp;&nbsp;Exporting without &quot;ignorable whitespace&quot;</a></h3>
+<p>The <tt class="docutils literal">export</tt> methods generated by <tt class="docutils literal">generateDS.py</tt> support an
+optional argument (<tt class="docutils literal">pretty_print=True</tt>) that enables you to export
+a document <em>without</em> ignorable whitespace.  <tt class="docutils literal">lxml.objectify</tt> has
+support for that also:</p>
+<ol class="arabic">
+<li><p class="first">Parse the document initially without the ignorable whitespace.
+Example:</p>
+<pre class="literal-block">
+parser = etree.XMLParser(remove_blank_text=True)
+doc = etree.parse(filename, parser)
+root = doc.getroot()
+</pre>
+</li>
+<li><p class="first">In some cases you might need to remove ignorable whitespace with
+something like the following:</p>
+<pre class="literal-block">
+for element in root.iter():
+    element.tail = None
+</pre>
+</li>
+</ol>
+<p>The above code examples and more information on ignorable whitespace
+and formatting serialized output (also known as &quot;export&quot; in
+<tt class="docutils literal">generateDS.py</tt>) can be found in the <tt class="docutils literal">lxml</tt> FAQ:
+<a class="reference external" href="http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output">http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output</a></p>
+</div>
+</div>
+<div class="section" id="the-lxml-objectify-api-access-to-children-and-attributes">
+<h2><a class="toc-backref" href="#id6">2.3&nbsp;&nbsp;&nbsp;The lxml.objectify API -- access to children and attributes</a></h2>
+<p><strong>Attributes</strong> -- The attributes of an <tt class="docutils literal">lxml.objectify</tt> XML element are
+available in a dictionary-like object.  But you can also access them
+directly throught the element.  Examples:</p>
+<pre class="literal-block">
+In [81]: element.attrib
+Out[81]: {'ratio': '3.2', 'id': '1', 'value': 'abcd'}
+In [82]:
+In [82]: element.get('ratio')
+Out[82]: '3.2'
+In [83]: print element.get('ratio')
+3.2
+In [84]: print element.get('ratioxxx')
+None
+</pre>
+<p>And, use <tt class="docutils literal">element.set(key, value)</tt> to set an attribute's value.</p>
+<p>Iterate over the attributes using the standard dictionary API on the
+elements <tt class="docutils literal">el.attrib</tt> attribute.  Example:</p>
+<pre class="literal-block">
+In [48]: link = root.Link[2]
+In [49]: for key, value in link.attrib.items():
+   ....:     print 'key: {}  value: {}'.format(key, value)
+   ....:
+key: rel  value: down
+key: type  value: application/vnd.vmware.admin.vmwExtension+xml
+key: href  value: https://vcloud.example.com/api/admin/extension
+</pre>
+<p><strong>Children</strong> -- The children of an XML element are available by using
+the child's tag as an attribute.  For example, if the element
+<tt class="docutils literal">people</tt> has one or more children whose tag is <tt class="docutils literal">person</tt>, then
+those children can be accessed as follows:</p>
+<pre class="literal-block">
+In [87]: people.person        # first person available without index
+Out[87]: &lt;Element person at 0x7fa0f1814ea8&gt;
+In [88]: people.person[0]     # same as previous
+Out[88]: &lt;Element person at 0x7fa0f1814ea8&gt;
+In [89]: people.person[1]
+Out[89]: &lt;Element person at 0x7fa0f1814e60&gt;
+</pre>
+<p>You can also use <tt class="docutils literal">getattr()</tt> to access child elements.  You may
+need to do this when there are children from different namespaces
+within the same element.  Examples:</p>
+<pre class="literal-block">
+In [50]: rootgroup = root.RootGroup
+In [51]: rootgroup.Group
+Out[51]: &lt;Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48&gt;
+In [52]:
+In [52]: getattr(rootgroup, 'Group')
+Out[52]: &lt;Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48&gt;
+In [53]:
+In [53]: getattr(rootgroup, '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group')
+Out[53]: &lt;Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48&gt;
+In [54]:
+In [54]: getattr(rootgroup, '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group')[1]
+Out[54]: &lt;Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05ab8&gt;
+</pre>
+<p>Iterate over the children by using the element's
+<tt class="docutils literal">el.iterchildren()</tt> method.  Example:</p>
+<pre class="literal-block">
+In [47]: for child in root.iterchildren():
+    print child.tag
+   ....:
+{http://www.vmware.com/vcloud/v1.5}Link
+{http://www.vmware.com/vcloud/v1.5}Link
+{http://www.vmware.com/vcloud/v1.5}Link
+{http://www.vmware.com/vcloud/v1.5}Link
+{http://www.vmware.com/vcloud/v1.5}Link
+</pre>
+</div>
+<div class="section" id="manipulating-and-modifying-the-element-tree">
+<h2><a class="toc-backref" href="#id7">2.4&nbsp;&nbsp;&nbsp;Manipulating and modifying the element tree</a></h2>
+<p>Modify text content -- You can assign to a leaf element to modify
+its text content, for example:</p>
+<pre class="literal-block">
+&gt;&gt;&gt; dataset.datanode = 'a simple string'
+</pre>
+<p>However, you may want to use <tt class="docutils literal">lxml.objectify</tt> data types.  If you
+do not, <tt class="docutils literal">lxml.objectify</tt> may put them in a different namespace.
+Here are examples that preserve the existing data types:</p>
+<pre class="literal-block">
+&gt;&gt;&gt; dataset.datanode = objectify.StringElement('a simple string')
+&gt;&gt;&gt; dataset.datanode = objectify.IntElement('200')
+&gt;&gt;&gt; dataset.datanode = objectify.FloatElement('300.5')
+</pre>
+<p>See the following for more on how to work with Python data types:
+<a class="reference external" href="http://lxml.de/objectify.html#python-data-types">http://lxml.de/objectify.html#python-data-types</a></p>
+<p>Creating new elements -- See this for information on how to add
+elements to the XML element tree:
+<a class="reference external" href="http://lxml.de/objectify.html#creating-objectify-trees">http://lxml.de/objectify.html#creating-objectify-trees</a></p>
+<p>You can also copy existing elements or sub-trees of elements, for
+example:</p>
+<pre class="literal-block">
+&gt;&gt;&gt; import copy
+&gt;&gt;&gt; new_element = copy.deepcopy(old_element)
+&gt;&gt;&gt; parent_element.append(new_element)
+</pre>
+</div>
+</div>
+<div class="section" id="useful-tips-and-hints">
+<h1><a class="toc-backref" href="#id8">3&nbsp;&nbsp;&nbsp;Useful tips and hints</a></h1>
+<div class="section" id="a-mini-library-of-helpful-functions">
+<h2><a class="toc-backref" href="#id9">3.1&nbsp;&nbsp;&nbsp;A mini-library of helpful functions</a></h2>
+<p>Some of the helper functions mentioned below are available here:
+<a class="reference external" href="Objectify_files/objectify_helpers.py">objectify_helpers.py</a>.</p>
+</div>
+<div class="section" id="printing-a-more-readable-representation">
+<h2><a class="toc-backref" href="#id10">3.2&nbsp;&nbsp;&nbsp;Printing a (more) readable representation</a></h2>
+<p>In order to get a picture of the API available at various elements,
+you can use the <tt class="docutils literal">objectify.dump(element)</tt>.  For example:</p>
+<pre class="literal-block">
+In [237]: print objectify.dump(root.programmer)
+programmer = None [ObjectifiedElement]
+  * id = '2'
+  * language = 'python'
+  * editor = 'xml'
+    name = 'Charles Carlson' [StringElement]
+    interest = 'programming' [StringElement]
+    category = 2233 [IntElement]
+    description = 'A very happy programmer' [StringElement]
+    email = 'charles&#64;happyprogrammers.com' [StringElement]
+    elposint = 14 [IntElement]
+    elnonposint = 0 [IntElement]
+    elnegint = -12 [IntElement]
+    elnonnegint = 4 [IntElement]
+    eldate = '2005-04-26' [StringElement]
+    eldatetime = '2005-04-26T10:11:12' [StringElement]
+    eldatetime1 = '2006-05-27T10:11:12.40' [StringElement]
+    eltoken = 'aa bb    cc\tdd\n            ee' [StringElement]
+    elshort = 123 [IntElement]
+    ellong = 1324123412 [IntElement]
+    elparam = u'' [StringElement]
+      * id = 'id001'
+      * name = 'Davy'
+      * semantic = 'a big    semantic'
+      * type = 'abc'
+    elparam = u'' [StringElement]
+      * id = 'id002'
+      * name = 'Davy'
+      * semantic = 'a big    semantic'
+      * type = 'int'
+</pre>
+<p>A similar display can be gotten by using <tt class="docutils literal">str(element)</tt>.  But,
+in order to do so, you may need to call
+<tt class="docutils literal">objectify.enable_recursive_str()</tt>, first.  For
+example:</p>
+<pre class="literal-block">
+In [238]: print str(root.programmer)
+programmer = None [ObjectifiedElement]
+  * id = '2'
+  * language = 'python'
+  * editor = 'xml'
+    name = 'Charles Carlson' [StringElement]
+    interest = 'programming' [StringElement]
+    category = 2233 [IntElement]
+    description = 'A very happy programmer' [StringElement]
+    email = 'charles&#64;happyprogrammers.com' [StringElement]
+    elposint = 14 [IntElement]
+    elnonposint = 0 [IntElement]
+    elnegint = -12 [IntElement]
+    elnonnegint = 4 [IntElement]
+    eldate = '2005-04-26' [StringElement]
+    eldatetime = '2005-04-26T10:11:12' [StringElement]
+    eldatetime1 = '2006-05-27T10:11:12.40' [StringElement]
+    eltoken = 'aa bb    cc\tdd\n            ee' [StringElement]
+    elshort = 123 [IntElement]
+    ellong = 1324123412 [IntElement]
+    elparam = u'' [StringElement]
+      * id = 'id001'
+      * name = 'Davy'
+      * semantic = 'a big    semantic'
+      * type = 'abc'
+    elparam = u'' [StringElement]
+      * id = 'id002'
+      * name = 'Davy'
+      * semantic = 'a big    semantic'
+      * type = 'int'
+</pre>
+<p>This behavior of <tt class="docutils literal">str(o)</tt> can be turned on and off with the
+following:</p>
+<pre class="literal-block">
+In [75]: objectify.enable_recursive_str(True)
+In [76]: objectify.enable_recursive_str(False)
+</pre>
+<p>And, here is an implementation that mimics <tt class="docutils literal">objectify.dump(o)</tt> but has
+several additional features:</p>
+<ul class="simple">
+<li>It enables you to limit the number of levels of nesting and
+display of children and their children etc.  Imagine displaying
+the root node of a very large file containing many levels of
+nested children.</li>
+<li>It writes to a file rather than accumulating a string.  For some
+situations, this saves having to type <tt class="docutils literal">print</tt> in order to format
+the output.  And, again thinking about very large documents, it
+might save us from building up a huge string.</li>
+</ul>
+<pre class="literal-block">
+def swrite(element, maxlevels=None, outfile=sys.stdout):
+    &quot;&quot;&quot;Recursively write out a formatted, readable representation of element.
+    Possibly do shallow recursion.
+    Limit recursion to maxlevels (default is all levels).
+    Write output to file outfile (default is sys.stdout).
+    &quot;&quot;&quot;
+    wrt = outfile.write
+    swrite_(element, 0, maxlevels, wrt)
+
+
+def swrite_(element, indent, maxlevels, wrt):
+    indentstr = '    ' * indent
+    wrt('{}{}: {}\n'.format(indentstr, element.tag, repr(element), ))
+    for name, value in element.attrib.iteritems():
+        wrt('  {}* {}: {}\n'.format(indentstr, name, value, ))
+    indent += 1
+    if maxlevels is not None and indent &gt; maxlevels:
+        return
+    for child in element.iterchildren():
+        swrite_(child, indent, maxlevels, wrt)
+</pre>
+</div>
+<div class="section" id="exploring-element-specific-api">
+<h2><a class="toc-backref" href="#id11">3.3&nbsp;&nbsp;&nbsp;Exploring element-specific API</a></h2>
+<p>With <tt class="docutils literal">lxml.objectify</tt>, inspecting objects to determine the API for
+that specific element type is a frequent task.  You may find a
+function something like the following helpful:</p>
+<pre class="literal-block">
+Standard_attrs = set([ '__dict__', '__getattr__', 'addattr',
+    'countchildren', 'descendantpaths', '__class__', '__contains__',
+    '__copy__', '__deepcopy__', '__delattr__', '__delitem__',
+    '__doc__', '__format__', '__getattribute__', '__getitem__',
+    '__hash__', '__init__', '__iter__', '__len__', '__new__',
+    '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__',
+    '__reversed__', '__setattr__', '__setitem__', '__sizeof__',
+    '__str__', '__subclasshook__', '_init', 'addnext',
+    'addprevious', 'append', 'attrib', 'base', 'clear', 'extend',
+    'find', 'findall', 'findtext', 'get', 'getchildren',
+    'getiterator', 'getnext', 'getparent', 'getprevious',
+    'getroottree', 'index', 'insert', 'items', 'iter',
+    'iterancestors', 'iterchildren', 'iterdescendants', 'iterfind',
+    'itersiblings', 'itertext', 'keys', 'makeelement', 'nsmap',
+    'prefix', 'remove', 'replace', 'set', 'sourceline', 'tag',
+    'tail', 'text', 'values', 'xpath', ])
+
+def members(element):
+    names = [attr for attr in dir(element) if attr not in Standard_attrs]
+    return names
+</pre>
+<p>I obtained that list of <tt class="docutils literal">Standard_attrs</tt> by doing <tt class="docutils literal">print
+dir(element)</tt> on a standard element (and then modifying it a bit).</p>
+<p>However, instead of calling that <tt class="docutils literal">members(o)</tt> function (above),
+the following snippet is likely just as useful:</p>
+<pre class="literal-block">
+In [96]: [child.tag for child in element.iterchildren()]
+Out[96]: ['example1', 'name', 'interest', 'interest', 'category', 'hot.agent']
+In [97]:
+In [97]: sorted([child.tag for child in element.iterchildren()])
+Out[97]: ['category', 'example1', 'hot.agent', 'interest', 'interest', 'name']
+</pre>
+<p>And, to save typing, the following functions might be helpful:</p>
+<pre class="literal-block">
+def children(element, tag=None):
+    &quot;&quot;&quot;Return a list of children of an element.
+    Optional argument tag can be a single string or list of strings
+    to select only children with that tag name.
+    &quot;&quot;&quot;
+    child_list = [child for child in element.iterchildren(tag=tag)]
+    return child_list
+
+def child_tags(element, tag=None):
+    &quot;&quot;&quot;Return a list of the tag names of the children of an element.
+    Optional argument tag can be a single string or list of strings
+    to select only children with that tag name.
+    &quot;&quot;&quot;
+    tags = [child.tag for child in element.iterchildren(tag=tag)]
+    return tags
+</pre>
+<p>Or, you may find this shallow dump function useful.  It uses
+<tt class="docutils literal">objectify.dump(o)</tt>, but attempts to <em>only</em> return the description
+of the top level object:</p>
+<pre class="literal-block">
+def sdump(element):
+    content = objectify.dump(element)
+    content = content.splitlines()
+    prefix = '        '
+    content = [line for line in content if not line.startswith(prefix)]
+    content = '\n'.join(content)
+    return content
+</pre>
+</div>
+<div class="section" id="searching-an-xml-document">
+<h2><a class="toc-backref" href="#id12">3.4&nbsp;&nbsp;&nbsp;Searching an XML document</a></h2>
+<p><tt class="docutils literal">lxml.objectify</tt> has its own XPath-like search capability with a
+(possibly) simpler form of the XPath/XQuery language.  See this for
+information about ObjectPath: <a class="reference external" href="http://lxml.de/objectify.html#objectpath">http://lxml.de/objectify.html#objectpath</a></p>
+<p>And, you can also use that lxml xpath on <tt class="docutils literal">lxml.objectify</tt>
+elements.  Example:</p>
+<pre class="literal-block">
+In [68]: root.xpath('.//&#64;Name')
+Out[68]:
+['dataset1-1',
+ 'dataset1-2',
+ 'subgroup01',
+ 'dataset2-1',
+ 'dataset2-2',
+ 'subgroup02',
+ 'dataset3-1',
+ 'dataset3-2',
+ 'subgroup03',
+ 'dataset3-3']
+</pre>
+<p>See this for information about the <tt class="docutils literal">lxml</tt> support for
+<tt class="docutils literal">xpath</tt>: <a class="reference external" href="http://lxml.de/xpathxslt.html">http://lxml.de/xpathxslt.html</a>.  And, see this for
+information about the XPath path language:</p>
+<ul class="simple">
+<li><a class="reference external" href="http://www.w3.org/TR/2014/REC-xpath-30-20140408/#unabbrev">http://www.w3.org/TR/2014/REC-xpath-30-20140408/#unabbrev</a></li>
+<li><a class="reference external" href="http://www.w3.org/TR/2014/REC-xpath-30-20140408/#abbrev">http://www.w3.org/TR/2014/REC-xpath-30-20140408/#abbrev</a></li>
+</ul>
+</div>
+</div>
+<div class="section" id="sample-applications-with-lxml-objectify">
+<h1><a class="toc-backref" href="#id13">4&nbsp;&nbsp;&nbsp;Sample applications with lxml.objectify</a></h1>
+<ol class="arabic">
+<li><p class="first">Here is a sample application that parses and displays weather
+information from an XML document: <a class="reference external" href="Objectify_files/weather_test.py">weather_test.py</a>.</p>
+</li>
+<li><p class="first">This sample application picks data out of an XML document that
+was generated with <tt class="docutils literal">h5dump</tt>.  For example:</p>
+<pre class="literal-block">
+$ h5dump -x my_data.hdf5 &gt; my_data.hdf5.xml
+</pre>
+<p>This sample application attempts to create a new hdf5 data file from that XML
+document.  The code is here:
+<a class="reference external" href="Objectify_files/obj_hdf_xml.py">obj_hdf_xml.py</a></p>
+<p>Here is more information about HDF5:</p>
+<ul class="simple">
+<li><a class="reference external" href="http://www.hdfgroup.org/">http://www.hdfgroup.org/</a></li>
+<li><a class="reference external" href="http://docs.h5py.org/en/latest/index.html">http://docs.h5py.org/en/latest/index.html</a> -- HDF5 for Python</li>
+</ul>
+</li>
+<li><p class="first">Here are several small applications that pick data out of files
+related to Vcloud.  I've included the Python code, a sample XML
+file, and a dump of the XML file produced by
+<tt class="docutils literal">objectify.dump(root)</tt>.  The code is here:
+<a class="reference external" href="Objectify_files/vcloud_samples.zip">vcloud_samples.zip</a>  And, you can learn
+more about Vcloud here:
+<a class="reference external" href="http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/about.html">http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/about.html</a></p>
+</li>
+</ol>
+</div>
+<div class="section" id="evaluation-and-comparison-lxml-objectify-vs-generateds-py">
+<h1><a class="toc-backref" href="#id14">5&nbsp;&nbsp;&nbsp;Evaluation and comparison -- lxml.objectify vs. generateDS.py</a></h1>
+<div class="section" id="api-discovery">
+<h2><a class="toc-backref" href="#id15">5.1&nbsp;&nbsp;&nbsp;API discovery</a></h2>
+<p><tt class="docutils literal">generateDS.py</tt> generates a class for each <tt class="docutils literal">xs:complexType</tt>.
+Therefore, there is Python code that you can inspect to determine
+the (generated) API, for example, getters, setters, constructor,
+export function, etc.  In order to do that, you will need to
+identify which generated class is the implementation for the element
+in which you are interested.</p>
+<p><tt class="docutils literal">lxml.objectify</tt> objects can be inspected using
+<tt class="docutils literal">objectify.dump(o)</tt> or one of the helper functions described in
+this document in section <a class="reference internal" href="#useful-tips-and-hints">Useful tips and hints</a>.  In order to
+perform this inspection, you must get access to an object of the
+type that you want to inspect.  Here are several ways to do that
+(and you may think of others):</p>
+<ul>
+<li><p class="first">Drop into the Python debugger by placing this code in your
+application where you have access to an object of the type you are
+interested in:</p>
+<pre class="literal-block">
+import pdb
+pdb.set_trace()
+</pre>
+<p>Or, if you have installed <tt class="docutils literal">ipython</tt> and <tt class="docutils literal">ipdb</tt>, use:</p>
+<pre class="literal-block">
+import ipdb
+ipdb.set_trace()
+</pre>
+<p><tt class="docutils literal">ipdb</tt> gives you tab completion for names available in the
+current scope.</p>
+</li>
+<li><p class="first">Parse and dump an XML instance document (using
+<tt class="docutils literal">objectify.dump(el)</tt>), capture it in a file, then look for the
+element of interest with your text editor.  Here is a simple
+utility script to help do that:</p>
+<pre class="literal-block">
+#!/usr/bin/env python
+
+import sys
+from lxml import objectify
+
+def dump(infilename):
+    doc = objectify.parse(infilename)
+    root = doc.getroot()
+    print objectify.dump(root)
+
+def main():
+    args = sys.argv[1:]
+    infilename = args[0]
+    dump(infilename)
+
+if __name__ == '__main__':
+    main()
+</pre>
+</li>
+<li><p class="first">Insert the the following code in your application at some point
+where it will have access to the element whose API you wish to
+discover:</p>
+<pre class="literal-block">
+print objectify.dump(element)
+</pre>
+<p>Or, if stdout (standard output) is not available and visible to
+you, something like the following:</p>
+<pre class="literal-block">
+import tempfile
+
+with tempfile.NamedTemporaryFile('w', delete=False) as outfile:
+    outfile.write(objectify.dump(element))
+    outfilename = outfile.name
+</pre>
+</li>
+<li><p class="first">Or, use one of the helpers above, for example:</p>
+<pre class="literal-block">
+print objectify_helpers.child_tags(element)
+</pre>
+</li>
+</ul>
+</div>
+<div class="section" id="namespaces">
+<h2><a class="toc-backref" href="#id16">5.2&nbsp;&nbsp;&nbsp;Namespaces</a></h2>
+<p><tt class="docutils literal">lxml.objectify</tt> handles namespaces correctly; <tt class="docutils literal">generateDS.py</tt>,
+especially when there are multiple namespaces in the same XML
+document, does not.</p>
+<p>Mostly, <tt class="docutils literal">lxml.objectify</tt> handles namespaces for you without
+additional effort on your part.  If you are working with an element
+that contains items from different namespaces, then see this:
+<a class="reference external" href="http://lxml.de/objectify.html#namespace-handling">http://lxml.de/objectify.html#namespace-handling</a>.  Sometimes, when
+you use <tt class="docutils literal">getattr(el, 'xxx')</tt> or el.iterchildren(tag='xxx'), you
+will need to include the namespace.  Examples:</p>
+<pre class="literal-block">
+In [15]: rootgroup = root.RootGroup
+In [16]: rootgroup.Group.tag
+Out[16]: '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group'
+In [17]: [el.tag for el in rootgroup.iterchildren(tag=&quot;{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group&quot;)]
+Out[17]:
+['{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group',
+ '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group',
+ '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group']
+</pre>
+<p>and:</p>
+<pre class="literal-block">
+In [24]: rootgroup.Dataset
+Out[24]: &lt;Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset at 0x7f0293b65c68&gt;
+In [25]: getattr(rootgroup, &quot;{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset&quot;)
+Out[25]: &lt;Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset at 0x7f0293b65c68&gt;
+</pre>
+</div>
+<div class="section" id="summary">
+<h2><a class="toc-backref" href="#id17">5.3&nbsp;&nbsp;&nbsp;Summary</a></h2>
+<p>Although their approaches are very different, <tt class="docutils literal">generateDS.py</tt> and
+<tt class="docutils literal">lxml.objectify</tt> seem to solve the same set of problems and answer
+equivalent sets of needs.  <tt class="docutils literal">generateDS.py</tt> generates and gives you
+an API for each element type, specifically a Python class.  With
+<tt class="docutils literal">lxml.objectify</tt>, you can discover a (simulated) API by inspecting
+a dump produced by <tt class="docutils literal">lxml.objectify.dump(o)</tt> or by using
+<tt class="docutils literal">lxml.objectify</tt> and <tt class="docutils literal">lxml</tt> capabilities in each element to
+inspect the element.</p>
+<p>When might you want to use one rather than the other?</p>
+<ul class="simple">
+<li>Since <tt class="docutils literal">generateDS.py</tt> requires an XML schema in order to
+generate code, if you do <em>not</em> have an XML schema for your
+document type, then <tt class="docutils literal">generateDS.py</tt> is not an option for you.</li>
+<li>If you must handle an XML document that is defined by an XML
+schema that contains multiple namespaces, then, because of the
+problems that <tt class="docutils literal">generateDS.py</tt> has with namespaces, you should
+choose <tt class="docutils literal">lxml.objectify</tt>.</li>
+<li>If you want to produce Python code that defines and implements an
+API for a specific XML document type and you have an XML schema
+that defines that document type, then you may want to consider
+<tt class="docutils literal">generateDS.py</tt>.  If you want to be able to send that generated
+API for use by other developers, then the <tt class="docutils literal">generateDS.py</tt>
+approach might be an advantage to you.  However, the content
+produced by <tt class="docutils literal">lxml.objectify.dump(o)</tt> is very close to a
+description of an API for accessing an manipulating each element
+in an XML document.</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="objectify_notes.txt">View document source</a>.
+Generated on: 2015-07-06 20:48 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>
+</body>
+</html>
diff --git a/Docs/objectify_notes.txt b/Docs/objectify_notes.txt
new file mode 100644
index 0000000..3dc2cdd
--- /dev/null
+++ b/Docs/objectify_notes.txt
@@ -0,0 +1,633 @@
+.. vim:ft=rst:
+
+======================
+lxml.objectify notes
+======================
+
+:author: Dave Kuhlman
+:address:
+    dkuhlman (at) davekuhlman (dot) org
+
+:revision: 1.1a
+:date: |date|
+
+.. |date| date:: %B %d, %Y
+
+:Copyright: Copyright (c) 2015 Dave Kuhlman.  All Rights Reserved.
+    This software is subject to the provisions of the MIT License
+    http://www.opensource.org/licenses/mit-license.php.
+
+:Abstract: A document intended to help those getting started with
+           ``lxml.objectify`` and, in particular, to help those
+           attempting to transition from ``generateDS.py``.
+
+.. sectnum::
+
+.. contents::
+
+Introduction
+==============
+
+This document is an attempt to give a little help to those starting
+out with ``lxml.objectify``.  But, it does not attempt to replace
+the official doc, which you can find here:
+http://lxml.de/objectify.html.
+
+Much of the code in this document assumes that you have done the
+following in your Python code::
+
+    from lxml import objectify
+
+
+Migrating from generateDS.py to lxml.objectify
+================================================
+
+With ``lxml.objectify``, unlike ``generateDS.py``, there is no need
+to generate code before processing an XML instance document.
+
+Parsing an XML instance document
+----------------------------------
+
+Use something like the following::
+
+    def objectify_parse(infilename):
+        doctree = objectify.parse(infilename)
+        root = doctree.getroot()
+        return doctree, root
+
+Or, when you want to validate against a schema while parsing, use::
+
+    def objectify_parse_with_schema(schemaname, infilename):
+        schema = etree.XMLSchema(file=schemaname)
+        parser = objectify.makeparser(schema=schema)
+        doctree = objectify.parse(infilename, parser=parser)
+        root = doctree.getroot()
+        return doctree, root
+
+And, if validation against a schema is one of your needs, don't
+forget the ``xmllint`` command line tool.  For example::
+
+    $ xmllint --noout --schema my_schema.xsd my_instancedoc.xml
+
+
+Exporting an XML document
+---------------------------
+
+There are several ways::
+
+    >>> print etree.tostring(doctree)
+    >>> print etree.tostring(root)
+    >>> doctree.write(sys.stdout)
+    >>> doctree.write(sys.stdout, pretty_print=True)
+
+You can also export a sub-tree::
+
+    In [163]: person = root.person[1]
+    In [164]: print etree.tostring(person, pretty_print=True)
+
+And, with optional pretty printing (indenting) and an XML
+declaration::
+
+    >>> doctree.write(my_output_file, pretty_print=True)
+    >>> doctree.write(my_output_file, xml_declaration=True)
+    >>> doctree.write(my_output_file, pretty_print=True, xml_declaration=True)
+
+Yet more examples::
+
+    >>> a = obj.fromstring('<aaa><bbb>111</bbb><bbb><ccc>222</ccc></bbb></aaa>')
+    >>> etree.tostring(a)
+    >>> print etree.tostring(a)
+    >>> print etree.tostring(a, pretty_print=True)
+    >>> print etree.tostring(a.bbb[1], pretty_print=True)    # pretty print a subtree
+
+
+Exporting without "ignorable whitespace"
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The ``export`` methods generated by ``generateDS.py`` support an
+optional argument (``pretty_print=True``) that enables you to export
+a document *without* ignorable whitespace.  ``lxml.objectify`` has
+support for that also:
+
+1. Parse the document initially without the ignorable whitespace.
+   Example::
+
+       parser = etree.XMLParser(remove_blank_text=True)
+       doc = etree.parse(filename, parser)
+       root = doc.getroot()
+
+2. In some cases you might need to remove ignorable whitespace with
+   something like the following::
+
+       for element in root.iter():
+           element.tail = None
+
+The above code examples and more information on ignorable whitespace
+and formatting serialized output (also known as "export" in
+``generateDS.py``) can be found in the ``lxml`` FAQ:
+http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output
+
+
+The lxml.objectify API -- access to children and attributes
+-------------------------------------------------------------
+
+**Attributes** -- The attributes of an ``lxml.objectify`` XML element are
+available in a dictionary-like object.  But you can also access them
+directly throught the element.  Examples::
+
+    In [81]: element.attrib
+    Out[81]: {'ratio': '3.2', 'id': '1', 'value': 'abcd'}
+    In [82]:
+    In [82]: element.get('ratio')
+    Out[82]: '3.2'
+    In [83]: print element.get('ratio')
+    3.2
+    In [84]: print element.get('ratioxxx')
+    None
+
+And, use ``element.set(key, value)`` to set an attribute's value.
+
+Iterate over the attributes using the standard dictionary API on the
+elements ``el.attrib`` attribute.  Example::
+
+    In [48]: link = root.Link[2]
+    In [49]: for key, value in link.attrib.items():
+       ....:     print 'key: {}  value: {}'.format(key, value)
+       ....:     
+    key: rel  value: down
+    key: type  value: application/vnd.vmware.admin.vmwExtension+xml
+    key: href  value: https://vcloud.example.com/api/admin/extension
+
+**Children** -- The children of an XML element are available by using
+the child's tag as an attribute.  For example, if the element
+``people`` has one or more children whose tag is ``person``, then
+those children can be accessed as follows::
+
+    In [87]: people.person        # first person available without index
+    Out[87]: <Element person at 0x7fa0f1814ea8>
+    In [88]: people.person[0]     # same as previous
+    Out[88]: <Element person at 0x7fa0f1814ea8>
+    In [89]: people.person[1]
+    Out[89]: <Element person at 0x7fa0f1814e60>
+
+You can also use ``getattr()`` to access child elements.  You may
+need to do this when there are children from different namespaces
+within the same element.  Examples::
+
+    In [50]: rootgroup = root.RootGroup 
+    In [51]: rootgroup.Group
+    Out[51]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48>
+    In [52]: 
+    In [52]: getattr(rootgroup, 'Group')
+    Out[52]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48>
+    In [53]: 
+    In [53]: getattr(rootgroup, '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group')
+    Out[53]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48>
+    In [54]: 
+    In [54]: getattr(rootgroup, '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group')[1]
+    Out[54]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05ab8>
+
+Iterate over the children by using the element's
+``el.iterchildren()`` method.  Example::
+
+    In [47]: for child in root.iterchildren():
+        print child.tag
+       ....:     
+    {http://www.vmware.com/vcloud/v1.5}Link
+    {http://www.vmware.com/vcloud/v1.5}Link
+    {http://www.vmware.com/vcloud/v1.5}Link
+    {http://www.vmware.com/vcloud/v1.5}Link
+    {http://www.vmware.com/vcloud/v1.5}Link
+
+
+
+Manipulating and modifying the element tree
+---------------------------------------------
+
+Modify text content -- You can assign to a leaf element to modify
+its text content, for example::
+
+    >>> dataset.datanode = 'a simple string'
+
+However, you may want to use ``lxml.objectify`` data types.  If you
+do not, ``lxml.objectify`` may put them in a different namespace.
+Here are examples that preserve the existing data types::
+
+    >>> dataset.datanode = objectify.StringElement('a simple string')
+    >>> dataset.datanode = objectify.IntElement('200')
+    >>> dataset.datanode = objectify.FloatElement('300.5')
+
+See the following for more on how to work with Python data types:
+http://lxml.de/objectify.html#python-data-types
+
+Creating new elements -- See this for information on how to add
+elements to the XML element tree:
+http://lxml.de/objectify.html#creating-objectify-trees
+
+You can also copy existing elements or sub-trees of elements, for
+example::
+
+    >>> import copy
+    >>> new_element = copy.deepcopy(old_element)
+    >>> parent_element.append(new_element)
+
+
+Useful tips and hints
+=======================
+
+A mini-library of helpful functions
+-------------------------------------
+
+Some of the helper functions mentioned below are available here:
+`objectify_helpers.py <Objectify_files/objectify_helpers.py>`_.
+
+
+Printing a (more) readable representation
+-------------------------------------------
+
+In order to get a picture of the API available at various elements,
+you can use the ``objectify.dump(element)``.  For example::
+
+    In [237]: print objectify.dump(root.programmer)
+    programmer = None [ObjectifiedElement]
+      * id = '2'
+      * language = 'python'
+      * editor = 'xml'
+        name = 'Charles Carlson' [StringElement]
+        interest = 'programming' [StringElement]
+        category = 2233 [IntElement]
+        description = 'A very happy programmer' [StringElement]
+        email = 'charles@happyprogrammers.com' [StringElement]
+        elposint = 14 [IntElement]
+        elnonposint = 0 [IntElement]
+        elnegint = -12 [IntElement]
+        elnonnegint = 4 [IntElement]
+        eldate = '2005-04-26' [StringElement]
+        eldatetime = '2005-04-26T10:11:12' [StringElement]
+        eldatetime1 = '2006-05-27T10:11:12.40' [StringElement]
+        eltoken = 'aa bb    cc\tdd\n            ee' [StringElement]
+        elshort = 123 [IntElement]
+        ellong = 1324123412 [IntElement]
+        elparam = u'' [StringElement]
+          * id = 'id001'
+          * name = 'Davy'
+          * semantic = 'a big    semantic'
+          * type = 'abc'
+        elparam = u'' [StringElement]
+          * id = 'id002'
+          * name = 'Davy'
+          * semantic = 'a big    semantic'
+          * type = 'int'
+
+A similar display can be gotten by using ``str(element)``.  But,
+in order to do so, you may need to call
+``objectify.enable_recursive_str()``, first.  For
+example::
+
+    In [238]: print str(root.programmer)
+    programmer = None [ObjectifiedElement]
+      * id = '2'
+      * language = 'python'
+      * editor = 'xml'
+        name = 'Charles Carlson' [StringElement]
+        interest = 'programming' [StringElement]
+        category = 2233 [IntElement]
+        description = 'A very happy programmer' [StringElement]
+        email = 'charles@happyprogrammers.com' [StringElement]
+        elposint = 14 [IntElement]
+        elnonposint = 0 [IntElement]
+        elnegint = -12 [IntElement]
+        elnonnegint = 4 [IntElement]
+        eldate = '2005-04-26' [StringElement]
+        eldatetime = '2005-04-26T10:11:12' [StringElement]
+        eldatetime1 = '2006-05-27T10:11:12.40' [StringElement]
+        eltoken = 'aa bb    cc\tdd\n            ee' [StringElement]
+        elshort = 123 [IntElement]
+        ellong = 1324123412 [IntElement]
+        elparam = u'' [StringElement]
+          * id = 'id001'
+          * name = 'Davy'
+          * semantic = 'a big    semantic'
+          * type = 'abc'
+        elparam = u'' [StringElement]
+          * id = 'id002'
+          * name = 'Davy'
+          * semantic = 'a big    semantic'
+          * type = 'int'
+
+This behavior of ``str(o)`` can be turned on and off with the
+following::
+
+    In [75]: objectify.enable_recursive_str(True)
+    In [76]: objectify.enable_recursive_str(False)
+
+And, here is an implementation that mimics ``objectify.dump(o)`` but has
+several additional features:
+
+- It enables you to limit the number of levels of nesting and
+  display of children and their children etc.  Imagine displaying
+  the root node of a very large file containing many levels of
+  nested children.
+
+- It writes to a file rather than accumulating a string.  For some
+  situations, this saves having to type ``print`` in order to format
+  the output.  And, again thinking about very large documents, it
+  might save us from building up a huge string.
+
+::
+
+    def swrite(element, maxlevels=None, outfile=sys.stdout):
+        """Recursively write out a formatted, readable representation of element.
+        Possibly do shallow recursion.
+        Limit recursion to maxlevels (default is all levels).
+        Write output to file outfile (default is sys.stdout).
+        """
+        wrt = outfile.write
+        swrite_(element, 0, maxlevels, wrt)
+
+
+    def swrite_(element, indent, maxlevels, wrt):
+        indentstr = '    ' * indent
+        wrt('{}{}: {}\n'.format(indentstr, element.tag, repr(element), ))
+        for name, value in element.attrib.iteritems():
+            wrt('  {}* {}: {}\n'.format(indentstr, name, value, ))
+        indent += 1
+        if maxlevels is not None and indent > maxlevels:
+            return
+        for child in element.iterchildren():
+            swrite_(child, indent, maxlevels, wrt)
+
+
+Exploring element-specific API
+--------------------------------
+
+With ``lxml.objectify``, inspecting objects to determine the API for
+that specific element type is a frequent task.  You may find a
+function something like the following helpful::
+
+    Standard_attrs = set([ '__dict__', '__getattr__', 'addattr',
+        'countchildren', 'descendantpaths', '__class__', '__contains__',
+        '__copy__', '__deepcopy__', '__delattr__', '__delitem__',
+        '__doc__', '__format__', '__getattribute__', '__getitem__',
+        '__hash__', '__init__', '__iter__', '__len__', '__new__',
+        '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__',
+        '__reversed__', '__setattr__', '__setitem__', '__sizeof__',
+        '__str__', '__subclasshook__', '_init', 'addnext',
+        'addprevious', 'append', 'attrib', 'base', 'clear', 'extend',
+        'find', 'findall', 'findtext', 'get', 'getchildren',
+        'getiterator', 'getnext', 'getparent', 'getprevious',
+        'getroottree', 'index', 'insert', 'items', 'iter',
+        'iterancestors', 'iterchildren', 'iterdescendants', 'iterfind',
+        'itersiblings', 'itertext', 'keys', 'makeelement', 'nsmap',
+        'prefix', 'remove', 'replace', 'set', 'sourceline', 'tag',
+        'tail', 'text', 'values', 'xpath', ])
+
+    def members(element):
+        names = [attr for attr in dir(element) if attr not in Standard_attrs]
+        return names
+
+I obtained that list of ``Standard_attrs`` by doing ``print
+dir(element)`` on a standard element (and then modifying it a bit).
+
+However, instead of calling that ``members(o)`` function (above),
+the following snippet is likely just as useful::
+
+    In [96]: [child.tag for child in element.iterchildren()]
+    Out[96]: ['example1', 'name', 'interest', 'interest', 'category', 'hot.agent']
+    In [97]: 
+    In [97]: sorted([child.tag for child in element.iterchildren()])
+    Out[97]: ['category', 'example1', 'hot.agent', 'interest', 'interest', 'name']
+
+And, to save typing, the following functions might be helpful::
+
+    def children(element, tag=None):
+        """Return a list of children of an element.
+        Optional argument tag can be a single string or list of strings
+        to select only children with that tag name.
+        """
+        child_list = [child for child in element.iterchildren(tag=tag)]
+        return child_list
+
+    def child_tags(element, tag=None):
+        """Return a list of the tag names of the children of an element.
+        Optional argument tag can be a single string or list of strings
+        to select only children with that tag name.
+        """
+        tags = [child.tag for child in element.iterchildren(tag=tag)]
+        return tags
+
+Or, you may find this shallow dump function useful.  It uses
+``objectify.dump(o)``, but attempts to *only* return the description
+of the top level object::
+
+    def sdump(element):
+        content = objectify.dump(element)
+        content = content.splitlines()
+        prefix = '        '
+        content = [line for line in content if not line.startswith(prefix)]
+        content = '\n'.join(content)
+        return content
+
+
+Searching an XML document
+---------------------------
+
+``lxml.objectify`` has its own XPath-like search capability with a
+(possibly) simpler form of the XPath/XQuery language.  See this for
+information about ObjectPath: http://lxml.de/objectify.html#objectpath
+
+And, you can also use that lxml xpath on ``lxml.objectify``
+elements.  Example::
+
+    In [68]: root.xpath('.//@Name')
+    Out[68]: 
+    ['dataset1-1',
+     'dataset1-2',
+     'subgroup01',
+     'dataset2-1',
+     'dataset2-2',
+     'subgroup02',
+     'dataset3-1',
+     'dataset3-2',
+     'subgroup03',
+     'dataset3-3']
+
+See this for information about the ``lxml`` support for
+``xpath``: http://lxml.de/xpathxslt.html.  And, see this for
+information about the XPath path language:
+
+- http://www.w3.org/TR/2014/REC-xpath-30-20140408/#unabbrev
+- http://www.w3.org/TR/2014/REC-xpath-30-20140408/#abbrev
+
+
+Sample applications with lxml.objectify
+==========================================
+
+1. Here is a sample application that parses and displays weather
+   information from an XML document: `weather_test.py
+   <Objectify_files/weather_test.py>`_.
+
+2. This sample application picks data out of an XML document that
+   was generated with ``h5dump``.  For example::
+
+       $ h5dump -x my_data.hdf5 > my_data.hdf5.xml
+
+   This sample application attempts to create a new hdf5 data file from that XML
+   document.  The code is here:
+   `obj_hdf_xml.py <Objectify_files/obj_hdf_xml.py>`_
+
+   Here is more information about HDF5:
+
+   - http://www.hdfgroup.org/
+   - http://docs.h5py.org/en/latest/index.html -- HDF5 for Python
+
+3. Here are several small applications that pick data out of files
+   related to Vcloud.  I've included the Python code, a sample XML
+   file, and a dump of the XML file produced by
+   ``objectify.dump(root)``.  The code is here:
+   `vcloud_samples.zip <Objectify_files/vcloud_samples.zip>`_  And, you can learn
+   more about Vcloud here:
+   http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/about.html
+
+
+Evaluation and comparison -- lxml.objectify vs. generateDS.py
+===============================================================
+
+API discovery
+---------------
+
+``generateDS.py`` generates a class for each ``xs:complexType``.
+Therefore, there is Python code that you can inspect to determine
+the (generated) API, for example, getters, setters, constructor,
+export function, etc.  In order to do that, you will need to
+identify which generated class is the implementation for the element
+in which you are interested.
+
+``lxml.objectify`` objects can be inspected using
+``objectify.dump(o)`` or one of the helper functions described in
+this document in section `Useful tips and hints`_.  In order to
+perform this inspection, you must get access to an object of the
+type that you want to inspect.  Here are several ways to do that
+(and you may think of others):
+
+- Drop into the Python debugger by placing this code in your
+  application where you have access to an object of the type you are
+  interested in::
+
+      import pdb
+      pdb.set_trace()
+
+  Or, if you have installed ``ipython`` and ``ipdb``, use::
+
+      import ipdb
+      ipdb.set_trace()
+
+  ``ipdb`` gives you tab completion for names available in the
+  current scope.
+
+- Parse and dump an XML instance document (using
+  ``objectify.dump(el)``), capture it in a file, then look for the
+  element of interest with your text editor.  Here is a simple
+  utility script to help do that::
+
+      #!/usr/bin/env python
+
+      import sys
+      from lxml import objectify
+
+      def dump(infilename):
+          doc = objectify.parse(infilename)
+          root = doc.getroot()
+          print objectify.dump(root)
+
+      def main():
+          args = sys.argv[1:]
+          infilename = args[0]
+          dump(infilename)
+
+      if __name__ == '__main__':
+          main()
+
+- Insert the the following code in your application at some point
+  where it will have access to the element whose API you wish to
+  discover::
+
+      print objectify.dump(element)
+
+  Or, if stdout (standard output) is not available and visible to
+  you, something like the following::
+
+      import tempfile
+
+      with tempfile.NamedTemporaryFile('w', delete=False) as outfile:
+          outfile.write(objectify.dump(element))
+          outfilename = outfile.name
+
+- Or, use one of the helpers above, for example::
+
+      print objectify_helpers.child_tags(element)
+
+
+Namespaces
+------------
+
+``lxml.objectify`` handles namespaces correctly; ``generateDS.py``,
+especially when there are multiple namespaces in the same XML
+document, does not.
+
+Mostly, ``lxml.objectify`` handles namespaces for you without
+additional effort on your part.  If you are working with an element
+that contains items from different namespaces, then see this:
+http://lxml.de/objectify.html#namespace-handling.  Sometimes, when
+you use ``getattr(el, 'xxx')`` or el.iterchildren(tag='xxx'), you
+will need to include the namespace.  Examples::
+
+    In [15]: rootgroup = root.RootGroup 
+    In [16]: rootgroup.Group.tag
+    Out[16]: '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group'
+    In [17]: [el.tag for el in rootgroup.iterchildren(tag="{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group")]
+    Out[17]: 
+    ['{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group',
+     '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group',
+     '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group']
+
+and::
+
+    In [24]: rootgroup.Dataset 
+    Out[24]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset at 0x7f0293b65c68>
+    In [25]: getattr(rootgroup, "{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset")
+    Out[25]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset at 0x7f0293b65c68>
+
+
+Summary
+---------
+
+Although their approaches are very different, ``generateDS.py`` and
+``lxml.objectify`` seem to solve the same set of problems and answer
+equivalent sets of needs.  ``generateDS.py`` generates and gives you
+an API for each element type, specifically a Python class.  With
+``lxml.objectify``, you can discover a (simulated) API by inspecting
+a dump produced by ``lxml.objectify.dump(o)`` or by using
+``lxml.objectify`` and ``lxml`` capabilities in each element to
+inspect the element.
+
+When might you want to use one rather than the other?
+
+- Since ``generateDS.py`` requires an XML schema in order to
+  generate code, if you do *not* have an XML schema for your
+  document type, then ``generateDS.py`` is not an option for you.
+
+- If you must handle an XML document that is defined by an XML
+  schema that contains multiple namespaces, then, because of the
+  problems that ``generateDS.py`` has with namespaces, you should
+  choose ``lxml.objectify``.
+
+- If you want to produce Python code that defines and implements an
+  API for a specific XML document type and you have an XML schema
+  that defines that document type, then you may want to consider
+  ``generateDS.py``.  If you want to be able to send that generated
+  API for use by other developers, then the ``generateDS.py``
+  approach might be an advantage to you.  However, the content
+  produced by ``lxml.objectify.dump(o)`` is very close to a
+  description of an API for accessing an manipulating each element
+  in an XML document.
diff --git a/MANIFEST.in b/MANIFEST.in
index 475b8d2..268eadd 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,6 +1,7 @@
 include README LICENSE MANIFEST.in
 include setup.py
 include generateDS.py
+include generateds_config.py
 include generateDS.txt
 include django/gends_run_gen_django.py
 include django/gends_extract_simple_types.py
@@ -10,6 +11,8 @@ include process_includes.py
 include generate_coverage.py
 include generateDS.html
 include gends_user_methods.py
+include generateds_gui_notes.txt
+include generateds_gui_notes.html
 include Demos/People/people.xsd
 include Demos/People/people.xml
 include Demos/People/run_test
@@ -77,14 +80,47 @@ include tests/people_procincl_b.xsd
 include tests/abstract_type.xsd
 include tests/abstract_type1_sup.py tests/abstract_type1_sub.py
 include tests/abstract_type2_sup.py tests/abstract_type2_sub.py
-
 include tests/simpletypes_other.xsd
-include tests/simpletypes_other1_sup.py tests/simpletypes1_other_sub.py
-include tests/simpletypes_other2_sup.py tests/simpletypes_other2_sub.py
-
+include tests/simpletypes_other1_sub.py tests/simpletypes1_other_sup.py
+include tests/simpletypes_other2_sub.py tests/simpletypes_other2_sup.py
 include tests/attr_groups.xsd
 include tests/attr_groups1_sup.py tests/attr_groups1_sub.py
 include tests/attr_groups2_sup.py tests/attr_groups2_sub.py
+include tests/oneper00.xsd tests/oneper01.xsd tests/oneper02.xsd
+include tests/OnePer/oneperType0?_?One.py
+include tests/anonymous_type.xsd
+include tests/anonymous_type1_sub.py tests/anonymous_type1_sup.py
+include tests/anonymous_type2_sub.py tests/anonymous_type2_sup.py
+include tests/catalog.xml tests/catalogtest.xsd
+include tests/catalogtest1_sub.py tests/catalogtest1_sup.py
+include tests/catalogtest2_sub.py tests/catalogtest2_sup.py
+include tests/to_etree.xsd tests/to_etree.xml
+include tests/to_etree1.xml tests/to_etree2.xml
+include tests/to_etree1_sub.py tests/to_etree1_sup.py
+include tests/to_etree2_sub.py tests/to_etree2_sup.py
+include tests/defaults_cases1_out.xml  tests/defaults_cases.xsd
+include tests/defaults_cases1_sub.py   tests/defaults_coverage1_sub.py
+include tests/defaults_cases1_sup.py   tests/defaults_coverage1_sup.py
+include tests/defaults_cases.xml       tests/defaults_coverage.xsd
+include tests/address.xsd
+include tests/cdata1_sub.py tests/cdata1_sup.py
+include tests/cdata1.xml tests/cdata.xsd
+include tests/cleanupname1_sub.py tests/cleanupname1_sup.py
+include tests/cleanupname.xsd
+include tests/groups.xml tests/groups.xsd
+include tests/mapcleanname1_sub.py tests/mapcleanname1_sup.py
+include tests/mapcleanname.xsd
+include tests/nested_def1_out.xml
+include tests/nested_def.xml tests/nested_def.xsd
+include tests/nested_def1_sub.py tests/nested_def1_sup.py
+include tests/prefix_classname1_out.xml
+include tests/prefix_classname1_sub.py tests/prefix_classname1_sup.py
+include tests/prefix_classname.xml tests/prefix_classname.xsd
+include tests/validate_simpletypes1_out.xml
+include tests/validate_simpletypes1_sub.py tests/validate_simpletypes1_sup.py
+include tests/validate_simpletypes1_warnings.txt
+include tests/validate_simpletypes2_sub.py tests/validate_simpletypes2_sup.py
+include tests/validate_simpletypes.xml tests/validate_simpletypes.xsd
 
 include gui/generateds_gui.py
 include gui/generateds_gui.glade
diff --git a/README b/README
index 4b90418..3c2805e 100644
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
-         ================================================
-         generateDS.py -- Generate Python Data Structures
-         ================================================
+================================================
+generateDS.py -- Generate Python Data Structures
+================================================
 
 ----------
 What is it
@@ -141,7 +141,389 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
-Version 2.11b (08/19/2013)
+Version 2.24b (01/02/2017)
+
+- Added several fixes to generateDS.py and process_includes.py that
+  are needed for the support for Python 3.  Thank you Ian Glover for
+  catching this and for contributing the fixes.
+- Fixed bug in generation of regular expression for validating
+  pattern in a restriction on a simpleType.  In the pattern, we
+  needed to replace "|" with "$|^", unless the vertical bar was
+  escaped with a backslash.  This was necessary so that each regular
+  expression separated by a vertical bar would be anchored at the
+  left and right.  Thanks to Clint Pitzak for catching and reporting
+  this.
+- Modified the Django support (in ./django/) so that it will run
+  under Python 3.  Thanks to Shane Rigby for reporting this problem.
+- Fixed an error in encoding unicode valueOf_ for  <xs:complexType 
+  <xs:simpleContent> <xs:extension base="xs:string">.  Thanks to
+  Andrii Iudin for catching this.
+
+Version 2.24a (11/16/2016)
+
+- Added entry_points to setup.py so that distutils will generate
+  executable scripts for executable .py files (for example,
+  generateDS.py and process_includes.py).  Thanks to Michael Jenny
+  for suggesting this and for showing the way to do it.
+- Fixed function call signature mismatch in MixedContainer call to
+  export method.  Thanks to Lev Israel for catching this and
+  providing the solution.
+- Added "remove duplicate elements" fix to catch duplicate
+  definitions of child elements with the same name inside a single
+  parent element.  This fix does the following: (1) removes
+  duplicate child; (2) makes the remaining child a Python list
+  (effectively maxOccurs="unbounded"); (3) prints a warning message
+  when it finds and removes a duplicate.  Thanks to Pietro Saccardi
+  for catching and reporting this.
+- More fixes for "remove duplicate elements".
+- Removed command line option for "remove duplicate elements".  This
+  behavior will now always be performed.
+- Added unit test for "remove duplicate elements".
+- Added command line option "--no-warnings" to turn off warning
+  messages.  I needed it for the unit test for "remove duplicate
+  elements".
+
+Version 2.23b (09/26/2016)
+
+- Added missing unit test files to build (MANIFEST.in).
+- Fixed exception that occurs when character content is empty for an
+  element defined as type xs:token.  Thanks to Andrii Iudin for
+  reporting and checking this.
+
+Version 2.23a (09/14/2016)
+
+- Integrated Clayton Daley's fixes to the unit tests.  Thanks much,
+  Clayton.
+- Clayton's fixes to the unit tests uncovered several errors that
+  had been masked and hidden.  Fixed those errors, for example: (1)
+  eliminated generation of erroneous call to validation method; (2)
+  added catalog file.
+
+Version 2.22c (04/26/2016)
+
+- Fixes to generation of validation methods for xs:date, xs:time,
+  and xs:dateTime simpleType.  Thanks to Andrii Iudin for reporting
+  this and for suggesting a solution.
+- Added additional unit tests for validations of xs:date, xs:time,
+  and xs:dateTime simpleType.
+
+Version 2.22b (04/20/2016)
+
+- Fixed endless recursion that occurred while attempting to replace
+  attribute group names.  Thanks to Bing Wang for reporting this and
+  for identifying and providing the XML schema that reproduced it.
+- Fixed failure to clean up names containing special characters in
+  function generateBuildStandard_1.  This error was uncovered
+  when generating code from Bing Wang's schema.  Thanks again Bing.
+
+Version 2.22a (04/11/2016)
+
+- Added support for additional command line options to
+  generateds_gui.py.  Added analogous support to generateDS.py for
+  use of session files produced by generateds_gui.py.
+- There is now a bit of documentation with a few usage notes on
+  generateds_gui.py.  See generateds_gui_notes.txt and
+  generateds_gui_notes.html.
+
+Version 2.21a (04/01/2016)
+
+- The GUI (graphical) front end to generateDS.py has been
+  resuscitated and is now working again thanks to Aleksandr
+  Dragunkin.  
+  The GUI front end must be run under Python 3, and you must install
+  Python support for Gtk.
+  Aleksandr has also provided a Russian translation of the labels
+  etc in the user interface.  You can run that with:
+
+      $ cd /path/to/generateds/gui
+      $ python3 generateds_gui.py --impl-gui=generateds_gui_ru.glade
+
+  Note that the GUI interface still lacks support for a few of the
+  command line options that were added most recently to
+  generateDS.py.  If you need one or more of those missing options
+  but would still like to use the GUI front end, you can consider
+  using the "Capture CL" under the Tools menu, and then copy and
+  paste the result into a shell script, add any needed options to
+  that script, and run the script from the command line.
+
+
+Version 2.20b (03/28/2016)
+
+- Fixes to handling of simpleType with and without restrictions on
+  another defined simpleType.  These were not being handled
+  correctly when the name of the simpleType contained a dash.
+  Thanks to Ryku for identifying this problem and for a very helpful
+  description of what was wrong and for providing schemas to
+  reproduce the problem.
+
+Version 2.20a (02/25/2016)
+
+- Another patch for Python 2 and 3.  We needed to protect against
+  performing an encoding that caused an exception in generateDS.py
+  and process_includes.py.  Thanks to Marcus Schäfer for catching
+  this and for providing a fix.
+
+Version 2.19b (02/16/2016)
+
+- Modified generated code so that it will run under both Python 2
+  and Python 3.  There is no longer any need to generate different
+  code for Python 2 and Python 3.  If fact, the "--py3" command line
+  option has been removed.
+
+Version 2.19a (02/08/2016)
+
+- Added the ability to generate code that can run under Python 3.
+  Use the "--py3" command line option.  Note that if you generate
+  code for Python 2 (the default), then you must run that generated
+  code under Python 2.  And, if you generate code for Python 3,
+  then you must run that generated code under Python 3.  There is
+  currently no way to generate code that will run under both Python
+  2 and Python 3.
+- Modifications so that generateDS.py itself can be run with either
+  Python 2 or Python 3.
+- Fixed the template (TEMPLATE_HEADER) so that it uses the format
+  function and keyword arguments.
+- Added info on --py3 command line option to doc (generateDS.txt).
+- Added new script (fix_subclass_refs.py) that can be used to fix-up
+  (change) which subclass file (of two or more that were generated
+  with the -s command line option) is used by the superclass file
+  when parsing an XML instance document.  This will enable you to
+  use the -s option to generate multiple subclass files, add
+  different code to each of them, and then parse documents and
+  create instances of classes from one then another during the same
+  run.  But also, see next item.
+- Added generation of code to lookup the subclass of a generated
+  class using a global variable containing the subclass module.
+  This provides an alternative and more convenient way to do the
+  above (i.e., use fix_subclass_refs.py to select from multiple
+  subclass files generated with the -s command line option).
+  However, there may be tasks that can be performed with that script
+  or a modified version of it that cannot be done with this approach
+  using a global variable.  Here is a sample script that uses this
+  option:
+
+      import tmp01suba
+      import tmp01subb
+      def test():
+          tmp01suba.supermod.CurrentSubclassModule_ = tmp01suba
+          roota = tmp01suba.parse('test01.xml', silence=True)
+          tmp01subb.supermod.CurrentSubclassModule_ = tmp01subb
+          rootb = tmp01subb.parse('test01.xml', silence=True)
+          roota.show()
+          print '-' * 50
+          rootb.show()
+      test()
+
+Version 2.18a (12/16/2015)
+
+- Fixed quoting of simpleContent so that, e.g., "&amp;" is exported
+  as "&amp;" and not as "&".  Thanks to Ardan Patwardha for
+  reporting this and contributing a fix.
+- Fix to generation of exportAttributes so that the test for already
+  generated is properly quoted.  Thanks to Naresh Shenoy for
+  reporting this and for contributing a fix.
+- Another fix related to the unquoted constant in exportAttributes.
+  A simple fix had a bad conflict.  Thanks to Christian Rasmussen
+  for focusing my attention on this one.
+- Fix for xs:simpleContent that extends type xs:float (or xs:integer
+  or other numeric types).  When set to numeric zero (for example,
+  after parsing the instance doc), the value was not being exported.
+  Thanks to Ardan Patwardhan for diagnosing this and for
+  contributing the fix.
+
+Version 2.17a (08/17/2015)
+
+- Modified setup.py so that process_includes.py is installed where
+  it can be imported.
+- Changed default settings for export -- Default is now to generate
+  only the normal export methods, instead of both normal and
+  literal.  See command line option --export.
+- Fix to regex pattern used to capture "<![CDATA[ ... ]]>".  The old
+  pattern was dropping ending characters when the content contained
+  HTML/XML markup.  Thanks to Adrian Cook for this fix.
+- Merged use of replacement patterns in cleanupName. With this fix
+  users can specify patterns to look for and replacements strings to
+  be used to clean up special characters and other patterns in
+  names.  There are some notes in the document; search for
+  "cleanup-name" in generateDS.html.  Thanks to Fedor Tyurin for
+  suggesting and implementing this enhancement.
+- Added unit test for enhanced cleanupName.  Added documentation to
+  generateDS.txt.
+
+Version 2.16a (05/28/2015)
+
+- Added new command line option ("--preserve-cdata-tags") that
+  causes generation of code that contains a special parser to retain
+  CDATA tags.  Thanks to Adrian Cook for reporting this, for
+  providing test data and test cases, and for help with testing and
+  feed-back.
+- Added ability for user to specify the names of classes generated
+  from anonymous, nested xs:complexType definitions, rather than
+  accept the names created in process_includes.py.
+- Added a unit test for the anonymous, nested definition capability.
+- Fix to error caused by check (in generated code) for whether lxml
+  or ElementTree is being used.  We no longer support use of
+  ElementTree.  Thanks to Emil Nordling for catching and reporting
+  this.
+
+Version 2.15b (04/07/2015)
+
+- Fix to generation of simpleType validation code for list (unbounded)
+  elements.  Thanks to wobanator for this fix.
+- Fix to code for --one-file-per-xsd.  Added check to avoid an
+  infinite loop schemas not suitable to --one-file-per-xsd.  Thanks
+  Michael Vezie for catching this and for identifying relevant
+  location in the code.  And, thanks to George David for providing a
+  better fix than mine.
+- Enhancement so that child elements defined with a default value
+  will not export when the current value and the default value are
+  the same.  Also added equivalent changes for attributes.  Thanks
+  to Jan Biel for finding and reporting this.
+- Added unit tests for the above default value enhancement.
+
+Version 2.15a (02/18/2015)
+
+- Modifications so that we generate code that can be used by Python 3.
+  Thanks much to Richard Gerkin for this work.
+- Removed possible use of ElementTree.  Lxml is now a requirement
+  for both running generateDS.py itself and for running the
+  generated code.
+- Fixed exporting of text content so that, when it contains CDATA
+  sections, the mark-up characters inside the CDATA sections are not
+  escaped.  Thanks to George David for reporting this and for
+  helping with a fix.
+
+Version 2.14a (11/26/2014)
+
+- Fixed export of simpleType lists (added "' '.join(data)".  Thanks
+  to Per Rosengren for catching this.
+- Added new style validation of simpleType data.  Validation
+  requirements are captured from the XML schema definition of the
+  simpleType, e.g. 'restriction base="..."' etc.  Thanks to
+  azer gh for implementing much of this extended capability.
+- Added unit test for simpleType validation, including test for
+  proper detection of bad (invalid) data.
+- Did some code cleanup with the help of the flake8 code checker.
+- Added a fix so that attribute declarations that use ref= rather
+  than type= will also be generated with the specific type.  Thanks
+  to Florian Wilmshoever for catching and reporting this and for
+  providing an XML schema as a test case.
+- Added unit test for reference to simpleType.
+- Fix to generation of names of substitutionGroup.  The namespace
+  prefix was not being stripped in some cases.
+
+Version 2.13a (09/09/2014)
+
+- Minor fix to function generateToEtreeChildren.  Must generate
+  call to get_valueOf only when defined (i.e. when element is
+  simpleContent or isMixed).
+- Fix to generation of class name prefixes added with the "-p"
+  command line option.  This fix was added by Christian Ascheberg.
+  Thank you Christian.
+- Added unit test for class name prefixes command line option.
+
+Version 2.12f (08/12/2014)
+
+- Fix for substitutionGroup conflict with keyword name mapping.
+  Thanks to Leonid Minchin for finding and helping with this
+  problem.
+- An exception occured when an element had a documentation string
+  that was short (possibly 1 character).  Fixed.  Thanks to Matthias
+  Zaake for finding this and for providing a patch.
+
+Version 2.12e (06/16/2014)
+
+- Fix for formatting error.  Thanks to Nikolay Lavrov for catching
+  this and for providing a fix.
+- Fix to gds_parse_datetime().  The Python datetime module's
+  datetime object uses microseconds, but xs:dateTime uses fractions
+  of a second (e.g. 0.123).  Converted from decimal fraction to
+  microseconds.  Thanks to Mikki Weesenaar for catching this.
+- Modified behavior and names for generated method insert_xxx(which
+  are generated when, e.g., maxOccurs="unbounded"), so that now we
+  generate insert_xxx_at and replace_xxx_at.  Thanks to Bart
+  Wagenaar for pointing out this deviation from Pythonic style.
+- Function transitiveClosure in generateDS.py was susceptible to
+  infinite looping.  This seemed to occur when a substitutionGroup
+  contains a member with the same name as the head of the
+  substitutionGroup (but in a different namespace?).  Added a test
+  to stop the recursion when this occurs.  Thanks to Stuart Chalk
+  for finding and reporting this.
+- Added explanation to the documentation explaining how the source                  
+  distribution (generateDS-x.xxy.tar.gz or Bitbucket) is needed for                 
+  use of the Django model generation capability.                                    
+
+Version 2.12d (04/02/2014)
+
+- Fix for an infinite loop caused by inconsistent use of
+  mapped/clean names with list AlreadyGenerated.  Thanks to Jerome
+  Allasia for catching this and for suggesting a fix.
+- Added a unit test for the use of mapped/clean names, in particular
+  when one xs:complexType is an xs:extension of another.
+- Changed several lists to sets for faster look-up, for example
+  AlreadyGenerated, AlreadyGenerated_subclass, DelayedElements, etc.
+- Cleaned up the use of functions mapName() and cleanupName() to
+  avoid duplicate transformations.
+
+Version 2.12c (03/28/2014)
+
+- Fix for "one module per XSD file" to handle an include or import
+  element that refers to a *remote* schema on the Net (i.e. the
+  location is "http:..." or "ftp:...") rather than a file on the
+  local file system.  Added ability to access include/import file
+  across the Net.  Thanks to Jinquan Liu for reporting this.
+- Added schema to unit test for "one module per XSD file" that is
+  read from remote site (http://www.davekuhlman.org).
+- Fix to process_includes.py -- When run directly from the command
+  line (as opposed to imported and called from another python
+  module), the fixtypenames option was not being intialized.
+- Fix for error in order of generation of classes that have
+  superclasses.  When an anonymous simpleType occured, the name of
+  the enclosing complexType was used, which caused generateDS.py to
+  believe that the superclass had already been generated.  Thanks
+  again to Jinquan Liu for reporting this issue.
+- Fix for handling of xs:substitutionGroup -- Namespace prefix was
+  causing gDS to fail to match on substitutionGroup name.
+- Added code so that an instance of a generated class can remember
+  the tag from which it was built.  This is needed for instances of
+  a class that represents an element type that is a member of a
+  xs:substitutionGroup.  But, in fact, generated code now uses this
+  feature to remember and export the tag name of all complex
+  elements.
+- Enhanced command line option --root-element so that both the root
+  tag and the root class can be specified (separated by a vertical
+  bar).
+- Added support for the ability of an element definition to inherit
+  minOccurs and maxOccurs from the xs:sequence that contains it.
+- The command line options and command line arguments used to
+  generate modules are now included as comments near the top of the
+  generated modules.  Also included in these generated comments is
+  the command line used to generate the module.  This will help
+  users later to determine which XML schema and what options were
+  used to generate each module, and to re-generate the module, if
+  needed.  Thanks to Mikki Weesenaar for suggesting this
+  enhancement.
+
+Version 2.12b (02/10/2014)
+
+- Fix to the aliasing capability.  You should now be able to alias
+  one element to another, and by doing so, only generate the
+  targeted alias.  See notes on generateds_config.py in the
+  documentation for more on this.  Thanks to Mikki Weesenaar for
+  bring up the use case that needed this.
+- Additional fixes for the "one module per XSD file".  Also,
+  creation of a unit test for this capability.  See section "One
+  Per -- generating separate files from imported/included schemas"
+  in the documentation for more information.  Thanks again to
+  George David for all his work on this.
+- Fixes to process_includes.py -- Some uses of namespace prefix xs:
+  were hard-coded, whereas some XML schemas use xsd: instead of xs:.
+- Various fixes to unit tests so that all unit tests pass when using
+  either the cloned Mercurial repository at Bitbucket
+  (https://bitbucket.org/dkuhlman/generateds) or the tar achive.
+
+Version 2.12a (10/29/2013)
+
 - A name conflict issue caused by naming anonymous types.  An
   anonymous type is a complexType that does not have a name
   attribute and that is nested inside an element that does not have
@@ -154,8 +536,19 @@ Version 2.11b (08/19/2013)
   there are name conflicts in your XML schema, for example, because
   the schema refers to two types with the same name but in different
   namespaces.
+- Ability added to generate one Python module for each XML Schema
+  (.xsd file) imported/included.  Added command line options
+  --one-file-per-xsd, --output-directory=, and --module--suffix= in
+  support of this.  Thanks much to George David for implementing
+  this new feature.
+- This change provided by Logan Owen. -- Return self from build
+  function of generated classes, to allow easy chaining.  The main
+  use case for this change is if you have a list of xml documents,
+  and you want to change them into generateDS class instances.
+  Thank you Logan.
 
 Version 2.11a (08/16/2013)
+
 - Added ability to use XML catalog to find included/imported
   schemas.  The -c command line option has been added to support
   this.  Thanks to George David for implementing this enhancement.
@@ -173,12 +566,15 @@ Version 2.11a (08/16/2013)
   Thanks to Rinat Yangurazov for catching this.
 
 Version 2.10b (07/22/2013)
+
 - Changed flag for generating getters and setters.  Removed flag
   --use-old-getter-setter.  Replaced it with new flag
   --use-getter-setter, which can have the following values:
+
      "old" - Name getters/setters getVar()/setVar().
      "new" - Name getters/setters get_var()/set_var().
      "none" - Do not generate getter/setter methods.
+
   The default is "new".  See the help (use --help option) or see the
   doc (generateDS.txt/generateDS.html) for more on this.  Thanks to
   Mike Vella for suggesting this.
@@ -186,6 +582,7 @@ Version 2.10b (07/22/2013)
   from "xx" to "_".
 
 Version 2.10a (05/29/2013)
+
 - Added ability to produce mapping (a dict) during call to
   to_etree() that maps gDS instances to their associated etree
   elements.  Also added convenience method gds_reverse_node_mapping
@@ -226,6 +623,7 @@ Version 2.10a (05/29/2013)
   by gDS.
 
 Version 2.9a (02/21/2013)
+
 - Added support for exporting to an Lxml element tree.  The element
   tree can then be serialized to XML, e.g. using Lxml
   etree.tostring().  This innovation is by Logan Owen, who also did
@@ -257,11 +655,13 @@ Version 2.9a (02/21/2013)
   particular, support for xs:anyAttribute).
 
 Version 2.8c (provisional) (01/30/2013)
+
 - Changed generated check for attributes that are already_processed
   to use a set object rather than a list.  Since sets are hashed, I
   believe that lookup is faster.
 
 Version 2.8b (01/30/2013)
+
 - Fixed missing underscore in reference to member names in
   generateExportLiteralFn_2.  Thanks to Sergii Chernysh for
   reporting this.
@@ -278,6 +678,7 @@ Version 2.8b (01/30/2013)
   https://bitbucket.org/dkuhlman/generateds
 
 Version 2.8a (01/10/2013)
+
   * Fix to process_includes.py so as to remove the limitation on the
     number of unique names it can generate when raising anonymous
     types to the top level.  Thanks to Daniel Browne for help with
@@ -318,6 +719,7 @@ Version 2.8a (01/10/2013)
     Browne for catching this.
 
 Version 2.7c (08/06/2012)
+
   * Added xs:hexBinary to the list of string types in generateDS.py
     and django/generatedssuper.py.  Effectively, we are generating
     the same code for types xs:base64Binary and xs:hexBinary.  That
@@ -337,6 +739,7 @@ Version 2.7c (08/06/2012)
     it; see section titled "Exporting compact XML documents".
 
 Version 2.7b (12/10/2011)
+
   * Fix for xs:any in buildChildren in an element defined with no
     other children so that we do not generate "else:" clause without
     an "if ...:".  Thanks to Keith Robertson for help with this.
@@ -349,6 +752,7 @@ Version 2.7b (12/10/2011)
   * Added xs:time to list of handled simple (date, time) types.
 
 Version 2.7a (11/04/2011)
+
   * Fix for case where a child is defined with a reference (ref="")
     to a complexType (rather than a simpleType) and the complexType
     is abstract.
@@ -357,6 +761,7 @@ Version 2.7a (11/04/2011)
   * Added unit test for xs:any.
 
 Version 2.6b (10/13/2011)
+
   * Fix for case where a child element is declared with a type that
     is a simpleType whose restriction base is another simpleType
     that is referred to with a namespace prefix.  With this fix we
@@ -393,6 +798,7 @@ Version 2.6b (10/13/2011)
     xs:anyURI and xs:duration.
 
 Version 2.6a (07/28/2011)
+
   * Fix to capture xs:/xsd:/etc namespace prefix from schema.  Was
     not setting global variable XsdNameSpace.  Thanks to Frank Liauw
     for focusing my attention on this one.
@@ -450,6 +856,7 @@ Version 2.6a (07/28/2011)
   * Added xs:byte to the list of integer types.
 
 Version 2.5a (06/06/2011)
+
   * Fix for generation of default value in parameters for the
     constructors.
   * Fix for lookup of attribute value in generated buildAttributes
@@ -474,6 +881,7 @@ Version 2.5a (06/06/2011)
     different directories.
 
 Version 2.4c (03/21/2011)
+
   * Added minimal support for unsignedLong, unsignedInt, and
     unsignedByte.
   * Made the retrieval of the parent (superclass) name and parent
@@ -497,12 +905,14 @@ Version 2.4c (03/21/2011)
     http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/#DerivByRestrict
 
 Version 2.4b (02/21/2011)
+
   * Fix to generation the superclass in the class statement header
     line.  Formerly we did not correctly pick-up the superclass
     name (from extension base="").  Thanks to Timo Sugliani for
     finding this bug.
 
 Version 2.4a (02/16/2011)
+
   * A few fixes to format of some error messages.
   * Clean-up names in the exportableClassList (__all__).
   * Modify reading session object/doc to use lxml instead of
@@ -530,6 +940,7 @@ Version 2.4a (02/16/2011)
     out this fix.
 
 Version 2.3b (12/28/2010)
+
   * Fix for simpleTypes defined as a restriction whose (ultimate)
     base type is a pre-defined simple type which were not generating
     correct (type-specific) code in build method.  Thanks to
@@ -538,12 +949,12 @@ Version 2.3b (12/28/2010)
     attribute where the type was not being recognized.
   * Fix so that we recognize some other simple types as xs:string
     type (e.g. xs:NMTOKEN, xs:ID, xs:Name).
-  * To do:
-    - If a simpleType is a restriction on another simpleType and
-      the base simpleType definition is declared as a list, we are
-      not recognizing that it is a list.
+  * To do -- If a simpleType is a restriction on another simpleType and
+    the base simpleType definition is declared as a list, we are
+    not recognizing that it is a list.
 
 Version 2.3a (12/02/2010)
+
   * Added generatation of code to handle attributes inherited by a
     restriction from its base type and the types that the base
     extends (i.e.  from a restriction base class and its
@@ -552,13 +963,16 @@ Version 2.3a (12/02/2010)
     a type that is an extension: special characters (e.g. dash)
     were not being cleaned/mapped.  Reported by Koen Smets; thanks.
   * To do:
+
     - In a restriction, inherited attributes can be "prohibited". 
       It would be nice if gDS would do something to block their
       use.
     - When:
+
           AbstractElement mixed=false and
           Element1 mixed=true base=AbstractElement and
           Element2 mixed=FALSE base=AbstractElement 
+
       Incorrect parse code is generated for Element2.
       Reported by Jaime Cepas.
     - It might be desirable if the getter functions could be asked
@@ -572,9 +986,10 @@ Version 2.3a (12/02/2010)
       excoding of Python code and of string literals (unicode, utf-8).
 
 Version 2.2b (11/10/2010)
+
   * Added generation of __all__ global variable containing a list
     of generated class names.  This enables you to do a reasonably
-    safe "from mymodule import *.  It's sorted, so it also gives
+    safe "from mymodule import \*".  It's sorted, so it also gives
     you something in the way of an alphabetical table of contents
     of the generated classes.  Thanks to Jaime Cepas for this.
   * Added another fix so that the generated code for mixed content
@@ -600,6 +1015,7 @@ Version 2.2b (11/10/2010)
     manually until I can figure out a fix.
 
 Version 2.2a (9/14/2010)
+
   * Changes for coding consistency -- Used wrt() pervasively
     instead of outfile.write().
   * Re-write of process_includes.py -- It now handles
@@ -617,9 +1033,11 @@ Version 2.2a (9/14/2010)
     maps the name "range" to "rangeType" so that if the schema defines
     a complexType "range", generateDS.py will generate a class named
     "rangeType":
+
         NameTable = {
             'range': 'rangeType',
             }
+
     See the doc for more on this.
   * Instead of using the lower() function from the string module,
     added a function to the GeneratedsSuper class and used the string
@@ -633,6 +1051,7 @@ Version 2.2a (9/14/2010)
     values.
         
 Version 2.1d (8/23/2010)
+
   * Fix to indentation of generated code in the build method for
     type checking of NonNegativeIntegerType.
   * Fix to generation parameters in call to superclass constructor. 
@@ -646,6 +1065,7 @@ Version 2.1d (8/23/2010)
     available during export.
 
 Version 2.1c (8/8/2010)
+
   * Fix to functions parse, parseString, and parseLiteral so that
     they start the build with the correct root class.  I believe
     that there yet is another case that this does not handle,
@@ -660,9 +1080,11 @@ Version 2.1c (8/8/2010)
     duplicate arguments.
   * Added a comment to the generated superclass module at the top
     that specifies the utf-8 source code encoding:
+
         # -*- coding: utf-8 -*- 
 
 Version 2.1b (8/2/2010)
+
   * Fix to generation of export functions.  If no children, must
     generate "pass" statement.
   * Changed generated get_all_text function so that it uses an "if"
@@ -671,15 +1093,18 @@ Version 2.1b (8/2/2010)
     Python.
 
 Version 2.1a (7/8/2010)
+
   * Added ability to capture annotation/documentation element text
     as doc-strings in the generated classes.  Thanks to
     Roy Williams for suggesting this and for guidance.
 
 Version 2.0b (6/24/2010)
+
   * Fix to generation of export method so that valueOf_ is exported
     when childCount == 0 and not isMixed.
 
 Version 2.0a (6/21/2010)
+
   * Switched to use of lxml/ElementTree in generated files. 
     Thanks to Biswanath Patel and Jaime Huerta Cepas for
     encouraging me to implement the switch to lxml/ElementTree.
@@ -687,7 +1112,7 @@ Version 2.0a (6/21/2010)
     and parseLiteral() so that they automatically recognize the
     root element of an instance XML document and call the build
     method of the appropriate class.
-  * Fix to hasContent_ method so that so that in elements defined
+  * Fix to hasContent_ method so that in elements defined
     with extension-base, the superclass is checked also.
   * For classes that must call an overridden method m in the
     superclass, switched to use "super(superclassname, self).m(...)"
@@ -699,10 +1124,12 @@ Version 2.0a (6/21/2010)
     imports (for example collada_schema_1_5.xsd).
 
 Version 1.20g (5/21/2010)
+
   * Update to documentation -- Added a section on suggested ways to
     handle/recognize different top level (root) elements.
 
 Version 1.20f (5/3/2010)
+
   * Fix to generation of export so that anyAttribute does not cause
     duplicate attributes to be exported.
   * Fix so that we do a better job of determining whether a
@@ -711,11 +1138,12 @@ Version 1.20f (5/3/2010)
   * Fix to generation of constructors so that (1) valueOf_ is
     intialized in subclass modules and (2) valueOf_ is initialized
     to None (rather than '').
-  To do: Extend the --root-element flag so that we can specify both
+  * To do: Extend the --root-element flag so that we can specify both
     the tag name and the element/type name.  Sometimes they are
     different.
 
 Version 1.20e (2/8/2010)
+
   * Fixed error that caused incorrect tag name to be exported
     when the tag name contains special characters and the tag name is
     different from the type name.
@@ -723,6 +1151,7 @@ Version 1.20e (2/8/2010)
     distribution file.
 
 Version 1.20d (2/3/2010)
+
   * Updated version number/info in genereateds_gui.py.
   * Fix to process_includes.py -- Handle include elements and
     import elements in the same way.  In particular, allow both to
@@ -736,6 +1165,7 @@ Version 1.20d (2/3/2010)
   * Added missing files in the tests/ directory to the distribution.
 
 Version 1.20c (1/1/2010)
+
   * Replaced symbolic links in the distribution with hard links. 
     Symbolic links do not work on MS Windows.
   * Fix to the use of the subprocess module in generateds_gui.py,
@@ -749,6 +1179,7 @@ Version 1.20c (1/1/2010)
     patch.  Also added a unit test for this case.
 
 Version 1.20b (12/14/2009)
+
   * Fix to process_includes.py so that it handles relative paths
     in include/import elements in the schema.
   * Various fixes and additions to the GUI front-end, e.g. added
@@ -765,6 +1196,7 @@ Version 1.20b (12/14/2009)
     See http://gensc.org).  Thank you, Erica.
   * generateDS.py can now generate bindings for the following
     (rather large) schemas:
+
     - gcdml -- Genomic Contextual Data Markup Language --
       See http://gensc.org
     - Collada -- 3D Asset Exchange Schema 1.5 -- See
@@ -775,10 +1207,12 @@ Version 1.20b (12/14/2009)
       http://www.fpml.org/
 
 Version 1.20a (12/01/2009)
+
   * Added first version of the GUI front-end.  See the generateDS
     doc (generateDS.html).
 
 Version 1.19a (10/21/2009)
+
   * Enhancement to the table of information generated in each class
     when the --member-specs=list|dict command line option is used. 
     For a complexType defined as a simpleType, we now generate a
@@ -786,9 +1220,12 @@ Version 1.19a (10/21/2009)
     name "valueOf_".  Thanks to Ryan Leslie for much help and
     guidance with these changes.
     Example:
+
         'valueOf_': MemberSpec_('valueOf_', [u'RelationType', 
             u'RelationType2', u'xs:string'], 0),
+
     Note the following incompatible changes:
+
       - _MemberSpec changed to MemberSpec_ -- We want avoid posible
         name conflicts, not make it "weakly hidden".  See the Python
         style guide for more on this
@@ -798,6 +1235,7 @@ Version 1.19a (10/21/2009)
         if the types is a list and the single type if not a list.
       - Method MemberSpec_.get_data_type_chain() is a new method that
         returns the entire list of data types.
+
     The new tutorial (see tutorial/tutorial.html in the
     distribution) has an example of the use of the MemberSpec
     feature.
@@ -810,6 +1248,7 @@ Version 1.19a (10/21/2009)
   * There is now a preliminary version of a tutorial.
 
 Version 1.18f (9/14/2009)
+
   * Fixes to process_includes.py from Mihai Ibanescu.  These fixes
     address namespace and namespace prefix problems for XML tree
     that is copied into a document.  Thanks Mihai.
@@ -829,6 +1268,7 @@ Version 1.18f (9/14/2009)
     Ryan Leslie.
 
 Version 1.18e (9/1/2009)
+
   * Added patch from Mihai Ibanescu which handles and expands
     groups.  Also added Mihai's unit test for groups.  Thank you,
     Mihai.
@@ -841,6 +1281,7 @@ Version 1.18e (9/1/2009)
     differences.  Thanks again to Mihai.
 
 Version 1.18d (8/26/2009)
+
   * Automatic detection of the namespace prefix used in the schema
     document.  Thanks to Mihai Ibanescu for this enhancement.
   * Fix to deal conflicts with generateDS's internal function
@@ -857,6 +1298,7 @@ Version 1.18d (8/26/2009)
     one element.  Thanks to Chris Allan for this fix.
 
 Version 1.18c (8/11/2009)
+
   * Small changes related to check for mixed content.
   * Enhancement to generation of hasContent_() method to check for items
     with maxOccurs > 1.
@@ -865,6 +1307,7 @@ Version 1.18c (8/11/2009)
     skipped when the element is mixed.
 
 Version 1.18b (7/29/2009)
+
   * Fix for exception with simpleType that is an extension of 
     another simpleType.
   * Change to mixed extension chain -- Will now generate class.
@@ -879,6 +1322,7 @@ Version 1.18b (7/29/2009)
     to stdout.
 
 Version 1.18a (7/14/2009)
+
   * Added command line flag --member-specs to generate the member
     specifications as described in "User Methods" section of the doc.
     The member specs can be a list or a dictionary.
@@ -888,6 +1332,7 @@ Version 1.18a (7/14/2009)
     generated by generateDS.py.
 
 Version 1.17d (7/2/2009)
+
   * Fix for generation of recursively defined simpleTypes, e.g.
     a simpleType defined as a restriction of another simpleType.
     (see fix_simpletype comment in generateDS.py)
@@ -896,6 +1341,7 @@ Version 1.17d (7/2/2009)
     correctly and fixed failure to initialize a local variable.
 
 Version 1.17c (6/24/2009)
+
   * Fix for error generating code for exporting related to
     simpleType.
   * Fix for syntax error in export of boolean types.
@@ -905,10 +1351,12 @@ Version 1.17c (6/24/2009)
     command line option is used.
 
 Version 1.17b (6/10/2009)
+
   * Fix so that generateDS.py will still work with Python 2.4. 
     Thanks to Dave Sugar for that.
 
 Version 1.17a (5/20/2009)
+
   * Modified export of children of type xs:string so that
     (1) if None, not exported and (2) if not None but an
     empty string, exported (example "<aa></aa>").
@@ -926,6 +1374,7 @@ Version 1.17a (5/20/2009)
     xs:string, xs:integer, etc.
 
 Version 1.16e (4/28/2009)
+
   * Eliminated generation of SAX parser.  I'm sure it no longer
     worked, anyway.
   * Fix to export of CDATA characters, provided by Kerim Mansour.
@@ -943,22 +1392,27 @@ Version 1.16e (4/28/2009)
     any more anyway.
 
 Version 1.16d (3/25/2009)
+
   * Fixes to generation of the exportLiteral functions.  We
     can now do exportLiteral, then import the resulting file 
     in Python.  See generated parseLiteral() for an example.
   * Added an additional parameter to the export() methods.
     Now, you can call export() as follows:
+
         rootObj.export(outfile, 0,
             namespacedef_='xmlns:abc="http://www.abc.com/namespacelo"')
+
     which will insert the namespace prefix definition in the
     exported root element.
   * Added new command line option --namespacedef= to specify
     the namespacedef_ to be passed in by the generated
     parse() and parseString() functions.  Example use:
+
         generateDS.py --namespacedef='xmlns:abc="http://www.abc.com/"'
             -o out.py myschema.xsd
 
 Version 1.16c (3/13/2009)
+
   * One more fix for abstract types -- When the implementation
     element/class for an abstract class exports itself, it adds
     the xsi:type="class_name" attribute.
@@ -970,10 +1424,12 @@ Version 1.16c (3/13/2009)
     attribute values.  Thanks to Kerim Mansour for help with this.
 
 Version 1.16b (3/9/2009)
+
   * Added support for restriction/list, i.e. a list of words
     separated by whitespace.
 
 Version 1.16a (2/16/2009)
+
   * Generated export methods now check for empty content and 
     write out <xx ... /> rather than <xx ...></xx> if empty.
   * All generated constructors (__init__()) now initialize
@@ -985,6 +1441,7 @@ Version 1.16a (2/16/2009)
     use of self.xxx rather than self.get_xxx().
 
 Version 1.15d (1/22/2009)
+
   * Fix to setup.py so that it also installs process_includes.py.
   * Enhancements to process_includes.py so that it can also
     retrieve included files via ftp and http.
@@ -992,19 +1449,23 @@ Version 1.15d (1/22/2009)
   * The above changes are all from Arne Grimstrup.  Thank you Arne.
 
 Version 1.15c (11/26/2008)
+
   * Added switch (--silence) to cause generateDS.py to generate
     parsing functions that do not write output to stdout.  This fix
     contributed by Al Niessner.
 
 Version 1.15b (11/24/2008)
+
   * Added Amnon Janiv's fixes for attribute groups and for logging.
 
 Version 1.15a (11/20/2008)
+
   * Added support for abstract elements/types.  See:
     http://www.w3.org/TR/xmlschema-0/#abstract
     Thanks to Luigi Paioro for help with this.
 
 Version 1.14g (10/17/2008)
+
   * Fix in generation of exportChildren (omitted "_" in "namespace".
 
 Version 1.14f (10/06/2008)
@@ -1224,9 +1685,10 @@ Version 1.7b (11/15/04)
     the root.
 
 Version 1.7a (10/28/04)
-  Thanks very much to Lloyd Kvam for help with these fixes and
-  improvements.  His ideas, suggestions, and work have been
-  extremely valuable.
+
+  * Thanks very much to Lloyd Kvam for help with these fixes and
+    improvements.  His ideas, suggestions, and work have been
+    extremely valuable.
   * Implementd partial support for <xsd:extension base="">.
     Limitation: extension elements cannot override members
     defined in a base.
@@ -1241,6 +1703,7 @@ Version 1.7a (10/28/04)
     maxOccurs given a value other than "1" or "unbounded".
 
 Version 1.6d (10/1/04)
+
   * Several bug fixes.
   * Added command-line flag --subclass-suffix="X".  Changes the
     suffix appended to the class name in subclass files.  Default
@@ -1260,6 +1723,7 @@ Version 1.6d (10/1/04)
     nested.
 
 Version 1.6c (9/15/04)
+
   * generateDS.py was not walking lower levels of the tree data
     structure collected by the SAX parser that describes the
     classes to be generated.  Now, function generate() calls
@@ -1274,6 +1738,7 @@ Version 1.6c (9/15/04)
     build(), etc.
 
 Version 1.6b (9/10/04, yet again)
+
   * Still fixing bug related to generating all the sub-class
     stubs.  All sub-classes were not being generated when no
     superclasses were generated (-o flag omitted), because there
@@ -1283,10 +1748,12 @@ Version 1.6b (9/10/04, yet again)
     temp file if they are not requested.
 
 Version 1.6b (8/26/04, again)
+
   * Fixed bug -- complexTypes defined in-line were omitted from the
     sub-class file.  Now these sub-classes are being generated.
 
 Version 1.6b (8/18/04)
+
   * Added ability to access the text content of elements that are
     defined but have *no* nested elements.  The member variable is
     "valueOf_" (note underscore which will hopefully avoid name
@@ -1385,6 +1852,7 @@ Version 1.2a (again, 5/16/03)
   * Fixed error in code generation for float values.
   * Added very simple unit tests in tests directory.  Can be run
     with:
+
         cd tests
         python test.py
 
@@ -1423,6 +1891,5 @@ The following enhancements and fixes remain to be done:
 
 
 Dave Kuhlman
-dkuhlman@pacbell.net
+dkuhlman@davekuhlman.org
 http://www.davekuhlman.org
-
diff --git a/build_dist b/build_dist
new file mode 100755
index 0000000..a78242e
--- /dev/null
+++ b/build_dist
@@ -0,0 +1,15 @@
+#!/bin/sh -v
+#cp ../Xslt/xsltvsgenerateds/xsltvsgenerateds.css .
+#cp ../Xslt/xsltvsgenerateds/xsltvsgenerateds.html .
+#rst2html.py --source-url=generateDS.txt --generator \
+#    --stylesheet-path=/home/dkuhlman/bin/dave_docutils.css \
+#    generateDS.txt generateDS.html
+generate generateDS.txt
+generate librarytemplate_howto.txt
+generate generateds_gui_notes.txt
+cd tutorial
+generate generateds_tutorial.txt
+zip -f generateds_tutorial.zip
+cd ..
+#python setup.py sdist --formats=gztar,zip
+python setup.py sdist --formats=gztar
diff --git a/django/gends_extract_simple_types.py b/django/gends_extract_simple_types.py
index 8e152cd..07865cb 100755
--- a/django/gends_extract_simple_types.py
+++ b/django/gends_extract_simple_types.py
@@ -4,10 +4,14 @@
 #
 # Imports
 
+from __future__ import print_function
 import sys
 import os
 import argparse
-import StringIO
+if sys.version_info.major == 2:
+    from StringIO import StringIO as stringio
+else:
+    from io import StringIO as stringio
 from lxml import etree
 import process_includes
 
@@ -18,8 +22,7 @@ import process_includes
 SchemaNS = 'http://www.w3.org/2001/XMLSchema'
 Nsmap = {
     'xs': SchemaNS,
-    }
-
+}
 
 
 #
@@ -34,41 +37,55 @@ class TypeDescriptor(object):
         self.name_ = name
         self.type_name_ = type_name
         self.type_obj_ = None
+
     def __str__(self):
-        return '<%s -- name: %s type: %s>' % (self.__class__.__name__,
+        return '<%s -- name: %s type: %s>' % (
+            self.__class__.__name__,
             self.name, self.type_name,)
+
     def get_name_(self):
         return self.name_
+
     def set_name_(self, name):
         self.name_ = name
     name = property(get_name_, set_name_)
+
     def get_type_name_(self):
         return self.type_name_
+
     def set_type_name_(self, type_name):
         self.type_name_ = type_name
     type_name = property(get_type_name_, set_type_name_)
+
     def get_type_obj_(self):
         return self.type_obj_
+
     def set_type_obj_(self, type_obj):
         self.type_obj_ = type_obj
     type_obj = property(get_type_obj_, set_type_obj_)
 
+
 class ComplexTypeDescriptor(TypeDescriptor):
     def __init__(self, name):
         super(ComplexTypeDescriptor, self).__init__(name)
         self.elements_ = []
         self.attributes_ = {}
+
     def get_elements_(self):
         return self.elements_
+
     def set_elements_(self, elements):
         self.elements_ = elements
     elements = property(get_elements_, set_elements_)
+
     def get_attributes_(self):
         return self.attributes_
+
     def set_attributes_(self, attributes):
         self.attributes_ = attributes
     attributes = property(get_attributes_, set_attributes_)
 
+
 class SimpleTypeDescriptor(TypeDescriptor):
     def __init__(self, name, type_name):
         super(SimpleTypeDescriptor, self).__init__(name, type_name)
@@ -175,7 +192,6 @@ for name in Simple_type_names:
     Builtin_descriptors[name] = SimpleTypeDescriptor(name, name)
 
 
-
 #
 # Functions for internal use and testing
 
@@ -183,15 +199,16 @@ def extract_descriptors(args):
     if os.path.exists(args.outfilename) and not args.force:
         sys.stderr.write(
             '\nFile %s exists.  Use -f/--force to overwrite.\n\n' % (
-            args.outfilename,))
+                args.outfilename,))
         sys.exit(1)
     outfile = open(args.outfilename, 'w')
 
     schema_file_name = os.path.join(
         os.path.abspath(os.path.curdir),
         args.infilename)
-    infile = StringIO.StringIO()
-    process_includes.process_include_files(args.infilename, infile,
+    infile = stringio()
+    process_includes.process_include_files(
+        args.infilename, infile,
         inpath=schema_file_name)
     infile.seek(0)
 
@@ -199,7 +216,7 @@ def extract_descriptors(args):
     root = doc.getroot()
     descriptors = {}
     extract(root, descriptors, outfile)
-    for descriptor in descriptors.itervalues():
+    for descriptor in list(descriptors.values()):
         descriptor.export(outfile)
     outfile.close()
 
@@ -210,7 +227,6 @@ def get_descriptor_name(d):
 
 def extract(root, descriptors, outfile):
     unresolved = {}
-    complex_descriptors = {}
     # Process top level simpleTypes.  Resolve the base types.
     nodes = root.xpath('xs:simpleType', namespaces=Nsmap)
     for node in nodes:
@@ -227,7 +243,7 @@ def export_defined_simple_types(outfile, resolved):
     wrt = outfile.write
     wrt(Header_template)
     wrt('Defined_simple_type_table = {\n')
-    for descriptor in resolved.itervalues():
+    for descriptor in list(resolved.values()):
         name = descriptor.name
         prefix, type_name = get_prefix_name(descriptor.type_name)
         wrt("    '%s': SimpleTypeDescriptor('%s', '%s'),\n" % (
@@ -238,7 +254,7 @@ def export_defined_simple_types(outfile, resolved):
 def resolve_simple_types(unresolved):
     resolved = {}
     #import pdb; pdb.set_trace()
-    sorted_descriptors = unresolved.values()
+    sorted_descriptors = list(unresolved.values())
     sorted_descriptors.sort(key=get_descriptor_name)
     for descriptor in sorted_descriptors:
         resolve_1_simple_type(descriptor, resolved, unresolved)
@@ -259,7 +275,8 @@ def resolve_1_simple_type(descriptor, resolved, unresolved):
         return type_obj
     else:
         #import pdb; pdb.set_trace()
-        type_obj = resolve_1_simple_type(unresolved[descriptor.type_name],
+        type_obj = resolve_1_simple_type(
+            unresolved[descriptor.type_name],
             resolved, unresolved)
         descriptor.type_obj = type_obj
         resolved[descriptor.name] = descriptor
@@ -312,22 +329,28 @@ def etxpath(node, pat):
 
 USAGE_TEXT = __doc__
 
+
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 USAGE_TEXT = """synopsis: capture XML Schema simpleType descriptors
 """
 
+
 def main():
     parser = argparse.ArgumentParser(description=USAGE_TEXT)
-    parser.add_argument('-v', '--verbose', action='store_true',
+    parser.add_argument(
+        '-v', '--verbose', action='store_true',
         help='show additional info')
-    parser.add_argument('-f', '--force', action='store_true',
+    parser.add_argument(
+        '-f', '--force', action='store_true',
         help='force overwrite of output file without asking')
-    parser.add_argument('infilename', type=str,
+    parser.add_argument(
+        'infilename', type=str,
         help='input XML Schema file')
-    parser.add_argument('-o', '--outfile', type=str, dest='outfilename',
+    parser.add_argument(
+        '-o', '--outfile', type=str, dest='outfilename',
         default='generateds_definedsimpletypes.py',
         help='output (.py) file name')
     args = parser.parse_args()
@@ -337,5 +360,3 @@ def main():
 if __name__ == '__main__':
     #import pdb; pdb.set_trace()
     main()
-
-
diff --git a/django/gends_generate_django.py b/django/gends_generate_django.py
index 9f7801e..2b00087 100755
--- a/django/gends_generate_django.py
+++ b/django/gends_generate_django.py
@@ -13,6 +13,7 @@ Options:
 """
 
 
+from __future__ import print_function
 import sys
 import os
 import getopt
@@ -21,7 +22,6 @@ import importlib
 #import nexmllib as supermod
 
 
-
 #
 # Globals
 #
@@ -32,9 +32,11 @@ supermod = None
 # Classes
 #
 
+
 class ProgramOptions(object):
     def get_force_(self):
         return self.force_
+
     def set_force_(self, force):
         self.force_ = force
     force = property(get_force_, set_force_)
@@ -46,14 +48,17 @@ class Writer(object):
         self.outfile = open(outfilename, 'w')
         self.stdout_also = stdout_also
         self.line_count = 0
+
     def get_count(self):
         return self.line_count
+
     def write(self, content):
         self.outfile.write(content)
         if self.stdout_also:
             sys.stdout.write(content)
         count = content.count('\n')
         self.line_count += count
+
     def close(self):
         self.outfile.close()
 
@@ -68,14 +73,17 @@ def generate_model(options, module_name):
     models_file_name = 'models.py'
     forms_file_name = 'forms.py'
     admin_file_name = 'admin.py'
-    if (    (os.path.exists(models_file_name) or 
-            os.path.exists(forms_file_name) or
-            os.path.exists(admin_file_name)
-            )
-        and not options.force):
-        sys.stderr.write('\nmodels.py or forms.py or admin.py exists.  Use -f/--force to overwrite.\n\n')
+    if (
+            (
+                os.path.exists(models_file_name) or
+                os.path.exists(forms_file_name) or
+                os.path.exists(admin_file_name)
+            ) and
+            not options.force):
+        sys.stderr.write(
+            '\nmodels.py or forms.py or admin.py exists.  '
+            'Use -f/--force to overwrite.\n\n')
         sys.exit(1)
-    globals_dict = globals()
     models_writer = Writer(models_file_name)
     forms_writer = Writer(forms_file_name)
     admin_writer = Writer(admin_file_name)
@@ -106,24 +114,26 @@ def generate_model(options, module_name):
     models_writer.close()
     forms_writer.close()
     admin_writer.close()
-    print 'Wrote %d lines to models.py' % (models_writer.get_count(), )
-    print 'Wrote %d lines to forms.py' % (forms_writer.get_count(), )
-    print 'Wrote %d lines to admin.py' % (admin_writer.get_count(), )
-
+    print('Wrote %d lines to models.py' % (models_writer.get_count(), ))
+    print('Wrote %d lines to forms.py' % (forms_writer.get_count(), ))
+    print('Wrote %d lines to admin.py' % (admin_writer.get_count(), ))
 
 
 USAGE_TEXT = __doc__
 
+
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
 def main():
     args = sys.argv[1:]
     try:
-        opts, args = getopt.getopt(args, 'hfs:', ['help', 'force',
-            'suffix=', ])
+        opts, args = getopt.getopt(
+            args, 'hfs:', [
+                'help', 'force',
+                'suffix=', ])
     except:
         usage()
     options = ProgramOptions()
@@ -142,5 +152,3 @@ def main():
 if __name__ == '__main__':
     #import pdb; pdb.set_trace()
     main()
-
-
diff --git a/django/gends_run_gen_django.py b/django/gends_run_gen_django.py
index 16f57c0..7eb8742 100755
--- a/django/gends_run_gen_django.py
+++ b/django/gends_run_gen_django.py
@@ -13,9 +13,12 @@ Options:
                         generateds_definedsimpletypes.py
                         models.py
                         forms.py
+    -p, --path-to-generateDS-script=/path/to/generateDS.py
+                    Path to the generateDS.py script.
     -v, --verbose   Display additional information while running.
-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
 
 """
 
@@ -63,21 +66,25 @@ def generate(options, schema_file_name):
         flag4 = exists(admin_file_name)
         if (flag1 or flag2 or flag3 or flag4):
             return
-    args = ('generateDS.py', '-f',
+    args = (
+        options['path'],
+        '-f',
         '-o', '%s' % (bindings_file_name, ),
         '--member-specs=list',
         schema_file_name,
-        )
+    )
     if not run_cmd(options, args):
         return
-    args = ('./gends_extract_simple_types.py', '-f',
+    args = (
+        './gends_extract_simple_types.py', '-f',
         schema_file_name,
-        )
+    )
     if not run_cmd(options, args):
         return
-    args = ('./gends_generate_django.py', '-f',
+    args = (
+        './gends_generate_django.py', '-f',
         bindings_file_stem,
-        )
+    )
     if not run_cmd(options, args):
         return
 
@@ -113,23 +120,23 @@ def dbg_msg(options, msg):
         sys.stdout.write(msg)
 
 
-USAGE_TEXT = __doc__
-
 def usage():
-    sys.stderr.write(USAGE_TEXT)
-    sys.exit(1)
+    sys.exit(__doc__)
 
 
 def main():
     args = sys.argv[1:]
     try:
-        opts, args = getopt.getopt(args, 'hvf', ['help', 'verbose',
-            'force', ])
+        opts, args = getopt.getopt(args, 'hvfp:', [
+            'help', 'verbose',
+            'force', 'path-to-generateDS-script=',
+        ])
     except:
         usage()
     options = {}
     options['force'] = False
     options['verbose'] = False
+    options['path'] = './generateDS.py'
     for opt, val in opts:
         if opt in ('-h', '--help'):
             usage()
@@ -137,6 +144,12 @@ def main():
             options['force'] = True
         elif opt in ('-v', '--verbose'):
             options['verbose'] = True
+        elif opt in ('-p', '--path-to-generateDS-script'):
+            options['path'] = val
+    if not os.path.exists(options['path']):
+        sys.exit(
+            '\n*** error: Cannot find generateDS.py.  '
+            'Use "-p path" command line option.\n')
     if len(args) != 1:
         usage()
     schema_name = args[0]
@@ -146,5 +159,3 @@ def main():
 if __name__ == '__main__':
     #import pdb; pdb.set_trace()
     main()
-
-
diff --git a/django/generatedssuper.py b/django/generatedssuper.py
index cbd9922..e808cd6 100644
--- a/django/generatedssuper.py
+++ b/django/generatedssuper.py
@@ -96,10 +96,18 @@ String_type_table = {
 }
 Date_type_table = {
     'date': None,
+    'gYear': None,
+    'gYearMonth': None,
+    'gMonth': None,
+    'gMonthDay': None,
+    'gDay': None,
 }
 DateTime_type_table = {
     'dateTime': None,
 }
+Time_type_table = {
+    'time': None,
+}
 Boolean_type_table = {
     'boolean': None,
 }
@@ -111,14 +119,19 @@ Boolean_type_table = {
 class GeneratedsSuper(object):
     def gds_format_string(self, input_data, input_name=''):
         return input_data
+
     def gds_format_integer(self, input_data, input_name=''):
         return '%d' % input_data
+
     def gds_format_float(self, input_data, input_name=''):
         return '%f' % input_data
+
     def gds_format_double(self, input_data, input_name=''):
         return '%e' % input_data
+
     def gds_format_boolean(self, input_data, input_name=''):
         return '%s' % input_data
+
     def gds_str_lower(self, instring):
         return instring.lower()
 
@@ -178,6 +191,11 @@ class GeneratedsSuper(object):
                         name, options, ))
                     wrtforms('    %s = forms.DateTimeField(%s)\n' % (
                         name, options, ))
+                elif data_type in Time_type_table:
+                    wrtmodels('    %s = models.TimeField(%s)\n' % (
+                        name, options, ))
+                    wrtforms('    %s = forms.TimeField(%s)\n' % (
+                        name, options, ))
                 elif data_type in Boolean_type_table:
                     wrtmodels('    %s = models.BooleanField(%s)\n' % (
                         name, options, ))
@@ -186,20 +204,21 @@ class GeneratedsSuper(object):
                 elif data_type in String_type_table:
                     wrtmodels(
                         '    %s = models.CharField(max_length=1000, %s)\n' % (
-                        name, options, ))
+                            name, options, ))
                     wrtforms(
                         '    %s = forms.CharField(max_length=1000, %s)\n' % (
-                        name, options, ))
+                            name, options, ))
                 else:
                     sys.stderr.write('Unhandled simple type: %s %s\n' % (
                         name, data_type, ))
             else:
                 wrtmodels(
                     '    %s = models.ForeignKey("%s_model")\n' % (
-                    name, data_type, ))
+                        name, data_type, ))
                 wrtforms(
-                    '    %s = forms.MultipleChoiceField(%s_model.objects.all())\n' % (
-                    name, data_type, ))
+                    '    %s = forms.MultipleChoiceField(%s_model.objects'
+                    '.all())\n' % (
+                        name, data_type, ))
         wrtmodels('    def __unicode__(self):\n')
         wrtmodels('        return "id: %s" % (self.id, )\n')
 
@@ -212,5 +231,3 @@ def cleanupName(oldName):
     newName = newName.replace('-', '_')
     newName = newName.replace('.', '_')
     return newName
-
-
diff --git a/fix_subclass_refs.py b/fix_subclass_refs.py
new file mode 100755
index 0000000..b08d111
--- /dev/null
+++ b/fix_subclass_refs.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+
+"""
+synopsis:
+    Fix up subclass references so that the classes in the superclass
+    module refer to classes in a specified submodule.
+    The superclass module was generated with the generateDS.py "-o"
+    command line option; the subclass module was generated with "-s".
+    The intended use is to be able to switch between different versions
+    of submodules generated from the same XML schema.
+usage:
+    python fix_subclass_refs.py <supermodname> <submodname1> <submodname2>
+examples:
+    From the command line for testing purposes:
+        python fix_subclass_refs.py datalib datasub1 datasub2
+    From within an application -- Suppose we want to switch between the use
+    of submodule_1 and submodule_2 while our application is running:
+        import fix_subclass_refs
+        import supermodule
+        import submodule_1
+        import submodule_2
+            ...
+        fix_subclass_refs.fix_up_refs(supermodule, submodule_1)
+        submodule_1.parse('data.xml')
+            ...
+        fix_subclass_refs.fix_up_refs(supermodule, submodule_2)
+        submodule_2.parse('data.xml')
+"""
+
+
+from __future__ import print_function
+import sys
+import importlib
+
+
+def fix_up_refs(supermod, submod):
+    """Change the value of class variable "subclass" so that it refers
+    to the subclass in "submod".
+    """
+    count = 0
+    for superclassname in supermod.__all__:
+        superclass = getattr(supermod, superclassname)
+        if superclass.subclass is None:
+            # never happens?
+            print('*** {} missing subclass'.format(superclassname))
+            pass
+        else:
+            subclassname = superclass.subclass.__name__
+            subclass = getattr(submod, subclassname)
+            superclass.subclass = subclass
+            count += 1
+    return count
+
+
+def show(supermod):
+    count = 0
+    for superclassname in supermod.__all__:
+        superclass = getattr(supermod, superclassname)
+        print('subclass: {}'.format(superclass.subclass))
+        count += 1
+    return count
+
+
+def test(supermodname, submodname1, submodname2):
+    supermod = importlib.import_module(supermodname)
+    submod1 = importlib.import_module(submodname1)
+    importlib.import_module(submodname2)
+    count = show(supermod)
+    print('count: {}'.format(count))
+    count = fix_up_refs(supermod, submod1)
+    print('fix-up count: {}'.format(count))
+    raw_input('Press Enter to continue ')
+    print('-' * 50)
+    count = show(supermod)
+    print('count: {}'.format(count))
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 3:
+        sys.exit(__doc__)
+    supermodname = args[0]
+    submodname1 = args[1]
+    submodname2 = args[2]
+    test(supermodname, submodname1, submodname2)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/generateDS.html b/generateDS.html
index f41c344..257e460 100644
--- a/generateDS.html
+++ b/generateDS.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" />
 <title>generateDS -- Generate Data Structures from XML Schema</title>
 <meta name="author" content="Dave Kuhlman" />
 <style type="text/css">
@@ -187,9 +187,12 @@ div.warning p.admonition-title {
   font-family: sans-serif }
 
 tt.docutils {
-  background-color: #eeeeee;
+  background-color: #dddddd;
 }
 
+ul.auto-toc {
+  list-style-type: none }
+
 </style>
 </head>
 <body>
@@ -202,7 +205,7 @@ tt.docutils {
 <tr><th class="docinfo-name">Author:</th>
 <td>Dave Kuhlman</td></tr>
 <tr><th class="docinfo-name">Contact:</th>
-<td><a class="first last reference external" href="mailto:dkuhlman&#64;pacbell.net">dkuhlman&#64;pacbell.net</a></td></tr>
+<td>dkuhlman (at) davekuhlman (dot) org</td></tr>
 <tr><th class="docinfo-name">Address:</th>
 <td><pre class="address">
 <a class="first last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a>
@@ -217,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.11b</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td>
 </tr>
 </tbody>
 </table>
@@ -226,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">August 21, 2013</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">January 16, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -258,116 +261,131 @@ to process the contents of an XML document.</td>
 <li><a class="reference internal" href="#support-and-more-information" id="id10">2.2&nbsp;&nbsp;&nbsp;Support and more information</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#how-to-build-and-install-it" id="id11">3&nbsp;&nbsp;&nbsp;How to build and install it</a></li>
-<li><a class="reference internal" href="#packaging-your-code" id="id12">4&nbsp;&nbsp;&nbsp;Packaging your code</a></li>
-<li><a class="reference internal" href="#the-command-line-interface-how-to-use-it" id="id13">5&nbsp;&nbsp;&nbsp;The command line interface -- How to use it</a><ul class="auto-toc">
-<li><a class="reference internal" href="#running-generateds-py" id="id14">5.1&nbsp;&nbsp;&nbsp;Running <tt class="docutils literal">generateDS.py</tt></a></li>
-<li><a class="reference internal" href="#name-conflicts" id="id15">5.2&nbsp;&nbsp;&nbsp;Name conflicts</a><ul class="auto-toc">
-<li><a class="reference internal" href="#conflicts-with-python-keywords" id="id16">5.2.1&nbsp;&nbsp;&nbsp;Conflicts with Python keywords</a></li>
-<li><a class="reference internal" href="#conflicts-between-child-elements-and-attributes" id="id17">5.2.2&nbsp;&nbsp;&nbsp;Conflicts between child elements and attributes</a></li>
+<li><a class="reference internal" href="#how-to-build-and-install-it" id="id11">3&nbsp;&nbsp;&nbsp;How to build and install it</a><ul class="auto-toc">
+<li><a class="reference internal" href="#requirements" id="id12">3.1&nbsp;&nbsp;&nbsp;Requirements</a></li>
+<li><a class="reference internal" href="#installation" id="id13">3.2&nbsp;&nbsp;&nbsp;Installation</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#packaging-your-code" id="id14">4&nbsp;&nbsp;&nbsp;Packaging your code</a></li>
+<li><a class="reference internal" href="#the-command-line-interface-how-to-use-it" id="id15">5&nbsp;&nbsp;&nbsp;The command line interface -- How to use it</a><ul class="auto-toc">
+<li><a class="reference internal" href="#running-generateds-py" id="id16">5.1&nbsp;&nbsp;&nbsp;Running <tt class="docutils literal">generateDS.py</tt></a></li>
+<li><a class="reference internal" href="#command-line-options" id="id17">5.2&nbsp;&nbsp;&nbsp;Command line options</a></li>
+<li><a class="reference internal" href="#name-conflicts-etc" id="id18">5.3&nbsp;&nbsp;&nbsp;Name conflicts etc.</a><ul class="auto-toc">
+<li><a class="reference internal" href="#conflicts-with-python-keywords" id="id19">5.3.1&nbsp;&nbsp;&nbsp;Conflicts with Python keywords</a></li>
+<li><a class="reference internal" href="#conflicts-between-child-elements-and-attributes" id="id20">5.3.2&nbsp;&nbsp;&nbsp;Conflicts between child elements and attributes</a></li>
+<li><a class="reference internal" href="#cleaning-up-names-with-special-characters-etc" id="id21">5.3.3&nbsp;&nbsp;&nbsp;Cleaning up names with special characters etc.</a></li>
+</ul>
+</li>
 </ul>
 </li>
+<li><a class="reference internal" href="#the-graphical-user-interface-how-to-use-it" id="id22">6&nbsp;&nbsp;&nbsp;The graphical user interface -- How to use it</a></li>
+<li><a class="reference internal" href="#common-problems" id="id23">7&nbsp;&nbsp;&nbsp;Common problems</a><ul class="auto-toc">
+<li><a class="reference internal" href="#namespace-prefix-mis-match" id="id24">7.1&nbsp;&nbsp;&nbsp;Namespace prefix mis-match</a></li>
+<li><a class="reference internal" href="#using-multiple-subclass-modules-with-the-same-superclass-module" id="id25">7.2&nbsp;&nbsp;&nbsp;Using multiple subclass modules with the same superclass module</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#the-graphical-user-interface-how-to-use-it" id="id18">6&nbsp;&nbsp;&nbsp;The graphical user interface -- How to use it</a></li>
-<li><a class="reference internal" href="#common-problems" id="id19">7&nbsp;&nbsp;&nbsp;Common problems</a><ul class="auto-toc">
-<li><a class="reference internal" href="#namespace-prefix-mis-match" id="id20">7.1&nbsp;&nbsp;&nbsp;Namespace prefix mis-match</a></li>
+<li><a class="reference internal" href="#supported-features-of-xml-schema" id="id26">8&nbsp;&nbsp;&nbsp;Supported features of XML Schema</a><ul class="auto-toc">
+<li><a class="reference internal" href="#attributes-no-nested-children" id="id27">8.1&nbsp;&nbsp;&nbsp;Attributes + no nested children</a></li>
+<li><a class="reference internal" href="#mixed-content" id="id28">8.2&nbsp;&nbsp;&nbsp;Mixed content</a></li>
+<li><a class="reference internal" href="#anyattribute" id="id29">8.3&nbsp;&nbsp;&nbsp;anyAttribute</a></li>
+<li><a class="reference internal" href="#element-extensions" id="id30">8.4&nbsp;&nbsp;&nbsp;Element extensions</a></li>
+<li><a class="reference internal" href="#attribute-groups" id="id31">8.5&nbsp;&nbsp;&nbsp;Attribute groups</a></li>
+<li><a class="reference internal" href="#substitution-groups" id="id32">8.6&nbsp;&nbsp;&nbsp;Substitution groups</a></li>
+<li><a class="reference internal" href="#primitive-types" id="id33">8.7&nbsp;&nbsp;&nbsp;Primitive types</a></li>
+<li><a class="reference internal" href="#simpletype" id="id34">8.8&nbsp;&nbsp;&nbsp;simpleType</a></li>
+<li><a class="reference internal" href="#list-values-optional-values-maxoccurs-etc" id="id35">8.9&nbsp;&nbsp;&nbsp;List values, optional values, maxOccurs, etc.</a></li>
+<li><a class="reference internal" href="#simpletype-and-validators" id="id36">8.10&nbsp;&nbsp;&nbsp;simpleType and validators</a><ul class="auto-toc">
+<li><a class="reference internal" href="#generating-validator-bodies-from-xml-schema" id="id37">8.10.1&nbsp;&nbsp;&nbsp;Generating validator bodies from XML schema</a></li>
+<li><a class="reference internal" href="#user-written-validator-bodies" id="id38">8.10.2&nbsp;&nbsp;&nbsp;User written validator bodies</a></li>
+<li><a class="reference internal" href="#turning-off-validation-of-simpletype-data" id="id39">8.10.3&nbsp;&nbsp;&nbsp;Turning off validation of <tt class="docutils literal">simpleType</tt> data</a></li>
+<li><a class="reference internal" href="#additional-notes-on-simpletype-validation" id="id40">8.10.4&nbsp;&nbsp;&nbsp;Additional notes on <tt class="docutils literal">simpleType</tt> validation</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#supported-features-of-xml-schema" id="id21">8&nbsp;&nbsp;&nbsp;Supported features of XML Schema</a><ul class="auto-toc">
-<li><a class="reference internal" href="#attributes-no-nested-children" id="id22">8.1&nbsp;&nbsp;&nbsp;Attributes + no nested children</a></li>
-<li><a class="reference internal" href="#mixed-content" id="id23">8.2&nbsp;&nbsp;&nbsp;Mixed content</a></li>
-<li><a class="reference internal" href="#anyattribute" id="id24">8.3&nbsp;&nbsp;&nbsp;anyAttribute</a></li>
-<li><a class="reference internal" href="#element-extensions" id="id25">8.4&nbsp;&nbsp;&nbsp;Element extensions</a></li>
-<li><a class="reference internal" href="#attribute-groups" id="id26">8.5&nbsp;&nbsp;&nbsp;Attribute groups</a></li>
-<li><a class="reference internal" href="#substitution-groups" id="id27">8.6&nbsp;&nbsp;&nbsp;Substitution groups</a></li>
-<li><a class="reference internal" href="#primitive-types" id="id28">8.7&nbsp;&nbsp;&nbsp;Primitive types</a></li>
-<li><a class="reference internal" href="#simpletype" id="id29">8.8&nbsp;&nbsp;&nbsp;simpleType</a></li>
-<li><a class="reference internal" href="#list-values-optional-values-maxoccurs-etc" id="id30">8.9&nbsp;&nbsp;&nbsp;List values, optional values, maxOccurs, etc.</a></li>
-<li><a class="reference internal" href="#simpletype-and-validators" id="id31">8.10&nbsp;&nbsp;&nbsp;simpleType and validators</a></li>
-<li><a class="reference internal" href="#include-file-processing" id="id32">8.11&nbsp;&nbsp;&nbsp;Include file processing</a></li>
-<li><a class="reference internal" href="#abstract-types" id="id33">8.12&nbsp;&nbsp;&nbsp;Abstract types</a></li>
+<li><a class="reference internal" href="#include-file-processing" id="id41">8.11&nbsp;&nbsp;&nbsp;Include file processing</a></li>
+<li><a class="reference internal" href="#abstract-types" id="id42">8.12&nbsp;&nbsp;&nbsp;Abstract types</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#the-xml-schema-input-to-generateds" id="id34">9&nbsp;&nbsp;&nbsp;The XML schema input to generateDS</a><ul class="auto-toc">
-<li><a class="reference internal" href="#additional-constructions" id="id35">9.1&nbsp;&nbsp;&nbsp;Additional constructions</a><ul class="auto-toc">
-<li><a class="reference internal" href="#complextype-at-top-level" id="id36">9.1.1&nbsp;&nbsp;&nbsp;&lt;complexType&gt; at top-level</a></li>
-<li><a class="reference internal" href="#use-of-ref-instead-of-name-and-type-attributes" id="id37">9.1.2&nbsp;&nbsp;&nbsp;Use of &quot;ref&quot; instead of &quot;name&quot; and &quot;type&quot; attributes</a></li>
-<li><a class="reference internal" href="#extension-types" id="id38">9.1.3&nbsp;&nbsp;&nbsp;Extension types</a></li>
-<li><a class="reference internal" href="#elements-containing-mixed-content" id="id39">9.1.4&nbsp;&nbsp;&nbsp;Elements containing mixed content</a></li>
+<li><a class="reference internal" href="#the-xml-schema-input-to-generateds" id="id43">9&nbsp;&nbsp;&nbsp;The XML schema input to generateDS</a><ul class="auto-toc">
+<li><a class="reference internal" href="#additional-constructions" id="id44">9.1&nbsp;&nbsp;&nbsp;Additional constructions</a><ul class="auto-toc">
+<li><a class="reference internal" href="#complextype-at-top-level" id="id45">9.1.1&nbsp;&nbsp;&nbsp;&lt;complexType&gt; at top-level</a></li>
+<li><a class="reference internal" href="#use-of-ref-instead-of-name-and-type-attributes" id="id46">9.1.2&nbsp;&nbsp;&nbsp;Use of &quot;ref&quot; instead of &quot;name&quot; and &quot;type&quot; attributes</a></li>
+<li><a class="reference internal" href="#extension-types" id="id47">9.1.3&nbsp;&nbsp;&nbsp;Extension types</a></li>
+<li><a class="reference internal" href="#elements-containing-mixed-content" id="id48">9.1.4&nbsp;&nbsp;&nbsp;Elements containing mixed content</a></li>
 </ul>
 </li>
 </ul>
 </li>
-<li><a class="reference internal" href="#id2" id="id40">10&nbsp;&nbsp;&nbsp;XMLBehaviors</a><ul class="auto-toc">
-<li><a class="reference internal" href="#the-xmlbehaviors-input-file" id="id41">10.1&nbsp;&nbsp;&nbsp;The XMLBehaviors input file</a></li>
-<li><a class="reference internal" href="#implementing-other-sources-for-implementation-bodies" id="id42">10.2&nbsp;&nbsp;&nbsp;Implementing other sources for implementation bodies</a></li>
+<li><a class="reference internal" href="#id2" id="id49">10&nbsp;&nbsp;&nbsp;XMLBehaviors</a><ul class="auto-toc">
+<li><a class="reference internal" href="#the-xmlbehaviors-input-file" id="id50">10.1&nbsp;&nbsp;&nbsp;The XMLBehaviors input file</a></li>
+<li><a class="reference internal" href="#implementing-other-sources-for-implementation-bodies" id="id51">10.2&nbsp;&nbsp;&nbsp;Implementing other sources for implementation bodies</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#additional-features" id="id43">11&nbsp;&nbsp;&nbsp;Additional features</a><ul class="auto-toc">
-<li><a class="reference internal" href="#xsd-list-element-support" id="id44">11.1&nbsp;&nbsp;&nbsp;xsd:list element support</a></li>
-<li><a class="reference internal" href="#xsd-enumeration-support" id="id45">11.2&nbsp;&nbsp;&nbsp;xsd:enumeration support</a></li>
-<li><a class="reference internal" href="#xsd-union-support" id="id46">11.3&nbsp;&nbsp;&nbsp;xsd:union support</a></li>
-<li><a class="reference internal" href="#extended-xsd-choice-support" id="id47">11.4&nbsp;&nbsp;&nbsp;Extended xsd:choice support</a></li>
-<li><a class="reference internal" href="#arity-minoccurs-maxoccurs-etc" id="id48">11.5&nbsp;&nbsp;&nbsp;Arity, minOccurs, maxOccurs, etc</a></li>
-<li><a class="reference internal" href="#more-thorough-content-type-and-base-type-resolution" id="id49">11.6&nbsp;&nbsp;&nbsp;More thorough content type and base type resolution</a></li>
-<li><a class="reference internal" href="#making-top-level-simpletypes-available-from-xschemahandler" id="id50">11.7&nbsp;&nbsp;&nbsp;Making top level simpleTypes available from XschemaHandler</a></li>
-<li><a class="reference internal" href="#namespaces-inserting-namespace-definition-in-exported-documents" id="id51">11.8&nbsp;&nbsp;&nbsp;Namespaces -- inserting namespace definition in exported documents</a></li>
-<li><a class="reference internal" href="#support-for-xs-any" id="id52">11.9&nbsp;&nbsp;&nbsp;Support for xs:any</a></li>
-<li><a class="reference internal" href="#generating-lxml-element-tree" id="id53">11.10&nbsp;&nbsp;&nbsp;Generating Lxml Element tree</a><ul class="auto-toc">
-<li><a class="reference internal" href="#mapping-generateds-objects-to-lxml-elements-and-back" id="id54">11.10.1&nbsp;&nbsp;&nbsp;Mapping generateDS objects to Lxml Elements and back</a></li>
+<li><a class="reference internal" href="#additional-features" id="id52">11&nbsp;&nbsp;&nbsp;Additional features</a><ul class="auto-toc">
+<li><a class="reference internal" href="#xsd-list-element-support" id="id53">11.1&nbsp;&nbsp;&nbsp;xsd:list element support</a></li>
+<li><a class="reference internal" href="#xsd-enumeration-support" id="id54">11.2&nbsp;&nbsp;&nbsp;xsd:enumeration support</a></li>
+<li><a class="reference internal" href="#xsd-union-support" id="id55">11.3&nbsp;&nbsp;&nbsp;xsd:union support</a></li>
+<li><a class="reference internal" href="#extended-xsd-choice-support" id="id56">11.4&nbsp;&nbsp;&nbsp;Extended xsd:choice support</a></li>
+<li><a class="reference internal" href="#arity-minoccurs-maxoccurs-etc" id="id57">11.5&nbsp;&nbsp;&nbsp;Arity, minOccurs, maxOccurs, etc</a></li>
+<li><a class="reference internal" href="#more-thorough-content-type-and-base-type-resolution" id="id58">11.6&nbsp;&nbsp;&nbsp;More thorough content type and base type resolution</a></li>
+<li><a class="reference internal" href="#making-top-level-simpletypes-available-from-xschemahandler" id="id59">11.7&nbsp;&nbsp;&nbsp;Making top level simpleTypes available from XschemaHandler</a></li>
+<li><a class="reference internal" href="#namespaces-inserting-namespace-definition-in-exported-documents" id="id60">11.8&nbsp;&nbsp;&nbsp;Namespaces -- inserting namespace definition in exported documents</a></li>
+<li><a class="reference internal" href="#support-for-xs-any" id="id61">11.9&nbsp;&nbsp;&nbsp;Support for xs:any</a></li>
+<li><a class="reference internal" href="#generating-lxml-element-tree" id="id62">11.10&nbsp;&nbsp;&nbsp;Generating Lxml Element tree</a><ul class="auto-toc">
+<li><a class="reference internal" href="#mapping-generateds-objects-to-lxml-elements-and-back" id="id63">11.10.1&nbsp;&nbsp;&nbsp;Mapping generateDS objects to Lxml Elements and back</a></li>
 </ul>
 </li>
+<li><a class="reference internal" href="#specifying-names-for-anonymous-nested-type-definitions" id="id64">11.11&nbsp;&nbsp;&nbsp;Specifying names for anonymous nested type definitions</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#how-to-use-the-generated-source-code" id="id55">12&nbsp;&nbsp;&nbsp;How-to Use the generated source code</a><ul class="auto-toc">
-<li><a class="reference internal" href="#the-parsing-functions" id="id56">12.1&nbsp;&nbsp;&nbsp;The parsing functions</a></li>
-<li><a class="reference internal" href="#recognizing-the-top-level-element" id="id57">12.2&nbsp;&nbsp;&nbsp;Recognizing the top level element</a></li>
-<li><a class="reference internal" href="#the-export-methods" id="id58">12.3&nbsp;&nbsp;&nbsp;The export methods</a><ul class="auto-toc">
-<li><a class="reference internal" href="#method-export" id="id59">12.3.1&nbsp;&nbsp;&nbsp;Method export</a></li>
-<li><a class="reference internal" href="#method-exportliteral" id="id60">12.3.2&nbsp;&nbsp;&nbsp;Method <tt class="docutils literal">exportLiteral</tt></a><ul class="auto-toc">
-<li><a class="reference internal" href="#what-it-does" id="id61">12.3.2.1&nbsp;&nbsp;&nbsp;What It Does</a></li>
-<li><a class="reference internal" href="#why-you-might-care" id="id62">12.3.2.2&nbsp;&nbsp;&nbsp;Why You Might Care</a></li>
-<li><a class="reference internal" href="#how-to-use-it" id="id63">12.3.2.3&nbsp;&nbsp;&nbsp;How to use it</a></li>
+<li><a class="reference internal" href="#how-to-use-the-generated-source-code" id="id65">12&nbsp;&nbsp;&nbsp;How to use the generated source code</a><ul class="auto-toc">
+<li><a class="reference internal" href="#the-parsing-functions" id="id66">12.1&nbsp;&nbsp;&nbsp;The parsing functions</a></li>
+<li><a class="reference internal" href="#recognizing-the-top-level-element" id="id67">12.2&nbsp;&nbsp;&nbsp;Recognizing the top level element</a></li>
+<li><a class="reference internal" href="#the-export-methods" id="id68">12.3&nbsp;&nbsp;&nbsp;The export methods</a><ul class="auto-toc">
+<li><a class="reference internal" href="#method-export" id="id69">12.3.1&nbsp;&nbsp;&nbsp;Method export</a></li>
+<li><a class="reference internal" href="#method-exportliteral" id="id70">12.3.2&nbsp;&nbsp;&nbsp;Method <tt class="docutils literal">exportLiteral</tt></a><ul class="auto-toc">
+<li><a class="reference internal" href="#what-it-does" id="id71">12.3.2.1&nbsp;&nbsp;&nbsp;What It Does</a></li>
+<li><a class="reference internal" href="#why-you-might-care" id="id72">12.3.2.2&nbsp;&nbsp;&nbsp;Why You Might Care</a></li>
+<li><a class="reference internal" href="#how-to-use-it" id="id73">12.3.2.3&nbsp;&nbsp;&nbsp;How to use it</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#exporting-compact-xml-documents" id="id64">12.3.3&nbsp;&nbsp;&nbsp;Exporting compact XML documents</a></li>
+<li><a class="reference internal" href="#exporting-compact-xml-documents" id="id74">12.3.3&nbsp;&nbsp;&nbsp;Exporting compact XML documents</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#building-instances" id="id65">12.4&nbsp;&nbsp;&nbsp;Building instances</a></li>
-<li><a class="reference internal" href="#using-the-subclass-module" id="id66">12.5&nbsp;&nbsp;&nbsp;Using the subclass module</a></li>
-<li><a class="reference internal" href="#elements-with-attributes-but-no-nested-children" id="id67">12.6&nbsp;&nbsp;&nbsp;Elements with attributes but no nested children</a></li>
-<li><a class="reference internal" href="#id4" id="id68">12.7&nbsp;&nbsp;&nbsp;Mixed content</a></li>
-<li><a class="reference internal" href="#id6" id="id69">12.8&nbsp;&nbsp;&nbsp;anyAttribute</a></li>
-<li><a class="reference internal" href="#user-methods" id="id70">12.9&nbsp;&nbsp;&nbsp;User Methods</a></li>
-<li><a class="reference internal" href="#overridable-methods" id="id71">12.10&nbsp;&nbsp;&nbsp;Overridable methods</a></li>
-<li><a class="reference internal" href="#the-element-name-to-class-name-dictionary" id="id72">12.11&nbsp;&nbsp;&nbsp;The element name to class name dictionary</a></li>
+<li><a class="reference internal" href="#building-instances" id="id75">12.4&nbsp;&nbsp;&nbsp;Building instances</a></li>
+<li><a class="reference internal" href="#using-the-subclass-module" id="id76">12.5&nbsp;&nbsp;&nbsp;Using the subclass module</a></li>
+<li><a class="reference internal" href="#elements-with-attributes-but-no-nested-children" id="id77">12.6&nbsp;&nbsp;&nbsp;Elements with attributes but no nested children</a></li>
+<li><a class="reference internal" href="#id4" id="id78">12.7&nbsp;&nbsp;&nbsp;Mixed content</a></li>
+<li><a class="reference internal" href="#id6" id="id79">12.8&nbsp;&nbsp;&nbsp;anyAttribute</a></li>
+<li><a class="reference internal" href="#user-methods" id="id80">12.9&nbsp;&nbsp;&nbsp;User Methods</a></li>
+<li><a class="reference internal" href="#overridable-methods" id="id81">12.10&nbsp;&nbsp;&nbsp;Overridable methods</a></li>
+<li><a class="reference internal" href="#the-element-name-to-class-name-dictionary" id="id82">12.11&nbsp;&nbsp;&nbsp;The element name to class name dictionary</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#how-to-modify-the-generated-code" id="id73">13&nbsp;&nbsp;&nbsp;How to modify the generated code</a><ul class="auto-toc">
-<li><a class="reference internal" href="#adding-features-to-class-definitions" id="id74">13.1&nbsp;&nbsp;&nbsp;Adding features to class definitions</a></li>
+<li><a class="reference internal" href="#one-per-generating-separate-files-from-imported-included-schemas" id="id83">13&nbsp;&nbsp;&nbsp;&quot;One Per&quot; -- generating separate files from imported/included schemas</a></li>
+<li><a class="reference internal" href="#how-to-modify-the-generated-code" id="id84">14&nbsp;&nbsp;&nbsp;How to modify the generated code</a><ul class="auto-toc">
+<li><a class="reference internal" href="#adding-features-to-class-definitions" id="id85">14.1&nbsp;&nbsp;&nbsp;Adding features to class definitions</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#examples-and-demonstrations" id="id75">14&nbsp;&nbsp;&nbsp;Examples and demonstrations</a><ul class="auto-toc">
-<li><a class="reference internal" href="#django-generating-models-and-forms" id="id76">14.1&nbsp;&nbsp;&nbsp;Django -- Generating Models and Forms</a><ul class="auto-toc">
-<li><a class="reference internal" href="#how-to-generate-django-models-and-forms" id="id77">14.1.1&nbsp;&nbsp;&nbsp;How to generate Django models and forms</a></li>
-<li><a class="reference internal" href="#how-it-works" id="id78">14.1.2&nbsp;&nbsp;&nbsp;How it works</a></li>
+<li><a class="reference internal" href="#examples-and-demonstrations" id="id86">15&nbsp;&nbsp;&nbsp;Examples and demonstrations</a><ul class="auto-toc">
+<li><a class="reference internal" href="#django-generating-models-and-forms" id="id87">15.1&nbsp;&nbsp;&nbsp;Django -- Generating Models and Forms</a><ul class="auto-toc">
+<li><a class="reference internal" href="#how-to-generate-django-models-and-forms" id="id88">15.1.1&nbsp;&nbsp;&nbsp;How to generate Django models and forms</a></li>
+<li><a class="reference internal" href="#how-it-works" id="id89">15.1.2&nbsp;&nbsp;&nbsp;How it works</a></li>
 </ul>
 </li>
 </ul>
 </li>
-<li><a class="reference internal" href="#sample-code-and-extensions" id="id79">15&nbsp;&nbsp;&nbsp;Sample code and extensions</a><ul class="auto-toc">
-<li><a class="reference internal" href="#capturing-xs-date-elements-as-dates" id="id80">15.1&nbsp;&nbsp;&nbsp;Capturing xs:date elements as dates</a></li>
+<li><a class="reference internal" href="#sample-code-and-extensions" id="id90">16&nbsp;&nbsp;&nbsp;Sample code and extensions</a><ul class="auto-toc">
+<li><a class="reference internal" href="#capturing-xs-date-elements-as-dates" id="id91">16.1&nbsp;&nbsp;&nbsp;Capturing xs:date elements as dates</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#limitations-of-generateds" id="id81">16&nbsp;&nbsp;&nbsp;Limitations of generateDS</a><ul class="auto-toc">
-<li><a class="reference internal" href="#xml-schema-limitations" id="id82">16.1&nbsp;&nbsp;&nbsp;XML Schema limitations</a></li>
-<li><a class="reference internal" href="#large-documents" id="id83">16.2&nbsp;&nbsp;&nbsp;Large documents</a></li>
+<li><a class="reference internal" href="#limitations-of-generateds" id="id92">17&nbsp;&nbsp;&nbsp;Limitations of generateDS</a><ul class="auto-toc">
+<li><a class="reference internal" href="#xml-schema-limitations" id="id93">17.1&nbsp;&nbsp;&nbsp;XML Schema limitations</a></li>
+<li><a class="reference internal" href="#large-documents" id="id94">17.2&nbsp;&nbsp;&nbsp;Large documents</a></li>
 </ul>
 </li>
-<li><a class="reference internal" href="#includes-the-xml-schema-include-element" id="id84">17&nbsp;&nbsp;&nbsp;Includes -- The XML schema include element</a></li>
-<li><a class="reference internal" href="#acknowledgments" id="id85">18&nbsp;&nbsp;&nbsp;Acknowledgments</a></li>
-<li><a class="reference internal" href="#see-also" id="id86">19&nbsp;&nbsp;&nbsp;See also</a></li>
+<li><a class="reference internal" href="#includes-the-xml-schema-include-element" id="id95">18&nbsp;&nbsp;&nbsp;Includes -- The XML schema include element</a></li>
+<li><a class="reference internal" href="#acknowledgments" id="id96">19&nbsp;&nbsp;&nbsp;Acknowledgments</a></li>
+<li><a class="reference internal" href="#see-also" id="id97">20&nbsp;&nbsp;&nbsp;See also</a></li>
 </ul>
 </div>
 <div class="section" id="introduction">
@@ -419,6 +437,9 @@ process the contents of the XML file. The user can also generate
 and extend multiple subclass files which use a single, common
 superclass file, thus implementing a number of different processes
 on the same XML document type.</p>
+<p><tt class="docutils literal">generateDS.py</tt> can be run under either Python 2 or Python 3.  The
+generated Python code (both superclass and subclass modules) can be
+run under either Python 2 or Python 3.</p>
 <p>This document explains (1) how to use <tt class="docutils literal">generateDS.py</tt>; (2) how
 to use the Python code and data structures that it generates; and
 (3) how to modify the generated code for special purposes.</p>
@@ -446,15 +467,24 @@ https://bitbucket.org/dkuhlman/generateds</a></li>
 https://lists.sourceforge.net/lists/listinfo/generateds-users</a>.</p>
 <p>There is a tutorial in the distribution:
 <tt class="docutils literal">tutorial/tutorial.html</tt> and at
-<a class="reference external" href="http://www.rexx.com/~dkuhlman/generateds_tutorial.html">generateDS -- Introduction and Tutorial --
-http://www.rexx.com/~dkuhlman/generateds_tutorial.html</a>.</p>
+<a class="reference external" href="http://www.davekuhlman.org/generateds_tutorial.html">generateDS -- Introduction and Tutorial --
+http://www.davekuhlman.org/generateds_tutorial.html</a>.</p>
 </div>
 </div>
 <div class="section" id="how-to-build-and-install-it">
 <h1><a class="toc-backref" href="#id11">3&nbsp;&nbsp;&nbsp;How to build and install it</a></h1>
-<p>Newer versions of Python have XML support in the Python standard
-library. For older versions of Python, install PyXML. You can find
-it at: <a class="reference external" href="http://pyxml.sourceforge.net/">http://pyxml.sourceforge.net/</a></p>
+<div class="section" id="requirements">
+<h2><a class="toc-backref" href="#id12">3.1&nbsp;&nbsp;&nbsp;Requirements</a></h2>
+<p><tt class="docutils literal">Lxml</tt> is used both by <tt class="docutils literal">generateDS.py</tt> and by the code it
+generates.  <tt class="docutils literal">Lxml</tt> is available at the Python Package Index
+<a class="reference external" href="https://pypi.python.org/pypi/lxml/">https://pypi.python.org/pypi/lxml/</a> and at the <tt class="docutils literal">Lxml</tt> project home
+site <a class="reference external" href="http://lxml.de/">http://lxml.de/</a>.</p>
+<p>Older versions of Python XML support can sometimes cause problems.
+If you receive a traceback that includes &quot;_xmlplus&quot;, then you will
+need to remove that <tt class="docutils literal">_xmlplus</tt> package.</p>
+</div>
+<div class="section" id="installation">
+<h2><a class="toc-backref" href="#id13">3.2&nbsp;&nbsp;&nbsp;Installation</a></h2>
 <p>De-compress the <tt class="docutils literal">generateDS</tt> distribution file. Use something
 like the following:</p>
 <pre class="literal-block">
@@ -467,8 +497,9 @@ $ python setup.py build
 $ python setup.py install        # probably as root
 </pre>
 </div>
+</div>
 <div class="section" id="packaging-your-code">
-<h1><a class="toc-backref" href="#id12">4&nbsp;&nbsp;&nbsp;Packaging your code</a></h1>
+<h1><a class="toc-backref" href="#id14">4&nbsp;&nbsp;&nbsp;Packaging your code</a></h1>
 <p>There is some support for packaging the code you generate with
 <tt class="docutils literal">generateDS.py</tt>.  This support helps you to produce a directory
 structure with places to put sample code, sample XML instance
@@ -481,14 +512,14 @@ especially useful when the schema used to generate code contains
 <a class="reference external" href="librarytemplate_howto.html">How to package a generateDS.py generated library --
 librarytemplate_howto.html</a></p>
 <p>And the package building support itself is here:
-<a class="reference external" href="http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip">LibraryTemplate --
-http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip</a>.
+<a class="reference external" href="http://www.davekuhlman.org/librarytemplate-1.0a.zip">LibraryTemplate --
+http://www.davekuhlman.org/librarytemplate-1.0a.zip</a>.
 It is also included in the generateDS distribution package.</p>
 </div>
 <div class="section" id="the-command-line-interface-how-to-use-it">
-<h1><a class="toc-backref" href="#id13">5&nbsp;&nbsp;&nbsp;The command line interface -- How to use it</a></h1>
+<h1><a class="toc-backref" href="#id15">5&nbsp;&nbsp;&nbsp;The command line interface -- How to use it</a></h1>
 <div class="section" id="running-generateds-py">
-<h2><a class="toc-backref" href="#id14">5.1&nbsp;&nbsp;&nbsp;Running <tt class="docutils literal">generateDS.py</tt></a></h2>
+<h2><a class="toc-backref" href="#id16">5.1&nbsp;&nbsp;&nbsp;Running <tt class="docutils literal">generateDS.py</tt></a></h2>
 <p>Run <tt class="docutils literal">generateDS.py</tt> with a single argument, the XML Schema file
 that defines the data structures. For example, the following will
 generate Python source code for data structures described in
@@ -500,7 +531,7 @@ python generateDS.py -o people.py -s peoplesubs.py people.xsd
 <p>Here is the usage message displayed by <tt class="docutils literal">generateDS.py</tt>:</p>
 <pre class="literal-block">
 Synopsis:
-    Generate Python classes from XML Schema definition.
+    Generate Python classes from XML schema definition.
     Input is read from in_xsd_file or, if &quot;-&quot; (dash) arg, from stdin.
     Output is written to files named in &quot;-o&quot; and &quot;-s&quot; options.
 Usage:
@@ -517,16 +548,28 @@ Options:
     -b &lt;behaviorfilename&gt;    Input file name for behaviors added to subclasses
     -m                       Generate properties for member variables
     -c &lt;xmlcatalogfilename&gt;  Input file name to load an XML catalog
+    --one-file-per-xsd       Create a python module for each XSD processed.
+    --output-directory=&quot;XXX&quot; Used in conjunction with --one-file-per-xsd.
+                             The directory where the modules will be created.
+    --module-suffix=&quot;XXX&quot;    To be used in conjunction with --one-file-per-xsd.
+                             Append XXX to the end of each file created.
     --subclass-suffix=&quot;XXX&quot;  Append XXX to the generated subclass names.
                              Default=&quot;Sub&quot;.
-    --root-element=&quot;XXX&quot;     Assume XXX is root element of instance docs.
-                             Default is first element defined in schema.
-                             Also see section &quot;Recognizing the top level
+    --root-element=&quot;XX&quot;      When parsing, assume XX is root element of
+    --root-element=&quot;XX|YY&quot;   instance docs.  Default is first element defined
+                             in schema.  If YY is added, then YY is used as the
+                             top level class; if YY omitted XX is the default.
+                             class. Also see section &quot;Recognizing the top level
                              element&quot; in the documentation.
-    --super=&quot;XXX&quot;            Super module name in generated in subclass
+    --super=&quot;XXX&quot;            Super module name in generated subclass
                              module. Default=&quot;???&quot;
     --validator-bodies=path  Path to a directory containing files that provide
                              bodies (implementations) of validator methods.
+    --use-old-simpletype-validators
+                             Use the old style simpleType validator functions
+                             stored in a specified directory, instead of the
+                             new style validators generated directly from the
+                             XML schema.  See option --validator-bodies.
     --use-getter-setter      Generate getter and setter methods.  Values:
                              &quot;old&quot; - Name getters/setters getVar()/setVar().
                              &quot;new&quot; - Name getters/setters get_var()/set_var().
@@ -543,10 +586,10 @@ Options:
                              generated files. This is useful if you want
                              to minimize the amount of (no-operation)
                              changes to the generated python code.
-    --no-process-includes    Do not process included XML Schema files.  By
+    --no-process-includes    Do not process included XML schema files.  By
                              default, generateDS.py will insert content
                              from files referenced by &lt;include ... /&gt;
-                             elements into the XML Schema to be processed.
+                             elements into the XML schema to be processed.
     --silence                Normally, the code generated with generateDS
                              echoes the information being parsed. To prevent
                              the echo from occurring, use the --silence switch.
@@ -578,13 +621,23 @@ Options:
                                      to XML)
                              Example: &quot;write etree&quot;
                              Default: &quot;write&quot;
+    --preserve-cdata-tags    Preserve CDATA tags.  Default: False
+    --cleanup-name-list=&lt;replacement-map&gt;
+                             Specifies list of 2-tuples used for cleaning
+                             names.  First element is a regular expression
+                             search pattern and second is a replacement.
+                             Example: &quot;[('[-:.]', '_'), ('^__', 'Special')]&quot;
+                             Default: &quot;[('[-:.]', '_')]&quot;
     -q, --no-questions       Do not ask questions, for example,
                              force overwrite.
+    --no-warnings            Do not print warning messages.
     --session=mysession.session
                              Load and use options from session file. You can
                              create session file in generateds_gui.py.  Or,
                              copy and edit sample.session from the
                              distribution.
+    --fix-type-names=&quot;oldname1:newname1;oldname2:newname2;...&quot;
+                             Fix up (replace) complex type names.
     --version                Print version and exit.
 
 Usage example:
@@ -599,7 +652,10 @@ creates (with force over-write) sample_lib.py from sample_api.xsd.
 creates sample_lib.py superclass and sample_app1.py subclass modules;
 also generates member specifications in each class (in a dictionary).
 </pre>
-<p>The following command line flags are recognized by <tt class="docutils literal">generateDS.py</tt>:</p>
+</div>
+<div class="section" id="command-line-options">
+<h2><a class="toc-backref" href="#id17">5.2&nbsp;&nbsp;&nbsp;Command line options</a></h2>
+<p>The following command line options are recognized by <tt class="docutils literal">generateDS.py</tt>:</p>
 <dl class="docutils">
 <dt>o &lt;filename&gt;</dt>
 <dd>Write the data representation classes to file filename.</dd>
@@ -645,9 +701,20 @@ getters and setters.  This is experimental.</dd>
 <dt>c &lt;xmlcatalogfilename&gt;</dt>
 <dd>Specify the file to be used as an XML catalog.  This file will
 be used by process_includes.py if needed to resolve references
-in &lt;import&gt; and &lt;include&gt; elements in the XML Schema.  For more
-information on XML catalogs, see:
-<a class="reference external" href="http://en.wikipedia.org/wiki/XML_Catalog">http://en.wikipedia.org/wiki/XML_Catalog</a></dd>
+in &lt;xs:import&gt; and &lt;xs:include&gt; elements in the XML Schema.  For
+more information on XML catalogs, see:
+http://en.wikipedia.org/wiki/XML_Catalog</dd>
+<dt>one-file-per-xsd</dt>
+<dd>Create a separate Python module for each XML Schema document
+processed (for example, using &lt;xs:include&gt; or &lt;xs:import&gt;).  For
+help with using this option, see <a class="reference internal" href="#one-per-generating-separate-files-from-imported-included-schemas">&quot;One Per&quot; -- generating
+separate files from imported/included schemas</a>.</dd>
+<dt>output-directory &lt;directory&gt;</dt>
+<dd>When used with <tt class="docutils literal"><span class="pre">one-file-per-xsd</span></tt>, create generated output
+files in path <tt class="docutils literal">&lt;directory&gt;</tt>.</dd>
+<dt>module-suffix &lt;suffix&gt;</dt>
+<dd>When used with <tt class="docutils literal"><span class="pre">one-file-per-xsd</span></tt>, append <tt class="docutils literal">&lt;suffix&gt;</tt> to the
+end of each module name.</dd>
 <dt>subclass-suffix=&lt;suffix&gt;</dt>
 <dd><p class="first">Append suffix to the name of classes generated in the subclass
 file.  The default, if omitted, is &quot;Sub&quot;.  For example, the
@@ -662,11 +729,16 @@ and subclass names the same:</p>
 generateDS.py --subclass-suffix=&quot;&quot; -s actions.py mydef.xsd
 </pre>
 </dd>
-<dt>root-element=&lt;element_name&gt;</dt>
-<dd>Make element_name the assumed root of instance documents.  The
-default is the name of the element whose definition is first
-in the XML Schema document.  This flag effects the parsing
-functions (for example, parse(), parseString()).</dd>
+<dt>root-element=&lt;element_name&gt; -OR- &lt;element_name&gt;|&lt;class_name&gt;</dt>
+<dd>Make <tt class="docutils literal">element_name</tt> the assumed root of instance documents.
+The default is the name of the element whose definition is first
+in the XML Schema document.  If <tt class="docutils literal">class_name</tt> is also present
+(after a vertical bar), then <tt class="docutils literal">class_name</tt> is assumed to be the
+name of the class to be created from the root (top level)
+element when parsing an XML instance document.  If
+<tt class="docutils literal">class_name</tt> is omitted, the default class name is the same as
+<tt class="docutils literal">element_name</tt>.  This flag effects the parsing functions (for
+example, parse(), parseString(), etc).</dd>
 <dt>super=&lt;module_name&gt;</dt>
 <dd><p class="first">Make module_name the name of the superclass module imported
 by the subclass module.  If this flag is omitted, the
@@ -686,6 +758,21 @@ an optional &quot;.py&quot; extension.  If a file is not provided for a
 given type, an empty body (<tt class="docutils literal">pass</tt>) is generated.  In these
 files, lines with &quot;##&quot; in the first two columns are ignored
 and are not inserted.</dd>
+<dt>use-old-simpletype-validators</dt>
+<dd><p class="first"><tt class="docutils literal">generateDS.py</tt> is capable of generating validator bodies --
+the code that validates data content in an XML instance
+docuement and writes out warning messages if that data does not
+satisfy the facets in the <tt class="docutils literal">xs:restriction</tt> in the
+<tt class="docutils literal">xs:simpleType</tt> defintion in the XML schema.  Use this option
+if you want to use your own validation bodies/code defined in a
+specified directory .  See option <tt class="docutils literal"><span class="pre">--validator-bodies</span></tt> for
+information on that.  <em>Without</em> this option
+(<tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt>), the validator code will
+be generated directly from the XML schema, which is the default.</p>
+<p class="last">This option can also be used to generate code that does <em>no</em>
+validation.  See <a class="reference internal" href="#simpletype-and-validators">simpleType and validators</a> and <a class="reference internal" href="#turning-off-validation-of-simpletype-data">Turning off
+validation of simpleType data</a> for more information.</p>
+</dd>
 <dt>use-getter-setter</dt>
 <dd><p class="first"><tt class="docutils literal">generateDS.py</tt> now generates getter and setter methods (for
 variable &quot;abc&quot;, for example) with the names get_abc() and
@@ -718,7 +805,12 @@ changes to the generated python code.</dd>
 <dd>Do not process included XML Schema files.  By default,
 generateDS.py will insert content from files referenced by
 <tt class="docutils literal">&lt;include ... /&gt;</tt> elements into the XML Schema to be processed.
-See section <a class="reference internal" href="#include-file-processing">Include file processing</a>.</dd>
+See section <a class="reference internal" href="#include-file-processing">Include file processing</a>.  Note that include
+processing, which is performed in <tt class="docutils literal">process_includes.py</tt> is
+required for generating validator bodies from the XML schema,
+because the Lxml ElementTree produced in <tt class="docutils literal">process_includes.py</tt>
+is needed to generate the validator code.  So, using this option
+also turns off automatic generation of validator code.</dd>
 <dt>silence</dt>
 <dd>Normally, the code generated with generateDS echoes the
 information being parsed. To prevent the echo from occurring,
@@ -773,27 +865,71 @@ and use any of lxml's other capabilities.</li>
 <p class="last">For example: <tt class="docutils literal"><span class="pre">--export=&quot;write</span> etree&quot;</tt> and <tt class="docutils literal"><span class="pre">--export=&quot;write&quot;</span></tt>.  The
 default is: <tt class="docutils literal"><span class="pre">--export=&quot;write</span> literal&quot;</tt>.</p>
 </dd>
+<dt>preserve-cdata-tags</dt>
+<dd>Preserve CDATA tags.  Normally, CDATA tags (&quot;&lt;![CDATA[ ... ]]&gt;&quot;)
+are dropped while parsing an XML instance document.  If this
+option is included, the generated code will preserve those tags
+and will write them out during export.  The default is False.</dd>
+<dt>cleanup-name-list=&lt;replacement-map&gt;</dt>
+<dd><p class="first">Specifies replacement pairs to be used when cleaning up names.
+Must be a string representation of a Python list of 2-tuples.
+The values of each pair (2-tuple) must be strings.  The first
+item of each pair is a pattern and must be a valid Python
+regular expression (see
+<a class="reference external" href="https://docs.python.org/2/library/re.html#module-re">https://docs.python.org/2/library/re.html#module-re</a>) The second
+item of each pair is a string that will replace anything matched
+by the pattern.  Also see <a class="reference internal" href="#cleaning-up-names-with-special-characters-etc">Cleaning up names with special characters etc.</a></p>
+<p>The intension is to enable us to replace
+special characters in names that would cause the generation of
+invalid Python names, for example the names of generated
+classes.  However, since a string replacement is
+performed, you can replace any single character or sequence of
+characters by any other single character or sequence of
+characters.  Example:
+<tt class="docutils literal"><span class="pre">[(':',</span> <span class="pre">'colon'),</span> <span class="pre">('-',</span> <span class="pre">'dash'),</span> <span class="pre">('.',</span> <span class="pre">'dot')]</span></tt>.</p>
+<p class="last">The default when omitted is <tt class="docutils literal"><span class="pre">[('[-:.]',</span> <span class="pre">'_')]</span></tt>.</p>
+</dd>
 <dt>q, no-questions</dt>
 <dd>Do not ask questions.  For example, if the &quot;-f&quot; command line
 option is omitted and the ouput file exists, then generateDS.py
 will not ask whether the file should be overwritten.  (In this
 case, when &quot;-q&quot; is used, the &quot;-f&quot; must be used to force the
 output file to be written.</dd>
+<dt>no-warnings</dt>
+<dd>While running generateDS.py, do not print warning messages that
+would be written to stderr.</dd>
 <dt>session=mysession.session</dt>
 <dd>Load and use options from session file. You can create a
 session file in generateds_gui.py, the graphical front-end for
 generateDS.py.  Additional options on the command line can be
 used to override options in the session file.  A session file
 is an XML document, so you can modify it with a text editor.</dd>
+<dt>fix-type-names=&quot;oldname1:newname1;oldname2:newname2;...&quot; Fix up</dt>
+<dd><p class="first">(replace) complex type names.  Using this option will replace
+the following: (1) the 'name' attribute of a complexType; (2)
+the 'type' attribute of each element that refers to the type;
+and (3) the 'base' attribute of each extension that refers to
+the type.  These fixups happen before information is collected
+from the schema for code generation. Therefore, using this
+option is effectively equivalent to copying your schema, then
+editing it with your text editor, then generating code from the
+modified schema.  If a new name is not specified, the default is
+to replace the old name with the old name plus an added &quot;xx&quot;
+suffix.  Examples:</p>
+<pre class="last literal-block">
+$ generateDS.py --fix-type-names=&quot;type1:type1Aux&quot;
+$ generateDS.py --fix-type-names=&quot;type1;type2:type2Repl&quot;
+</pre>
+</dd>
 <dt>version</dt>
-<dd>Print out the current version of generateDS.py and immediately
-exit.</dd>
+<dd>Print out the current version of <tt class="docutils literal">generateDS.py</tt> and
+immediately exit.</dd>
 </dl>
 </div>
-<div class="section" id="name-conflicts">
-<h2><a class="toc-backref" href="#id15">5.2&nbsp;&nbsp;&nbsp;Name conflicts</a></h2>
+<div class="section" id="name-conflicts-etc">
+<h2><a class="toc-backref" href="#id18">5.3&nbsp;&nbsp;&nbsp;Name conflicts etc.</a></h2>
 <div class="section" id="conflicts-with-python-keywords">
-<h3><a class="toc-backref" href="#id16">5.2.1&nbsp;&nbsp;&nbsp;Conflicts with Python keywords</a></h3>
+<h3><a class="toc-backref" href="#id19">5.3.1&nbsp;&nbsp;&nbsp;Conflicts with Python keywords</a></h3>
 <p>In some cases the element and attribute names in an XML document
 will conflict with Python keywords.  There are two solutions to fixing
 and avoiding name conflicts:</p>
@@ -833,7 +969,7 @@ itself.</p>
 </ul>
 </div>
 <div class="section" id="conflicts-between-child-elements-and-attributes">
-<h3><a class="toc-backref" href="#id17">5.2.2&nbsp;&nbsp;&nbsp;Conflicts between child elements and attributes</a></h3>
+<h3><a class="toc-backref" href="#id20">5.3.2&nbsp;&nbsp;&nbsp;Conflicts between child elements and attributes</a></h3>
 <p>In some cases the name of a child element and the name of an
 attribute will be the same.  (I believe, but am not sure, that
 this is allowed by XML Schema.) Since generateDS.py treats both
@@ -842,10 +978,48 @@ this is a name conflict.  Therefore, where such conflicts exist,
 generateDS.py modifies the name of the attribute by adding &quot;_attr&quot;
 to its name.</p>
 </div>
+<div class="section" id="cleaning-up-names-with-special-characters-etc">
+<h3><a class="toc-backref" href="#id21">5.3.3&nbsp;&nbsp;&nbsp;Cleaning up names with special characters etc.</a></h3>
+<p><tt class="docutils literal">generateDS.py</tt> attempts to clean up names that contain special
+characters.  For example, a complexType whose name contains a dash
+would generate a Python class with an invalid name.  But, you can
+use this facility to make other changes to names as well.</p>
+<p>The command line option <tt class="docutils literal"><span class="pre">--cleanup-name-list</span></tt> specifies
+replacement pairs to be used when cleaning up (and modifying) names.
+The value of this option must be a string representation of a Python
+list of 2-tuples.  The values of each pair (2-tuple) must be
+strings.  The first item of each pair is a pattern and must be a
+valid Python regular expression (see
+<a class="reference external" href="https://docs.python.org/2/library/re.html#module-re">https://docs.python.org/2/library/re.html#module-re</a>) The second item
+of each pair is a string that will replace anything matched by the
+pattern.  The intension is to enable us to replace special
+characters in names that would cause the generation of invalid
+Python names, for example the names of generated classes.  However,
+since a string replacement is performed, you can replace any single
+character or sequence of characters by any other single character or
+sequence of characters.</p>
+<p>For example, the following option, in addition to performing the
+default replacements of &quot;-&quot;, &quot;:&quot;, and &quot;.&quot; by an underscore, would
+also replace the string &quot;Type&quot; when it occurs at the end of a name,
+by &quot;Class&quot;:</p>
+<pre class="literal-block">
+--cleanup-name-list=&quot;[('[-:.]', '_'), ('Type$', 'Class')]&quot;
+</pre>
+<p>This would cause the name &quot;big-data-Type&quot; to become &quot;big_data_Class&quot;.</p>
+<p>The default when this option is omitted is <tt class="docutils literal"><span class="pre">[('[-:.]',</span> <span class="pre">'_')]</span></tt>.</p>
+<p>The order of replacements performed is the same as the order of the
+tuples in the list.  So, replacements performed by pattern
+replacement pairs (2-tuples) later in the list (to the right) will
+be performed after those earlier (to the left), and may overwrite
+earlier replacements.</p>
+<p>See the notes on the command line option <tt class="docutils literal"><span class="pre">--cleanup-name-list</span></tt> for
+more on this.  Or, run <tt class="docutils literal">$ generateDS.py <span class="pre">--help</span></tt>.</p>
+</div>
 </div>
 </div>
 <div class="section" id="the-graphical-user-interface-how-to-use-it">
-<h1><a class="toc-backref" href="#id18">6&nbsp;&nbsp;&nbsp;The graphical user interface -- How to use it</a></h1>
+<h1><a class="toc-backref" href="#id22">6&nbsp;&nbsp;&nbsp;The graphical user interface -- How to use it</a></h1>
+<p><strong>Note:</strong> The graphical user interface is no longer supported.</p>
 <p>Here are a few notes on how to use the GUI front-end.</p>
 <ul>
 <li><p class="first"><tt class="docutils literal">generateds_gui.py</tt> is installed when you do the standard
@@ -914,9 +1088,9 @@ files.</p>
 </ul>
 </div>
 <div class="section" id="common-problems">
-<h1><a class="toc-backref" href="#id19">7&nbsp;&nbsp;&nbsp;Common problems</a></h1>
+<h1><a class="toc-backref" href="#id23">7&nbsp;&nbsp;&nbsp;Common problems</a></h1>
 <div class="section" id="namespace-prefix-mis-match">
-<h2><a class="toc-backref" href="#id20">7.1&nbsp;&nbsp;&nbsp;Namespace prefix mis-match</a></h2>
+<h2><a class="toc-backref" href="#id24">7.1&nbsp;&nbsp;&nbsp;Namespace prefix mis-match</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> is not very intelligent about detecting what
 prefix is used in the schema file for the XML Schema namespace.
 When this problem occurs, you may see the following when running
@@ -933,9 +1107,64 @@ you will need to use the &quot;-a&quot; command line option when you run
 generateDS.py -a &quot;xsd:&quot; --super=mylib -o mylib.py -s myapp.py someschema.xsd
 </pre>
 </div>
+<div class="section" id="using-multiple-subclass-modules-with-the-same-superclass-module">
+<h2><a class="toc-backref" href="#id25">7.2&nbsp;&nbsp;&nbsp;Using multiple subclass modules with the same superclass module</a></h2>
+<p>Suppose that from a single XML schema, you have generated a
+superclass module and a subclass module (using the &quot;-o&quot; and &quot;-s&quot;
+command line options).  Now you make a copy of the subclass module.
+Next you add special and different code to each of the subclass
+modules.  You can run these two subclass modules separately and
+(after a bit of debugging) each works fine.  And, you can import
+each subclass module in separate applications, and things are still
+good.  However, if you import both subclass modules into a single
+application, you find that one of them is &quot;ignored&quot; by the
+superclass module when it parses XML instance documents and builds
+classes.  Effectively, each subclass module, when it is imported,
+sets a class variable (<tt class="docutils literal">subclass</tt>) in each superclass to the
+subclass to be used by the superclass, and the last subclass
+imported module wins.</p>
+<p>There are two alternative solutions to this problem:</p>
+<ol class="arabic">
+<li><p class="first">Use the script/function provided by the distribution in file
+<tt class="docutils literal">fix_subclass_refs.py</tt>.  The doc string in that module explains
+how to use it and gives an example of its use.</p>
+</li>
+<li><p class="first">Each generated superclass module (starting with <tt class="docutils literal">generateDS.py</tt>
+version 2-19a) contains a global variable
+<tt class="docutils literal">CurrentSubclassModule_</tt>.  The value of this variable, if it is
+not None, overrides the value of the class variable <tt class="docutils literal">subclass</tt>
+in each generated superclass.  You can change the value of this
+variable before parsing an XML document and building instances of
+the generated classes to determine which subclass module is to be
+used during the &quot;build&quot; phase.</p>
+<p>Here is an example of the use of this feature:</p>
+<pre class="literal-block">
+#!/usr/bin/env python
+
+import lib01suba
+import lib01subb
+
+def test():
+    lib01suba.supermod.CurrentSubclassModule_ = lib01suba
+    roota = lib01suba.parse('test01.xml', silence=True)
+    lib01subb.supermod.CurrentSubclassModule_ = lib01subb
+    rootb = lib01subb.parse('test01.xml', silence=True)
+    roota.show()
+    print '-' * 50
+    rootb.show()
+
+test()
+</pre>
+</li>
+</ol>
+<p>The second alternative (above) is likely to be a more convenient
+solution in most cases.  But, there are possibly use cases where the
+use of <tt class="docutils literal">fix_subclass_refs.py</tt> or a modified version of it will be
+helpful.</p>
+</div>
 </div>
 <div class="section" id="supported-features-of-xml-schema">
-<h1><a class="toc-backref" href="#id21">8&nbsp;&nbsp;&nbsp;Supported features of XML Schema</a></h1>
+<h1><a class="toc-backref" href="#id26">8&nbsp;&nbsp;&nbsp;Supported features of XML Schema</a></h1>
 <p>The following constructs, among others, in XML Schema are
 supported:</p>
 <ul class="simple">
@@ -950,14 +1179,14 @@ Schema document.</li>
 and structures. Also see the section on <a class="reference internal" href="#the-xml-schema-input-to-generateds">The XML Schema Input
 to generateDS</a>.</p>
 <div class="section" id="attributes-no-nested-children">
-<h2><a class="toc-backref" href="#id22">8.1&nbsp;&nbsp;&nbsp;Attributes + no nested children</a></h2>
+<h2><a class="toc-backref" href="#id27">8.1&nbsp;&nbsp;&nbsp;Attributes + no nested children</a></h2>
 <p>Element definitions that contain attributes but <em>no</em> nested child
 elements provide access to their data content through getter and
 setter methods <tt class="docutils literal">getValueOf_</tt> and <tt class="docutils literal">setValueOf_</tt> and member
 variable <tt class="docutils literal">valueOf_</tt>.</p>
 </div>
 <div class="section" id="mixed-content">
-<h2><a class="toc-backref" href="#id23">8.2&nbsp;&nbsp;&nbsp;Mixed content</a></h2>
+<h2><a class="toc-backref" href="#id28">8.2&nbsp;&nbsp;&nbsp;Mixed content</a></h2>
 <p>Elements that are defined to contain both text and nested child
 elements have &quot;mixed content&quot;.  <tt class="docutils literal">generateDS.py</tt> provides access
 to mixed content, but the generated data structures (classes) are
@@ -970,7 +1199,7 @@ elements, character data is captured in a member variable
 <tt class="docutils literal">getValueOf_</tt> and <tt class="docutils literal">setValueOf_</tt>.</p>
 </div>
 <div class="section" id="anyattribute">
-<h2><a class="toc-backref" href="#id24">8.3&nbsp;&nbsp;&nbsp;anyAttribute</a></h2>
+<h2><a class="toc-backref" href="#id29">8.3&nbsp;&nbsp;&nbsp;anyAttribute</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> supports <tt class="docutils literal">anyAttribute</tt>.  For example, if an
 element is defined as follows:</p>
 <pre class="literal-block">
@@ -990,7 +1219,7 @@ as well as code for parsing and export. <tt class="docutils literal">generateDS.
 <tt class="docutils literal">processContents</tt>. See section <a class="reference internal" href="#id5">anyAttribute</a> for more details.</p>
 </div>
 <div class="section" id="element-extensions">
-<h2><a class="toc-backref" href="#id25">8.4&nbsp;&nbsp;&nbsp;Element extensions</a></h2>
+<h2><a class="toc-backref" href="#id30">8.4&nbsp;&nbsp;&nbsp;Element extensions</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> now generates subclasses for extensions, that is
 when an element definition contains something like this:</p>
 <pre class="literal-block">
@@ -1009,7 +1238,7 @@ its superclass has been generated.  Therefore, the order in which
 classes are generated may be different from what you expect.</p>
 </div>
 <div class="section" id="attribute-groups">
-<h2><a class="toc-backref" href="#id26">8.5&nbsp;&nbsp;&nbsp;Attribute groups</a></h2>
+<h2><a class="toc-backref" href="#id31">8.5&nbsp;&nbsp;&nbsp;Attribute groups</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> now handles definition and use of attribute
 groups.  For example: the use of something like the following:</p>
 <pre class="literal-block">
@@ -1033,7 +1262,7 @@ groups.  For example: the use of something like the following:</p>
 groups themselves can contain references to other attribute groups.</p>
 </div>
 <div class="section" id="substitution-groups">
-<h2><a class="toc-backref" href="#id27">8.6&nbsp;&nbsp;&nbsp;Substitution groups</a></h2>
+<h2><a class="toc-backref" href="#id32">8.6&nbsp;&nbsp;&nbsp;Substitution groups</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> now handles a limited range of substitution
 groups, but, there is an important <strong>limitation</strong>, in particular
 <tt class="docutils literal">generateDS.py</tt> handles substitution groups that involve complex
@@ -1044,7 +1273,7 @@ does not provide the needed information to handle substitution
 groups.</p>
 </div>
 <div class="section" id="primitive-types">
-<h2><a class="toc-backref" href="#id28">8.7&nbsp;&nbsp;&nbsp;Primitive types</a></h2>
+<h2><a class="toc-backref" href="#id33">8.7&nbsp;&nbsp;&nbsp;Primitive types</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> supports some, but not all, simple types defined
 in &quot;XML Schema Part 0: Primer Second Edition&quot; (
 <a class="reference external" href="http://www.w3.org/TR/xmlschema-0/">http://www.w3.org/TR/xmlschema-0/</a>.  See section &quot;Simple Types&quot; and
@@ -1071,7 +1300,7 @@ validation.</li>
 </ul>
 </div>
 <div class="section" id="simpletype">
-<h2><a class="toc-backref" href="#id29">8.8&nbsp;&nbsp;&nbsp;simpleType</a></h2>
+<h2><a class="toc-backref" href="#id34">8.8&nbsp;&nbsp;&nbsp;simpleType</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> generates minimal support for members defined as
 <tt class="docutils literal">simpleType</tt>.  However, the code generated by <tt class="docutils literal">generateDS.py</tt>
 does <strong>not</strong> enforce restrictions.  For notes on how to enforce
@@ -1110,7 +1339,7 @@ generate valid code:</p>
 </pre>
 </div>
 <div class="section" id="list-values-optional-values-maxoccurs-etc">
-<h2><a class="toc-backref" href="#id30">8.9&nbsp;&nbsp;&nbsp;List values, optional values, maxOccurs, etc.</a></h2>
+<h2><a class="toc-backref" href="#id35">8.9&nbsp;&nbsp;&nbsp;List values, optional values, maxOccurs, etc.</a></h2>
 <p>For elements defined with <tt class="docutils literal"><span class="pre">maxOccurs=&quot;unbounded&quot;</span></tt>,
 <tt class="docutils literal">generateDS.py</tt> generates code that processes a list of elements.</p>
 <p>For elements defined with <tt class="docutils literal"><span class="pre">minOccurs=&quot;0&quot;</span></tt> and <tt class="docutils literal"><span class="pre">maxOccurs=&quot;1&quot;</span></tt>,
@@ -1118,9 +1347,55 @@ generate valid code:</p>
 that element has a (non-None) value.</p>
 </div>
 <div class="section" id="simpletype-and-validators">
-<h2><a class="toc-backref" href="#id31">8.10&nbsp;&nbsp;&nbsp;simpleType and validators</a></h2>
-<p>Here are a few notes that should help you use validator methods to
-enforce restrictions.</p>
+<h2><a class="toc-backref" href="#id36">8.10&nbsp;&nbsp;&nbsp;simpleType and validators</a></h2>
+<div class="section" id="generating-validator-bodies-from-xml-schema">
+<h3><a class="toc-backref" href="#id37">8.10.1&nbsp;&nbsp;&nbsp;Generating validator bodies from XML schema</a></h3>
+<p>If you do <em>not</em> use the <tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt> command line
+option, then <tt class="docutils literal">generateDS.py</tt> will generate validation code
+directly from the restrictions specified inside the <tt class="docutils literal">simpleType</tt>
+definitions in your XML schema.</p>
+<p>Here is a bit of explanation of what that generated code will do.</p>
+<ul class="simple">
+<li>The generated validation code checks the global variable
+<tt class="docutils literal">Validate_simpletypes_</tt>.  Set that variable to <tt class="docutils literal">False</tt> to turn
+off validation.</li>
+<li>In the case of some XML schema built-in simple types, the
+generated validation code calls <tt class="docutils literal">gds_validate_xxx</tt>, where &quot;xxx&quot;
+is a base, simple type.  In some cases, you will be able to add
+additional code to that method to perform custom checking.  See
+section <a class="reference internal" href="#overridable-methods">Overridable methods</a> for information on how to use and
+override that class.</li>
+<li>When validation finds data that fails to validate, it generates a
+warning (using the <tt class="docutils literal">warnings</tt> module from the Python standard
+library), not an exception, so that processing continues.</li>
+<li>The validation code is generated in a separate method named
+<tt class="docutils literal">validate_xxx</tt>, where &quot;xxx&quot; is the name of the data element.
+This method is called in the <tt class="docutils literal">build</tt> method as the input data is
+parsed and instances of the generated classes are created to hold
+it.  Your own code can also call this method whenever you'd like
+to perform on the data in that element/field.</li>
+<li>There are rules for how checking should be performed when (1)
+there are multiple restrictions in a single <tt class="docutils literal">simpleType</tt> and
+when there are restrictions in a <tt class="docutils literal">simpleType</tt> and it base simple
+types.  <tt class="docutils literal">generateds.py</tt> attempts to follow those rules in
+generating validation code.  For information about that, see:
+<a class="reference external" href="http://www.w3.org/TR/xmlschema-2/#rf-facets">http://www.w3.org/TR/xmlschema-2/#rf-facets</a>.  Pattern facets are
+especially tricky, because pattern restrictions at the same level
+are OR-ed together, while pattern restrictions at different levels
+are AND-ed together.  See:
+<a class="reference external" href="http://www.w3.org/TR/xmlschema-2/#rf-pattern">http://www.w3.org/TR/xmlschema-2/#rf-pattern</a>.</li>
+<li>The validation method also performs type conversion for some
+simple types, for example, string to int for integers, string to
+float for floats, etc.</li>
+</ul>
+</div>
+<div class="section" id="user-written-validator-bodies">
+<h3><a class="toc-backref" href="#id38">8.10.2&nbsp;&nbsp;&nbsp;User written validator bodies</a></h3>
+<p>This is the older, more manual method.  In order to generate code
+that uses this method, use command line option
+<tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt>.</p>
+<p>Here are a few notes that should help you <em>write your own</em> validator
+methods to enforce restrictions.</p>
 <ul>
 <li><p class="first">Default behavior -- The generated code, by default, treats the
 value of a member whose type is a <tt class="docutils literal">simpleType</tt> as if it were
@@ -1231,8 +1506,33 @@ So, for example, the following works:</p>
 </li>
 </ul>
 </div>
+<div class="section" id="turning-off-validation-of-simpletype-data">
+<h3><a class="toc-backref" href="#id39">8.10.3&nbsp;&nbsp;&nbsp;Turning off validation of <tt class="docutils literal">simpleType</tt> data</a></h3>
+<p>If you do not want validation performed on <tt class="docutils literal">simpleType</tt> data, you
+have these options:</p>
+<ol class="arabic simple">
+<li>When generating your code, use the
+<tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt> command line option but do
+<em>not</em> use the <tt class="docutils literal"><span class="pre">--validator-bodies</span></tt> command line option.  This
+will result in validator methods that have empty bodies (only a
+<tt class="docutils literal">pass</tt> statement).</li>
+<li>Or, when you run your generated code, set the variable
+<tt class="docutils literal">Validate_simpletypes_</tt> to <tt class="docutils literal">False</tt>.  This global variable is
+near the top of your generated module.  It can be set to <tt class="docutils literal">True</tt>
+or <tt class="docutils literal">False</tt> before and during processing to turn validation on
+and off.</li>
+</ol>
+</div>
+<div class="section" id="additional-notes-on-simpletype-validation">
+<h3><a class="toc-backref" href="#id40">8.10.4&nbsp;&nbsp;&nbsp;Additional notes on <tt class="docutils literal">simpleType</tt> validation</a></h3>
+<p>Don't forget that <tt class="docutils literal">xmllint</tt> can also be used to perform
+validation against the XML scheme.  This validation includes
+checking against <tt class="docutils literal">simpleType</tt> restrictions.  See
+<a class="reference external" href="http://xmlsoft.org/">http://xmlsoft.org/</a> for more information on <tt class="docutils literal">xmllint</tt>.</p>
+</div>
+</div>
 <div class="section" id="include-file-processing">
-<h2><a class="toc-backref" href="#id32">8.11&nbsp;&nbsp;&nbsp;Include file processing</a></h2>
+<h2><a class="toc-backref" href="#id41">8.11&nbsp;&nbsp;&nbsp;Include file processing</a></h2>
 <p>By default, generateDS.py will insert content from files referenced by
 <tt class="docutils literal">include</tt> elements into the XML Schema to be processed.  This
 behavior can be turned off by using the &quot;--no-process-includes&quot;
@@ -1241,18 +1541,12 @@ command line option.</p>
 inserted in the XML Schema by importing and using
 <tt class="docutils literal">process_includes.py</tt>, which is included in the <tt class="docutils literal">generateDS.py</tt>
 distribution.</p>
-<p><tt class="docutils literal">process_includes.py</tt> will use either <tt class="docutils literal">lxml</tt> or <tt class="docutils literal">ElementTree</tt>,
-but its preference is <tt class="docutils literal">lxml</tt> because <tt class="docutils literal">lxml</tt> attempts to preserve
-namespace prefixes.  So if your XML Schemas have <tt class="docutils literal">&lt;include ... /&gt;</tt>
-elements in them, you might want to consider installing <tt class="docutils literal">lxml</tt>, even
-though <tt class="docutils literal">ElementTree</tt> is in the Python standard library for Python
-versions &gt;= 2.5.</p>
 <p>The include file processing is capable of retrieve included files
 via FTP and HTTP internet protocols as well as from the local file
 system.</p>
 </div>
 <div class="section" id="abstract-types">
-<h2><a class="toc-backref" href="#id33">8.12&nbsp;&nbsp;&nbsp;Abstract types</a></h2>
+<h2><a class="toc-backref" href="#id42">8.12&nbsp;&nbsp;&nbsp;Abstract types</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> has support for abstract types.  For more on
 this, see:
 <a class="reference external" href="http://www.w3.org/TR/xmlschema-0/#abstract">XML Schema Part 0: Primer Second Edition: Abstract Elements and Types --
@@ -1260,7 +1554,7 @@ http://www.w3.org/TR/xmlschema-0/#abstract</a>.</p>
 </div>
 </div>
 <div class="section" id="the-xml-schema-input-to-generateds">
-<h1><a class="toc-backref" href="#id34">9&nbsp;&nbsp;&nbsp;The XML schema input to generateDS</a></h1>
+<h1><a class="toc-backref" href="#id43">9&nbsp;&nbsp;&nbsp;The XML schema input to generateDS</a></h1>
 <p><strong>Note:</strong> Quite a bit of work has been done on <tt class="docutils literal">generateDS.py</tt>
 since this section was written.  So, it accepts and processes
 more of features in XML Schema than earlier.  The best advice is to
@@ -1380,11 +1674,11 @@ order to define a member data item that takes an instance or
 list of instances of a Python class.</li>
 </ul>
 <div class="section" id="additional-constructions">
-<h2><a class="toc-backref" href="#id35">9.1&nbsp;&nbsp;&nbsp;Additional constructions</a></h2>
+<h2><a class="toc-backref" href="#id44">9.1&nbsp;&nbsp;&nbsp;Additional constructions</a></h2>
 <p>Here are a few additional constructions that <tt class="docutils literal">generateDS.py</tt>
 understands.</p>
 <div class="section" id="complextype-at-top-level">
-<h3><a class="toc-backref" href="#id36">9.1.1&nbsp;&nbsp;&nbsp;&lt;complexType&gt; at top-level</a></h3>
+<h3><a class="toc-backref" href="#id45">9.1.1&nbsp;&nbsp;&nbsp;&lt;complexType&gt; at top-level</a></h3>
 <p>You can use the &lt;complexType&gt; element at top level (instead of
 &lt;element&gt;) to define an element. So, for example, instead of:</p>
 <pre class="literal-block">
@@ -1408,7 +1702,7 @@ understands.</p>
 </pre>
 </div>
 <div class="section" id="use-of-ref-instead-of-name-and-type-attributes">
-<h3><a class="toc-backref" href="#id37">9.1.2&nbsp;&nbsp;&nbsp;Use of &quot;ref&quot; instead of &quot;name&quot; and &quot;type&quot; attributes</a></h3>
+<h3><a class="toc-backref" href="#id46">9.1.2&nbsp;&nbsp;&nbsp;Use of &quot;ref&quot; instead of &quot;name&quot; and &quot;type&quot; attributes</a></h3>
 <p>You can use the &quot;ref&quot; attribute to refer to another element
 definition, instead of using the &quot;name&quot; and &quot;type&quot; attributes. So,
 for example, you can use the following:</p>
@@ -1433,7 +1727,7 @@ for example, you can use the following:</p>
 </pre>
 </div>
 <div class="section" id="extension-types">
-<h3><a class="toc-backref" href="#id38">9.1.3&nbsp;&nbsp;&nbsp;Extension types</a></h3>
+<h3><a class="toc-backref" href="#id47">9.1.3&nbsp;&nbsp;&nbsp;Extension types</a></h3>
 <p><tt class="docutils literal">generateDS.py</tt> generates a subclass for each element that that
 is defined as the extension of a base element.  So, for the
 following:</p>
@@ -1455,7 +1749,7 @@ class BType(AType):
 </pre>
 </div>
 <div class="section" id="elements-containing-mixed-content">
-<h3><a class="toc-backref" href="#id39">9.1.4&nbsp;&nbsp;&nbsp;Elements containing mixed content</a></h3>
+<h3><a class="toc-backref" href="#id48">9.1.4&nbsp;&nbsp;&nbsp;Elements containing mixed content</a></h3>
 <p><tt class="docutils literal">generateDS.py</tt> generates special code to handle elements
 defined as containing mixed content, that is elements defined with
 attribute <tt class="docutils literal"><span class="pre">mixed=&quot;true&quot;</span></tt>.  See section <a class="reference internal" href="#id3">Mixed content</a> for more
@@ -1464,7 +1758,7 @@ details.</p>
 </div>
 </div>
 <div class="section" id="id2">
-<span id="xmlbehaviors"></span><h1><a class="toc-backref" href="#id40">10&nbsp;&nbsp;&nbsp;XMLBehaviors</a></h1>
+<span id="xmlbehaviors"></span><h1><a class="toc-backref" href="#id49">10&nbsp;&nbsp;&nbsp;XMLBehaviors</a></h1>
 <p>With the use of the &quot;-b&quot; command line option, <tt class="docutils literal">generateDS.py</tt> will
 also accept as input an XML document instance that describes
 behaviors to be added to subclasses when the subclass file is
@@ -1476,7 +1770,7 @@ for the most part, designed by gian paolo ciceri
 (<a class="reference external" href="mailto:gp.ciceri&#64;suddenthinks.com">gp.ciceri&#64;suddenthinks.com</a>).  This work is part of our work on
 our application development project for Quixote.</p>
 <div class="section" id="the-xmlbehaviors-input-file">
-<h2><a class="toc-backref" href="#id41">10.1&nbsp;&nbsp;&nbsp;The XMLBehaviors input file</a></h2>
+<h2><a class="toc-backref" href="#id50">10.1&nbsp;&nbsp;&nbsp;The XMLBehaviors input file</a></h2>
 <p>This section describes the XMLBehavior XML document that is used
 as input to <tt class="docutils literal">generateDS.py</tt>.  The XMLBehavior XML document is an
 XML instance document (given as an argument to the &quot;-b&quot; command
@@ -1549,7 +1843,7 @@ of the base-impl-url.</li>
 </ul>
 </div>
 <div class="section" id="implementing-other-sources-for-implementation-bodies">
-<h2><a class="toc-backref" href="#id42">10.2&nbsp;&nbsp;&nbsp;Implementing other sources for implementation bodies</a></h2>
+<h2><a class="toc-backref" href="#id51">10.2&nbsp;&nbsp;&nbsp;Implementing other sources for implementation bodies</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> contains a function <tt class="docutils literal">get_impl_body()</tt> that
 implements the ability to retrieve implementation bodies.  The
 current implementation retrieves implementation bodies from an
@@ -1590,11 +1884,11 @@ def get_impl_body(classBehavior, baseImplUrl, implUrl):
 </div>
 </div>
 <div class="section" id="additional-features">
-<h1><a class="toc-backref" href="#id43">11&nbsp;&nbsp;&nbsp;Additional features</a></h1>
+<h1><a class="toc-backref" href="#id52">11&nbsp;&nbsp;&nbsp;Additional features</a></h1>
 <p>Here are additional features, contributed by users such as Chris
 Allan.  Many thanks.</p>
 <div class="section" id="xsd-list-element-support">
-<h2><a class="toc-backref" href="#id44">11.1&nbsp;&nbsp;&nbsp;xsd:list element support</a></h2>
+<h2><a class="toc-backref" href="#id53">11.1&nbsp;&nbsp;&nbsp;xsd:list element support</a></h2>
 <p>xsd:list elements can be used with a child xsd:simpleType which
 confuses the XschemaHandler stack unrolling.  xsd:list element
 support should allow the following XML Schema definition to be
@@ -1612,18 +1906,18 @@ supported in <tt class="docutils literal">generateDS.py</tt>:</p>
 </pre>
 </div>
 <div class="section" id="xsd-enumeration-support">
-<h2><a class="toc-backref" href="#id45">11.2&nbsp;&nbsp;&nbsp;xsd:enumeration support</a></h2>
+<h2><a class="toc-backref" href="#id54">11.2&nbsp;&nbsp;&nbsp;xsd:enumeration support</a></h2>
 <p>The enumerated values for the parent element are resolved and made
 available through the instance attribute <tt class="docutils literal">values</tt>.</p>
 </div>
 <div class="section" id="xsd-union-support">
-<h2><a class="toc-backref" href="#id46">11.3&nbsp;&nbsp;&nbsp;xsd:union support</a></h2>
+<h2><a class="toc-backref" href="#id55">11.3&nbsp;&nbsp;&nbsp;xsd:union support</a></h2>
 <p>In order to properly resolve and query types which are unions in
 an XML Schema, an element's membership in an xsd:union is
 available through the instance attribute <tt class="docutils literal">unionOf</tt>.</p>
 </div>
 <div class="section" id="extended-xsd-choice-support">
-<h2><a class="toc-backref" href="#id47">11.4&nbsp;&nbsp;&nbsp;Extended xsd:choice support</a></h2>
+<h2><a class="toc-backref" href="#id56">11.4&nbsp;&nbsp;&nbsp;Extended xsd:choice support</a></h2>
 <p>When a parent xsd:choice is exists, an element's &quot;maxOccurs&quot; and
 &quot;minOccurs&quot; values can be inherited from the xsd:choice rather
 than the element itself. xsd:choice elements have been added to
@@ -1643,7 +1937,7 @@ supported in <tt class="docutils literal">generateDS.py</tt>:</p>
 </pre>
 </div>
 <div class="section" id="arity-minoccurs-maxoccurs-etc">
-<h2><a class="toc-backref" href="#id48">11.5&nbsp;&nbsp;&nbsp;Arity, minOccurs, maxOccurs, etc</a></h2>
+<h2><a class="toc-backref" href="#id57">11.5&nbsp;&nbsp;&nbsp;Arity, minOccurs, maxOccurs, etc</a></h2>
 <p>Some applications require information about the &quot;minOccurs&quot; and
 &quot;maxOccurs&quot; attributes in the XML Schema.  Some of that information
 can be obtained by using the --member-specs= (list|dict) command line
@@ -1652,7 +1946,7 @@ that it generates in each data representation class.  In particular,
 look at the <tt class="docutils literal">get_container</tt> method (from class <tt class="docutils literal">MemberSpec_</tt>).</p>
 </div>
 <div class="section" id="more-thorough-content-type-and-base-type-resolution">
-<h2><a class="toc-backref" href="#id49">11.6&nbsp;&nbsp;&nbsp;More thorough content type and base type resolution</a></h2>
+<h2><a class="toc-backref" href="#id58">11.6&nbsp;&nbsp;&nbsp;More thorough content type and base type resolution</a></h2>
 <p>The previous content type and base type resolution is insufficient
 for some needs.  Basically it was unable to handle more complex
 and shared element and simpleType definitions.  This support has
@@ -1665,7 +1959,7 @@ achieved is available as comments in the source code of
 class <tt class="docutils literal">XschemaElement</tt>.</p>
 </div>
 <div class="section" id="making-top-level-simpletypes-available-from-xschemahandler">
-<h2><a class="toc-backref" href="#id50">11.7&nbsp;&nbsp;&nbsp;Making top level simpleTypes available from XschemaHandler</a></h2>
+<h2><a class="toc-backref" href="#id59">11.7&nbsp;&nbsp;&nbsp;Making top level simpleTypes available from XschemaHandler</a></h2>
 <p>Some developers working to extend the analysis and code generation
 in <tt class="docutils literal">generateDS.py</tt> may be helped by additional information
 collected during the parsing of the XML Schema file.</p>
@@ -1676,7 +1970,7 @@ available as an instance attribute <tt class="docutils literal">topLevelSimpleTy
 <tt class="docutils literal">XschemaHandler</tt>.</p>
 </div>
 <div class="section" id="namespaces-inserting-namespace-definition-in-exported-documents">
-<h2><a class="toc-backref" href="#id51">11.8&nbsp;&nbsp;&nbsp;Namespaces -- inserting namespace definition in exported documents</a></h2>
+<h2><a class="toc-backref" href="#id60">11.8&nbsp;&nbsp;&nbsp;Namespaces -- inserting namespace definition in exported documents</a></h2>
 <p>In some cases, the document produced by a call to an export method
 will contain elements that have namespace prefixes.  For example,
 the following snippet contains namespace prefix &quot;abc&quot;:</p>
@@ -1722,7 +2016,7 @@ generateDS.py --namespacedef='xmlns:abc=&quot;http://www.abc.com/namespace.xsd&q
 <tt class="docutils literal">namespacedef_</tt> argument to the call to export.</p>
 </div>
 <div class="section" id="support-for-xs-any">
-<h2><a class="toc-backref" href="#id52">11.9&nbsp;&nbsp;&nbsp;Support for xs:any</a></h2>
+<h2><a class="toc-backref" href="#id61">11.9&nbsp;&nbsp;&nbsp;Support for xs:any</a></h2>
 <p>There is minimal support for the <tt class="docutils literal">xs:any</tt> wild card declaration.
 Effectively, an element defined by an <tt class="docutils literal">xs:complexType</tt> containing
 <tt class="docutils literal">xs:any</tt> can contain any element type as a child element.  Because
@@ -1749,7 +2043,7 @@ with <tt class="docutils literal">xs:any</tt> should help you understand what is
 copy, paste, and edit code from there.</p>
 </div>
 <div class="section" id="generating-lxml-element-tree">
-<h2><a class="toc-backref" href="#id53">11.10&nbsp;&nbsp;&nbsp;Generating Lxml Element tree</a></h2>
+<h2><a class="toc-backref" href="#id62">11.10&nbsp;&nbsp;&nbsp;Generating Lxml Element tree</a></h2>
 <p>Once you have build the tree of objects that are instances of the
 classes generated by <tt class="docutils literal">generateDS.py</tt>, you can use this to produce
 a tree of instances of the Lxml Element instances.  See
@@ -1779,7 +2073,7 @@ def parseEtree(inFileName):
     return rootObj, rootElement, mapping, reverse_mapping
 </pre>
 <div class="section" id="mapping-generateds-objects-to-lxml-elements-and-back">
-<h3><a class="toc-backref" href="#id54">11.10.1&nbsp;&nbsp;&nbsp;Mapping generateDS objects to Lxml Elements and back</a></h3>
+<h3><a class="toc-backref" href="#id63">11.10.1&nbsp;&nbsp;&nbsp;Mapping generateDS objects to Lxml Elements and back</a></h3>
 <p>Now suppose that you have produced the tree of instances of the
 generated classes, and suppose that you have used that to produce a
 tree of instances of the Element class from Lxml.  It may be useful
@@ -1792,11 +2086,71 @@ convenience method <tt class="docutils literal">gds_reverse_node_mapping</tt> fr
 <tt class="docutils literal">GeneratedsSuper</tt>.  Again, see the code above for an example.</p>
 </div>
 </div>
+<div class="section" id="specifying-names-for-anonymous-nested-type-definitions">
+<h2><a class="toc-backref" href="#id64">11.11&nbsp;&nbsp;&nbsp;Specifying names for anonymous nested type definitions</a></h2>
+<p><tt class="docutils literal">generateDS.py</tt> automatically assigns names for types (and the
+classes generated from them), when that type definition (for
+example, <tt class="docutils literal">xs:complexType</tt>) does not have a name and it is nested
+inside another type definition.  However, these assigned names, in
+part because of the need to make them unique, can be difficult to
+predict.</p>
+<p>Therefore, <tt class="docutils literal">generateDS.py</tt> provides a way to specify the names of
+the Python classes generated from these anonymous, nested types.  To
+do so, follow these steps:</p>
+<ol class="arabic">
+<li><p class="first">Create a module named <tt class="docutils literal">gds_inner_name_map</tt>
+(<tt class="docutils literal">gds_inner_name_map.py</tt>).</p>
+</li>
+<li><p class="first">Place that module where Python can import it when you run
+<tt class="docutils literal">generateDS.py</tt>.  You can do this either by adding an
+additional directory to the environment variable <tt class="docutils literal">PYTHONPATH</tt>
+or by placing <tt class="docutils literal">gds_inner_name_map.py</tt> in a directory that is
+already on Python's search path for modules.  You can check this
+by running the following Python code snippet:</p>
+<pre class="literal-block">
+import sys
+print sys.path
+</pre>
+<p>Also see: <a class="reference external" href="https://docs.python.org/2/library/sys.html#sys.path">https://docs.python.org/2/library/sys.html#sys.path</a></p>
+</li>
+<li><p class="first">In module <tt class="docutils literal">gds_inner_name_map</tt>, define a global variable
+<tt class="docutils literal">Inner_name_map</tt>.  The value of this variable should be a
+dictionary that maps 2-tuples containing (a) the name of the
+grandparent type and (b) the name of the parent type onto the new
+name.</p>
+</li>
+</ol>
+<p>If <tt class="docutils literal">generateDS.py</tt> cannot import <tt class="docutils literal">Inner_name_map</tt> from
+<tt class="docutils literal">gds_inner_name_map</tt>, then it will, by default, generate unique
+names.  In particular, it automatically generates names for
+anonymous, nested types when the following Python statement fails:</p>
+<pre class="literal-block">
+from gds_inner_name_map import Inner_name_map
+</pre>
+<p>Here is an example of module <tt class="docutils literal">gds_inner_name_map.py</tt>:</p>
+<pre class="literal-block">
+Inner_name_map = {
+    (&quot;classAType&quot;, &quot;inner&quot;): &quot;inner_001&quot;,
+    (&quot;classBType&quot;, &quot;inner&quot;): &quot;inner_002&quot;,
+}
+</pre>
+<p>Usage hints:</p>
+<ul class="simple">
+<li>When <tt class="docutils literal">generateDS.py</tt> succeeds in importing <tt class="docutils literal">Inner_name_map</tt>
+from <tt class="docutils literal">gds_inner_name_map</tt>, but <em>cannot</em> find one of the required
+mappings in that dictionary, it will throw an exception and print
+out the missing mapping.  You can copy this line; paste it into
+your <tt class="docutils literal">gds_inner_name_map.py</tt>; and edit it so as to specify the
+class name of your choice.</li>
+<li>Make sure that the names you specify are unique within your XML
+schema.</li>
+</ul>
+</div>
 </div>
 <div class="section" id="how-to-use-the-generated-source-code">
-<h1><a class="toc-backref" href="#id55">12&nbsp;&nbsp;&nbsp;How-to Use the generated source code</a></h1>
+<h1><a class="toc-backref" href="#id65">12&nbsp;&nbsp;&nbsp;How to use the generated source code</a></h1>
 <div class="section" id="the-parsing-functions">
-<h2><a class="toc-backref" href="#id56">12.1&nbsp;&nbsp;&nbsp;The parsing functions</a></h2>
+<h2><a class="toc-backref" href="#id66">12.1&nbsp;&nbsp;&nbsp;The parsing functions</a></h2>
 <p>The simplest use is to call one of the parsing functions in the
 generated source file. You may be able to use one of these
 functions without change, or can modify one to fit your needs.
@@ -1822,7 +2176,7 @@ rootObject = people.parse('people.xml')
 </pre>
 </div>
 <div class="section" id="recognizing-the-top-level-element">
-<h2><a class="toc-backref" href="#id57">12.2&nbsp;&nbsp;&nbsp;Recognizing the top level element</a></h2>
+<h2><a class="toc-backref" href="#id67">12.2&nbsp;&nbsp;&nbsp;Recognizing the top level element</a></h2>
 <p>It might be that the generated module, when parsing an XML instance
 document, does not, by default, recognize the top level (root)
 element in an instance document.  This might happen because
@@ -1943,14 +2297,14 @@ function can parse and export it.</p>
 </ol>
 </div>
 <div class="section" id="the-export-methods">
-<h2><a class="toc-backref" href="#id58">12.3&nbsp;&nbsp;&nbsp;The export methods</a></h2>
+<h2><a class="toc-backref" href="#id68">12.3&nbsp;&nbsp;&nbsp;The export methods</a></h2>
 <p>The generated classes contain methods <tt class="docutils literal">export</tt> and
 <tt class="docutils literal">exportLiteral</tt> which can be called to export classes to several
 text formats, in particular to an XML instance document and a
 Python module containing Python literals.  See the generated parse
 functions for examples showing how to call the export methods.</p>
 <div class="section" id="method-export">
-<h3><a class="toc-backref" href="#id59">12.3.1&nbsp;&nbsp;&nbsp;Method export</a></h3>
+<h3><a class="toc-backref" href="#id69">12.3.1&nbsp;&nbsp;&nbsp;Method export</a></h3>
 <p>The export method in generated classes writes out an XML document
 that represents the instance that contains it and its child
 elements.  So, for example, if your instance tree was created by
@@ -1959,14 +2313,14 @@ one of the parsing functions described above, then calling
 document, differing only with respect to ignorable white space.</p>
 </div>
 <div class="section" id="method-exportliteral">
-<h3><a class="toc-backref" href="#id60">12.3.2&nbsp;&nbsp;&nbsp;Method <tt class="docutils literal">exportLiteral</tt></a></h3>
+<h3><a class="toc-backref" href="#id70">12.3.2&nbsp;&nbsp;&nbsp;Method <tt class="docutils literal">exportLiteral</tt></a></h3>
 <p><tt class="docutils literal">generateDS.py</tt> generates Python classes that represent the
 elements in an XML document, given an Xschema definition of the
 XML document type. The <tt class="docutils literal">exportLiteral</tt> method will export a
 Python literal representation of the Python instances of the
 classes that represent an XML document.</p>
 <div class="section" id="what-it-does">
-<h4><a class="toc-backref" href="#id61">12.3.2.1&nbsp;&nbsp;&nbsp;What It Does</a></h4>
+<h4><a class="toc-backref" href="#id71">12.3.2.1&nbsp;&nbsp;&nbsp;What It Does</a></h4>
 <p>When <tt class="docutils literal">generateDS.py</tt> generates the Python source code for your
 classes, this new feature also generates an <tt class="docutils literal">exportLiteral</tt>
 method in each class. If you call this method on the root
@@ -1980,7 +2334,7 @@ that you can import to (re-)create instances of the classes that
 represent your XML document.</p>
 </div>
 <div class="section" id="why-you-might-care">
-<h4><a class="toc-backref" href="#id62">12.3.2.2&nbsp;&nbsp;&nbsp;Why You Might Care</a></h4>
+<h4><a class="toc-backref" href="#id72">12.3.2.2&nbsp;&nbsp;&nbsp;Why You Might Care</a></h4>
 <p><tt class="docutils literal">generateDS.py</tt> was designed and built with the assumption that
 we are <em>not</em> interested in marking up text content at all.  What
 we really want is a way to represent structured and nested date in
@@ -2023,13 +2377,13 @@ import.</li>
 </ul>
 </div>
 <div class="section" id="how-to-use-it">
-<h4><a class="toc-backref" href="#id63">12.3.2.3&nbsp;&nbsp;&nbsp;How to use it</a></h4>
+<h4><a class="toc-backref" href="#id73">12.3.2.3&nbsp;&nbsp;&nbsp;How to use it</a></h4>
 <p>See the generated function <tt class="docutils literal">parseLiteral</tt> for an example of how
 to use <tt class="docutils literal">exportLiteral</tt>.</p>
 </div>
 </div>
 <div class="section" id="exporting-compact-xml-documents">
-<h3><a class="toc-backref" href="#id64">12.3.3&nbsp;&nbsp;&nbsp;Exporting compact XML documents</a></h3>
+<h3><a class="toc-backref" href="#id74">12.3.3&nbsp;&nbsp;&nbsp;Exporting compact XML documents</a></h3>
 <p>You can also export &quot;compact&quot; XML documents.  A compact document is
 one that is exported <em>without</em> the ignorable whitespace that is used
 to produce pretty printed documents.  In contrast, a pretty printed
@@ -2043,7 +2397,7 @@ default.</p>
 </div>
 </div>
 <div class="section" id="building-instances">
-<h2><a class="toc-backref" href="#id65">12.4&nbsp;&nbsp;&nbsp;Building instances</a></h2>
+<h2><a class="toc-backref" href="#id75">12.4&nbsp;&nbsp;&nbsp;Building instances</a></h2>
 <p>If you have an instance of a minidom node that represents an
 element in an XML document, you can also use the 'build' member
 function to populate an instance of the corresponding class. Here
@@ -2063,7 +2417,7 @@ for child in rootNode.childNodes:
 </pre>
 </div>
 <div class="section" id="using-the-subclass-module">
-<h2><a class="toc-backref" href="#id66">12.5&nbsp;&nbsp;&nbsp;Using the subclass module</a></h2>
+<h2><a class="toc-backref" href="#id76">12.5&nbsp;&nbsp;&nbsp;Using the subclass module</a></h2>
 <p>If you choose to use the generated subclass module, and I
 encourage you to do so, you may need to edit and modify that
 file. Here are some of the things that you must do (look for
@@ -2090,14 +2444,14 @@ accessed through getter and setter methods in the class in which
 they are referenced.</p>
 </div>
 <div class="section" id="elements-with-attributes-but-no-nested-children">
-<h2><a class="toc-backref" href="#id67">12.6&nbsp;&nbsp;&nbsp;Elements with attributes but no nested children</a></h2>
+<h2><a class="toc-backref" href="#id77">12.6&nbsp;&nbsp;&nbsp;Elements with attributes but no nested children</a></h2>
 <p>Element definitions that contain attributes but <em>no</em> nested child
 elements provide access to their data content through getter and
 setter methods <tt class="docutils literal">getValueOf_</tt> and <tt class="docutils literal">setValueOf_</tt> and member
 variable <tt class="docutils literal">valueOf_</tt>.</p>
 </div>
 <div class="section" id="id4">
-<span id="id3"></span><h2><a class="toc-backref" href="#id68">12.7&nbsp;&nbsp;&nbsp;Mixed content</a></h2>
+<span id="id3"></span><h2><a class="toc-backref" href="#id78">12.7&nbsp;&nbsp;&nbsp;Mixed content</a></h2>
 <p>The goal of <tt class="docutils literal">generateDS.py</tt> is to support data structures
 represented in XML as opposed to text mark-up.  However, it does
 provides some support for mixed content.  But, for mixed content,
@@ -2165,7 +2519,7 @@ elements, character data is captured in a member variable
 <tt class="docutils literal">getValueOf_</tt> and <tt class="docutils literal">setValueOf_</tt>.</p>
 </div>
 <div class="section" id="id6">
-<span id="id5"></span><h2><a class="toc-backref" href="#id69">12.8&nbsp;&nbsp;&nbsp;anyAttribute</a></h2>
+<span id="id5"></span><h2><a class="toc-backref" href="#id79">12.8&nbsp;&nbsp;&nbsp;anyAttribute</a></h2>
 <p>For elements that specify <tt class="docutils literal">anyAttributes</tt>, <tt class="docutils literal">generateDS.py</tt>
 produces a class containing the following:</p>
 <ul class="simple">
@@ -2186,7 +2540,7 @@ are <em>not</em> stored in the dictionary <tt class="docutils literal">anyAttrib
 <tt class="docutils literal">anyAttribute</tt> element in the XML Schema</p>
 </div>
 <div class="section" id="user-methods">
-<h2><a class="toc-backref" href="#id70">12.9&nbsp;&nbsp;&nbsp;User Methods</a></h2>
+<h2><a class="toc-backref" href="#id80">12.9&nbsp;&nbsp;&nbsp;User Methods</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> provides a mechanism that enables you to attach
 user defined methods to specific generated classes.  In order to
 do so, create a Python module containing specifications of those
@@ -2308,7 +2662,7 @@ source code and the class_name pattern in each specification.</li>
 </ol>
 </div>
 <div class="section" id="overridable-methods">
-<h2><a class="toc-backref" href="#id71">12.10&nbsp;&nbsp;&nbsp;Overridable methods</a></h2>
+<h2><a class="toc-backref" href="#id81">12.10&nbsp;&nbsp;&nbsp;Overridable methods</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> generates calls to several methods that each have
 a default implementation in a superclass.  The default superclass
 with default implementations is included in the generated code.
@@ -2353,9 +2707,10 @@ default methods in the following places:</p>
 <li><p class="first">In a class named <tt class="docutils literal">GeneratedsSuper</tt> in a separate module named
 <tt class="docutils literal">generatedssuper</tt>.  Since this class would replace the
 default implementations, you should provide implementations of
-all the default methods listed above in that class.  The
-distribution contains a <tt class="docutils literal">generatedssuper.py</tt> which you can
-modify for your specific needs.</p>
+all the default methods listed above in that class.  To create
+your own version, copy and paste the default implementation of
+class <tt class="docutils literal">GeneratedsSuper</tt> from your generated module into a file
+named <tt class="docutils literal">generatedssuper.py</tt>, then modify that.</p>
 </li>
 <li><p class="first">In individual generated (super) classes (the ones generated with
 the &quot;-o&quot; command line option) using the <a class="reference internal" href="#user-methods">User Methods</a> feature.</p>
@@ -2426,7 +2781,7 @@ option for <tt class="docutils literal">generateDS.py</tt>.</p>
 </ul>
 </div>
 <div class="section" id="the-element-name-to-class-name-dictionary">
-<h2><a class="toc-backref" href="#id72">12.11&nbsp;&nbsp;&nbsp;The element name to class name dictionary</a></h2>
+<h2><a class="toc-backref" href="#id82">12.11&nbsp;&nbsp;&nbsp;The element name to class name dictionary</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> automatically generates a dictionary that maps
 element/complexType names to the names of the class generated for
 that complexType definition.  This dictionary is named
@@ -2434,12 +2789,65 @@ that complexType definition.  This dictionary is named
 with the &quot;-o&quot; option.</p>
 </div>
 </div>
+<div class="section" id="one-per-generating-separate-files-from-imported-included-schemas">
+<h1><a class="toc-backref" href="#id83">13&nbsp;&nbsp;&nbsp;&quot;One Per&quot; -- generating separate files from imported/included schemas</a></h1>
+<p>The <tt class="docutils literal"><span class="pre">--one-file-per-xsd</span></tt> command line option enables you to
+generate a separate Python module for each XML schema that is
+imported or included (using <tt class="docutils literal">&lt;xs:import&gt;</tt> or <tt class="docutils literal">&lt;xs:include&gt;</tt>) by
+a &quot;master&quot; schema.  Then, in your Python application, these modules
+can then be imported separately.  Alternatively, these modules can
+be placed in a Python package (a directory containing a file named
+&quot;__init__.py&quot;).  See
+<a class="reference external" href="http://docs.python.org/2/tutorial/modules.html#packages">http://docs.python.org/2/tutorial/modules.html#packages</a> for more on
+Python packages.</p>
+<p>Here is a sample use:</p>
+<pre class="literal-block">
+$ ../generateDS.py --one-file-per-xsd --output-directory=&quot;OnePer&quot; --module-suffix=&quot;One&quot; one_per.xsd
+</pre>
+<p>The above command does the following:</p>
+<ul class="simple">
+<li>It generates one Python module for each XML schema that is
+included/imported by <tt class="docutils literal">one_per.xsd</tt>.</li>
+<li>It places the generated output files in the directory <tt class="docutils literal">OnePer</tt>.</li>
+<li>It adds &quot;One&quot; as a suffix to the name of each generated module.</li>
+</ul>
+<p>Here are a few hints, guidelines, and suggestions:</p>
+<ul>
+<li><p class="first">At least one element definition in an included/imported module
+must be a root element definition in order to cause a
+module to be generated for that schema.  In other words, the
+module must contain an element definition of the form:</p>
+<pre class="literal-block">
+&lt;xs:element name=&quot;Sample&quot; type=&quot;sampleType&quot; /&gt;
+</pre>
+</li>
+<li><p class="first">You may want to write a separate &quot;master&quot; schema that includes
+each of the schemas for which you want to generate a separate
+Python module.</p>
+</li>
+<li><p class="first">Use the <tt class="docutils literal"><span class="pre">--output-directory=&lt;directory&gt;</span></tt> command line option to
+tell <tt class="docutils literal">generateDS.py</tt> to generate the Python modules in a
+specific directory.  The directory must already exist.</p>
+</li>
+<li><p class="first">Use the <tt class="docutils literal"><span class="pre">--module-suffix=&lt;suffix&gt;</span></tt> command line option to add a
+specifc suffix to each module name (the part immediately before
+the extension).  For example, the option <tt class="docutils literal"><span class="pre">--module-suffix=Abc</span></tt>
+causes <tt class="docutils literal">generateDS.py</tt> to generate a file named &quot;schema1Abc.py&quot;
+instead of &quot;schema1.py&quot;.</p>
+</li>
+<li><p class="first">If you want to import files from the output directory and it is
+not in <tt class="docutils literal">sys.path</tt>, add a file named &quot;__init__.py&quot; to that
+directory.  The existence of the file <tt class="docutils literal">__init__.py</tt> turns the
+directory into a Python package.</p>
+</li>
+</ul>
+</div>
 <div class="section" id="how-to-modify-the-generated-code">
-<h1><a class="toc-backref" href="#id73">13&nbsp;&nbsp;&nbsp;How to modify the generated code</a></h1>
+<h1><a class="toc-backref" href="#id84">14&nbsp;&nbsp;&nbsp;How to modify the generated code</a></h1>
 <p>This section attempts to explain how to modify and add features to
 the generated code.</p>
 <div class="section" id="adding-features-to-class-definitions">
-<h2><a class="toc-backref" href="#id74">13.1&nbsp;&nbsp;&nbsp;Adding features to class definitions</a></h2>
+<h2><a class="toc-backref" href="#id85">14.1&nbsp;&nbsp;&nbsp;Adding features to class definitions</a></h2>
 <p>You can add new member definitions to a generated class. Look at
 the 'export' and 'exportLiteral' member functions for examples of
 how to access member variables and how to walk nested
@@ -2484,7 +2892,7 @@ parser, for example, since generating the file.</li>
 </div>
 </div>
 <div class="section" id="examples-and-demonstrations">
-<h1><a class="toc-backref" href="#id75">14&nbsp;&nbsp;&nbsp;Examples and demonstrations</a></h1>
+<h1><a class="toc-backref" href="#id86">15&nbsp;&nbsp;&nbsp;Examples and demonstrations</a></h1>
 <p>Under the directory Demos are several examples:</p>
 <ul class="simple">
 <li>Demos/People provides a simple demonstration of generating
@@ -2501,20 +2909,33 @@ outline tree and writes out a outline.</li>
 structure.</li>
 <li>The implementation of filters and transformations on XML
 documents. The following paper discusses and compares this
-technique with the use of XSLT: <a class="reference external" href="http://www.rexx.com/~dkuhlman/xsltvsgenerateds.html">XSLT and generateDS --
+technique with the use of XSLT: <a class="reference external" href="http://www.davekuhlman.org/xsltvsgenerateds.html">XSLT and generateDS --
 Analysis, Comparison, and Evaluation --
-http://www.rexx.com/~dkuhlman/xsltvsgenerateds.html</a>.</li>
+http://www.davekuhlman.org/xsltvsgenerateds.html</a>.</li>
 <li>Anything that requires a <em>customized</em> tree walk of the XML
 document. Because you can add methods to the generated classes
 containing explicit control logic, the order in which nodes of
 the parsed XML document are visited is under your control.</li>
 </ul>
 <div class="section" id="django-generating-models-and-forms">
-<h2><a class="toc-backref" href="#id76">14.1&nbsp;&nbsp;&nbsp;Django -- Generating Models and Forms</a></h2>
+<h2><a class="toc-backref" href="#id87">15.1&nbsp;&nbsp;&nbsp;Django -- Generating Models and Forms</a></h2>
 <p><tt class="docutils literal">generateDS.py</tt> can be used to generate Django models and Django
 forms that represent the data structures defined in an XML Schema.</p>
+<p><strong>Note:</strong> In order to use this capability, you must obtain the
+&quot;source&quot; distribution of <tt class="docutils literal">generateDS.py</tt>.  You can do this either
+(1) by downloading <tt class="docutils literal"><span class="pre">generateDS-x.xxy.tar.gz</span></tt> from the Python
+Package Index or (2) by downloading the distribution from Bitbucket
+at <a class="reference external" href="https://bitbucket.org/dkuhlman/generateds">https://bitbucket.org/dkuhlman/generateds</a>.  In particular,
+installing <tt class="docutils literal">generateDS.py</tt> using <tt class="docutils literal">pip</tt> does not give you all the
+files you need in order to use this capability.</p>
+<p><em>Note:</em> You only need to obtain the source distribution (so that you
+can copy the files in the <tt class="docutils literal">django/</tt> directory, for example); you
+do not necessarily need to install from it.  If you have already
+installed <tt class="docutils literal">generateDS.py</tt> using <tt class="docutils literal">pip</tt> or <tt class="docutils literal">easy_install</tt>, you
+do not need to re-install from the source tree.</p>
 <p>There are support files in the <tt class="docutils literal">django</tt> directory in the
-distribution.</p>
+source distribution (but <em>not</em> in the version install using <tt class="docutils literal">pip</tt>
+or <tt class="docutils literal">easy_install</tt>).</p>
 <p>Here is an overview of the process:</p>
 <ul class="simple">
 <li>Step 1.  Generate bindings -- Run <tt class="docutils literal">generateDS.py</tt>.</li>
@@ -2524,8 +2945,14 @@ distribution.</p>
 <tt class="docutils literal">gends_generate_django.py</tt>.</li>
 </ul>
 <p>The script <tt class="docutils literal">gends_run_gen_django.py</tt> performs these three steps.</p>
+<p>In order to use the script <tt class="docutils literal">gends_run_gen_django.py</tt>, you may need
+to tell it where the <tt class="docutils literal">generateDS.py</tt> script is located.  If so,
+use the &quot;-p&quot; command line option.  For more information, do:</p>
+<pre class="literal-block">
+python gends_run_gen_django.py --help
+</pre>
 <div class="section" id="how-to-generate-django-models-and-forms">
-<h3><a class="toc-backref" href="#id77">14.1.1&nbsp;&nbsp;&nbsp;How to generate Django models and forms</a></h3>
+<h3><a class="toc-backref" href="#id88">15.1.1&nbsp;&nbsp;&nbsp;How to generate Django models and forms</a></h3>
 <p><strong>Warning:</strong> Running this script attempts to over-write the
 following files in the current directory:</p>
 <ul class="simple">
@@ -2546,8 +2973,9 @@ $ mkdir WorkDir
 $ cd WorkDir
 </pre>
 </li>
-<li><p class="first">Copy the files in from the sub directory <tt class="docutils literal">django/</tt> in the
-distribution to the current directory:</p>
+<li><p class="first">Copy the files in from the sub directory <tt class="docutils literal">django/</tt> in the of
+the source distribution of <tt class="docutils literal">generateDS.py</tt> to the current
+directory:</p>
 <pre class="literal-block">
 $ cp /my_sources/generateDS-n.nn/django/* .
 </pre>
@@ -2562,6 +2990,9 @@ $ cp /my_sources/generateDS-n.nn/process_includes.py .
 <pre class="literal-block">
 $ ./gends_run_gen_django.py myschema.xsd
 </pre>
+<p>There are additional command line options for
+<tt class="docutils literal">gends_run_gen_django.py</tt>.  For help, run
+<tt class="docutils literal">$ python gends_run_gen_django.py <span class="pre">--help</span></tt>.</p>
 </li>
 <li><p class="first">Copy the generated files  <tt class="docutils literal">models.py</tt> and <tt class="docutils literal">forms.py</tt> to your
 Django application.</p>
@@ -2569,7 +3000,7 @@ Django application.</p>
 </ol>
 </div>
 <div class="section" id="how-it-works">
-<h3><a class="toc-backref" href="#id78">14.1.2&nbsp;&nbsp;&nbsp;How it works</a></h3>
+<h3><a class="toc-backref" href="#id89">15.1.2&nbsp;&nbsp;&nbsp;How it works</a></h3>
 <p>Here are a few notes that might be helpful if and when you need to
 do some debugging or extend the current capabilities or write a new
 &quot;meta-app&quot; that uses the same approach but does something new and
@@ -2596,9 +3027,9 @@ root super class of all generated data representation classes.</p>
 </div>
 </div>
 <div class="section" id="sample-code-and-extensions">
-<h1><a class="toc-backref" href="#id79">15&nbsp;&nbsp;&nbsp;Sample code and extensions</a></h1>
+<h1><a class="toc-backref" href="#id90">16&nbsp;&nbsp;&nbsp;Sample code and extensions</a></h1>
 <div class="section" id="capturing-xs-date-elements-as-dates">
-<h2><a class="toc-backref" href="#id80">15.1&nbsp;&nbsp;&nbsp;Capturing xs:date elements as dates</a></h2>
+<h2><a class="toc-backref" href="#id91">16.1&nbsp;&nbsp;&nbsp;Capturing xs:date elements as dates</a></h2>
 <p>The following extension employs a user method (see <a class="reference internal" href="#user-methods">User
 Methods</a>) in order to capture elements defined as xs:date as date
 objects.</p>
@@ -2667,9 +3098,9 @@ import types
 </div>
 </div>
 <div class="section" id="limitations-of-generateds">
-<h1><a class="toc-backref" href="#id81">16&nbsp;&nbsp;&nbsp;Limitations of generateDS</a></h1>
+<h1><a class="toc-backref" href="#id92">17&nbsp;&nbsp;&nbsp;Limitations of generateDS</a></h1>
 <div class="section" id="xml-schema-limitations">
-<h2><a class="toc-backref" href="#id82">16.1&nbsp;&nbsp;&nbsp;XML Schema limitations</a></h2>
+<h2><a class="toc-backref" href="#id93">17.1&nbsp;&nbsp;&nbsp;XML Schema limitations</a></h2>
 <p>There are things in Xschema that are not supported. You will have
 to use a restricted sub-set of Xschema to define your data
 structures. See above for supported features. See people.xsd and
@@ -2678,7 +3109,7 @@ people.xml for examples.</p>
 does not work.</p>
 </div>
 <div class="section" id="large-documents">
-<h2><a class="toc-backref" href="#id83">16.2&nbsp;&nbsp;&nbsp;Large documents</a></h2>
+<h2><a class="toc-backref" href="#id94">17.2&nbsp;&nbsp;&nbsp;Large documents</a></h2>
 <p><strong>Warning</strong> -- This section describes an optional generated SAX
 parser which, I believe, is currently broken for all but the
 simplest schemas.  Generation of a SAX parser has not been updated
@@ -2705,20 +3136,13 @@ memory problem to some extent when the minidom parser is used.</p>
 </div>
 </div>
 <div class="section" id="includes-the-xml-schema-include-element">
-<h1><a class="toc-backref" href="#id84">17&nbsp;&nbsp;&nbsp;Includes -- The XML schema include element</a></h1>
+<h1><a class="toc-backref" href="#id95">18&nbsp;&nbsp;&nbsp;Includes -- The XML schema include element</a></h1>
 <p>While <tt class="docutils literal">generateDS.py</tt> itself does not process XML Schema
 <tt class="docutils literal">include</tt> elements, the distribution provides a script
 <tt class="docutils literal">process_includes.py</tt> that can be used as a preprocessor.  This
 script scans your XML Schema document and, recursively, documents
 that are included looking for <tt class="docutils literal">include</tt> elements; it inserts all
 content into a single document, which it writes out.</p>
-<p>Since <tt class="docutils literal">process_includes.py</tt> uses the ElementTree API, in order
-to use <tt class="docutils literal">process_includes.py</tt> you will need one of the following:</p>
-<ul class="simple">
-<li>Python 2.5 or newer -- ElementTree is in the Python-2.5 distribution.  Or,</li>
-<li><a class="reference external" href="http://effbot.org/zone/element-index.htm">ElementTree</a>.  Or,</li>
-<li><a class="reference external" href="http://codespeak.net/lxml/">lxml</a> -- another implementation of the ElementTree API.</li>
-</ul>
 <p>Here are samples of how you might use <tt class="docutils literal">process_includes.py</tt>, if
 your schema contains <tt class="docutils literal">include</tt> elements.</p>
 <p>Example 1:</p>
@@ -2737,7 +3161,7 @@ $ python process_includes.py --help
 </pre>
 </div>
 <div class="section" id="acknowledgments">
-<h1><a class="toc-backref" href="#id85">18&nbsp;&nbsp;&nbsp;Acknowledgments</a></h1>
+<h1><a class="toc-backref" href="#id96">19&nbsp;&nbsp;&nbsp;Acknowledgments</a></h1>
 <p>Many thanks to those who have used <tt class="docutils literal">generateDS.py</tt> and have
 contributed their comments and suggestions.  These comments have
 been valuable both in teaching me about things I needed to know in
@@ -2751,14 +3175,16 @@ following among others:</p>
 </ul>
 </div>
 <div class="section" id="see-also">
-<h1><a class="toc-backref" href="#id86">19&nbsp;&nbsp;&nbsp;See also</a></h1>
+<h1><a class="toc-backref" href="#id97">20&nbsp;&nbsp;&nbsp;See also</a></h1>
 <p><a class="reference external" href="http://www.python.org">Python</a>: The Python home page.</p>
-<p><a class="reference external" href="http://www.rexx.com/~dkuhlman">Dave's Page</a>: My home page, which contains more Python stuff.</p>
+<p><a class="reference external" href="http://www.davekuhlman.org">Dave's Page</a>: My home page, which contains more Python stuff.</p>
+<!-- vim:ft=rst: -->
 </div>
 </div>
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateDS.txt">View document source</a>.
+Generated on: 2017-01-17 00:01 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 94b0acd..6164e26 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 """
 Synopsis:
-    Generate Python classes from XML Schema definition.
+    Generate Python classes from XML schema definition.
     Input is read from in_xsd_file or, if "-" (dash) arg, from stdin.
     Output is written to files named in "-o" and "-s" options.
 Usage:
@@ -18,16 +18,28 @@ Options:
     -b <behaviorfilename>    Input file name for behaviors added to subclasses
     -m                       Generate properties for member variables
     -c <xmlcatalogfilename>  Input file name to load an XML catalog
+    --one-file-per-xsd       Create a python module for each XSD processed.
+    --output-directory="XXX" Used in conjunction with --one-file-per-xsd.
+                             The directory where the modules will be created.
+    --module-suffix="XXX"    To be used in conjunction with --one-file-per-xsd.
+                             Append XXX to the end of each file created.
     --subclass-suffix="XXX"  Append XXX to the generated subclass names.
                              Default="Sub".
-    --root-element="XXX"     Assume XXX is root element of instance docs.
-                             Default is first element defined in schema.
-                             Also see section "Recognizing the top level
+    --root-element="XX"      When parsing, assume XX is root element of
+    --root-element="XX|YY"   instance docs.  Default is first element defined
+                             in schema.  If YY is added, then YY is used as the
+                             top level class; if YY omitted XX is the default.
+                             class. Also see section "Recognizing the top level
                              element" in the documentation.
-    --super="XXX"            Super module name in generated in subclass
+    --super="XXX"            Super module name in generated subclass
                              module. Default="???"
     --validator-bodies=path  Path to a directory containing files that provide
                              bodies (implementations) of validator methods.
+    --use-old-simpletype-validators
+                             Use the old style simpleType validator functions
+                             stored in a specified directory, instead of the
+                             new style validators generated directly from the
+                             XML schema.  See option --validator-bodies.
     --use-getter-setter      Generate getter and setter methods.  Values:
                              "old" - Name getters/setters getVar()/setVar().
                              "new" - Name getters/setters get_var()/set_var().
@@ -44,10 +56,10 @@ Options:
                              generated files. This is useful if you want
                              to minimize the amount of (no-operation)
                              changes to the generated python code.
-    --no-process-includes    Do not process included XML Schema files.  By
+    --no-process-includes    Do not process included XML schema files.  By
                              default, generateDS.py will insert content
                              from files referenced by <include ... />
-                             elements into the XML Schema to be processed.
+                             elements into the XML schema to be processed.
     --silence                Normally, the code generated with generateDS
                              echoes the information being parsed. To prevent
                              the echo from occurring, use the --silence switch.
@@ -79,8 +91,18 @@ Options:
                                      to XML)
                              Example: "write etree"
                              Default: "write"
+    --disable-xml            Disables generation of all XML build/export
+                             methods and command line interface
+    --preserve-cdata-tags    Preserve CDATA tags.  Default: False
+    --cleanup-name-list=<replacement-map>
+                             Specifies list of 2-tuples used for cleaning
+                             names.  First element is a regular expression
+                             search pattern and second is a replacement.
+                             Example: "[('[-:.]', '_'), ('^__', 'Special')]"
+                             Default: "[('[-:.]', '_')]"
     -q, --no-questions       Do not ask questions, for example,
                              force overwrite.
+    --no-warnings            Do not print warning messages.
     --session=mysession.session
                              Load and use options from session file. You can
                              create session file in generateds_gui.py.  Or,
@@ -129,17 +151,29 @@ also generates member specifications in each class (in a dictionary).
 ## SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
+from __future__ import print_function
 import sys
 import os.path
 import time
 import getopt
-import urllib2
+
+if sys.version_info.major == 2:
+    import urllib2
+    import StringIO
+else:
+    import urllib.request
+    import urllib.error
+    import urllib.parse
+    import io
+    from functools import reduce
 import imp
 from xml.sax import handler, make_parser
 import logging
 import keyword
-import StringIO
 import textwrap
+import hashlib
+import operator
+import re
 
 # Default logger configuration
 logging.basicConfig(
@@ -172,19 +206,31 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.11b'
+VERSION = '2.24b'
 ##VERSION##
 
+if sys.version_info.major == 2:
+    BaseStrType = basestring
+else:
+    BaseStrType = str
+
 GenerateProperties = 0
 UseGetterSetter = 'new'
+UseOldSimpleTypeValidators = False
+UseGeneratedssuperLookup = True
+SchemaLxmlTree = None
+XsdFileName = []
 MemberSpecs = None
-DelayedElements = []
-DelayedElements_subclass = []
-AlreadyGenerated = []
-AlreadyGenerated_subclass = []
+DelayedElements = set()
+DelayedElements_subclass = set()
+AlreadyGenerated = set()
+AlreadyGenerated_subclass = set()
 PostponedExtensions = []
+LoopcheckOneperChecksums = set()
 ElementsForSubclasses = []
 ElementDict = {}
+fqnToElementDict = {}
+fqnToModuleNameMap = {}
 Force = False
 NoQuestions = False
 NoDates = False
@@ -192,8 +238,10 @@ NoVersion = False
 Dirpath = []
 ExternalEncoding = sys.getdefaultencoding()
 Namespacedef = ''
+CleanupNameList = [(re.compile('[-:.]'), '_')]
 
 NamespacesDict = {}
+prefixToNamespaceMap = {}
 MappingTypes = {}
 Targetnamespace = ""
 
@@ -225,8 +273,14 @@ CurrentNamespacePrefix = 'xs:'
 AnyTypeIdentifier = '__ANY__'
 ExportWrite = True
 ExportEtree = False
-ExportLiteral = True
+ExportLiteral = False
+XmlDisabled = False
 FixTypeNames = None
+SingleFileOutput = True
+OutputDirectory = None
+ModuleSuffix = ""
+PreserveCdataTags = False
+NoWarnings = False
 
 SchemaToPythonTypeMap = {}
 
@@ -243,6 +297,7 @@ NonNegativeIntegerType = None
 BooleanType = None
 FloatType = None
 DoubleType = None
+NumericTypes = None
 ElementType = None
 ComplexTypeType = None
 GroupType = None
@@ -292,6 +347,7 @@ def set_type_constants(nameSpace):
         PositiveIntegerType, NegativeIntegerType, \
         NonPositiveIntegerType, NonNegativeIntegerType, \
         BooleanType, FloatType, DoubleType, \
+        NumericTypes, \
         ElementType, ComplexTypeType, GroupType, SequenceType, ChoiceType, \
         AttributeGroupType, AttributeType, SchemaType, \
         DateTimeType, DateType, TimeType, \
@@ -367,6 +423,17 @@ def set_type_constants(nameSpace):
         nameSpace + 'Name',
         nameSpace + 'language',
     )
+    NumericTypes = set([
+        IntegerType,
+        DecimalType,
+        PositiveIntegerType,
+        NegativeIntegerType,
+        NonPositiveIntegerType,
+        NonNegativeIntegerType,
+        FloatType,
+        DoubleType,
+    ])
+    NumericTypes.update(set(IntegerType))
     Base64Type = nameSpace + 'base64Binary'
     TokenType = nameSpace + 'token'
     NameType = nameSpace + 'Name'
@@ -451,12 +518,12 @@ DEBUG = 0
 
 def dbgprint(level, msg):
     if DEBUG and level > 0:
-        print msg
+        print(msg)
 
 
 def pplist(lst):
     for count, item in enumerate(lst):
-        print '%d. %s' % (count, item)
+        print('%d. %s' % (count, item))
 
 
 #
@@ -530,11 +597,7 @@ class SimpleTypeElement(XschemaElementBase):
         s1 = '<"%s" SimpleTypeElement instance at 0x%x>' % \
             (self.getName(), id(self))
         return s1
-
-    def __repr__(self):
-        s1 = '<"%s" SimpleTypeElement instance at 0x%x>' % \
-            (self.getName(), id(self))
-        return s1
+    __repr__ = __str__
 
     def resolve_list_type(self):
         if self.isListType():
@@ -547,23 +610,48 @@ class SimpleTypeElement(XschemaElementBase):
 
 
 class XschemaElement(XschemaElementBase):
-    def __init__(self, attrs):
+    def __init__(self, attrs, targetNamespace=None):
         XschemaElementBase.__init__(self)
         self.cleanName = ''
         self.attrs = dict(attrs)
         name_val = ''
         type_val = ''
         ref_val = ''
+        self.prefix = None
+        self.namespace = None
+        self.is_root_element = False
+        self.targetNamespace = targetNamespace
+        self.fullyQualifiedName = None
+        self.fullyQualifiedType = None
+        self.type = 'NoneType'
+
         if 'name' in self.attrs:
-            name_val = strip_namespace(self.attrs['name'])
+            self.prefix, name_val = get_prefix_and_value(self.attrs['name'])
+            self.fullyQualifiedName = "%s:%s" % (targetNamespace, name_val)
+
         if 'type' in self.attrs:
             if (len(XsdNameSpace) > 0 and
                     self.attrs['type'].startswith(XsdNameSpace)):
                 type_val = self.attrs['type']
             else:
-                type_val = strip_namespace(self.attrs['type'])
+                self.prefix, type_val = get_prefix_and_value(
+                    self.attrs['type'])
+                self.type = type_val
         if 'ref' in self.attrs:
-            ref_val = strip_namespace(self.attrs['ref'])
+            self.prefix, ref_val = get_prefix_and_value(self.attrs['ref'])
+            if self.prefix in prefixToNamespaceMap:
+                xmlns = prefixToNamespaceMap[self.prefix]
+                fqn = "%s:%s" % (xmlns, ref_val)
+                if fqn in fqnToElementDict:
+                    referencedElement = fqnToElementDict[fqn]
+                    type_val = referencedElement.getType()
+                    if type_val == "NoneType":
+                        # anonymous types
+                        type_val = referencedElement.getName()
+                    name_val = ref_val
+            if not type_val:
+                type_val = ref_val
+
         if type_val and not name_val:
             name_val = type_val
         if ref_val and not name_val:
@@ -587,13 +675,14 @@ class XschemaElement(XschemaElementBase):
         self.maxOccurs = 1
         self.complex = 0
         self.complexType = 0
-        self.type = 'NoneType'
         self.mixed = 0
         self.base = None
         self.mixedExtensionError = 0
         self.collapseWhiteSpace = 0
         # Attribute definitions for the currect element.
         self.attributeDefs = {}
+        # Use this to maintain predictable order of attributes.
+        self.attributeDefsList = []
         # Attribute definitions for the current attributeGroup, if
         #   there is one.
         self.attributeGroup = None
@@ -628,6 +717,23 @@ class XschemaElement(XschemaElementBase):
     def getName(self):
         return self.name
 
+    def getFullyQualifiedName(self):
+        return self.fullyQualifiedName
+
+    def getFullyQualifiedType(self):
+        typeName = self.type
+        if not typeName or typeName == "NoneType":
+            typeName = self.name
+        if typeName and not self.fullyQualifiedType:
+            namespace = self.targetNamespace
+            if self.prefix and self.prefix in prefixToNamespaceMap:
+                xmlns = prefixToNamespaceMap[self.prefix]
+                if xmlns:
+                    namespace = xmlns
+            self.fullyQualifiedType = "%s:%s" % (namespace, typeName)
+
+        return self.fullyQualifiedType
+
     def getCleanName(self):
         return self.cleanName
 
@@ -682,12 +788,21 @@ class XschemaElement(XschemaElementBase):
     def isComplex(self):
         return self.complex
 
+    def setIsRootElement(self, is_root_elem):
+        self.is_root_element = is_root_elem
+
+    def isRootElement(self):
+        return self.is_root_element
+
     def addAttributeDefs(self, attrs):
         self.attributeDefs.append(attrs)
 
     def getAttributeDefs(self):
         return self.attributeDefs
 
+    def getAttributeDefsList(self):
+        return self.attributeDefsList
+
     def isMixed(self):
         return self.mixed
 
@@ -808,7 +923,11 @@ class XschemaElement(XschemaElementBase):
         self.expandGroupReferences_tree(visited)
         self.collect_element_dict()
         self.annotate_find_type()
-        self.annotate_tree()
+        element_dict = None
+        to_be_removed = None
+        self.annotate_tree(
+            element_dict=element_dict,
+            to_be_removed=to_be_removed)
         self.fix_dup_names()
         self.coerce_attr_types()
         self.checkMixedBases()
@@ -865,7 +984,10 @@ class XschemaElement(XschemaElementBase):
 
     def collectSimpleBases(self):
         if self.base:
-            self.addSimpleBase(self.base.encode('utf-8'))
+            if sys.version_info.major == 2:
+                self.addSimpleBase(self.base.encode('utf-8'))
+            else:
+                self.addSimpleBase(self.base)
         if self.simpleBase:
             base1 = SimpleTypeDict.get(self.simpleBase[0])
             if base1:
@@ -873,7 +995,10 @@ class XschemaElement(XschemaElementBase):
             else:
                 base2 = None
             while base2:
-                self.addSimpleBase(base2.encode('utf-8'))
+                if sys.version_info.major == 2:
+                    self.addSimpleBase(base2.encode('utf-8'))
+                else:
+                    self.addSimpleBase(base2)
                 base2 = SimpleTypeDict.get(base2)
                 if base2:
                     base2 = base2.getBase()
@@ -921,7 +1046,10 @@ class XschemaElement(XschemaElementBase):
         if type_val == AnyType:
             return AnyType
         if type_val in SimpleTypeDict:
-            self.addSimpleBase(type_val.encode('utf-8'))
+            if sys.version_info.major == 2:
+                self.addSimpleBase(type_val.encode('utf-8'))
+            else:
+                self.addSimpleBase(type_val)
             simple_type = SimpleTypeDict[type_val]
             list_type = simple_type.resolve_list_type()
             self.setListType(list_type)
@@ -1028,12 +1156,32 @@ class XschemaElement(XschemaElementBase):
             type_val = self.resolve_type()
             self.attrs['type'] = type_val
             self.type = type_val
+            self.fullyQualifiedType = None
         if not self.complex:
             SimpleElementDict[self.name] = self
         for child in self.children:
             child.annotate_find_type()
 
-    def annotate_tree(self):
+    def annotate_tree(self, element_dict, to_be_removed):
+        name = self.getName()
+        if element_dict is not None:
+            dup_element = element_dict.get(name)
+            if (dup_element is not None and
+                    # The element_dict keys are the element name.
+                    # So, we do not need to compare names.
+                    #dup_element.getName() == name and
+                    not self.complexType and
+                    not dup_element.complexType):
+                # If we've already seen this element (name), and
+                # these are both xsd:complexType, then
+                # make it a list and throw the previous one away.
+                self.maxOccurs = 2
+                to_be_removed.append(element_dict[name])
+                err_msg(
+                    '*** warning.  Removing child with duplicate '
+                    'name: "{}"\n'.format(name))
+            else:
+                element_dict[name] = self
         # If there is a namespace, replace it with an underscore.
         if self.base:
             self.base = strip_namespace(self.base)
@@ -1073,7 +1221,6 @@ class XschemaElement(XschemaElementBase):
             sys.exit(1)
         self.minOccurs = minOccurs
         self.maxOccurs = maxOccurs
-
         # If it does not have a type, then make the type the same as the name.
         if self.type == 'NoneType' and self.name:
             self.type = self.name
@@ -1092,8 +1239,21 @@ class XschemaElement(XschemaElementBase):
                     parent.collapseWhiteSpace):
                 self.collapseWhiteSpace = 1
         # Do it recursively for all descendents.
+        element_dict = {}
+        to_be_removed = []
         for child in self.children:
-            child.annotate_tree()
+            child.annotate_tree(
+                element_dict=element_dict,
+                to_be_removed=to_be_removed)
+        self.remove_children(to_be_removed)
+
+    def remove_children(self, to_be_removed):
+        for element in to_be_removed:
+            if element in self.children:
+                self.children.remove(element)
+            else:
+                err_msg("*** warning.  child {} already removed\n".format(
+                    element.getName()))
 
     #
     # For each name in the attributeGroupNameList for this element,
@@ -1117,15 +1277,22 @@ class XschemaElement(XschemaElementBase):
         if key is not None:
             attrGroup = AttributeGroups[key]
             for name in attrGroup.getKeys():
-                if (name in AttributeGroups or
-                        strip_namespace(name) in AttributeGroups):
+                group = attrGroup.get(name)
+                # If group is none, then it's an attributeGroup,
+                # not an attribute.
+                # Therefore, we might need to follow it recursively.
+                if (group is None and
+                        (name in AttributeGroups or
+                            strip_namespace(name) in AttributeGroups)):
                     self.replace_attributeGroup_names_1(name)
                 else:
                     attr = attrGroup.get(name)
                     self.attributeDefs[name] = attr
+                    self.attributeDefsList.append(name)
         else:
-            err_msg('*** Error. attributeGroup %s not defined.\n' % (
-                groupName, ))
+            err_msg('*** Error. Element %s attributeGroup %s '
+                    'not defined.\n' % (
+                        self.getName(), groupName, ))
 
     def __str__(self):
         s1 = '<XschemaElement name: "%s" type: "%s">' % \
@@ -1138,6 +1305,7 @@ class XschemaElement(XschemaElementBase):
         #   an attribute.
         #
         attrDefs = self.getAttributeDefs()
+        attrDefsList = self.getAttributeDefsList()
         # Collect a list of child element names.
         #   Must do this for base (extension) elements also.
         elementNames = set()
@@ -1153,17 +1321,21 @@ class XschemaElement(XschemaElementBase):
                 newName = mappedName + '_attr'
                 newAttr = XschemaAttribute(newName)
                 newAttr.setOrig_name(name)
-                attrDefs[newName] = newAttr
-                replaced.append(name)
+                replaced.append((name, newName, newAttr))
         # Remove the old (replaced) attributes.
-        for name in replaced:
+        for name, newName, newAttr in replaced:
             del attrDefs[name]
+            attrDefs[newName] = newAttr
+            try:
+                attrDefsList[attrDefsList.index(name)] = newName
+            except ValueError:
+                pass
         for child in self.children:
             child.fix_dup_names()
 
     def collectElementNames(self, elementNames, count):
         for child in self.children:
-            elementNames.add(mapName(cleanupName(child.cleanName)))
+            elementNames.add(child.getCleanName())
         base = self.getBase()
         if base and base in ElementDict:
             parent = ElementDict[base]
@@ -1191,12 +1363,16 @@ class XschemaElement(XschemaElementBase):
 
 
 class XschemaAttributeGroup:
-    def __init__(self, name='', group=None):
+    def __init__(self, name='', group=None, keyList=None):
         self.name = name
         if group:
             self.group = group
         else:
             self.group = {}
+        if keyList is not None:
+            self.keyList = keyList
+        else:
+            self.keyList = []
 
     def setName(self, name):
         self.name = name
@@ -1217,14 +1393,16 @@ class XschemaAttributeGroup:
             return default
 
     def getKeys(self):
-        return self.group.keys()
+        return self.keyList
 
     def add(self, name, attr):
         self.group[name] = attr
+        self.keyList.append(name)
 
     def delete(self, name):
         if name in self.group:
             del self.group[name]
+            self.keyList.remove(name)
             return 1
         else:
             return 0
@@ -1271,6 +1449,45 @@ class XschemaAttribute:
         if self.data_type in SimpleElementDict:
             typeObj = SimpleElementDict[self.data_type]
             typeObjType = typeObj.getRawType()
+
+##        if self.data_type in SimpleElementDict:
+##            typeObj = SimpleElementDict[self.data_type]
+##            typeObjType = typeObj.getRawType()
+
+##        if strip_namespace(self.data_type) in SimpleTypeDict:
+##            typeObj = SimpleTypeDict[strip_namespace(self.data_type)]
+##            typeObjType = typeObj.getBase()
+
+            if (typeObjType in StringType or
+                    typeObjType == TokenType or
+                    typeObjType in DateTimeGroupType or
+                    typeObjType == Base64Type or
+                    typeObjType in IntegerType or
+                    typeObjType == DecimalType or
+                    typeObjType == PositiveIntegerType or
+                    typeObjType == NegativeIntegerType or
+                    typeObjType == NonPositiveIntegerType or
+                    typeObjType == NonNegativeIntegerType or
+                    typeObjType == BooleanType or
+                    typeObjType == FloatType or
+                    typeObjType == DoubleType):
+                returnType = typeObjType
+        return returnType
+
+    def getBaseType(self):
+        returnType = self.data_type
+##        if self.data_type in SimpleElementDict:
+##            typeObj = SimpleElementDict[self.data_type]
+##            typeObjType = typeObj.getRawType()
+
+##        if self.data_type in SimpleElementDict:
+##            typeObj = SimpleElementDict[self.data_type]
+##            typeObjType = typeObj.getRawType()
+
+        if strip_namespace(self.data_type) in SimpleTypeDict:
+            typeObj = SimpleTypeDict[strip_namespace(self.data_type)]
+            typeObjType = typeObj.getBase()
+
             if (typeObjType in StringType or
                     typeObjType == TokenType or
                     typeObjType in DateTimeGroupType or
@@ -1319,6 +1536,7 @@ class XschemaHandler(handler.ContentHandler):
         self.inComplexType = 0
         self.inNonanonymousComplexType = 0
         self.inSequence = 0
+        self.sequenceStack = []
         self.inChoice = 1
         self.inAttribute = 0
         self.attributeGroupLevel = 0
@@ -1350,7 +1568,7 @@ class XschemaHandler(handler.ContentHandler):
         return keys[0]
 
     def startElement(self, name, attrs):
-        global Targetnamespace, NamespacesDict, XsdNameSpace
+        global Targetnamespace, NamespacesDict, XsdNameSpace, fqnToElementDict
         logging.debug("Start element: %s %s" % (name, repr(attrs.items())))
         if len(self.stack) == 0 and self.firstElement:
             self.firstElement = False
@@ -1373,22 +1591,37 @@ class XschemaHandler(handler.ContentHandler):
             #   use that namespace prefix.
             for name, value in attrs.items():
                 if name[:6] == 'xmlns:':
-                    nameSpace = name[6:] + ':'
+                    prefix = name[6:]
+                    nameSpace = prefix + ':'
                     NamespacesDict[value] = nameSpace
+                    prefixToNamespaceMap[prefix] = value
                 elif name == 'targetNamespace':
                     Targetnamespace = value
+                    element.targetNamespace = value
         elif (name == ElementType or
                 ((name == ComplexTypeType) and (len(self.stack) == 1))):
             self.inElement = 1
             self.inNonanonymousComplexType = 1
-            element = XschemaElement(attrs)
-            if not 'type' in attrs.keys() and not 'ref' in attrs.keys():
+            element = XschemaElement(attrs, Targetnamespace)
+            fqn = element.getFullyQualifiedName()
+            if fqn:
+                fqnToElementDict[fqn] = element
+            if element.prefix in prefixToNamespaceMap:
+                element.namespace = prefixToNamespaceMap[element.prefix]
+            if self.sequenceStack:
+                minOccurs, maxOccurs = self.sequenceStack[-1]
+                if 'minOccurs' not in attrs and minOccurs is not None:
+                    element.attrs['minOccurs'] = minOccurs
+                if 'maxOccurs' not in attrs and maxOccurs is not None:
+                    element.attrs['maxOccurs'] = maxOccurs
+            if 'type' not in attrs and 'ref' not in attrs:
                 element.setExplicitDefine(1)
             if len(self.stack) == 1:
                 element.setTopLevel(1)
-            if 'substitutionGroup' in attrs.keys() and 'name' in attrs.keys():
+            if 'substitutionGroup' in attrs and 'name' in attrs:
                 substituteName = attrs['name']
                 headName = attrs['substitutionGroup']
+                _, headName = get_prefix_and_value(headName)
                 if headName not in SubstitutionGroups:
                     SubstitutionGroups[headName] = []
                 SubstitutionGroups[headName].append(substituteName)
@@ -1416,26 +1649,36 @@ class XschemaHandler(handler.ContentHandler):
             self.stack.append(element)
         elif name == SequenceType:
             self.inSequence = 1
+            self.sequenceStack.append(
+                [attrs.get('minOccurs'), attrs.get('maxOccurs')])
         elif name == ChoiceType:
             self.currentChoice = XschemaElement(attrs)
             self.inChoice = 1
         elif name == AttributeType:
             self.inAttribute = 1
-            if 'name' in attrs.keys():
+            if 'name' in attrs:
                 name = attrs['name']
-            elif 'ref' in attrs.keys():
+            elif 'ref' in attrs:
                 name = strip_namespace(attrs['ref'])
             else:
                 name = 'no_attribute_name'
-            if 'type' in attrs.keys():
+            data_type = StringType[0]
+            if 'type' in attrs:
                 data_type = attrs['type']
-            else:
-                data_type = StringType[0]
-            if 'use' in attrs.keys():
+            elif 'ref' in attrs and SchemaLxmlTree is not None:
+                nsmap = {'xs': 'http://www.w3.org/2001/XMLSchema'}
+                attr_types = SchemaLxmlTree.xpath(
+                    "./xs:attribute[@name=$attrname]",
+                    namespaces=nsmap, attrname=name)
+                if attr_types:
+                    data_type1 = attr_types[0].get('type')
+                    if data_type1 is not None:
+                        data_type = data_type1
+            if 'use' in attrs:
                 use = attrs['use']
             else:
                 use = 'optional'
-            if 'default' in attrs.keys():
+            if 'default' in attrs:
                 default = attrs['default']
             else:
                 default = None
@@ -1447,18 +1690,19 @@ class XschemaHandler(handler.ContentHandler):
                 # Add this attribute to the element/complexType.
                 attribute = XschemaAttribute(name, data_type, use, default)
                 self.stack[-1].attributeDefs[name] = attribute
+                self.stack[-1].attributeDefsList.append(name)
             self.lastAttribute = attribute
         elif name == AttributeGroupType:
             if self.attributeGroupLevel >= 1:
                 # We are in an attribute group and are declaring a reference
                 #   to another attribute group.
-                if 'ref' in attrs.keys():
+                if 'ref' in attrs:
                     self.stack[-1].attributeGroup.add(attrs['ref'], None)
             else:
                 # If it has attribute 'name', then we are defining a new
                 #   attribute group.
                 #   Prepare to save it as an attributeGroup.
-                if 'name' in attrs.keys():
+                if 'name' in attrs:
                     name = strip_namespace(attrs['name'])
                     attributeGroup = XschemaAttributeGroup(name)
                     element = XschemaElement(attrs)
@@ -1468,7 +1712,7 @@ class XschemaHandler(handler.ContentHandler):
                     self.stack.append(element)
                 # If it has attribute 'ref', add it to the list of
                 #   attributeGroups for this element/complexType.
-                if 'ref' in attrs.keys():
+                if 'ref' in attrs:
                     self.stack[-1].attributeGroupNameList.append(attrs['ref'])
             self.attributeGroupLevel += 1
         elif name == SimpleContentType:
@@ -1478,7 +1722,7 @@ class XschemaHandler(handler.ContentHandler):
         elif name == ComplexContentType:
             pass
         elif name == ExtensionType:
-            if 'base' in attrs.keys() and len(self.stack) > 0:
+            if 'base' in attrs and len(self.stack) > 0:
                 extensionBase = attrs['base']
                 if (extensionBase in StringType or
                         extensionBase in IDTypes or
@@ -1498,8 +1742,11 @@ class XschemaHandler(handler.ContentHandler):
                         extensionBase in OtherSimpleTypes):
                     if (len(self.stack) > 0 and
                             isinstance(self.stack[-1], XschemaElement)):
-                        self.stack[-1].addSimpleBase(
-                            extensionBase.encode('utf-8'))
+                        if sys.version_info.major == 2:
+                            self.stack[-1].addSimpleBase(
+                                extensionBase.encode('utf-8'))
+                        else:
+                            self.stack[-1].addSimpleBase(extensionBase)
                 else:
                     self.stack[-1].setBase(extensionBase)
         elif name == AnyAttributeType:
@@ -1512,10 +1759,10 @@ class XschemaHandler(handler.ContentHandler):
             elif self.inSimpleType <= 0:
                 # Save the name of the simpleType, but ignore everything
                 #   else about it (for now).
-                if 'name' in attrs.keys():
-                    stName = cleanupName(attrs['name'])
+                if 'name' in attrs:
+                    stName = attrs['name']
                 elif len(self.stack) > 0:
-                    stName = cleanupName(self.stack[-1].getName())
+                    stName = self.stack[-1].getName()
                 else:
                     stName = None
                 # If the parent is an element, mark it as a simpleType.
@@ -1523,6 +1770,7 @@ class XschemaHandler(handler.ContentHandler):
                     self.stack[-1].setSimpleType(1)
                 element = SimpleTypeElement(stName)
                 SimpleTypeDict[stName] = element
+                SimpleTypeDict[Targetnamespace+":"+stName] = element
                 self.stack.append(element)
             self.inSimpleType += 1
         elif name == RestrictionType:
@@ -1533,7 +1781,7 @@ class XschemaHandler(handler.ContentHandler):
                 # If we are in a simpleType, capture the name of
                 #   the restriction base.
                 if ((self.inSimpleType >= 1 or self.inSimpleContent) and
-                        'base' in attrs.keys()):
+                        'base' in attrs):
                     self.stack[-1].setBase(attrs['base'])
                 else:
                     if 'base' in attrs:
@@ -1615,6 +1863,8 @@ class XschemaHandler(handler.ContentHandler):
             if len(self.stack) >= 2:
                 element = self.stack.pop()
                 self.stack[-1].addChild(element)
+            if name == ElementType and len(self.stack) == 1:
+                element.setIsRootElement(True)
         elif name == AnyType:
             if len(self.stack) >= 2:
                 element = self.stack.pop()
@@ -1623,6 +1873,7 @@ class XschemaHandler(handler.ContentHandler):
             self.inComplexType = 0
         elif name == SequenceType:
             self.inSequence = 0
+            self.sequenceStack.pop()
         elif name == ChoiceType:
             self.currentChoice = None
             self.inChoice = 0
@@ -1717,7 +1968,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
     mappedName = mapName(cleanName)
     child_type = child.getType()
     if child_type == DateTimeType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != "%s":\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
             "(namespace_, self.gds_format_datetime(self.%s, " \
@@ -1725,7 +1981,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
             (fill, name, name, mappedName, name, )
         wrt(s1)
     elif child_type == DateType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != "%s":\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
             "(namespace_, self.gds_format_date(self.%s, " \
@@ -1733,7 +1994,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
             (fill, name, name, mappedName, name, )
         wrt(s1)
     elif child_type == TimeType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != "%s":\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
             "(namespace_, self.gds_format_time(self.%s, " \
@@ -1743,29 +2009,45 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
     elif (child_type in StringType or
             child_type == TokenType or
             child_type in DateTimeGroupType):
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != "%s":\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         # fixlist
         if (child.getSimpleType() in SimpleTypeDict and
                 SimpleTypeDict[child.getSimpleType()].isListType()):
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
-                "(namespace_, self.gds_format_string(quote_xml" \
-                "(' '.join(self.%s)).encode(ExternalEncoding), " \
-                "input_name='%s'), namespace_, eol_))\n" % \
+                "(namespace_, self.gds_encode(self.gds_format_string(" \
+                "quote_xml" \
+                "(' '.join(self.%s)), " \
+                "input_name='%s')), namespace_, eol_))\n" % \
                 (fill, name, name, mappedName, name, )
         else:
+            namespace = 'namespace_'
+            if child.prefix and 'ref' in child.attrs:
+                namespace = "'%s:'" % child.prefix
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
-                "(namespace_, self.gds_format_string(quote_xml(self.%s)." \
-                "encode(ExternalEncoding), input_name='%s'), " \
-                "namespace_, eol_))\n" % \
-                (fill, name, name, mappedName, name, )
+                "(%s, self.gds_encode(self.gds_format_string(" \
+                "quote_xml(self.%s), " \
+                "input_name='%s')), " \
+                "%s, eol_))\n" % \
+                (fill, name, name, namespace, mappedName,
+                    name, namespace, )
         wrt(s1)
     elif (child_type in IntegerType or
             child_type == PositiveIntegerType or
             child_type == NonPositiveIntegerType or
             child_type == NegativeIntegerType or
             child_type == NonNegativeIntegerType):
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != %s:\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         if child.isListType():
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
@@ -1779,7 +2061,17 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
                 (fill, name, name, mappedName, name, )
         wrt(s1)
     elif child_type == BooleanType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            if default == 'true':
+                wrt('%s        if not self.%s:\n' % (fill, mappedName, ))
+            elif default == 'false':
+                wrt('%s        if self.%s:\n' % (fill, mappedName, ))
+            else:
+                wrt('%s        if self.%s is not None:\n' % (
+                    fill, mappedName, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         if child.isListType():
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
@@ -1795,7 +2087,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
         wrt(s1)
     elif (child_type == FloatType or
             child_type == DecimalType):
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != %s:\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         if child.isListType():
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
@@ -1809,7 +2106,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
                 (fill, name, name, mappedName, name, )
         wrt(s1)
     elif child_type == DoubleType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != %s:\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         if child.isListType():
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
@@ -1838,9 +2140,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
                 "namespace_, pretty_print=pretty_print)\n" % \
                 (fill, mappedName)
         else:
-            s1 = "%s            self.%s.export(outfile, level, " \
-                "namespace_, name_='%s', pretty_print=pretty_print)\n" % \
-                (fill, mappedName, name)
+            namespace = 'namespace_'
+            if child.prefix and 'ref' in child.attrs:
+                namespace += "='%s:'" % child.prefix
+            s1 = "%s            self.%s.export(outfile, level, %s, " \
+                "name_='%s', pretty_print=pretty_print)\n" % \
+                (fill, mappedName, namespace, name)
         wrt(s1)
 # end generateExportFn_1
 
@@ -1877,8 +2182,9 @@ def generateExportFn_2(wrt, child, name, namespace, fill):
             child_type in DateTimeGroupType):
         wrt('%s        showIndent(outfile, level, pretty_print)\n' % fill)
         wrt("%s        outfile.write('<%%s%s>%%s</%%s%s>%%s' %% "
-            "(namespace_, self.gds_format_string(quote_xml(%s_).encode("
-            "ExternalEncoding), input_name='%s'), namespace_, eol_))\n" %
+            "(namespace_, self.gds_encode(self.gds_format_string("
+            "quote_xml(%s_), "
+            "input_name='%s')), namespace_, eol_))\n" %
             (fill, name, name, cleanName, name,))
     elif (child_type in IntegerType or
             child_type == PositiveIntegerType or
@@ -1952,9 +2258,12 @@ def generateExportFn_2(wrt, child, name, namespace, fill):
             s1 = "%s        %s_.export(outfile, level, namespace_, " \
                 "pretty_print=pretty_print)\n" % (fill, cleanName)
         else:
-            s1 = "%s        %s_.export(outfile, level, namespace_, " \
+            namespace = 'namespace_'
+            if child.prefix and 'ref' in child.attrs:
+                namespace += "='%s:'" % child.prefix
+            s1 = "%s        %s_.export(outfile, level, %s, " \
                 "name_='%s', pretty_print=pretty_print)\n" % \
-                (fill, cleanName, name)
+                (fill, cleanName, namespace, name)
         wrt(s1)
 # end generateExportFn_2
 
@@ -1965,7 +2274,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
     child_type = child.getType()
     # fix_simpletype
     if child_type == DateTimeType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != "%s":\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
             "(namespace_, self.gds_format_datetime(" \
@@ -1973,7 +2287,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
             (fill, name, name, mappedName, name, )
         wrt(s1)
     elif child_type == DateType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != "%s":\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
             "(namespace_, self.gds_format_date(" \
@@ -1981,7 +2300,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
             (fill, name, name, mappedName, name, )
         wrt(s1)
     elif child_type == TimeType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != "%s":\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
             "(namespace_, self.gds_format_time(" \
@@ -1991,21 +2315,26 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
     elif (child_type in StringType or
             child_type == TokenType or
             child_type in DateTimeGroupType):
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != "%s":\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         # fixlist
         if (child.getSimpleType() in SimpleTypeDict and
                 SimpleTypeDict[child.getSimpleType()].isListType()):
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
-                "(namespace_, self.gds_format_string(" \
-                "quote_xml(' '.join(self.%s)).encode(ExternalEncoding), " \
-                "input_name='%s'), namespace_, eol_))\n" % \
+                "(namespace_, self.gds_encode(self.gds_format_string(" \
+                "quote_xml(' '.join(self.%s)), " \
+                "input_name='%s')), namespace_, eol_))\n" % \
                 (fill, name, name, mappedName, name, )
         else:
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
-                "(namespace_, self.gds_format_string(" \
-                "quote_xml(self.%s).encode(ExternalEncoding), " \
-                "input_name='%s'), namespace_, eol_))\n" % \
+                "(namespace_, self.gds_encode(self.gds_format_string(" \
+                "quote_xml(self.%s), " \
+                "input_name='%s')), namespace_, eol_))\n" % \
                 (fill, name, name, mappedName, name, )
         wrt(s1)
     elif (child_type in IntegerType or
@@ -2013,7 +2342,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
             child_type == NonPositiveIntegerType or
             child_type == NegativeIntegerType or
             child_type == NonNegativeIntegerType):
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != %s:\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         if child.isListType():
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
@@ -2027,7 +2361,17 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
                 (fill, name, name, mappedName, name, )
         wrt(s1)
     elif child_type == BooleanType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            if default == 'true':
+                wrt('%s        if not self.%s:\n' % (fill, mappedName, ))
+            elif default == 'false':
+                wrt('%s        if self.%s:\n' % (fill, mappedName, ))
+            else:
+                wrt('%s        if self.%s is not None:\n' % (
+                    fill, mappedName, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         if child.isListType():
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
@@ -2043,7 +2387,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
         wrt(s1)
     elif (child_type == FloatType or
             child_type == DecimalType):
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != %s:\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         if child.isListType():
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
@@ -2057,7 +2406,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
                 (fill, name, name, mappedName, name, )
         wrt(s1)
     elif child_type == DoubleType:
-        wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        default = child.getDefault()
+        if default is None:
+            wrt('%s        if self.%s is not None:\n' % (fill, mappedName, ))
+        else:
+            wrt('%s        if self.%s != %s:\n' % (
+                fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         if child.isListType():
             s1 = "%s            outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \
@@ -2086,9 +2440,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
                 "outfile, level, namespace_, pretty_print=pretty_print)\n" % \
                 (fill, mappedName)
         else:
-            s1 = "%s            self.%s.export(outfile, level, namespace_, " \
+            namespace = 'namespace_'
+            if child.prefix and 'ref' in child.attrs:
+                namespace += "='%s:'" % child.prefix
+            s1 = "%s            self.%s.export(outfile, level, %s, " \
                 "name_='%s', pretty_print=pretty_print)\n" % \
-                (fill, mappedName, name)
+                (fill, mappedName, namespace, name)
         wrt(s1)
 # end generateExportFn_3
 
@@ -2131,7 +2488,7 @@ def generateToEtreeChildren(wrt, element, Targetnamespace):
         else:
             for child in element.getChildren():
                 unmappedName = child.getName()
-                name = mapName(cleanupName(child.getName()))
+                name = child.getCleanName()
                 child_type = child.getType()
                 if child_type == AnyTypeIdentifier:
                     if child.getMaxOccurs() > 1:
@@ -2178,61 +2535,66 @@ def generateToEtreeChildren(wrt, element, Targetnamespace):
                             wrt("            etree_.SubElement(element, "
                                 "'{%s}%s').text = self.gds_format_integer_list"
                                 "(%s_)\n" % (
-                                Targetnamespace, unmappedName, name))
+                                    Targetnamespace, unmappedName, name))
                         else:
                             wrt("            etree_.SubElement(element, "
                                 "'{%s}%s').text = self.gds_format_integer"
                                 "(%s_)\n" % (
-                                Targetnamespace, unmappedName, name))
+                                    Targetnamespace, unmappedName, name))
                     elif child_type == BooleanType:
                         if child.isListType():
                             wrt("            etree_.SubElement(element, "
                                 "'{%s}%s').text = self.gds_format_boolean_list"
                                 "(%s_)\n" % (
-                                Targetnamespace, unmappedName, name))
+                                    Targetnamespace, unmappedName, name))
                         else:
                             wrt("            etree_.SubElement(element, "
                                 "'{%s}%s').text = self.gds_format_boolean"
                                 "(%s_)\n" % (
-                                Targetnamespace, unmappedName, name))
+                                    Targetnamespace, unmappedName, name))
                     elif child_type == FloatType or \
                             child_type == DecimalType:
                         if child.isListType():
                             wrt("            etree_.SubElement(element, "
                                 "'{%s}%s').text = self.gds_format_float_list"
                                 "(%s_)\n" % (
-                                Targetnamespace, unmappedName, name))
+                                    Targetnamespace, unmappedName, name))
                         else:
                             wrt("            etree_.SubElement(element, "
                                 "'{%s}%s').text = self.gds_format_float"
                                 "(%s_)\n" % (
-                                Targetnamespace, unmappedName, name))
+                                    Targetnamespace, unmappedName, name))
                     elif child_type == DoubleType:
                         if child.isListType():
                             wrt("            etree_.SubElement(element, "
                                 "'{%s}%s').text = self.gds_format_double_list"
                                 "(%s_)\n" % (
-                                Targetnamespace, unmappedName, name))
+                                    Targetnamespace, unmappedName, name))
                         else:
                             wrt("            etree_.SubElement(element, "
                                 "'{%s}%s').text = self.gds_format_double"
                                 "(%s_)\n" % (
-                                Targetnamespace, unmappedName, name))
+                                    Targetnamespace, unmappedName, name))
                     elif child_type == Base64Type:
                         wrt("            etree_.SubElement(element, "
                             "'{%s}%s').text = self.gds_format_base64"
                             "(%s_)\n" % (
-                            Targetnamespace, unmappedName, name))
+                                Targetnamespace, unmappedName, name))
                     else:
                         wrt("            %s_.to_etree(element, name_='%s', "
                             "mapping_=mapping_)\n" % (
-                            name, unmappedName,))
+                                name, unmappedName,))
+    else:
+        if element.getSimpleContent() or element.isMixed():
+            wrt("        if self.hasContent_():\n")
+            wrt("            element.text = self.gds_format_string"
+                "(self.get_valueOf_())\n")
 #end generateToEtreeChildren
 
 
 def generateToEtreeAttributes(wrt, element):
     attrDefs = element.getAttributeDefs()
-    for key in attrDefs.keys():
+    for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         name = attrDef.getName()
         cleanName = mapName(cleanupName(name))
@@ -2282,7 +2644,7 @@ def generateExportAttributes(wrt, element, hasAttributes):
     if len(element.getAttributeDefs()) > 0:
         hasAttributes += 1
         attrDefs = element.getAttributeDefs()
-        for key in attrDefs.keys():
+        for key in element.getAttributeDefsList():
             attrDef = attrDefs[key]
             name = attrDef.getName()
             orig_name = attrDef.getOrig_name()
@@ -2290,9 +2652,32 @@ def generateExportAttributes(wrt, element, hasAttributes):
                 orig_name = name
             cleanName = mapName(cleanupName(name))
             if True:            # attrDef.getUse() == 'optional':
-                wrt("        if self.%s is not None and '%s' not in "
-                    "already_processed:\n" % (
-                    cleanName, cleanName, ))
+                default = attrDef.getDefault()
+                if default is None:
+                    s1 = '        if self.%s is not None and ' % (cleanName, )
+                else:
+                    attr_type = attrDef.getBaseType()
+                    if (attr_type in StringType or
+                            attr_type == TokenType or
+                            attr_type in DateTimeGroupType):
+                        s1 = '        if self.%s != "%s" and ' % (
+                            cleanName, default, )
+                    elif attr_type == BooleanType:
+                        if default == 'true':
+                            s1 = '        if not self.%s and ' % (cleanName, )
+                        elif default == 'false':
+                            s1 = '        if self.%s and ' % (cleanName, )
+                        else:
+                            s1 = '        if self.%s is not None and ' % (
+                                cleanName, )
+                    elif attr_type in NumericTypes:
+                        s1 = '        if self.%s != %s and ' % (
+                            cleanName, default, )
+                    else:
+                        s1 = '        if self.%s != "%s" and ' % (
+                            cleanName, default, )
+                s1 += "'%s' not in already_processed:\n" % (cleanName, )
+                wrt(s1)
                 wrt("            already_processed.add('%s')\n" % (
                     cleanName, ))
                 indent = "    "
@@ -2303,23 +2688,23 @@ def generateExportAttributes(wrt, element, hasAttributes):
                 s1 = '''%s        outfile.write(' %s="%%s"' %% ''' \
                     '''self.gds_format_datetime(self.%s, ''' \
                     '''input_name='%s'))\n''' % (
-                    indent, orig_name, cleanName, name)
+                        indent, orig_name, cleanName, name)
             elif attrDef.getType() == DateType:
                 s1 = '''%s        outfile.write(' %s="%%s"' %% ''' \
                     '''self.gds_format_date(self.%s, input_name='%s'))\n''' % (
-                    indent, orig_name, cleanName, name)
+                        indent, orig_name, cleanName, name)
             elif attrDef.getType() == TimeType:
                 s1 = '''%s        outfile.write(' %s="%%s"' %% ''' \
                     '''self.gds_format_time(self.%s, input_name='%s'))\n''' % (
-                    indent, orig_name, cleanName, name)
+                        indent, orig_name, cleanName, name)
             elif (attrDefType in StringType or
                     attrDefType in IDTypes or
                     attrDefType == TokenType or
                     attrDefType in DateTimeGroupType):
                 s1 = '''%s        outfile.write(' %s=%%s' %% ''' \
-                    '''(self.gds_format_string(quote_attrib(''' \
-                    '''self.%s).encode(''' \
-                    '''ExternalEncoding), input_name='%s'), ))\n''' % \
+                    '''(self.gds_encode(self.gds_format_string(''' \
+                    '''quote_attrib(self.%s), ''' \
+                    '''input_name='%s')), ))\n''' % \
                     (indent, orig_name, cleanName, name, )
             elif (attrDefType in IntegerType or
                     attrDefType == PositiveIntegerType or
@@ -2329,7 +2714,7 @@ def generateExportAttributes(wrt, element, hasAttributes):
                 s1 = '''%s        outfile.write(' %s="%%s"' %% ''' \
                     '''self.gds_format_integer(self.%s, ''' \
                     '''input_name='%s'))\n''' % (
-                    indent, orig_name, cleanName, name, )
+                        indent, orig_name, cleanName, name, )
             elif attrDefType == BooleanType:
                 s1 = '''%s        outfile.write(' %s="%%s"' %% ''' \
                     '''self.gds_format_boolean(''' \
@@ -2343,11 +2728,11 @@ def generateExportAttributes(wrt, element, hasAttributes):
                 s1 = '''%s        outfile.write(' %s="%%s"' %% ''' \
                     '''self.gds_format_double(self.%s, ''' \
                     '''input_name='%s'))\n''' % (
-                    indent, orig_name, cleanName, name)
+                        indent, orig_name, cleanName, name)
             else:
                 s1 = '''%s        outfile.write(' %s=%%s' %% ''' \
                     '''(quote_attrib(self.%s), ))\n''' % (
-                    indent, orig_name, cleanName, )
+                        indent, orig_name, cleanName, )
             wrt(s1)
     if element.getExtended():
         wrt("        if self.extensiontype_ is not None and 'xsi:type' "
@@ -2378,7 +2763,7 @@ def generateExportChildren(wrt, element, hasChildren, namespace):
             any_type_child = None
             for child in element.getChildren():
                 unmappedName = child.getName()
-                name = mapName(cleanupName(child.getName()))
+                name = child.getCleanName()
                 # fix_abstract
                 type_element = None
                 abstract_child = False
@@ -2395,13 +2780,13 @@ def generateExportChildren(wrt, element, hasChildren, namespace):
                             fill, name, name,))
                         wrt("%s    %s_.export(outfile, level, namespace_, "
                             "name_='%s', pretty_print=pretty_print)\n" % (
-                            fill, name, name, ))
+                                fill, name, unmappedName, ))
                     elif abstract_child:
                         wrt("%sif self.%s is not None:\n" % (fill, name, ))
                         wrt("%s    self.%s.export(outfile, level, "
                             "namespace_, name_='%s', "
                             "pretty_print=pretty_print)\n" % (
-                            fill, name, name, ))
+                                fill, name, unmappedName, ))
                     elif child.getMaxOccurs() > 1:
                         generateExportFn_2(
                             wrt, child, unmappedName, namespace, '    ')
@@ -2441,25 +2826,28 @@ def getParentName(element):
     parentObj = None
     if base and base in ElementDict:
         parentObj = ElementDict[base]
-        parentName = cleanupName(parentObj.getName())
+        parentName = parentObj.getCleanName()
     elif rBase:
         base = element.getRestrictionBase()
         parentObj = ElementDict[base]
-        parentName = cleanupName(parentObj.getName())
+        parentName = parentObj.getCleanName()
     return parentName, parentObj
 
 
-def generateExportFn(wrt, prefix, element, namespace):
+def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
     childCount = countChildren(element, 0)
     name = element.getName()
     base = element.getBase()
     wrt("    def export(self, outfile, level, namespace_='%s', "
-        "name_='%s', namespacedef_='', pretty_print=True):\n" %
-        (namespace, name, ))
+        "name_='%s', namespacedef_='%s', pretty_print=True):\n" %
+        (namespace, name, nameSpacesDef))
     wrt('        if pretty_print:\n')
     wrt("            eol_ = '\\n'\n")
     wrt('        else:\n')
     wrt("            eol_ = ''\n")
+    # We need to be able to export the original tag name.
+    wrt("        if self.original_tagname_ is not None:\n")
+    wrt("            name_ = self.original_tagname_\n")
     wrt('        showIndent(outfile, level, pretty_print)\n')
     wrt("        outfile.write('<%s%s%s' % (namespace_, name_, "
         "namespacedef_ and ' ' + namespacedef_ or '', ))\n")
@@ -2484,12 +2872,13 @@ def generateExportFn(wrt, prefix, element, namespace):
         if element.getSimpleContent():
             wrt("            outfile.write('>')\n")
             if not element.isMixed():
-                wrt("            outfile.write(str(self.valueOf_).encode("
-                    "ExternalEncoding))\n")
+                wrt("            outfile.write(self.convert_unicode("
+                    "self.valueOf_))\n")
         else:
             wrt("            outfile.write('>%s' % (eol_, ))\n")
         wrt("            self.exportChildren(outfile, level + 1, "
-            "namespace_, name_, pretty_print=pretty_print)\n")
+            "namespace_='%s', name_='%s', pretty_print=pretty_print)\n" %
+            (namespace, name))
         # Put a condition on the indent to require children.
         if childCount != 0:
             wrt('            showIndent(outfile, level, pretty_print)\n')
@@ -2525,9 +2914,9 @@ def generateExportFn(wrt, prefix, element, namespace):
                                 name, quote_attrib(value), ))
                         else:
                             unique_counter += 1
-                            outfile.write(' xmlns:yyy%d=\"%s\"' % (
+                            outfile.write(' xmlns:%d=\"%s\"' % (
                                 unique_counter, namespace, ))
-                            outfile.write(' yyy%d:%s=%s' % (
+                            outfile.write(' %d:%s=%s' % (
                                 unique_counter, name, quote_attrib(value), ))
                 else:
                     if name not in already_processed:
@@ -2538,9 +2927,9 @@ def generateExportFn(wrt, prefix, element, namespace):
     if parentName:
         hasAttributes += 1
         elName = element.getCleanName()
-        wrt("        super(%s, self).exportAttributes("
+        wrt("        super(%s%s, self).exportAttributes("
             "outfile, level, already_processed, namespace_, name_='%s')\n" %
-            (elName, name, ))
+            (prefix, elName, name, ))
     hasAttributes += generateExportAttributes(wrt, element, hasAttributes)
     if hasAttributes == 0:
         wrt("        pass\n")
@@ -2554,9 +2943,9 @@ def generateExportFn(wrt, prefix, element, namespace):
     if parentName and not element.getRestrictionBaseObj():
         hasChildren += 1
         elName = element.getCleanName()
-        wrt("        super(%s, self).exportChildren(outfile, level, "
+        wrt("        super(%s%s, self).exportChildren(outfile, level, "
             "namespace_, name_, True, pretty_print=pretty_print)\n" %
-            (elName, ))
+            (prefix, elName, ))
     hasChildren += generateExportChildren(wrt, element, hasChildren, namespace)
     if childCount == 0:   # and not element.isMixed():
         wrt("        pass\n")
@@ -2609,15 +2998,15 @@ def generateExportLiteralFn_1(wrt, child, name, fill):
                     SimpleTypeDict[child.getSimpleType()].isListType()):
                 wrt("%s            if self.%s:\n" % (fill, mappedName, ))
                 wrt("%s                outfile.write('%s=%%s,\\n' %% "
-                    "quote_python(' '.join(self.%s)).encode("
-                    "ExternalEncoding)) \n" %
+                    "self.gds_encode(quote_python(' '.join(self.%s)))"
+                    ") \n" %
                     (fill, mappedName, mappedName, ))
                 wrt("%s            else:\n" % (fill, ))
                 wrt("%s                outfile.write('%s=None,\\n')\n" %
                     (fill, mappedName, ))
             else:
                 wrt("%s            outfile.write('%s=%%s,\\n' %% "
-                    "quote_python(self.%s).encode(ExternalEncoding))\n" %
+                    "self.gds_encode(quote_python(self.%s)))\n" %
                     (fill, mappedName, mappedName, ))
         elif (childType in IntegerType or
                 childType == PositiveIntegerType or
@@ -2680,8 +3069,8 @@ def generateExportLiteralFn_2(wrt, child, name, fill):
             childType == TokenType or
             childType in DateTimeGroupType):
         wrt('%s        showIndent(outfile, level)\n' % fill)
-        wrt("%s        outfile.write('%%s,\\n' %% quote_python(%s_).encode("
-            "ExternalEncoding))\n" % (fill, name))
+        wrt("%s        outfile.write('%%s,\\n' %% self.gds_encode("
+            "quote_python(%s_)))\n" % (fill, name, ))
     elif (childType in IntegerType or
             childType == PositiveIntegerType or
             childType == NonPositiveIntegerType or
@@ -2733,7 +3122,7 @@ def generateExportLiteralFn(wrt, prefix, element):
         "already_processed, name_):\n")
     count = 0
     attrDefs = element.getAttributeDefs()
-    for key in attrDefs:
+    for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         count += 1
         name = attrDef.getName()
@@ -2746,7 +3135,7 @@ def generateExportLiteralFn(wrt, prefix, element):
             attrType = SimpleTypeDict[attrType].getBase()
         wrt("        if self.%s is not None and '%s' not in "
             "already_processed:\n" % (
-            mappedName, mappedName, ))
+                mappedName, mappedName, ))
         wrt("            already_processed.add('%s')\n" % (
             mappedName, ))
         if attrType == DateTimeType:
@@ -2809,18 +3198,18 @@ def generateExportLiteralFn(wrt, prefix, element):
     if parentName:
         count += 1
         elName = element.getCleanName()
-        wrt("        super(%s, self).exportLiteralAttributes("
+        wrt("        super(%s%s, self).exportLiteralAttributes("
             "outfile, level, already_processed, name_)\n" %
-            (elName, ))
+            (prefix, elName, ))
     if count == 0:
         wrt("        pass\n")
     wrt("    def exportLiteralChildren(self, outfile, level, name_):\n")
     parentName, parent = getParentName(element)
     if parentName:
         elName = element.getCleanName()
-        wrt("        super(%s, self).exportLiteralChildren("
+        wrt("        super(%s%s, self).exportLiteralChildren("
             "outfile, level, name_)\n" %
-            (elName, ))
+            (prefix, elName, ))
     for child in element.getChildren():
         name = child.getName()
         name = cleanupName(name)
@@ -2878,7 +3267,7 @@ def generateExportLiteralFn(wrt, prefix, element):
 
 def generateBuildAttributes(wrt, element, hasAttributes):
     attrDefs = element.getAttributeDefs()
-    for key in attrDefs:
+    for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         hasAttributes += 1
         name = attrDef.getName()
@@ -2900,7 +3289,7 @@ def generateBuildAttributes(wrt, element, hasAttributes):
             wrt('            try:\n')
             wrt("                self.%s = self.gds_parse_datetime("
                 "value)\n" % (mappedName, ))
-            wrt('            except ValueError, exp:\n')
+            wrt('            except ValueError as exp:\n')
             wrt("                raise ValueError("
                 "'Bad date-time attribute (%s): %%s' %% exp)\n" %
                 (name, ))
@@ -2914,7 +3303,7 @@ def generateBuildAttributes(wrt, element, hasAttributes):
             wrt('            try:\n')
             wrt("                self.%s = self.gds_parse_date("
                 "value)\n" % (mappedName, ))
-            wrt('            except ValueError, exp:\n')
+            wrt('            except ValueError as exp:\n')
             wrt("                raise ValueError("
                 "'Bad date attribute (%s): %%s' %% exp)\n" %
                 (name, ))
@@ -2928,7 +3317,7 @@ def generateBuildAttributes(wrt, element, hasAttributes):
             wrt('            try:\n')
             wrt("                self.%s = self.gds_parse_time("
                 "value)\n" % (mappedName, ))
-            wrt('            except ValueError, exp:\n')
+            wrt('            except ValueError as exp:\n')
             wrt("                raise ValueError("
                 "'Bad time attribute (%s): %%s' %% exp)\n" %
                 (name, ))
@@ -2945,7 +3334,7 @@ def generateBuildAttributes(wrt, element, hasAttributes):
             wrt("            already_processed.add('%s')\n" % (name, ))
             wrt('            try:\n')
             wrt("                self.%s = int(value)\n" % (mappedName, ))
-            wrt('            except ValueError, exp:\n')
+            wrt('            except ValueError as exp:\n')
             wrt("                raise_parse_error("
                 "node, 'Bad integer attribute: %s' % exp)\n")
             if atype == PositiveIntegerType:
@@ -2988,7 +3377,7 @@ def generateBuildAttributes(wrt, element, hasAttributes):
             wrt('            try:\n')
             wrt("                self.%s = float(value)\n" %
                 (mappedName, ))
-            wrt('            except ValueError, exp:\n')
+            wrt('            except ValueError as exp:\n')
             wrt("                raise ValueError('Bad float/double "
                 "attribute (%s): %%s' %% exp)\n" %
                 (name, ))
@@ -3015,7 +3404,7 @@ def generateBuildAttributes(wrt, element, hasAttributes):
         if typeName and typeName in SimpleTypeDict:
             wrt("            self.validate_%s(self.%s)    "
                 "# validate type %s\n" %
-                (typeName, mappedName, typeName, ))
+                (cleanupName(typeName), mappedName, typeName, ))
     if element.getAnyAttribute():
         hasAttributes += 1
         wrt('        self.anyAttributes_ = {}\n')
@@ -3062,7 +3451,7 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed):
         wrt("            sval_ = child_.text\n")
         wrt("            try:\n")
         wrt("                ival_ = int(sval_)\n")
-        wrt("            except (TypeError, ValueError), exp:\n")
+        wrt("            except (TypeError, ValueError) as exp:\n")
         wrt("                raise_parse_error(child_, "
             "'requires integer: %s' % exp)\n")
         if childType == PositiveIntegerType:
@@ -3108,7 +3497,7 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed):
         wrt("            sval_ = child_.text\n")
         wrt("            try:\n")
         wrt("                fval_ = float(sval_)\n")
-        wrt("            except (TypeError, ValueError), exp:\n")
+        wrt("            except (TypeError, ValueError) as exp:\n")
         wrt("                raise_parse_error(child_, "
             "'requires float or double: %s' % exp)\n")
         wrt("            obj_ = self.mixedclass_("
@@ -3122,7 +3511,7 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed):
         wrt("            sval_ = child_.text\n")
         wrt("            try:\n")
         wrt("                bval_ = base64.b64decode(sval_)\n")
-        wrt("            except (TypeError, ValueError), exp:\n")
+        wrt("            except (TypeError, ValueError) as exp:\n")
         wrt("                raise_parse_error(child_, "
             "'requires base64 encoded string: %s' % exp)\n")
         wrt("            obj_ = self.mixedclass_("
@@ -3140,9 +3529,9 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed):
             type_element = ElementDict.get(type_name)
         if type_element and type_element.isAbstract():
             abstract_child = True
-        if not delayed and not child in DelayedElements:
-            DelayedElements.append(child)
-            DelayedElements_subclass.append(child)
+        if not delayed and child not in DelayedElements:
+            DelayedElements.add(child)
+            DelayedElements_subclass.add(child)
         wrt("        %s nodeName_ == '%s':\n" % (keyword, origName, ))
         if abstract_child:
             wrt(TEMPLATE_ABSTRACT_CHILD % (mappedName, ))
@@ -3151,8 +3540,9 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed):
             if type_obj is not None and type_obj.getExtended():
                 wrt("            class_obj_ = self.get_class_obj_("
                     "child_, %s%s)\n" % (
+                        prefix, cleanupName(mapName(childType)), ))
+                wrt("            class_obj_ = %s%s.factory()\n" % (
                     prefix, cleanupName(mapName(childType)), ))
-                wrt("            class_obj_ = %s%s.factory()\n")
             else:
                 wrt("            obj_ = %s%s.factory()\n" % (
                     prefix, cleanupName(mapName(childType))))
@@ -3232,10 +3622,18 @@ def generateBuildStandard_1(
                 childType in DateTimeGroupType or
                 child.isListType())):
         wrt("        %s nodeName_ == '%s':\n" % (keyword, origName, ))
-        wrt("            %s_ = child_.text\n" % name)
+        if PreserveCdataTags:
+            wrt("            mo_ = PRESERVE_CDATA_TAGS_PAT.search("
+                "etree_.tostring(child_).strip())\n")
+            wrt("            %s_ = mo_.group(1)\n" % name)
+        else:
+            wrt("            %s_ = child_.text\n" % name)
         if childType == TokenType:
-            wrt('            %s_ = re_.sub('
+            wrt('            if %s_:\n' % (name, ))
+            wrt('                %s_ = re_.sub('
                 'String_cleanup_pat_, " ", %s_).strip()\n' % (name, name))
+            wrt('            else:\n')
+            wrt('                %s_ = ""\n' % (name, ))
         if child.isListType():
             if (childType in IntegerType or
                     childType == PositiveIntegerType or
@@ -3275,7 +3673,7 @@ def generateBuildStandard_1(
         wrt("            sval_ = child_.text\n")
         wrt("            try:\n")
         wrt("                ival_ = int(sval_)\n")
-        wrt("            except (TypeError, ValueError), exp:\n")
+        wrt("            except (TypeError, ValueError) as exp:\n")
         wrt("                raise_parse_error(child_, "
             "'requires integer: %s' % exp)\n")
         if childType == PositiveIntegerType:
@@ -3324,7 +3722,7 @@ def generateBuildStandard_1(
         wrt("            sval_ = child_.text\n")
         wrt("            try:\n")
         wrt("                fval_ = float(sval_)\n")
-        wrt("            except (TypeError, ValueError), exp:\n")
+        wrt("            except (TypeError, ValueError) as exp:\n")
         wrt("                raise_parse_error("
             "child_, 'requires float or double: %s' % exp)\n")
         wrt("            fval_ = self.gds_validate_float("
@@ -3340,7 +3738,7 @@ def generateBuildStandard_1(
         wrt("            if sval_ is not None:\n")
         wrt("                try:\n")
         wrt("                    bval_ = base64.b64decode(sval_)\n")
-        wrt("                except (TypeError, ValueError), exp:\n")
+        wrt("                except (TypeError, ValueError) as exp:\n")
         wrt("                    raise_parse_error(child_, "
             "'requires base64 encoded string: %s' % exp)\n")
         wrt("                bval_ = self.gds_validate_base64("
@@ -3363,9 +3761,9 @@ def generateBuildStandard_1(
             type_element = ElementDict.get(type_name)
         if type_element and type_element.isAbstract():
             abstract_child = True
-        if not delayed and not child in DelayedElements:
-            DelayedElements.append(child)
-            DelayedElements_subclass.append(child)
+        if not delayed and child not in DelayedElements:
+            DelayedElements.add(child)
+            DelayedElements_subclass.add(child)
         wrt("        %s nodeName_ == '%s':\n" % (keyword, origName, ))
         # Is this a simple type?
         if child.getSimpleType():
@@ -3396,18 +3794,23 @@ def generateBuildStandard_1(
         if headChild.getMaxOccurs() > 1:
             substitutionGroup = child.getAttrs().get('substitutionGroup')
             if substitutionGroup is not None:
-                name = substitutionGroup
+                _, name = get_prefix_and_value(substitutionGroup)
+                name = mapName(name)
             else:
                 name = mappedName
+            name = cleanupName(name)
             s1 = "            self.%s.append(obj_)\n" % (name, )
         else:
             substitutionGroup = child.getAttrs().get('substitutionGroup')
             if substitutionGroup is not None:
-                name = substitutionGroup
+                _, name = get_prefix_and_value(substitutionGroup)
+                name = mapName(name)
             else:
-                name = headName
-            s1 = "            self.%s = obj_\n" % (mappedName, )
+                name = mapName(headName)
+            name = cleanupName(name)
+            s1 = "            self.%s = obj_\n" % (name, )
         wrt(s1)
+        wrt("            obj_.original_tagname_ = '%s'\n" % (origName, ))
     #
     # If this child is defined in a simpleType, then generate
     #   a validator method.
@@ -3419,23 +3822,33 @@ def generateBuildStandard_1(
             ElementDict[childType].getSimpleType()):
         typeName = ElementDict[childType].getType()
     # fixlist
-    if (child.getSimpleType() in SimpleTypeDict and
-            SimpleTypeDict[child.getSimpleType()].isListType()):
-        wrt("            self.%s = self.%s.split()\n" % (
-            mappedName, mappedName, ))
+    # splitting the list is now done in gds_validate_xxx_list.
+##     if (child.getSimpleType() in SimpleTypeDict and
+##             SimpleTypeDict[child.getSimpleType()].isListType()):
+##         wrt("            self.%s = self.%s.split()\n" % (
+##             mappedName, mappedName, ))
     typeName = child.getSimpleType()
     if typeName and typeName in SimpleTypeDict:
-        wrt("            self.validate_%s(self.%s)    # validate type %s\n" % (
-            typeName, mappedName, typeName, ))
+        if child.getMaxOccurs() > 1:
+            wrt("            # validate type %s\n" % (typeName, ))
+            wrt("            self.validate_%s(self.%s[-1])\n" % (
+                cleanupName(typeName), mappedName, ))
+        else:
+            wrt("            # validate type %s\n" % (typeName, ))
+            wrt("            self.validate_%s(self.%s)\n" % (
+                cleanupName(typeName), mappedName, ))
 # end generateBuildStandard_1
 
 
-def transitiveClosure(m, e):
+def transitiveClosure(m, e, seen):
     t = []
+    if e in seen:
+        return t
     if e in m:
         t += m[e]
+        seen.add(e)
         for f in m[e]:
-            t += transitiveClosure(m, f)
+            t += transitiveClosure(m, f, seen)
     return t
 
 
@@ -3455,8 +3868,9 @@ def generateBuildStandard(wrt, prefix, element, keyword, delayed, hasChildren):
             #   substitutionGroup.
             childName = child.getName()
             if childName in SubstitutionGroups:
+                seen = set()
                 for memberName in transitiveClosure(
-                        SubstitutionGroups, childName):
+                        SubstitutionGroups, childName, seen):
                     memberName = cleanupName(memberName)
                     if memberName in ElementDict:
                         member = ElementDict[memberName]
@@ -3514,9 +3928,9 @@ def generateBuildFn(wrt, prefix, element, delayed):
     if parentName:
         hasAttributes += 1
         elName = element.getCleanName()
-        wrt('        super(%s, self).buildAttributes('
+        wrt('        super(%s%s, self).buildAttributes('
             'node, attrs, already_processed)\n' %
-            (elName, ))
+            (prefix, elName, ))
     if hasAttributes == 0:
         wrt('        pass\n')
     wrt('    def buildChildren(self, child_, node, nodeName_, '
@@ -3534,8 +3948,8 @@ def generateBuildFn(wrt, prefix, element, delayed):
     base = element.getBase()
     if base and not element.getSimpleContent():
         elName = element.getCleanName()
-        wrt("        super(%s, self).buildChildren("
-            "child_, node, nodeName_, True)\n" % (elName, ))
+        wrt("        super(%s%s, self).buildChildren("
+            "child_, node, nodeName_, True)\n" % (prefix, elName, ))
     if hasChildren == 0:
         wrt("        pass\n")
 # end generateBuildFn
@@ -3579,12 +3993,14 @@ def buildCtorArgs_multilevel_aux(addedArgs, add, element):
 
 def buildCtorArgs_aux(addedArgs, add, element):
     attrDefs = element.getAttributeDefs()
-    for key in attrDefs:
+    for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         name = attrDef.getName()
         default = attrDef.getDefault()
         mappedName = name.replace(':', '_')
         mappedName = cleanupName(mapName(mappedName))
+        if mappedName == element.getCleanName():
+            mappedName += '_member'
         if mappedName in addedArgs:
             continue
         addedArgs[mappedName] = 1
@@ -3645,6 +4061,8 @@ def buildCtorArgs_aux(addedArgs, add, element):
                 add(", %s='%s'" % (mappedName, default, ))
     for child in element.getChildren():
         cleanName = child.getCleanName()
+        if cleanName == element.getCleanName():
+            cleanName += '_member'
         if cleanName in addedArgs:
             continue
         addedArgs[cleanName] = 1
@@ -3706,11 +4124,16 @@ MixedCtorInitializers = '''\
 '''
 
 
-def generateCtor(wrt, element):
+def generateCtor(wrt, prefix, element):
     elName = element.getCleanName()
     childCount = countChildren(element, 0)
     s2 = buildCtorArgs_multilevel(element, childCount)
     wrt('    def __init__(self%s):\n' % s2)
+    # Save the original tag name.  This is needed when there is a
+    # xs:substitutionGroup and we later (e.g. during export) do not know
+    # which member of the xs:substitutionGroup this specific element
+    # came from.
+    wrt('        self.original_tagname_ = None\n')
     parentName, parent = getParentName(element)
     if parentName:
         if parentName in AlreadyGenerated:
@@ -3718,46 +4141,53 @@ def generateCtor(wrt, element):
             s2 = ''.join(args)
             if len(args) > 254:
                 wrt('        arglist_ = (%s)\n' % (s2, ))
-                wrt('        super(%s, self).__init__(*arglist_)\n' %
-                    (elName, ))
+                wrt('        super(%s%s, self).__init__(*arglist_)\n' %
+                    (prefix, elName, ))
             else:
-                wrt('        super(%s, self).__init__(%s)\n' % (elName, s2, ))
+                wrt('        super(%s%s, self).__init__(%s)\n' % (
+                    prefix, elName, s2, ))
     attrDefs = element.getAttributeDefs()
-    for key in attrDefs:
+    for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         mappedName = cleanupName(attrDef.getName())
         name = mapName(mappedName)
+        if name == element.getCleanName():
+            mbrname = name + '_member'
+        else:
+            mbrname = name
         attrType = attrDef.getType()
         if attrType == DateTimeType:
-            wrt("        if isinstance(%s, basestring):\n" % (name, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
-                "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (name, ))
+                "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (mbrname, ))
             wrt("        else:\n")
-            wrt("            initvalue_ = %s\n" % (name, ))
+            wrt("            initvalue_ = %s\n" % (mbrname, ))
             wrt("        self.%s = initvalue_\n" % (name, ))
         elif attrType == DateType:
-            wrt("        if isinstance(%s, basestring):\n" % (name, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
-                "%s, '%%Y-%%m-%%d').date()\n" % (name, ))
+                "%s, '%%Y-%%m-%%d').date()\n" % (mbrname, ))
             wrt("        else:\n")
-            wrt("            initvalue_ = %s\n" % (name, ))
+            wrt("            initvalue_ = %s\n" % (mbrname, ))
             wrt("        self.%s = initvalue_\n" % (name, ))
         elif attrType == TimeType:
-            wrt("        if isinstance(%s, basestring):\n" % (name, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
-                "%s, '%%H:%%M:%%S').time()\n" % (name, ))
+                "%s, '%%H:%%M:%%S').time()\n" % (mbrname, ))
             wrt("        else:\n")
-            wrt("            initvalue_ = %s\n" % (name, ))
+            wrt("            initvalue_ = %s\n" % (mbrname, ))
             wrt("        self.%s = initvalue_\n" % (name, ))
         else:
             pythonType = SchemaToPythonTypeMap.get(attrDef.getType())
-            attrVal = "_cast(%s, %s)" % (pythonType, name, )
+            attrVal = "_cast(%s, %s)" % (pythonType, mbrname, )
             wrt('        self.%s = %s\n' % (name, attrVal, ))
-        member = 1
     # Generate member initializers in ctor.
-    member = 0
     for child in element.getChildren():
         name = cleanupName(child.getCleanName())
+        if name == element.getCleanName():
+            mbrname = name + '_member'
+        else:
+            mbrname = name
         logging.debug("Constructor child: %s" % name)
         logging.debug("Dump: %s" % child.__dict__)
         childType = child.getType()
@@ -3770,103 +4200,403 @@ def generateCtor(wrt, element):
             else:
                 wrt('        self.anytypeobjs_ = anytypeobjs_\n')
         elif childType == DateTimeType and child.getMaxOccurs() <= 1:
-            wrt("        if isinstance(%s, basestring):\n" % (name, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
-                "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (name, ))
+                "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (mbrname, ))
             wrt("        else:\n")
-            wrt("            initvalue_ = %s\n" % (name, ))
+            wrt("            initvalue_ = %s\n" % (mbrname, ))
             if child.getMaxOccurs() > 1:
                 wrt("        self.%s.append(initvalue_)\n" % (name, ))
             else:
                 wrt("        self.%s = initvalue_\n" % (name, ))
         elif childType == DateType and child.getMaxOccurs() <= 1:
-            wrt("        if isinstance(%s, basestring):\n" % (name, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
-                "%s, '%%Y-%%m-%%d').date()\n" % (name, ))
+                "%s, '%%Y-%%m-%%d').date()\n" % (mbrname, ))
             wrt("        else:\n")
-            wrt("            initvalue_ = %s\n" % (name, ))
+            wrt("            initvalue_ = %s\n" % (mbrname, ))
             if child.getMaxOccurs() > 1:
                 wrt("        self.%s.append(initvalue_)\n" % (name, ))
             else:
                 wrt("        self.%s = initvalue_\n" % (name, ))
         elif childType == TimeType and child.getMaxOccurs() <= 1:
-            wrt("        if isinstance(%s, basestring):\n" % (name, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
-                "%s, '%%H:%%M:%%S').time()\n" % (name, ))
+                "%s, '%%H:%%M:%%S').time()\n" % (mbrname, ))
             wrt("        else:\n")
-            wrt("            initvalue_ = %s\n" % (name, ))
+            wrt("            initvalue_ = %s\n" % (mbrname, ))
             if child.getMaxOccurs() > 1:
                 wrt("        self.%s.append(initvalue_)\n" % (name, ))
             else:
                 wrt("        self.%s = initvalue_\n" % (name, ))
         else:
             if child.getMaxOccurs() > 1:
-                wrt('        if %s is None:\n' % (name, ))
+                wrt('        if %s is None:\n' % (mbrname, ))
                 wrt('            self.%s = []\n' % (name, ))
                 wrt('        else:\n')
-                wrt('            self.%s = %s\n' % (name, name))
+                wrt('            self.%s = %s\n' % (name, mbrname))
             else:
                 typeObj = ElementDict.get(child.getType())
                 if (child.getDefault() and
                         typeObj is not None and
                         typeObj.getSimpleContent()):
-                    wrt('        if %s is None:\n' % (name, ))
+                    wrt('        if %s is None:\n' % (mbrname, ))
                     wrt("            self.%s = globals()['%s']('%s')\n" %
                         (name, child.getType(), child.getDefault(), ))
                     wrt('        else:\n')
-                    wrt('            self.%s = %s\n' % (name, name))
+                    wrt('            self.%s = %s\n' % (name, mbrname))
                 else:
-                    wrt('        self.%s = %s\n' % (name, name))
-        member = 1
+                    wrt('        self.%s = %s\n' % (name, mbrname))
+                    # validate if it is a simple type.  Validation shows
+                    # a warning so no fear that an error would rise.
+                    typeName = child.getSimpleType()
+                    if typeName and typeName in SimpleTypeDict:
+                        wrt('        self.validate_%s(self.%s)\n' % (
+                            cleanupName(typeName), mapName(name)))
     eltype = element.getType()
     if (element.getSimpleContent() or
             element.isMixed() or
             eltype in SimpleTypeDict or
             CurrentNamespacePrefix + eltype in OtherSimpleTypes):
         wrt('        self.valueOf_ = valueOf_\n')
-        member = 1
     if element.getAnyAttribute():
         wrt('        self.anyAttributes_ = {}\n')
-        member = 1
     if element.getExtended():
         wrt('        self.extensiontype_ = extensiontype_\n')
-        member = 1
-    if not member:
-        wrt('        pass\n')
     if element.isMixed():
         wrt(MixedCtorInitializers)
 # end generateCtor
 
 
-#
-# Attempt to retrieve the body (implementation) of a validator
-#   from a directory containing one file for each simpleType.
-#   The name of the file should be the same as the name of the
-#   simpleType with and optional ".py" extension.
-def getValidatorBody(stName):
-    retrieved = 0
-    if ValidatorBodiesBasePath:
-        found = 0
-        path = '%s%s%s.py' % (ValidatorBodiesBasePath, os.sep, stName, )
-        if os.path.exists(path):
-            found = 1
-        else:
-            path = '%s%s%s' % (ValidatorBodiesBasePath, os.sep, stName, )
+# find the simple type, either a named simpleType or an anonymous one.
+def find_simple_type_def(tree, stName, element, child, ns, base):
+    st = None
+    path1 = ("//xs:complexType[@name=$typeName]"
+             "//xs:element[@name=$childName]/xs:simpleType")
+    path2 = ("//xs:element[@name=$typeName]/xs:complexType//xs:element"
+             "[@name=$childName]/xs:simpleType")
+    if stName:
+        st_defs = tree.xpath(
+            "//xs:simpleType[@name=$n]",
+            namespaces=ns, n=stName)
+        if st_defs:
+            st = st_defs[0]
+        elif element is not None and child is not None:
+            typeName = element.getType()
+            childName = child.getName()
+            # search for an anonymous simpleType.
+            el_defs = tree.xpath(
+                path1,
+                namespaces=ns, typeName=typeName, childName=childName)
+            if el_defs:
+                st = el_defs[0]
+            else:
+                # search for an anonymous simpleType inside an anonymous
+                # complexType.
+                el_defs = tree.xpath(
+                    path2,
+                    namespaces=ns, typeName=typeName, childName=childName)
+    return st
+
+
+def get_target_value(default, stName):
+    stObj = SimpleTypeDict.get(stName)
+    targetValue = default
+    if stObj is not None:
+        if stObj.getBase() == DateType:
+            targetValue = "self.gds_parse_date('{}')".format(default)
+        elif stObj.getBase() == TimeType:
+            targetValue = "self.gds_parse_time('{}')".format(default)
+        elif stObj.getBase() == DateTimeType:
+            targetValue = "self.gds_parse_datetime('{}')".format(default)
+    return targetValue
+
+
+Vbar_repl_pat = re.compile('([^\\\])\|')
+
+
+# Replace vertical bars with "$|^", unless escaped with backslash.
+def replaceVbars(instr):
+    outstr, count = re.subn(Vbar_repl_pat, '\\1$|^', instr)
+    return outstr
+
+
+# Generate validation code for each restriction.
+# Recursivly call to process possible chain of base types.
+def processValidatorBodyRestrictions(
+        tree, s1, restrictions, st, ns, stName, base,
+        patterns1):
+    for restriction in restrictions:
+        #
+        # pattern
+        pats1 = restriction.xpath(
+            "./xs:pattern/@value", namespaces=ns)
+        if pats1:
+            pats2 = ['^{}$'.format(replaceVbars(p1)) for p1 in pats1]
+            patterns1.append(pats2)
+        #
+        # Check for and generate code for each possible type of restriction.
+        #
+        # enumerations
+        enumerations = restriction.xpath(
+            "./xs:enumeration/@value", namespaces=ns)
+        if enumerations:
+            toencode = '% {"value" : value.encode("utf-8")}'
+            s1 += "            value = str(value)\n"
+            s1 += "            enumerations = %(enumerations)s\n" % {
+                'enumerations': enumerations}
+            s1 += "            enumeration_respectee = False\n"
+            s1 += "            for enum in enumerations:\n"
+            s1 += "                if value == enum:\n"
+            s1 += "                    enumeration_respectee = True\n"
+            s1 += "                    break\n"
+            s1 += "            if not enumeration_respectee:\n"
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd enumeration restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # maxLength
+        maxLength = restriction.xpath(
+            "./xs:maxLength/@value", namespaces=ns)
+        if maxLength:
+            maxLength = maxLength[0]
+            toencode = '% {"value" : value}'
+            valuestring = '(str(value))'
+            if 'string' in base:
+                valuestring = '(value)'
+                toencode = '% {"value" : value.encode("utf-8")}'
+            s1 += "            if len%(valuestr)s > %(maxLen)s:\n" % {
+                'maxLen': maxLength, "valuestr": valuestring}
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd maxLength restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # minLength
+        minLength = restriction.xpath(
+            "./xs:minLength/@value", namespaces=ns)
+        if minLength:
+            minLength = minLength[0]
+            toencode = '% {"value" : value}'
+            valuestring = '(str(value))'
+            if 'string' in base:
+                valuestring = '(value)'
+                toencode = '% {"value" : value.encode("utf-8")}'
+            s1 += "            if len%(valuestr)s < %(minLen)s:\n" % {
+                'minLen': minLength, "valuestr": valuestring}
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd minLength restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # length
+        length = restriction.xpath(
+            "./xs:length/@value", namespaces=ns)
+        if length:
+            length = length[0]
+            toencode = '% {"value" : value}'
+            valuestring = '(str(value))'
+            if 'string' in base:
+                valuestring = '(value)'
+                toencode = '% {"value" : value.encode("utf-8")}'
+            s1 += "            if len%(valuestring)s != %(length)s:\n" % {
+                'length': length, "valuestring": valuestring}
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd length restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # minInclusive
+        minInclusive = restriction.xpath(
+            "./xs:minInclusive/@value", namespaces=ns)
+        if minInclusive:
+            minIncl = minInclusive[0]
+            toencode = '% {"value" : value}'
+            valuestring = 'value'
+            if 'string' in base:
+                valuestring = 'len(str(value))'
+                toencode = '% {"value" : value.encode("utf-8")}'
+            targetValue = get_target_value(minIncl, stName)
+            s1 += "            if %(valuestring)s < %(minIncl)s:\n" % {
+                'minIncl': targetValue, "valuestring": valuestring}
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd minInclusive restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # maxInclusive
+        maxInclusive = restriction.xpath(
+            "./xs:maxInclusive/@value", namespaces=ns)
+        if maxInclusive:
+            maxIncl = maxInclusive[0]
+            toencode = '% {"value" : value}'
+            valuestring = 'value'
+            if 'string' in base:
+                valuestring = 'len(str(value))'
+                toencode = '% {"value" : value.encode("utf-8")}'
+            targetValue = get_target_value(maxIncl, stName)
+            s1 += "            if %(valuestring)s > %(maxIncl)s:\n" % {
+                'maxIncl': targetValue, "valuestring": valuestring}
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd maxInclusive restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # minExclusive
+        minExclusive = restriction.xpath(
+            "./xs:minExclusive/@value", namespaces=ns)
+        if minExclusive:
+            minExclusive = minExclusive[0]
+            toencode = '% {"value" : value}'
+            valstr = 'value'
+            if 'string' in base:
+                valstr = 'len(str(value))'
+                toencode = '% {"value" : value.encode("utf-8")}'
+            targetValue = get_target_value(minExclusive, stName)
+            s1 += "            if %(valstr)s <= %(minExclusive)s:\n" % {
+                'minExclusive': targetValue, "valstr": valstr}
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd minExclusive restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # maxExclusive
+        maxExclusive = restriction.xpath(
+            "./xs:maxExclusive/@value", namespaces=ns)
+        if maxExclusive:
+            maxExclusive = maxExclusive[0]
+            toencode = '% {"value" : value}'
+            valstr = 'value'
+            if 'string' in base:
+                valstr = 'len(str(value))'
+                toencode = '% {"value" : value.encode("utf-8")}'
+            targetValue = get_target_value(maxExclusive, stName)
+            s1 += "            if %(valstr)s >= %(maxExclusive)s:\n" % {
+                'maxExclusive': targetValue, "valstr": valstr}
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd maxExclusive restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # totalDigits
+        totalDigits = restriction.xpath(
+            "./xs:totalDigits/@value", namespaces=ns)
+        if totalDigits:
+            totalDigits = totalDigits[0]
+            toencode = '% {"value" : value}'
+            valstr = '(str(value))'
+            if 'string' in base:
+                valstr = '(value)'
+                toencode = '% {"value" : value.encode("utf-8")}'
+            s1 += "            if len%(valstr)s >= %(totalDigits)s:\n" % {
+                'totalDigits': totalDigits, "valstr": valstr}
+            s1 += ("                warnings_.warn('Value \"%(val)s\" "
+                   "does not match xsd maxInclusive restriction on "
+                   "%(typename)s' %(express)s )\n" % {
+                       "val": '%(value)s',
+                       "typename": stName,
+                       "express": toencode}
+                   )
+        #
+        # Recurse into base simpleType, if it exists.
+        base1 = restriction.get('base')
+        if base1 is not None:
+            if ":" in base1:
+                base1 = base1.split(":")[1]
+            st1 = find_simple_type_def(tree, base1, None, None, ns, base)
+            if st1 is not None:
+                restrictions1 = st1.xpath(
+                    "./xs:restriction",
+                    namespaces=ns, n=stName, b=base)
+                if restrictions1:
+                    s2 = processValidatorBodyRestrictions(
+                        tree, '', restrictions1, st1, ns, stName,
+                        base1, patterns1)
+                    s1 += s2
+    return s1
+# end processValidatorBodyRestrictions
+
+
+# Generate validator method bodies.
+def getValidatorBody(stName, base, element, child):
+    s1 = None
+    patterns1 = ''
+    if not UseOldSimpleTypeValidators and SchemaLxmlTree is not None:
+        # generate validator bodies directly from the XML schema.
+        ns = {'xs': 'http://www.w3.org/2001/XMLSchema'}
+        tree = SchemaLxmlTree
+        # on determine l elemnt ou le type est definit
+        st = find_simple_type_def(tree, stName, element, child, ns, base)
+        if st is not None:
+            restrictions = st.xpath(
+                "./xs:restriction",
+                namespaces=ns, n=stName, b=base)
+            # une liste qui contient les restrictions deja traitees
+            if restrictions:
+                s1 = ('        if value is not None and '
+                      'Validate_simpletypes_:\n')
+                initial_len = len(s1)
+                patterns1 = []
+                s1 = processValidatorBodyRestrictions(
+                    tree, s1, restrictions, st, ns, stName, base,
+                    patterns1)
+                if len(s1) == initial_len and not patterns1:
+                    s1 += '            pass\n'
+        if s1 is None:
+            s1 = '        pass\n'
+        return s1, patterns1
+    #
+    # if UseOldSimpleTypeValidators
+    else:
+        # Generate validator bodies from user code.
+        retrieved = 0
+        if ValidatorBodiesBasePath:
+            found = 0
+            path = '%s%s%s.py' % (ValidatorBodiesBasePath, os.sep, stName, )
             if os.path.exists(path):
                 found = 1
-        if found:
-            infile = open(path, 'r')
-            lines = infile.readlines()
-            infile.close()
-            lines1 = []
-            for line in lines:
-                if not line.startswith('##'):
-                    lines1.append(line)
-            s1 = ''.join(lines1)
-            retrieved = 1
-    if not retrieved:
-        s1 = '        pass\n'
-    return s1
+            else:
+                path = '%s%s%s' % (ValidatorBodiesBasePath, os.sep, stName, )
+                if os.path.exists(path):
+                    found = 1
+            if found:
+                infile = open(path, 'r')
+                lines = infile.readlines()
+                infile.close()
+                lines1 = []
+                for line in lines:
+                    if not line.startswith('##'):
+                        lines1.append(line)
+                s1 = ''.join(lines1)
+                retrieved = 1
+        if not retrieved:
+            s1 = '        pass\n'
+        return s1, None
 # end getValidatorBody
 
 
@@ -3892,14 +4622,18 @@ def generateGettersAndSetters(wrt, element):
             if child.getMaxOccurs() > 1:
                 wrt('    def add%s(self, value): self.%s.append(value)\n' %
                     (capName, name))
-                wrt('    def insert%s(self, index, value): '
+                suffix = make_gs_name('at')
+                wrt('    def insert%s%s(self, index, value): '
+                    'self.%s.insert(index, value)\n' %
+                    (capName, suffix, name))
+                wrt('    def replace%s%s(self, index, value): '
                     'self.%s[index] = value\n' %
-                    (capName, name))
+                    (capName, suffix, name))
             if GenerateProperties:
                 wrt('    %sProp = property(get%s, set%s)\n' %
                     (unmappedName, capName, capName))
     attrDefs = element.getAttributeDefs()
-    for key in attrDefs:
+    for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         name = cleanupName(attrDef.getName().replace(':', '_'))
         mappedName = mapName(name)
@@ -3942,8 +4676,10 @@ def generateValidatorDefs(wrt, element):
         if (typeName and
                 typeName in SimpleTypeDict and
                 typeName not in generatedSimpleTypes):
+            cleanTypeName = cleanupName(typeName)
             generatedSimpleTypes.append(typeName)
-            wrt('    def validate_%s(self, value):\n' % (typeName, ))
+            wrt('    def validate_%s(self, value):\n' % (
+                cleanupName(typeName), ))
             if typeName in SimpleTypeDict:
                 stObj = SimpleTypeDict[typeName]
                 wrt('        # Validate type %s, a restriction '
@@ -3951,23 +4687,53 @@ def generateValidatorDefs(wrt, element):
                     (typeName, stObj.getBase(), ))
             else:
                 wrt('        # validate type %s\n' % (typeName, ))
-            wrt(getValidatorBody(typeName))
+            body, patterns = getValidatorBody(
+                typeName, stObj.getBase(), element, child)
+            wrt(body)
+            if patterns:
+                wrt('            if not self.gds_validate_simple_patterns(\n')
+                wrt('                    self.validate_%s_patterns_, '
+                    'value):\n' % (cleanTypeName, ))
+                s1 = ("                warnings_.warn('Value \"%%s\" "
+                      "does not match xsd pattern restrictions: %%s' "
+                      "%% (value.encode('utf-8'), "
+                      "self.validate_%s_patterns_, ))\n" % (cleanTypeName, )
+                      )
+                wrt(s1)
+                wrt('    validate_%s_patterns_ = %s\n' % (
+                    cleanTypeName, patterns, ))
     attrDefs = element.getAttributeDefs()
-    for key in attrDefs:
+    for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         typeName = attrDef.getType()
         if (typeName and
                 typeName in SimpleTypeDict and
                 typeName not in generatedSimpleTypes):
+            cleanTypeName = cleanupName(typeName)
             generatedSimpleTypes.append(typeName)
-            wrt('    def validate_%s(self, value):\n' % (typeName, ))
+            wrt('    def validate_%s(self, value):\n' % (
+                cleanupName(typeName), ))
             if typeName in SimpleTypeDict:
                 stObj = SimpleTypeDict[typeName]
                 wrt('        # Validate type %s, a restriction on %s.\n' % (
                     typeName, stObj.getBase(), ))
             else:
                 wrt('        # validate type %s\n' % (typeName, ))
-            wrt(getValidatorBody(typeName))
+            body, patterns = getValidatorBody(
+                typeName, stObj.getBase(), None, None)
+            wrt(body)
+            if patterns:
+                wrt('            if not self.gds_validate_simple_patterns(\n')
+                wrt('                    self.validate_%s_patterns_, '
+                    'value):\n' % (cleanTypeName, ))
+                s1 = ("                warnings_.warn('Value \"%%s\" "
+                      "does not match xsd pattern restrictions: %%s' "
+                      "%% (value.encode('utf-8'), "
+                      "self.validate_%s_patterns_, ))\n" % (cleanTypeName, )
+                      )
+                wrt(s1)
+                wrt('    validate_%s_patterns_ = %s\n' % (
+                    cleanTypeName, patterns, ))
 # end generateValidatorDefs
 
 
@@ -3983,16 +4749,18 @@ def generateMemberSpec(wrt, element):
     else:
         content = ['    member_data_items_ = [']
     add = content.append
-    for attrName, attrDef in element.getAttributeDefs().items():
-        item1 = attrName
+    attrDefs = element.getAttributeDefs()
+    for attrName in element.getAttributeDefsList():
+        attrDef = attrDefs[attrName]
+        item1 = mapName(attrName)
         item2 = attrDef.getType()
         item3 = 0
         if generateDict:
-            item = "        '%s': MemberSpec_('%s', '%s', %d)," % (
-                item1, item1, item2, item3, )
+            item = "        '%s': MemberSpec_('%s', '%s', %d, %s)," % (
+                item1, item1, item2, item3, str({'use':attrDef.getUse()}))
         else:
-            item = "        MemberSpec_('%s', '%s', %d)," % (
-                item1, item2, item3, )
+            item = "        MemberSpec_('%s', '%s', %d, %s)," % (
+                item1, item2, item3, str({'use':attrDef.getUse()}))
         add(item)
     for child in element.getChildren():
         name = cleanupName(child.getCleanName())
@@ -4014,12 +4782,14 @@ def generateMemberSpec(wrt, element):
         else:
             item3 = 0
         if generateDict:
-            item = "        '%s': MemberSpec_('%s', %s, %d)," % (
-                item1, item1, item2, item3, )
+            item = "        '%s': MemberSpec_('%s', %s, %d, %s, %s)," % (
+                item1, item1, item2, item3, str(child.getAttrs()),
+                id(child.choice) if child.choice else None)
         else:
             #item = "        ('%s', '%s', %d)," % (item1, item2, item3, )
-            item = "        MemberSpec_('%s', %s, %d)," % (
-                item1, item2, item3, )
+            item = "        MemberSpec_('%s', %s, %d, %s, %s)," % (
+                item1, item2, item3, str(child.getAttrs()),
+                id(child.choice) if child.choice else None)
         add(item)
     simplebase = element.getSimpleBase()
     if element.getSimpleContent() or element.isMixed():
@@ -4061,7 +4831,7 @@ def generateUserMethods(wrt, element):
             wrt(source)
 
 
-def generateHascontentMethod(wrt, element):
+def generateHascontentMethod(wrt, prefix, element):
     wrt('    def hasContent_(self):\n')
     wrt('        if (\n')
     firstTime = True
@@ -4069,34 +4839,67 @@ def generateHascontentMethod(wrt, element):
         if child.getType() == AnyTypeIdentifier:
             name = 'anytypeobjs_'
         else:
-            name = mapName(cleanupName(child.getName()))
+            name = child.getCleanName()
         if not firstTime:
             wrt(' or\n')
         firstTime = False
         if child.getMaxOccurs() > 1:
             wrt('            self.%s' % (name, ))
         else:
-            wrt('            self.%s is not None' % (name, ))
+            default = child.getDefault()
+            if default is None:
+                wrt('            self.%s is not None' % (name, ))
+            else:
+                child_type = child.getType()
+                if (child_type in StringType or
+                        child_type == TokenType or
+                        child_type in DateTimeGroupType):
+                    wrt('            self.%s != "%s"' % (name, default, ))
+                elif child_type == BooleanType:
+                    if default == 'true':
+                        wrt('            not self.%s' % (name, ))
+                    elif default == 'false':
+                        wrt('            self.%s' % (name, ))
+                    else:
+                        wrt('            self.%s is not None' % (name, ))
+                else:
+                    wrt('            self.%s != %s' % (name, default, ))
     if element.getSimpleContent() or element.isMixed():
         if not firstTime:
             wrt(' or\n')
         firstTime = False
-        wrt('            self.valueOf_')
+        wrt('            1 if type(self.valueOf_) '
+            'in [int,float] else self.valueOf_')
     parentName, parent = getParentName(element)
     if parentName:
         elName = element.getCleanName()
         if not firstTime:
             wrt(' or\n')
         firstTime = False
-        wrt('            super(%s, self).hasContent_()' % (elName, ))
+        wrt('            super(%s%s, self).hasContent_()' % (prefix, elName, ))
     wrt('\n        ):\n')
     wrt('            return True\n')
     wrt('        else:\n')
     wrt('            return False\n')
 
 
-def generateClasses(wrt, prefix, element, delayed):
+FactoryMethodTemplate = """\
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, {prefix}{name})
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if {prefix}{name}.subclass:
+            return {prefix}{name}.subclass(*args_, **kwargs_)
+        else:
+            return {prefix}{name}(*args_, **kwargs_)
+"""
+
+
+def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''):
     logging.debug("Generating class for: %s" % element)
+    mappedName = element.getCleanName()
     parentName, base = getParentName(element)
     logging.debug("Element base: %s" % base)
     if not element.isExplicitDefine():
@@ -4107,13 +4910,12 @@ def generateClasses(wrt, prefix, element, delayed):
     # If this element is an extension (has a base) and the base has
     #   not been generated, then postpone it.
     if parentName:
-        if (parentName not in AlreadyGenerated and
-                parentName not in SimpleTypeDict):
+        if parentName not in AlreadyGenerated:
             PostponedExtensions.append(element)
             return
-    if element.getName() in AlreadyGenerated:
+    if mappedName in AlreadyGenerated:
         return
-    AlreadyGenerated.append(element.getName())
+    AlreadyGenerated.add(mappedName)
     if element.getMixedExtensionError():
         err_msg('*** Element %s extension chain contains mixed and '
                 'non-mixed content.  Not generated.\n' %
@@ -4122,125 +4924,108 @@ def generateClasses(wrt, prefix, element, delayed):
     ElementsForSubclasses.append(element)
     name = element.getCleanName()
     if parentName:
-        s1 = 'class %s%s(%s):\n' % (prefix, name, parentName,)
+        s1 = 'class %s%s(%s%s):\n' % (prefix, name, prefix, parentName,)
     else:
         s1 = 'class %s%s(GeneratedsSuper):\n' % (prefix, name)
     wrt(s1)
     # If this element has documentation, generate a doc-string.
     if element.documentation:
         s2 = ' '.join(element.documentation.strip().split())
-        s2 = s2.encode('utf-8')
         s2 = textwrap.fill(s2, width=68, subsequent_indent='    ')
-        if s2[0] == '"' or s2[-1] == '"':
-            s2 = '    """ %s """\n' % (s2, )
-        else:
-            s2 = '    """%s"""\n' % (s2, )
-        wrt(s2)
+        if sys.version_info.major == 2:
+            s2 = s2.encode('utf-8')
+        if len(s2) > 1:
+            if s2[0] == '"' or s2[-1] == '"':
+                s2 = '    """ %s """\n' % (s2, )
+            else:
+                s2 = '    """%s"""\n' % (s2, )
+            wrt(s2)
     if UserMethodsModule or MemberSpecs:
         generateMemberSpec(wrt, element)
     wrt('    subclass = None\n')
     parentName, parent = getParentName(element)
     superclass_name = 'None'
     if parentName and parentName in AlreadyGenerated:
-        superclass_name = mapName(cleanupName(parentName))
+        superclass_name = prefix + parentName
     wrt('    superclass = %s\n' % (superclass_name, ))
-    generateCtor(wrt, element)
-    wrt('    def factory(*args_, **kwargs_):\n')
-    wrt('        if %s%s.subclass:\n' % (prefix, name))
-    wrt('            return %s%s.subclass(*args_, **kwargs_)\n' % (
-        prefix, name))
-    wrt('        else:\n')
-    wrt('            return %s%s(*args_, **kwargs_)\n' % (prefix, name))
+    generateCtor(wrt, prefix, element)
+    wrt(FactoryMethodTemplate.format(prefix=prefix, name=name))
     wrt('    factory = staticmethod(factory)\n')
     if UseGetterSetter != 'none':
         generateGettersAndSetters(wrt, element)
     generateValidatorDefs(wrt, element)
-    if Targetnamespace in NamespacesDict:
+    if element.namespace:
+        namespace = element.namespace
+    elif element.targetNamespace in NamespacesDict:
+        namespace = NamespacesDict[element.targetNamespace]
+    elif Targetnamespace in NamespacesDict:
         namespace = NamespacesDict[Targetnamespace]
     else:
         namespace = ''
-    generateHascontentMethod(wrt, element)
-    if ExportWrite:
-        generateExportFn(wrt, prefix, element, namespace)
-    if ExportEtree:
-        generateToEtree(wrt, element, Targetnamespace)
-    if ExportLiteral:
-        generateExportLiteralFn(wrt, prefix, element)
-    generateBuildFn(wrt, prefix, element, delayed)
+    generateHascontentMethod(wrt, prefix, element)
+    if not XmlDisabled:
+        if ExportWrite:
+            generateExportFn(wrt, prefix, element, namespace, nameSpacesDef)
+        if ExportEtree:
+            generateToEtree(wrt, element, Targetnamespace)
+        if ExportLiteral:
+            generateExportLiteralFn(wrt, prefix, element)
+        generateBuildFn(wrt, prefix, element, delayed)
     generateUserMethods(wrt, element)
-    wrt('# end class %s\n' % name)
+    wrt('# end class %s%s\n' % (prefix, name, ))
     wrt('\n\n')
 # end generateClasses
 
 
 TEMPLATE_HEADER = """\
-#!/usr/bin/env python
+#xmldisable##!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
 #
-# Generated %s by generateDS.py%s.
+# Generated {tstamp} by generateDS.py{version}.
+#
+# Command line options:
+{options1}
+#
+# Command line arguments:
+#   {args1}
+#
+# Command line:
+#   {command_line}
+#
+# Current working directory (os.getcwd()):
+#   {current_working_directory}
 #
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
+import warnings as warnings_
+#xmldisable#try:
+#xmldisable#    from lxml import etree as etree_
+#xmldisable#except ImportError:
+#xmldisable#    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+#xmldisable#def parsexml_(infile, parser=None, **kwargs):
+#xmldisable#    if parser is None:
+#xmldisable#        # Use the lxml ElementTree compatible parser so that, e.g.,
+#xmldisable#        #   we ignore comments.
+#xmldisable#        try:
+#xmldisable#            parser = etree_.ETCompatXMLParser()
+#xmldisable#        except AttributeError:
+#xmldisable#            # fallback to xml.etree
+#xmldisable#            parser = etree_.XMLParser()
+#xmldisable#    doc = etree_.parse(infile, parser=parser, **kwargs)
+#xmldisable#    return doc
 
 #
 # User methods
@@ -4249,283 +5034,7 @@ def parsexml_(*args, **kwargs):
 # You can replace these methods by re-implementing the following class
 #   in a module named generatedssuper.py.
 
-try:
-    from generatedssuper import GeneratedsSuper
-except ImportError, exp:
-
-    class GeneratedsSuper(object):
-        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
-        class _FixedOffsetTZ(datetime_.tzinfo):
-            def __init__(self, offset, name):
-                self.__offset = datetime_.timedelta(minutes=offset)
-                self.__name = name
-            def utcoffset(self, dt):
-                return self.__offset
-            def tzname(self, dt):
-                return self.__name
-            def dst(self, dt):
-                return None
-        def gds_format_string(self, input_data, input_name=''):
-            return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_base64(self, input_data, input_name=''):
-            return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_integer(self, input_data, input_name=''):
-            return '%%d' %% input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_integer_list(self, input_data, input_name=''):
-            return '%%s' %% input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
-        def gds_format_float(self, input_data, input_name=''):
-            return ('%%.15f' %% input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_float_list(self, input_data, input_name=''):
-            return '%%s' %% input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
-        def gds_format_double(self, input_data, input_name=''):
-            return '%%e' %% input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_double_list(self, input_data, input_name=''):
-            return '%%s' %% input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
-        def gds_format_boolean(self, input_data, input_name=''):
-            return ('%%s' %% input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%%s' %% input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                if value not in ('true', '1', 'false', '0', ):
-                    raise_parse_error(
-                        node,
-                        'Requires sequence of booleans '
-                        '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_datetime(self, input_data, input_name=''):
-            if input_data.microsecond == 0:
-                _svalue = '%%04d-%%02d-%%02dT%%02d:%%02d:%%02d' %% (
-                    input_data.year,
-                    input_data.month,
-                    input_data.day,
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                )
-            else:
-                _svalue = '%%04d-%%02d-%%02dT%%02d:%%02d:%%02d.%%s' %% (
-                    input_data.year,
-                    input_data.month,
-                    input_data.day,
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                    ('%%f' %% (float(input_data.microsecond) / 1000000))[2:],
-                )
-            if input_data.tzinfo is not None:
-                tzoff = input_data.tzinfo.utcoffset(input_data)
-                if tzoff is not None:
-                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                    if total_seconds == 0:
-                        _svalue += 'Z'
-                    else:
-                        if total_seconds < 0:
-                            _svalue += '-'
-                            total_seconds *= -1
-                        else:
-                            _svalue += '+'
-                        hours = total_seconds // 3600
-                        minutes = (total_seconds - (hours * 3600)) // 60
-                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            return _svalue
-        @classmethod
-        def gds_parse_datetime(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
-                dt = datetime_.datetime.strptime(
-                    input_data, '%%Y-%%m-%%dT%%H:%%M:%%S.%%f')
-            else:
-                dt = datetime_.datetime.strptime(
-                    input_data, '%%Y-%%m-%%dT%%H:%%M:%%S')
-            dt = dt.replace(tzinfo=tz)
-            return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_date(self, input_data, input_name=''):
-            _svalue = '%%04d-%%02d-%%02d' %% (
-                input_data.year,
-                input_data.month,
-                input_data.day,
-            )
-            try:
-                if input_data.tzinfo is not None:
-                    tzoff = input_data.tzinfo.utcoffset(input_data)
-                    if tzoff is not None:
-                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                        if total_seconds == 0:
-                            _svalue += 'Z'
-                        else:
-                            if total_seconds < 0:
-                                _svalue += '-'
-                                total_seconds *= -1
-                            else:
-                                _svalue += '+'
-                            hours = total_seconds // 3600
-                            minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            except AttributeError:
-                pass
-            return _svalue
-        @classmethod
-        def gds_parse_date(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            dt = datetime_.datetime.strptime(input_data, '%%Y-%%m-%%d')
-            dt = dt.replace(tzinfo=tz)
-            return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_time(self, input_data, input_name=''):
-            if input_data.microsecond == 0:
-                _svalue = '%%02d:%%02d:%%02d' %% (
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                )
-            else:
-                _svalue = '%%02d:%%02d:%%02d.%%s' %% (
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                    ('%%f' %% (float(input_data.microsecond) / 1000000))[2:],
-                )
-            if input_data.tzinfo is not None:
-                tzoff = input_data.tzinfo.utcoffset(input_data)
-                if tzoff is not None:
-                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                    if total_seconds == 0:
-                        _svalue += 'Z'
-                    else:
-                        if total_seconds < 0:
-                            _svalue += '-'
-                            total_seconds *= -1
-                        else:
-                            _svalue += '+'
-                        hours = total_seconds // 3600
-                        minutes = (total_seconds - (hours * 3600)) // 60
-                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            return _svalue
-        @classmethod
-        def gds_parse_time(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
-                dt = datetime_.datetime.strptime(input_data, '%%H:%%M:%%S.%%f')
-            else:
-                dt = datetime_.datetime.strptime(input_data, '%%H:%%M:%%S')
-            dt = dt.replace(tzinfo=tz)
-            return dt.time()
-        def gds_str_lower(self, instring):
-            return instring.lower()
-        def get_path_(self, node):
-            path_list = []
-            self.get_path_list_(node, path_list)
-            path_list.reverse()
-            path = '/'.join(path_list)
-            return path
-        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
-        def get_path_list_(self, node, path_list):
-            if node is None:
-                return
-            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
-            if tag:
-                path_list.append(tag)
-            self.get_path_list_(node.getparent(), path_list)
-        def get_class_obj_(self, node, default_class=None):
-            class_obj1 = default_class
-            if 'xsi' in node.nsmap:
-                classname = node.get('{%%s}type' %% node.nsmap['xsi'])
-                if classname is not None:
-                    names = classname.split(':')
-                    if len(names) == 2:
-                        classname = names[1]
-                    class_obj2 = globals().get(classname)
-                    if class_obj2 is not None:
-                        class_obj1 = class_obj2
-            return class_obj1
-        def gds_build_any(self, node, type_name=None):
-            return None
-        @classmethod
-        def gds_reverse_node_mapping(cls, mapping):
-            return dict(((v, k) for k, v in mapping.iteritems()))
-
+{generatedssuper_import}
 
 #
 # If you have installed IPython you can uncomment and use the following.
@@ -4546,11 +5055,16 @@ except ImportError, exp:
 # Globals
 #
 
-ExternalEncoding = '%s'
-Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+ExternalEncoding = '{ExternalEncoding}'
+Tag_pattern_ = re_.compile(r'({{.*}})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\\n\\r\\s]+")
-Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+Namespace_extract_pat_ = re_.compile(r'{{(.*)}}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\\[CDATA\\[.*?\\]\\]>", re_.DOTALL)
 
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+{preserve_cdata_tags_pat}
 #
 # Support/utility functions.
 #
@@ -4563,29 +5077,42 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%%s' %% inStr)
-    s1 = s1.replace('&', '&amp;')
+    {quote_xml_text}
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%%s' %% inStr)
+    {quote_attrib_text}
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     if '"' in s1:
         if "'" in s1:
-            s1 = '"%%s"' %% s1.replace('"', "&quot;")
+            s1 = '"%s"' % s1.replace('"', "&quot;")
         else:
-            s1 = "'%%s'" %% s1
+            s1 = "'%s'" % s1
     else:
-        s1 = '"%%s"' %% s1
+        s1 = '"%s"' % s1
     return s1
 
 
@@ -4593,28 +5120,19 @@ def quote_python(inStr):
     s1 = inStr
     if s1.find("'") == -1:
         if s1.find('\\n') == -1:
-            return "'%%s'" %% s1
+            return "'%s'" % s1
         else:
-            return "'''%%s'''" %% s1
+            return "'''%s'''" % s1
     else:
         if s1.find('"') != -1:
             s1 = s1.replace('"', '\\\\"')
         if s1.find('\\n') == -1:
-            return '"%%s"' %% s1
+            return '"%s"' % s1
         else:
-            return '\"\"\"%%s\"\"\"' %% s1
+            return '\"\"\"%s\"\"\"' % s1
 
 
-def get_all_text_(node):
-    if node.text is not None:
-        text = node.text
-    else:
-        text = ''
-    for child in node:
-        if child.tail is not None:
-            text += child.tail
-    return text
-
+{preserve_cdata_get_text}
 
 def find_attr_value_(attr_name, node):
     attrs = node.attrib
@@ -4626,7 +5144,7 @@ def find_attr_value_(attr_name, node):
         prefix, name = attr_parts
         namespace = node.nsmap.get(prefix)
         if namespace is not None:
-            value = attrs.get('{%%s}%%s' %% (namespace, name, ))
+            value = attrs.get('{{%s}}%s' % (namespace, name, ))
     return value
 
 
@@ -4635,11 +5153,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%%s (element %%s/line %%d)' %% (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%%s (element %%s)' %% (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -4672,92 +5186,95 @@ class MixedContainer:
         return self.value
     def getName(self):
         return self.name
-    def export(self, outfile, level, name, namespace, pretty_print=True):
-        if self.category == MixedContainer.CategoryText:
-            # Prevent exporting empty content as empty lines.
-            if self.value.strip():
-                outfile.write(self.value)
-        elif self.category == MixedContainer.CategorySimple:
-            self.exportSimple(outfile, level, name)
-        else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
-    def exportSimple(self, outfile, level, name):
-        if self.content_type == MixedContainer.TypeString:
-            outfile.write('<%%s>%%s</%%s>' %% (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeInteger or \\
-                self.content_type == MixedContainer.TypeBoolean:
-            outfile.write('<%%s>%%d</%%s>' %% (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeFloat or \\
-                self.content_type == MixedContainer.TypeDecimal:
-            outfile.write('<%%s>%%f</%%s>' %% (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeDouble:
-            outfile.write('<%%s>%%g</%%s>' %% (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeBase64:
-            outfile.write('<%%s>%%s</%%s>' %% (
-                self.name, base64.b64encode(self.value), self.name))
-    def to_etree(self, element):
-        if self.category == MixedContainer.CategoryText:
-            # Prevent exporting empty content as empty lines.
-            if self.value.strip():
-                if len(element) > 0:
-                    if element[-1].tail is None:
-                        element[-1].tail = self.value
-                    else:
-                        element[-1].tail += self.value
-                else:
-                    if element.text is None:
-                        element.text = self.value
-                    else:
-                        element.text += self.value
-        elif self.category == MixedContainer.CategorySimple:
-            subelement = etree_.SubElement(element, '%%s' %% self.name)
-            subelement.text = self.to_etree_simple()
-        else:    # category == MixedContainer.CategoryComplex
-            self.value.to_etree(element)
-    def to_etree_simple(self):
-        if self.content_type == MixedContainer.TypeString:
-            text = self.value
-        elif (self.content_type == MixedContainer.TypeInteger or
-                self.content_type == MixedContainer.TypeBoolean):
-            text = '%%d' %% self.value
-        elif (self.content_type == MixedContainer.TypeFloat or
-                self.content_type == MixedContainer.TypeDecimal):
-            text = '%%f' %% self.value
-        elif self.content_type == MixedContainer.TypeDouble:
-            text = '%%g' %% self.value
-        elif self.content_type == MixedContainer.TypeBase64:
-            text = '%%s' %% base64.b64encode(self.value)
-        return text
-    def exportLiteral(self, outfile, level, name):
-        if self.category == MixedContainer.CategoryText:
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%%d, %%d, "%%s", "%%s"),\\n' %% (
-                    self.category, self.content_type, self.name, self.value))
-        elif self.category == MixedContainer.CategorySimple:
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%%d, %%d, "%%s", "%%s"),\\n' %% (
-                    self.category, self.content_type, self.name, self.value))
-        else:    # category == MixedContainer.CategoryComplex
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%%d, %%d, "%%s",\\n' %% (
-                    self.category, self.content_type, self.name,))
-            self.value.exportLiteral(outfile, level + 1)
-            showIndent(outfile, level)
-            outfile.write(')\\n')
+#xmldisable#    def export(self, outfile, level, name, namespace, pretty_print=True):
+#xmldisable#        if self.category == MixedContainer.CategoryText:
+#xmldisable#            # Prevent exporting empty content as empty lines.
+#xmldisable#            if self.value.strip():
+#xmldisable#                outfile.write(self.value)
+#xmldisable#        elif self.category == MixedContainer.CategorySimple:
+#xmldisable#            self.exportSimple(outfile, level, name)
+#xmldisable#        else:    # category == MixedContainer.CategoryComplex
+#xmldisable#            self.value.export(
+#xmldisable#                outfile, level, namespace, name, pretty_print=pretty_print)
+#xmldisable#    def exportSimple(self, outfile, level, name):
+#xmldisable#        if self.content_type == MixedContainer.TypeString:
+#xmldisable#            outfile.write('<%s>%s</%s>' % (
+#xmldisable#                self.name, self.value, self.name))
+#xmldisable#        elif self.content_type == MixedContainer.TypeInteger or \\
+#xmldisable#                self.content_type == MixedContainer.TypeBoolean:
+#xmldisable#            outfile.write('<%s>%d</%s>' % (
+#xmldisable#                self.name, self.value, self.name))
+#xmldisable#        elif self.content_type == MixedContainer.TypeFloat or \\
+#xmldisable#                self.content_type == MixedContainer.TypeDecimal:
+#xmldisable#            outfile.write('<%s>%f</%s>' % (
+#xmldisable#                self.name, self.value, self.name))
+#xmldisable#        elif self.content_type == MixedContainer.TypeDouble:
+#xmldisable#            outfile.write('<%s>%g</%s>' % (
+#xmldisable#                self.name, self.value, self.name))
+#xmldisable#        elif self.content_type == MixedContainer.TypeBase64:
+#xmldisable#            outfile.write('<%s>%s</%s>' % (
+#xmldisable#                self.name, base64.b64encode(self.value), self.name))
+#xmldisable#    def to_etree(self, element):
+#xmldisable#        if self.category == MixedContainer.CategoryText:
+#xmldisable#            # Prevent exporting empty content as empty lines.
+#xmldisable#            if self.value.strip():
+#xmldisable#                if len(element) > 0:
+#xmldisable#                    if element[-1].tail is None:
+#xmldisable#                        element[-1].tail = self.value
+#xmldisable#                    else:
+#xmldisable#                        element[-1].tail += self.value
+#xmldisable#                else:
+#xmldisable#                    if element.text is None:
+#xmldisable#                        element.text = self.value
+#xmldisable#                    else:
+#xmldisable#                        element.text += self.value
+#xmldisable#        elif self.category == MixedContainer.CategorySimple:
+#xmldisable#            subelement = etree_.SubElement(element, '%s' % self.name)
+#xmldisable#            subelement.text = self.to_etree_simple()
+#xmldisable#        else:    # category == MixedContainer.CategoryComplex
+#xmldisable#            self.value.to_etree(element)
+#xmldisable#    def to_etree_simple(self):
+#xmldisable#        if self.content_type == MixedContainer.TypeString:
+#xmldisable#            text = self.value
+#xmldisable#        elif (self.content_type == MixedContainer.TypeInteger or
+#xmldisable#                self.content_type == MixedContainer.TypeBoolean):
+#xmldisable#            text = '%d' % self.value
+#xmldisable#        elif (self.content_type == MixedContainer.TypeFloat or
+#xmldisable#                self.content_type == MixedContainer.TypeDecimal):
+#xmldisable#            text = '%f' % self.value
+#xmldisable#        elif self.content_type == MixedContainer.TypeDouble:
+#xmldisable#            text = '%g' % self.value
+#xmldisable#        elif self.content_type == MixedContainer.TypeBase64:
+#xmldisable#            text = '%s' % base64.b64encode(self.value)
+#xmldisable#        return text
+#xmldisable#    def exportLiteral(self, outfile, level, name):
+#xmldisable#        if self.category == MixedContainer.CategoryText:
+#xmldisable#            showIndent(outfile, level)
+#xmldisable#            outfile.write(
+#xmldisable#                'model_.MixedContainer(%d, %d, "%s", "%s"),\\n' % (
+#xmldisable#                    self.category, self.content_type, self.name, self.value))
+#xmldisable#        elif self.category == MixedContainer.CategorySimple:
+#xmldisable#            showIndent(outfile, level)
+#xmldisable#            outfile.write(
+#xmldisable#                'model_.MixedContainer(%d, %d, "%s", "%s"),\\n' % (
+#xmldisable#                    self.category, self.content_type, self.name, self.value))
+#xmldisable#        else:    # category == MixedContainer.CategoryComplex
+#xmldisable#            showIndent(outfile, level)
+#xmldisable#            outfile.write(
+#xmldisable#                'model_.MixedContainer(%d, %d, "%s",\\n' % (
+#xmldisable#                    self.category, self.content_type, self.name,))
+#xmldisable#            self.value.exportLiteral(outfile, level + 1)
+#xmldisable#            showIndent(outfile, level)
+#xmldisable#            outfile.write(')\\n')
 
 
 class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
+    def __init__(self, name='', data_type='', container=0, child_attrs=None, choice=None):
         self.name = name
         self.data_type = data_type
         self.container = container
+        self.child_attrs = child_attrs
+        self.choice = choice
     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
@@ -4772,6 +5289,10 @@ class MemberSpec_(object):
             return self.data_type
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
+    def set_child_attrs(self, child_attrs): self.child_attrs = child_attrs
+    def get_child_attrs(self): return self.child_attrs
+    def set_choice(self, choice): self.choice = choice
+    def get_choice(self): return self.choice
 
 
 def _cast(typ, value):
@@ -4783,21 +5304,453 @@ def _cast(typ, value):
 # Data representation classes.
 #
 
+"""
+
 
+TEMPLATE_GENERATEDS_SUPER = """
+class GeneratedsSuper(object):
+    tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+    class _FixedOffsetTZ(datetime_.tzinfo):
+        def __init__(self, offset, name):
+            self.__offset = datetime_.timedelta(minutes=offset)
+            self.__name = name
+        def utcoffset(self, dt):
+            return self.__offset
+        def tzname(self, dt):
+            return self.__name
+        def dst(self, dt):
+            return None
+    def gds_format_string(self, input_data, input_name=''):
+        return input_data
+    def gds_validate_string(self, input_data, node=None, input_name=''):
+        if not input_data:
+            return ''
+        else:
+            return input_data
+    def gds_format_base64(self, input_data, input_name=''):
+        return base64.b64encode(input_data)
+    def gds_validate_base64(self, input_data, node=None, input_name=''):
+        return input_data
+    def gds_format_integer(self, input_data, input_name=''):
+        return '%d' % input_data
+    def gds_validate_integer(self, input_data, node=None, input_name=''):
+        return input_data
+    def gds_format_integer_list(self, input_data, input_name=''):
+        return '%s' % ' '.join(input_data)
+    def gds_validate_integer_list(
+            self, input_data, node=None, input_name=''):
+        values = input_data.split()
+        for value in values:
+            try:
+                int(value)
+            except (TypeError, ValueError):
+                raise_parse_error(node, 'Requires sequence of integers')
+        return values
+    def gds_format_float(self, input_data, input_name=''):
+        return ('%.15f' % input_data).rstrip('0')
+    def gds_validate_float(self, input_data, node=None, input_name=''):
+        return input_data
+    def gds_format_float_list(self, input_data, input_name=''):
+        return '%s' % ' '.join(input_data)
+    def gds_validate_float_list(
+            self, input_data, node=None, input_name=''):
+        values = input_data.split()
+        for value in values:
+            try:
+                float(value)
+            except (TypeError, ValueError):
+                raise_parse_error(node, 'Requires sequence of floats')
+        return values
+    def gds_format_double(self, input_data, input_name=''):
+        return '%e' % input_data
+    def gds_validate_double(self, input_data, node=None, input_name=''):
+        return input_data
+    def gds_format_double_list(self, input_data, input_name=''):
+        return '%s' % ' '.join(input_data)
+    def gds_validate_double_list(
+            self, input_data, node=None, input_name=''):
+        values = input_data.split()
+        for value in values:
+            try:
+                float(value)
+            except (TypeError, ValueError):
+                raise_parse_error(node, 'Requires sequence of doubles')
+        return values
+    def gds_format_boolean(self, input_data, input_name=''):
+        return ('%s' % input_data).lower()
+    def gds_validate_boolean(self, input_data, node=None, input_name=''):
+        return input_data
+    def gds_format_boolean_list(self, input_data, input_name=''):
+        return '%s' % ' '.join(input_data)
+    def gds_validate_boolean_list(
+            self, input_data, node=None, input_name=''):
+        values = input_data.split()
+        for value in values:
+            if value not in ('true', '1', 'false', '0', ):
+                raise_parse_error(
+                    node,
+                    'Requires sequence of booleans '
+                    '("true", "1", "false", "0")')
+        return values
+    def gds_validate_datetime(self, input_data, node=None, input_name=''):
+        return input_data
+    def gds_format_datetime(self, input_data, input_name=''):
+        if input_data.microsecond == 0:
+            _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+                input_data.hour,
+                input_data.minute,
+                input_data.second,
+            )
+        else:
+            _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+                input_data.hour,
+                input_data.minute,
+                input_data.second,
+                ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+            )
+        if input_data.tzinfo is not None:
+            tzoff = input_data.tzinfo.utcoffset(input_data)
+            if tzoff is not None:
+                total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                if total_seconds == 0:
+                    _svalue += 'Z'
+                else:
+                    if total_seconds < 0:
+                        _svalue += '-'
+                        total_seconds *= -1
+                    else:
+                        _svalue += '+'
+                    hours = total_seconds // 3600
+                    minutes = (total_seconds - (hours * 3600)) // 60
+                    _svalue += '{{0:02d}}:{{1:02d}}'.format(hours, minutes)
+        return _svalue
+    @classmethod
+    def gds_parse_datetime(cls, input_data):
+        tz = None
+        if input_data[-1] == 'Z':
+            tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+            input_data = input_data[:-1]
+        else:
+            results = GeneratedsSuper.tzoff_pattern.search(input_data)
+            if results is not None:
+                tzoff_parts = results.group(2).split(':')
+                tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                if results.group(1) == '-':
+                    tzoff *= -1
+                tz = GeneratedsSuper._FixedOffsetTZ(
+                    tzoff, results.group(0))
+                input_data = input_data[:-6]
+        time_parts = input_data.split('.')
+        if len(time_parts) > 1:
+            micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+            input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+            dt = datetime_.datetime.strptime(
+                input_data, '%Y-%m-%dT%H:%M:%S.%f')
+        else:
+            dt = datetime_.datetime.strptime(
+                input_data, '%Y-%m-%dT%H:%M:%S')
+        dt = dt.replace(tzinfo=tz)
+        return dt
+    def gds_validate_date(self, input_data, node=None, input_name=''):
+        return input_data
+    def gds_format_date(self, input_data, input_name=''):
+        _svalue = '%04d-%02d-%02d' % (
+            input_data.year,
+            input_data.month,
+            input_data.day,
+        )
+        try:
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{{0:02d}}:{{1:02d}}'.format(
+                            hours, minutes)
+        except AttributeError:
+            pass
+        return _svalue
+    @classmethod
+    def gds_parse_date(cls, input_data):
+        tz = None
+        if input_data[-1] == 'Z':
+            tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+            input_data = input_data[:-1]
+        else:
+            results = GeneratedsSuper.tzoff_pattern.search(input_data)
+            if results is not None:
+                tzoff_parts = results.group(2).split(':')
+                tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                if results.group(1) == '-':
+                    tzoff *= -1
+                tz = GeneratedsSuper._FixedOffsetTZ(
+                    tzoff, results.group(0))
+                input_data = input_data[:-6]
+        dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+        dt = dt.replace(tzinfo=tz)
+        return dt.date()
+    def gds_validate_time(self, input_data, node=None, input_name=''):
+        return input_data
+    def gds_format_time(self, input_data, input_name=''):
+        if input_data.microsecond == 0:
+            _svalue = '%02d:%02d:%02d' % (
+                input_data.hour,
+                input_data.minute,
+                input_data.second,
+            )
+        else:
+            _svalue = '%02d:%02d:%02d.%s' % (
+                input_data.hour,
+                input_data.minute,
+                input_data.second,
+                ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+            )
+        if input_data.tzinfo is not None:
+            tzoff = input_data.tzinfo.utcoffset(input_data)
+            if tzoff is not None:
+                total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                if total_seconds == 0:
+                    _svalue += 'Z'
+                else:
+                    if total_seconds < 0:
+                        _svalue += '-'
+                        total_seconds *= -1
+                    else:
+                        _svalue += '+'
+                    hours = total_seconds // 3600
+                    minutes = (total_seconds - (hours * 3600)) // 60
+                    _svalue += '{{0:02d}}:{{1:02d}}'.format(hours, minutes)
+        return _svalue
+    def gds_validate_simple_patterns(self, patterns, target):
+        # pat is a list of lists of strings/patterns.  We should:
+        # - AND the outer elements
+        # - OR the inner elements
+        found1 = True
+        for patterns1 in patterns:
+            found2 = False
+            for patterns2 in patterns1:
+                if re_.search(patterns2, target) is not None:
+                    found2 = True
+                    break
+            if not found2:
+                found1 = False
+                break
+        return found1
+    @classmethod
+    def gds_parse_time(cls, input_data):
+        tz = None
+        if input_data[-1] == 'Z':
+            tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+            input_data = input_data[:-1]
+        else:
+            results = GeneratedsSuper.tzoff_pattern.search(input_data)
+            if results is not None:
+                tzoff_parts = results.group(2).split(':')
+                tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                if results.group(1) == '-':
+                    tzoff *= -1
+                tz = GeneratedsSuper._FixedOffsetTZ(
+                    tzoff, results.group(0))
+                input_data = input_data[:-6]
+        if len(input_data.split('.')) > 1:
+            dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+        else:
+            dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+        dt = dt.replace(tzinfo=tz)
+        return dt.time()
+    def gds_str_lower(self, instring):
+        return instring.lower()
+    def get_path_(self, node):
+        path_list = []
+        self.get_path_list_(node, path_list)
+        path_list.reverse()
+        path = '/'.join(path_list)
+        return path
+    Tag_strip_pattern_ = re_.compile(r'\{{.*\}}')
+    def get_path_list_(self, node, path_list):
+        if node is None:
+            return
+        tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+        if tag:
+            path_list.append(tag)
+        self.get_path_list_(node.getparent(), path_list)
+    def get_class_obj_(self, node, default_class=None):
+        class_obj1 = default_class
+        if 'xsi' in node.nsmap:
+            classname = node.get('{{%s}}type' % node.nsmap['xsi'])
+            if classname is not None:
+                names = classname.split(':')
+                if len(names) == 2:
+                    classname = names[1]
+                class_obj2 = globals().get(classname)
+                if class_obj2 is not None:
+                    class_obj1 = class_obj2
+        return class_obj1
+    def gds_build_any(self, node, type_name=None):
+        return None
+    @classmethod
+    def gds_reverse_node_mapping(cls, mapping):
+        {gds_reverse_node_mapping_text}
+    @staticmethod
+    def gds_encode(instring):
+        if sys.version_info.major == 2:
+            return instring.encode(ExternalEncoding)
+        else:
+            return instring
+    @staticmethod
+    def convert_unicode(instring):
+        if isinstance(instring, str):
+            result = quote_xml(instring)
+        elif sys.version_info.major == 2 and isinstance(instring, unicode):
+            result = quote_xml(instring).encode('utf8')
+        else:
+            result = GeneratedsSuper.gds_encode(str(instring))
+        return result
+    def __eq__(self, other):
+        if type(self) != type(other):
+            return False
+        for key, val in self.__dict__.items():
+            if other.__dict__[key] != val:
+                return False
+        return True
+    def __ne__(self, other):
+        return not self.__eq__(other)
+            return instring
+
+def getSubclassFromModule_(module, class_):
+    '''Get the subclass of a class from a specific module.'''
+    name = class_.__name__ + 'Sub'
+    if hasattr(module, name):
+        return getattr(module, name)
+    else:
+        return None
 """
 
 # Fool (and straighten out) the syntax highlighting.
 # DUMMY = """
 
 
-def generateHeader(wrt, prefix):
+def format_options_args(options, args):
+    options1 = '\n'.join(['#   %s' % (item, ) for item in options])
+    args1 = '\n'.join(['#   %s' % (item, ) for item in args])
+    program = sys.argv[0]
+    options2 = ''
+    for name, value in options:
+        if value:
+            if name.startswith('--'):
+                options2 += ' %s="%s"' % (name, value, )
+            else:
+                options2 += ' %s "%s"' % (name, value, )
+        else:
+            options2 += ' %s' % name
+    args1 = ' '.join(args)
+    command_line = '%s%s %s' % (program, options2, args1, )
+    return options1, args1, command_line
+
+
+Preserve_cdata_get_all_text1 = """\
+PRESERVE_CDATA_TAGS_PAT1 = re_.compile(
+    r'^<.+?>(.*?)</?[a-zA-Z0-9\-]+>(?!.*</?[a-zA-Z0-9\-]+>)')
+PRESERVE_CDATA_TAGS_PAT2 = re_.compile(r'^<.+?>.*?</.+?>(.*)$')
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        mo_ = PRESERVE_CDATA_TAGS_PAT1.search(etree_.tostring(node).strip())
+        if mo_ is not None:
+            text = mo_.group(1)
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            mo_ = PRESERVE_CDATA_TAGS_PAT2.search(
+                etree_.tostring(child).strip())
+            if mo_ is not None:
+                text += mo_.group(1)
+    return text
+"""
+
+Preserve_cdata_get_all_text2 = """\
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+"""
+
+
+def generateHeader(wrt, prefix, options, args, externalImports):
+    global TEMPLATE_HEADER
     tstamp = (not NoDates and time.ctime()) or ''
     if NoVersion:
         version = ''
     else:
         version = ' version %s' % VERSION
-    s1 = TEMPLATE_HEADER % (tstamp, version, ExternalEncoding, )
+    options1, args1, command_line = format_options_args(options, args)
+    current_working_directory = os.path.split(os.getcwd())[1]
+    if PreserveCdataTags and not XmlDisabled:
+        preserve_cdata_tags_pat = \
+            "PRESERVE_CDATA_TAGS_PAT = re_.compile(r'^<.+?>(.*)<.+>$')\n\n"
+        preserve_cdata_get_text = Preserve_cdata_get_all_text1
+    else:
+        preserve_cdata_tags_pat = ""
+        preserve_cdata_get_text = Preserve_cdata_get_all_text2
+    gds_reverse_node_mapping_text = \
+        "return dict(((v, k) for k, v in mapping.iteritems()))"
+    quote_xml_text = \
+        "s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)"
+    quote_attrib_text = \
+        "s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)"
+
+    import_string = TEMPLATE_GENERATEDS_SUPER.format(
+        gds_reverse_node_mapping_text=gds_reverse_node_mapping_text)
+    if UseGeneratedssuperLookup:
+        s0 = """try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+"""
+        for line in StringIO.StringIO(import_string).readlines():
+            s0 += "    "+line
+        import_string = s0
+
+    s1 = TEMPLATE_HEADER.format(
+        tstamp=tstamp,
+        version=version,
+        options1=options1,
+        args1=args1,
+        command_line=command_line,
+        current_working_directory=current_working_directory,
+        ExternalEncoding=ExternalEncoding,
+        preserve_cdata_tags_pat=preserve_cdata_tags_pat,
+        preserve_cdata_get_text=preserve_cdata_get_text,
+        generatedssuper_import=import_string,
+        quote_xml_text=quote_xml_text,
+        quote_attrib_text=quote_attrib_text,
+    )
     wrt(s1)
+    for externalImport in externalImports:
+        wrt(externalImport + "\n")
+
+    wrt("\n")
 
 
 TEMPLATE_MAIN = """\
@@ -4807,7 +5760,7 @@ Usage: python <%(prefix)sParser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -4820,12 +5773,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+%(preserve_cdata_tags)s    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = %(prefix)s%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = %(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -4840,12 +5793,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+%(preserve_cdata_tags)s    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = %(prefix)s%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = %(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -4863,13 +5816,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+%(preserve_cdata_tags)s    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = %(prefix)s%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = %(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -4877,18 +5833,18 @@ def parseString(inString, silence=False):
 #silence#    if not silence:
 #silence#        sys.stdout.write('<?xml version="1.0" ?>\\n')
 #silence#        rootObj.export(
-#silence#            sys.stdout, 0, name_="%(name)s",
+#silence#            sys.stdout, 0, name_=rootTag,
 #silence#            namespacedef_='%(namespacedef)s')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+%(preserve_cdata_tags)s    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = %(prefix)s%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = %(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -4896,7 +5852,7 @@ def parseLiteral(inFileName, silence=False):
 #silence#    if not silence:
 #silence#        sys.stdout.write('#from %(module_name)s import *\\n\\n')
 #silence#        sys.stdout.write('import %(module_name)s as model_\\n\\n')
-#silence#        sys.stdout.write('rootObj = model_.rootTag(\\n')
+#silence#        sys.stdout.write('rootObj = model_.rootClass(\\n')
 #silence#        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 #silence#        sys.stdout.write(')\\n')
     return rootObj
@@ -4922,28 +5878,45 @@ if __name__ == '__main__':
 
 
 def generateMain(outfile, prefix, root):
-    exportDictLine = "GDSClassesMapping = {\n"
+    lines = []
     for classType in MappingTypes:
-        if MappingTypes[classType] in AlreadyGenerated:
-            exportDictLine += "    '%s': %s,\n" % (
-                classType,
-                cleanupName(mapName(MappingTypes[classType])))
-    exportDictLine += "}\n\n\n"
+        mappedName = mapName(cleanupName(MappingTypes[classType]))
+        if mappedName in AlreadyGenerated:
+            lines.append("    '%s': %s%s,\n" % (
+                classType, prefix, mappedName, ))
+    lines.sort()
+    exportDictLine = "GDSClassesMapping = {{\n{}}}\n\n\n".format(
+        ''.join(lines))
     outfile.write(exportDictLine)
+    if XmlDisabled:
+        return
     children = root.getChildren()
+    rootClass = None
     if children:
         name = RootElement or children[0].getName()
         elType = cleanupName(children[0].getType())
         if RootElement:
-            rootElement = RootElement
+            roots = RootElement.split('|')
+            if len(roots) > 1:
+                rootElement = roots[0]
+                rootClass = roots[1]
+            else:
+                rootElement = roots[0]
         else:
             rootElement = elType
     else:
         name = ''
         if RootElement:
-            rootElement = RootElement
+            roots = RootElement.split('|')
+            if len(roots) > 1:
+                rootElement = roots[0]
+                rootClass = roots[1]
+            else:
+                rootElement = roots[0]
         else:
             rootElement = ''
+    if rootClass is None:
+        rootClass = rootElement
     if Namespacedef:
         namespace = Namespacedef
     elif Targetnamespace:
@@ -4960,9 +5933,16 @@ def generateMain(outfile, prefix, root):
         'name': name,
         'cleanname': cleanupName(name),
         'module_name': os.path.splitext(os.path.basename(outfile.name))[0],
-        'root': rootElement,
+        'rootElement': rootElement,
+        'rootClass': rootClass,
         'namespacedef': namespace,
     }
+    if PreserveCdataTags:
+        params['preserve_cdata_tags'] = \
+            "    parser = etree_.ETCompatXMLParser(strip_cdata=False)\n"
+    else:
+        params['preserve_cdata_tags'] = "    parser = None\n"
+        params['preserve_cdata_tags_pat'] = ""
     s1 = TEMPLATE_MAIN % params
     outfile.write(s1)
 
@@ -4971,8 +5951,6 @@ def buildCtorParams(element, parent, childCount):
     content = []
     addedArgs = {}
     add = content.append
-##     if not element.isMixed():
-##         buildCtorParams_aux(addedArgs, add, parent)
     buildCtorParams_aux(addedArgs, add, parent)
     if element.getSimpleContent() or element.isMixed():
         add("valueOf_, ")
@@ -4989,10 +5967,12 @@ def buildCtorParams_aux(addedArgs, add, element):
     if parentName:
         buildCtorParams_aux(addedArgs, add, parentObj)
     attrDefs = element.getAttributeDefs()
-    for key in attrDefs:
+    for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         name = attrDef.getName()
         name = cleanupName(mapName(name))
+        if name == element.getCleanName():
+            name += '_member'
         if name not in addedArgs:
             addedArgs[name] = 1
             add('%s, ' % name)
@@ -5001,6 +5981,8 @@ def buildCtorParams_aux(addedArgs, add, element):
             add('anytypeobjs_, ')
         else:
             name = child.getCleanName()
+            if name == element.getCleanName():
+                name += '_member'
             if name not in addedArgs:
                 addedArgs[name] = 1
                 add('%s, ' % name)
@@ -5028,13 +6010,21 @@ def get_impl_body(classBehavior, baseImplUrl, implUrl):
     if implUrl:
         if baseImplUrl:
             implUrl = '%s%s' % (baseImplUrl, implUrl)
+        if sys.version_info.major == 2:
+            urllib_urlopen = urllib2.urlopen
+            urllib_httperror = urllib2.HTTPError
+            urllib_urlerror = urllib2.URLError
+        else:
+            urllib_urlopen = urllib.request.urlopen
+            urllib_httperror = urllib.error.HTTPError
+            urllib_urlerror = urllib.error.URLError
         try:
-            implFile = urllib2.urlopen(implUrl)
+            implFile = urllib_urlopen(implUrl)
             impl = implFile.read()
             implFile.close()
-        except urllib2.HTTPError:
+        except urllib_httperror:
             err_msg('*** Implementation at %s not found.\n' % implUrl)
-        except urllib2.URLError:
+        except urllib_urlerror:
             err_msg('*** Connection refused for URL: %s\n' % implUrl)
     return impl
 
@@ -5129,14 +6119,16 @@ def generateClassBehaviors(wrt, classBehaviors, baseImplUrl):
         wrt('\n')
 
 
-def generateSubclass(wrt, element, prefix, xmlbehavior,  behaviors, baseUrl):
+def generateSubclass(wrt, element, prefix, xmlbehavior, behaviors, baseUrl):
     if not element.isComplex():
         return
-    if element.getName() in AlreadyGenerated_subclass:
+    mappedName = element.getCleanName()
+    if mappedName in AlreadyGenerated_subclass:
         return
-    AlreadyGenerated_subclass.append(element.getName())
+    AlreadyGenerated_subclass.add(mappedName)
     name = element.getCleanName()
-    wrt('class %s%s%s(supermod.%s):\n' % (prefix, name, SubclassSuffix, name))
+    wrt('class %s%s%s(supermod.%s%s):\n' % (
+        prefix, name, SubclassSuffix, prefix, name))
     childCount = countChildren(element, 0)
     s1 = buildCtorArgs_multilevel(element, childCount)
     wrt('    def __init__(self%s):\n' % s1)
@@ -5163,7 +6155,8 @@ def generateSubclass(wrt, element, prefix, xmlbehavior,  behaviors, baseUrl):
             classBehaviors = None
         if classBehaviors:
             generateClassBehaviors(wrt, classBehaviors, baseUrl)
-    wrt('supermod.%s.subclass = %s%s\n' % (name, name, SubclassSuffix))
+    wrt('supermod.%s%s.subclass = %s%s%s\n' % (
+        prefix, name, prefix, name, SubclassSuffix))
     wrt('# end class %s%s%s\n' % (prefix, name, SubclassSuffix))
     wrt('\n\n')
 
@@ -5174,65 +6167,31 @@ TEMPLATE_SUBCLASS_HEADER = """\
 #
 # Generated %s by generateDS.py%s.
 #
+# Command line options:
+%s
+#
+# Command line arguments:
+#   %s
+#
+# Command line:
+#   %s
+#
+# Current working directory (os.getcwd()):
+#   %s
+#
 
 import sys
+#xmldisable#from lxml import etree as etree_
 
 import %s as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
+#xmldisable#def parsexml_(infile, parser=None, **kwargs):
+#xmldisable#    if parser is None:
+#xmldisable#        # Use the lxml ElementTree compatible parser so that, e.g.,
+#xmldisable#        #   we ignore comments.
+#xmldisable#        parser = etree_.ETCompatXMLParser()
+#xmldisable#    doc = etree_.parse(infile, parser=parser, **kwargs)
+#xmldisable#    return doc
 
 #
 # Globals
@@ -5258,12 +6217,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+%(preserve_cdata_tags)s    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = supermod.%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = supermod.%(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5278,12 +6237,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+%(preserve_cdata_tags)s    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = supermod.%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = supermod.%(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5302,12 +6261,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+%(preserve_cdata_tags)s    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = '%(name)s'
-        rootClass = supermod.%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = supermod.%(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5321,12 +6280,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+%(preserve_cdata_tags)s    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = supermod.%(root)s
+        rootTag = '%(rootElement)s'
+        rootClass = supermod.%(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5334,8 +6293,8 @@ def parseLiteral(inFilename, silence=False):
 #silence#    if not silence:
 #silence#        sys.stdout.write('#from %(super)s import *\\n\\n')
 #silence#        sys.stdout.write('import %(super)s as model_\\n\\n')
-#silence#        sys.stdout.write('rootObj = model_.%(cleanname)s(\\n')
-#silence#        rootObj.exportLiteral(sys.stdout, 0, name_="%(cleanname)s")
+#silence#        sys.stdout.write('rootObj = model_.rootClass(\\n')
+#silence#        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 #silence#        sys.stdout.write(')\\n')
     return rootObj
 
@@ -5346,7 +6305,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -5413,8 +6372,23 @@ TEMPLATE_ABSTRACT_CHILD = """\
 """
 
 
+def getNamespace(element):
+    namespace = ''
+    if element.targetNamespace in NamespacesDict:
+        namespace = 'xmlns:%s="%s"' % (
+            NamespacesDict[element.targetNamespace].rstrip(':'),
+            element.targetNamespace, )
+    elif Namespacedef:
+        namespace = Namespacedef
+    elif Targetnamespace in NamespacesDict:
+            namespace = 'xmlns:%s="%s"' % (
+                NamespacesDict[Targetnamespace].rstrip(':'),
+                Targetnamespace, )
+    return namespace
+
+
 def generateSubclasses(root, subclassFilename, behaviorFilename,
-                       prefix, superModule='xxx'):
+                       prefix, options, args, superModule='xxx'):
     subclassFile = makeFile(subclassFilename)
     wrt = subclassFile.write
     if subclassFile:
@@ -5444,25 +6418,44 @@ def generateSubclasses(root, subclassFilename, behaviorFilename,
             version = ''
         else:
             version = ' version %s' % VERSION
+        options1, args1, command_line = format_options_args(options, args)
+        current_working_directory = os.path.split(os.getcwd())[1]
         wrt(TEMPLATE_SUBCLASS_HEADER % (tstamp, version,
+            options1, args1,
+            command_line, current_working_directory,
             superModule, ExternalEncoding, ))
         for element in ElementsForSubclasses:
             generateSubclass(
                 wrt, element, prefix, xmlbehavior, behaviors, baseUrl)
+        if XmlDisabled:
+            return
         children = root.getChildren()
+        rootClass = None
         if children:
             name = children[0].getName()
             elType = cleanupName(children[0].getType())
             if RootElement:
-                rootElement = RootElement
+                roots = RootElement.split('|')
+                if len(roots) > 1:
+                    rootElement = roots[0]
+                    rootClass = roots[1]
+                else:
+                    rootElement = roots[0]
             else:
                 rootElement = elType
         else:
             name = ''
             if RootElement:
-                rootElement = RootElement
+                roots = RootElement.split('|')
+                if len(roots) > 1:
+                    rootElement = roots[0]
+                    rootClass = roots[1]
+                else:
+                    rootElement = roots[0]
             else:
                 rootElement = ''
+        if rootClass is None:
+            rootClass = rootElement
         if Namespacedef:
             namespace = Namespacedef
         elif Targetnamespace:
@@ -5477,23 +6470,47 @@ def generateSubclasses(root, subclassFilename, behaviorFilename,
         params = {
             'cap_name': make_gs_name(cleanupName(name)),
             'name': name,
+            'prefix': prefix,
             'cleanname': cleanupName(name),
             'module_name': os.path.splitext(
                 os.path.basename(subclassFilename))[0],
-            'root': rootElement,
+            'root': root,
+            'rootElement': rootElement,
+            'rootClass': rootClass,
             'namespacedef': namespace,
             'super': superModule,
         }
+        if PreserveCdataTags:
+            params['preserve_cdata_tags'] = \
+                "    parser = etree_.ETCompatXMLParser(strip_cdata=False)\n"
+        else:
+            params['preserve_cdata_tags'] = \
+                "    parser = None\n"
         wrt(TEMPLATE_SUBCLASS_FOOTER % params)
         subclassFile.close()
 
 
+def getUsedNamespacesDefs(element):
+    processedPrefixes = []
+    nameSpacesDef = getNamespace(element)
+    for child in element.getChildren():
+        if child.prefix not in processedPrefixes and \
+           child.prefix in prefixToNamespaceMap:
+            spaceDef = 'xmlns:%s="%s" ' % (
+                child.prefix, prefixToNamespaceMap[child.prefix])
+            if spaceDef.strip() not in nameSpacesDef:
+                nameSpacesDef += ' ' + spaceDef
+            processedPrefixes.append(child.prefix)
+    return nameSpacesDef
+
+
 def generateFromTree(wrt, prefix, elements, processed):
     for element in elements:
+        nameSpacesDef = getUsedNamespacesDefs(element)
         name = element.getCleanName()
         if 1:     # if name not in processed:
             processed.append(name)
-            generateClasses(wrt, prefix, element, 0)
+            generateClasses(wrt, prefix, element, 0, nameSpacesDef)
             children = element.getChildren()
             if children:
                 generateFromTree(wrt, prefix, element.getChildren(), processed)
@@ -5506,14 +6523,56 @@ def generateSimpleTypes(wrt, prefix, simpleTypeDict):
         wrt('\n\n')
 
 
+def getImportsForExternalXsds(root):
+    '''
+    If we are creating a file per xsd, then
+    we need to import any external classes we use
+    '''
+    externalImports = set()
+    if not SingleFileOutput:
+        childStack = list(root.getChildren())
+        while len(childStack) > 0:
+            child = childStack.pop()
+            if child.namespace and child.namespace != root.targetNamespace:
+                fqn = child.getFullyQualifiedType()
+                if fqn in fqnToModuleNameMap and fqn in fqnToElementDict:
+                    schemaElement = fqnToElementDict[fqn]
+                    moduleName = fqnToModuleNameMap[fqn]
+                    type = schemaElement.getType()
+                    if type == "xs:string":
+                        type = schemaElement.getName()
+                    externalImports.add("from %s%s import %s" %
+                                           (moduleName, ModuleSuffix,
+                                            type))
+            for subChild in child.getChildren():
+                childStack.append(subChild)
+    return externalImports
+
+
+def isNewState():
+    state = reduce(
+        operator.concat,
+        (str(id(item)) for item in PostponedExtensions))
+    if sys.version_info.major == 2:
+        sum = hashlib.sha1(str(state)).hexdigest()
+    else:
+        sum = hashlib.sha1(str(state).encode()).hexdigest()
+    if sum in LoopcheckOneperChecksums:
+        return False
+    LoopcheckOneperChecksums.add(sum)
+    return True
+
+
 def generate(outfileName, subclassFilename, behaviorFilename,
-             prefix, root, superModule):
-    global DelayedElements, DelayedElements_subclass
+             prefix, root, options, args, superModule):
+    global DelayedElements, DelayedElements_subclass, AlreadyGenerated
     # Create an output file.
     # Note that even if the user does not request an output file,
     #   we still need to go through the process of generating classes
     #   because it produces data structures needed during generation of
     #   subclasses.
+    MappingTypes.clear()
+    #AlreadyGenerated = set()
     outfile = None
     if outfileName:
         outfile = makeFile(outfileName)
@@ -5521,10 +6580,11 @@ def generate(outfileName, subclassFilename, behaviorFilename,
         outfile = os.tmpfile()
     wrt = outfile.write
     processed = []
-    generateHeader(wrt, prefix)
+    externalImports = getImportsForExternalXsds(root)
+    generateHeader(wrt, prefix, options, args, externalImports)
     #generateSimpleTypes(outfile, prefix, SimpleTypeDict)
-    DelayedElements = []
-    DelayedElements_subclass = []
+    DelayedElements = set()
+    DelayedElements_subclass = set()
     elements = root.getChildren()
     generateFromTree(wrt, prefix, elements, processed)
     while 1:
@@ -5538,9 +6598,11 @@ def generate(outfileName, subclassFilename, behaviorFilename,
     #
     # Generate the elements that were postponed because we had not
     #   yet generated their base class.
-    while 1:
-        if len(PostponedExtensions) <= 0:
-            break
+    while len(PostponedExtensions) > 0:
+        if not isNewState():
+            sys.stderr.write('\n*** maxLoops exceeded.  Something is '
+                             'wrong with --one-file-per-xsd.\n\n')
+            sys.exit(1)
         element = PostponedExtensions.pop()
         parentName, parent = getParentName(element)
         if parentName:
@@ -5549,6 +6611,7 @@ def generate(outfileName, subclassFilename, behaviorFilename,
                 generateClasses(wrt, prefix, element, 1)
             else:
                 PostponedExtensions.insert(0, element)
+
     #
     # Disable the generation of SAX handler/parser.
     # It failed when we stopped putting simple types into ElementDict.
@@ -5559,7 +6622,8 @@ def generate(outfileName, subclassFilename, behaviorFilename,
     if subclassFilename:
         generateSubclasses(
             root, subclassFilename, behaviorFilename,
-            prefix, superModule)
+            prefix, options, args, superModule)
+# end generate
 
 
 def makeFile(outFileName):
@@ -5571,12 +6635,16 @@ def makeFile(outFileName):
                 outFileName)
             sys.exit(1)
         else:
-            reply = raw_input(
-                'File %s exists.  Overwrite? (y/n): ' % outFileName)
+            if sys.version_info.major == 2:
+                reply = raw_input(
+                    'File %s exists.  Overwrite? (y/n): ' % outFileName)
+            else:
+                reply = input(
+                    'File %s exists.  Overwrite? (y/n): ' % outFileName)
             if reply == 'y':
-                outFile = file(outFileName, 'w')
+                outFile = open(outFileName, 'w')
     else:
-        outFile = file(outFileName, 'w')
+        outFile = open(outFileName, 'w')
     return outFile
 
 
@@ -5588,9 +6656,9 @@ def mapName(oldName):
 
 
 def cleanupName(oldName):
-    newName = oldName.replace(':', '_')
-    newName = newName.replace('-', '_')
-    newName = newName.replace('.', '_')
+    newName = oldName
+    for pattern, repl in CleanupNameList:
+        newName = re.sub(pattern, repl, newName)
     return newName
 
 
@@ -5608,6 +6676,12 @@ def strip_namespace(val):
     return val.split(':')[-1]
 
 
+def get_prefix_and_value(val):
+    if ':' in val:
+        return val.split(':')
+    return None, val
+
+
 def escape_string(instring):
     s1 = instring
     s1 = s1.replace('\\', '\\\\')
@@ -5634,62 +6708,18 @@ def is_builtin_simple_type(type_val):
         return False
 
 
-##def process_include(inpath, outpath):
-##    from xml.etree import ElementTree as etree
-##    if inpath:
-##        doc = etree.parse(inpath)
-##        root = doc.getroot()
-##        process_include_tree(root)
-##    else:
-##        s1 = sys.stdin.read()
-##        root = etree.fromstring(s1)
-##        process_include_tree(root)
-##        doc = etree.ElementTree(root)
-##    if outpath:
-##        outfile = make_file(outpath)
-##        if outfile:
-##            doc.write(outfile)
-##            outfile.close()
-##    else:
-##        doc.write(sys.stdout)
-##
-##def process_include_tree(root):
-##    idx = 0
-##    children = root.getchildren()
-##    while idx < len(children):
-##        child = children[idx]
-##        tag = child.tag
-##        if type(tag) == type(""):
-##            tag = NAMESPACE_PAT.sub("", tag)
-##        else:
-##            tag = None
-##        if tag == 'include' and 'schemaLocation' in child.attrib:
-##            root.remove(child)
-##            path = child.attrib['schemaLocation']
-##            if os.path.exists(path):
-##                doc = etree.parse(path)
-##                node = doc.getroot()
-##                process_include_tree(node)
-##                children1 = node.getchildren()
-##                for child1 in children1:
-##                    root.insert(idx, child1)
-##                    idx += 1
-##        else:
-##            process_include_tree(child)
-##            idx += 1
-##        children = root.getchildren()
-
 def parseAndGenerate(
         outfileName, subclassFilename, prefix,
         xschemaFileName, behaviorFilename, catalogFilename,
-        processIncludes, superModule='???'):
+        processIncludes, options, args, superModule='???'):
     global DelayedElements, DelayedElements_subclass, \
         AlreadyGenerated, SaxDelayedElements, \
-        AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule
-    DelayedElements = []
-    DelayedElements_subclass = []
-    AlreadyGenerated = []
-    AlreadyGenerated_subclass = []
+        AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule, \
+        SchemaLxmlTree, ModuleSuffix
+    DelayedElements = set()
+    DelayedElements_subclass = set()
+    AlreadyGenerated = set()
+    AlreadyGenerated_subclass = set()
     if UserMethodsPath:
         # UserMethodsModule = __import__(UserMethodsPath)
         path_list = UserMethodsPath.split('.')
@@ -5698,47 +6728,128 @@ def parseAndGenerate(
         module_spec = imp.find_module(mod_name, [mod_path, ])
         UserMethodsModule = imp.load_module(mod_name, *module_spec)
 ##    parser = saxexts.make_parser("xml.sax.drivers2.drv_pyexpat")
-    parser = make_parser()
-    dh = XschemaHandler()
-##    parser.setDocumentHandler(dh)
-    parser.setContentHandler(dh)
     if xschemaFileName == '-':
         infile = sys.stdin
     else:
         infile = open(xschemaFileName, 'r')
-    if processIncludes:
+    if SingleFileOutput:
+        parser = make_parser()
+        dh = XschemaHandler()
+        parser.setContentHandler(dh)
+        if processIncludes:
+            import process_includes
+            if sys.version_info.major == 2:
+                outfile = StringIO.StringIO()
+            else:
+                outfile = io.StringIO()
+            doc = process_includes.process_include_files(
+                infile, outfile,
+                inpath=xschemaFileName,
+                catalogpath=catalogFilename,
+                fixtypenames=FixTypeNames)
+            outfile.seek(0)
+            infile = outfile
+            SchemaLxmlTree = doc.getroot()
+        parser.parse(infile)
+        root = dh.getRoot()
+        root.annotate()
+        generate(
+            outfileName, subclassFilename, behaviorFilename,
+            prefix, root, options, args, superModule)
+        # Generate __all__.  When using the parser as a module it is useful
+        # to isolate important classes from internal ones. This way one
+        # can do a reasonably safe "from parser import *"
+        if outfileName:
+            exportableClassList = [
+                '"%s%s"' % (prefix, name, )
+                for name in AlreadyGenerated]
+            exportableClassList.sort()
+            exportableClassNames = ',\n    '.join(exportableClassList)
+            exportLine = "\n__all__ = [\n    %s\n]\n" % exportableClassNames
+            outfile = open(outfileName, "a")
+            outfile.write(exportLine)
+            outfile.close()
+    else:    # not SingleFileOutput
         import process_includes
-        outfile = StringIO.StringIO()
-        process_includes.process_include_files(
-            infile, outfile,
-            inpath=xschemaFileName,
-            catalogpath=catalogFilename,
-            fixtypenames=FixTypeNames)
-        outfile.seek(0)
-        infile = outfile
-    parser.parse(infile)
-    root = dh.getRoot()
-    root.annotate()
-##     print '-' * 60
-##     root.show(sys.stdout, 0)
-##     print '-' * 60
-    #debug_show_elements(root)
-    generate(
-        outfileName, subclassFilename, behaviorFilename,
-        prefix, root, superModule)
-    # Generate __all__.  When using the parser as a module it is useful
-    # to isolate important classes from internal ones. This way one
-    # can do a reasonably safe "from parser import *"
-    if outfileName:
-        exportableClassList = [
-            '"%s"' % mapName(cleanupName(name))
-            for name in AlreadyGenerated]
-        exportableClassList.sort()
-        exportableClassNames = ',\n    '.join(exportableClassList)
-        exportLine = "\n__all__ = [\n    %s\n]\n" % exportableClassNames
-        outfile = open(outfileName, "a")
-        outfile.write(exportLine)
-        outfile.close()
+        if 1:
+            if sys.version_info.major == 2:
+                outfile = StringIO.StringIO()
+            else:
+                outfile = io.StringIO()
+            doc = process_includes.process_include_files(
+                infile, outfile,
+                inpath=xschemaFileName,
+                catalogpath=catalogFilename,
+                fixtypenames=FixTypeNames)
+            outfile.close()
+            outfile = None
+            SchemaLxmlTree = doc.getroot()
+        infile.seek(0)
+        rootPaths = process_includes.get_all_root_file_paths(
+            infile, inpath=xschemaFileName,
+            catalogpath=catalogFilename)
+        roots = []
+        rootInfos = []
+        for path in rootPaths:
+            if path.startswith('http:') or path.startswith('ftp:'):
+                try:
+                    urlfile = urllib2.urlopen(path)
+                    content = urlfile.read()
+                    urlfile.close()
+                    if sys.version_info.major == 2:
+                        rootFile = StringIO.StringIO()
+                    else:
+                        rootFile = io.StringIO()
+                    rootFile.write(content)
+                    rootFile.seek(0)
+                except urllib2.HTTPError:
+                    msg = "Can't find file %s." % (path, )
+                    raise IOError(msg)
+            else:
+                rootFile = open(path, 'r')
+            parser = make_parser()
+            dh = XschemaHandler()
+            parser.setContentHandler(dh)
+            parser.parse(rootFile)
+            root = dh.getRoot()
+            roots.append(root)
+            rootFile.close()
+        for root, rootPath in zip(roots, rootPaths):
+            root.annotate()
+            moduleName = os.path.splitext(os.path.basename(rootPath))[0]
+            modulePath = None
+            # use the first root element to set
+            # up the module name and path
+            for child in root.getChildren():
+                fqnToModuleNameMap[child.getFullyQualifiedType()] = \
+                    moduleName
+                fqnToModuleNameMap[child.getFullyQualifiedName()] = \
+                    moduleName
+            # use the root file name as module name
+            modulePath = os.path.join(
+                OutputDirectory,
+                moduleName + ModuleSuffix + ".py")
+            rootInfos.append((root, modulePath))
+        for root, modulePath in rootInfos:
+            if modulePath:
+                generate(
+                    modulePath, subclassFilename, behaviorFilename,
+                    prefix, root, options, args, superModule)
+                # Generate __all__.  When using the parser as a module
+                # it is useful
+                # to isolate important classes from internal ones. This way one
+                # can do a reasonably safe "from parser import *"
+                exportableClassList = [
+                    '"%s%s"' % (prefix, name, )
+                    for name in AlreadyGenerated]
+                exportableClassList.sort()
+                exportableClassNames = ',\n    '.join(exportableClassList)
+                exportLine = "\n__all__ = [\n    %s\n]\n" % (
+                    exportableClassNames, )
+                outfile = open(modulePath, "a")
+                outfile.write(exportLine)
+                outfile.close()
+# end parseAndGenerate
 
 
 # Function that gets called recursively in order to expand nested references
@@ -5778,21 +6889,6 @@ def expandGroupReferences(grp):
     _expandGR(grp, visited)
 
 
-def debug_show_elements(root):
-    #print 'ElementDict:', ElementDict
-    print '=' * 50
-    for name, obj in ElementDict.iteritems():
-        print 'element:', name, obj.getName(), obj.type
-    print '=' * 50
-    #ipshell('debug')
-##     root.show(sys.stdout, 0)
-##     print '=' * 50
-##     response = raw_input('Press Enter')
-##     root.show(sys.stdout, 0)
-##     print '=' * 50
-##     print ']]] root: ', root, '[[['
-
-
 def load_config():
     try:
         #print '1. updating NameTable'
@@ -5812,15 +6908,65 @@ def fixSilence(txt, silent):
     return txt
 
 
+def fixXmlDisable(txt, disabled):
+    if disabled:
+        txt = txt.replace('#xmldisable#', '## ')
+    else:
+        txt = txt.replace('#xmldisable#', '')
+    return txt
+
+def capture_cleanup_name_list(option):
+    cleanupNameList = []
+    if not option:
+        return cleanupNameList
+    cleanup_str = option
+    from ast import literal_eval
+    try:
+        cleanup_list = literal_eval(cleanup_str)
+    except ValueError:
+        raise RuntimeError(
+            'Unable to parse option --cleanup-name-list.')
+    if type(cleanup_list) not in (list, tuple):
+        raise RuntimeError(
+            'Option --cleanup-name-list must be a list or a tuple.')
+    for cleanup_pair in cleanup_list:
+        if sys.version_info.major == 2:
+            if (type(cleanup_pair) not in (list, tuple) or
+                    len(cleanup_pair) != 2 or
+                    not isinstance(cleanup_pair[0], BaseStrType) or
+                    not isinstance(cleanup_pair[1], BaseStrType)):
+                raise RuntimeError(
+                    'Option --cleanup-name-list contains '
+                    'invalid element.')
+        else:
+            if (type(cleanup_pair) not in (list, tuple) or
+                    len(cleanup_pair) != 2 or
+                    not isinstance(cleanup_pair[0], str) or
+                    not isinstance(cleanup_pair[1], str)):
+                raise RuntimeError(
+                    'Option --cleanup-name-list contains '
+                    'invalid element.')
+        try:
+            cleanupNameList.append(
+                (re.compile(cleanup_pair[0]), cleanup_pair[1]))
+        except Exception:
+            raise RuntimeError(
+                'Option --cleanup-name-list contains invalid '
+                'pattern "%s".'
+                % cleanup_pair[0])
+    return cleanupNameList
+
+
 def err_msg(msg):
-    sys.stderr.write(msg)
+    if not NoWarnings:
+        sys.stderr.write(msg)
 
 
 USAGE_TEXT = __doc__
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -5828,11 +6974,15 @@ def main():
     global Force, GenerateProperties, SubclassSuffix, RootElement, \
         ValidatorBodiesBasePath, UseGetterSetter, \
         UserMethodsPath, XsdNameSpace, \
-        Namespacedef, NoDates, NoVersion, \
-        TEMPLATE_MAIN, TEMPLATE_SUBCLASS_FOOTER, Dirpath, \
-        ExternalEncoding, MemberSpecs, NoQuestions, \
-        ExportWrite, ExportEtree, ExportLiteral, \
-        FixTypeNames
+        Namespacedef, NoDates, NoVersion, TEMPLATE_HEADER, \
+        TEMPLATE_MAIN, TEMPLATE_SUBCLASS_FOOTER, TEMPLATE_SUBCLASS_HEADER,\
+        Dirpath, ExternalEncoding, MemberSpecs, NoQuestions, \
+        ExportWrite, ExportEtree, ExportLiteral, XmlDisabled, \
+        FixTypeNames, SingleFileOutput, OutputDirectory, \
+        ModuleSuffix, UseOldSimpleTypeValidators, \
+        UseGeneratedssuperLookup, \
+        PreserveCdataTags, CleanupNameList, \
+        NoWarnings
     outputText = True
     args = sys.argv[1:]
     try:
@@ -5846,7 +6996,12 @@ def main():
                 'namespacedef=', 'external-encoding=',
                 'member-specs=', 'no-dates', 'no-versions',
                 'no-questions', 'session=', 'fix-type-names=',
-                'version', 'export=',
+                'version', 'export=', 'disable-xml',
+                'one-file-per-xsd', 'output-directory=',
+                'module-suffix=', 'use-old-simpletype-validators',
+                'preserve-cdata-tags', 'cleanup-name-list=',
+                'disable-generatedssuper-lookup',
+                'no-warnings',
             ])
     except getopt.GetoptError:
         usage()
@@ -5869,7 +7024,7 @@ def main():
         if option[0] == '--session':
             sessionFilename = option[1]
             from libgenerateDS.gui import generateds_gui_session
-            from xml.etree import ElementTree as etree
+            from lxml import etree
             doc = etree.parse(sessionFilename)
             rootNode = doc.getroot()
             sessionObj = generateds_gui_session.sessionType()
@@ -5922,6 +7077,28 @@ def main():
                 ExternalEncoding = sessionObj.get_external_encoding()
             if sessionObj.get_member_specs() in ('list', 'dict'):
                 MemberSpecs = sessionObj.get_member_specs()
+            exports = sessionObj.get_export_spec()
+            if exports:
+                ExportWrite = False
+                ExportEtree = False
+                ExportLiteral = False
+                exports = exports.split()
+                if 'write' in exports:
+                    ExportWrite = True
+                if 'etree' in exports:
+                    ExportEtree = True
+                if 'literal' in exports:
+                    ExportLiteral = True
+            if sessionObj.get_one_file_per_xsd():
+                SingleFileOutput = False
+            if sessionObj.get_output_directory():
+                OutputDirectory = sessionObj.get_output_directory()
+            if sessionObj.get_module_suffix():
+                ModuleSuffix = sessionObj.get_module_suffix()
+            if sessionObj.get_preserve_cdata_tags():
+                PreserveCdataTags = True
+            CleanupNameList = capture_cleanup_name_list(
+                sessionObj.get_cleanup_name_list())
             break
     for option in options:
         if option[0] == '-h' or option[0] == '--help':
@@ -5965,6 +7142,8 @@ def main():
                 err_msg('*** Option use-getter-setter must '
                         '"old" or "new" or "none".\n')
                 sys.exit(1)
+        elif option[0] == '--use-old-simpletype-validators':
+            UseOldSimpleTypeValidators = True
         elif option[0] in ('-u', '--user-methods'):
             UserMethodsPath = option[1]
         elif option[0] == '--no-process-includes':
@@ -5997,8 +7176,24 @@ def main():
                 ExportEtree = True
             if 'literal' in tmpoptions:
                 ExportLiteral = True
+        elif option[0] == '--disable-xml':
+            XmlDisabled = True
+        elif option[0] == '--disable-generatedssuper-lookup':
+            UseGeneratedssuperLookup = False
+        elif option[0] == '--one-file-per-xsd':
+            SingleFileOutput = False
+        elif option[0] == "--output-directory":
+            OutputDirectory = option[1]
+        elif option[0] == "--module-suffix":
+            ModuleSuffix = option[1]
+        elif option[0] == "--preserve-cdata-tags":
+            PreserveCdataTags = True
+        elif option[0] == '--cleanup-name-list':
+            CleanupNameList = capture_cleanup_name_list(option[1])
+        elif option[0] == '--no-warnings':
+            NoWarnings = True
     if showVersion:
-        print 'generateDS.py version %s' % VERSION
+        print('generateDS.py version %s' % VERSION)
         sys.exit(0)
     XsdNameSpace = nameSpace
     Namespacedef = namespacedef
@@ -6011,14 +7206,19 @@ def main():
             usage()
         else:
             xschemaFileName = args[0]
+            XsdFileName.append(xschemaFileName)
     silent = not outputText
+    TEMPLATE_HEADER = fixXmlDisable(TEMPLATE_HEADER, XmlDisabled)
     TEMPLATE_MAIN = fixSilence(TEMPLATE_MAIN, silent)
+    TEMPLATE_SUBCLASS_HEADER = fixXmlDisable(
+        TEMPLATE_SUBCLASS_HEADER, XmlDisabled)
     TEMPLATE_SUBCLASS_FOOTER = fixSilence(TEMPLATE_SUBCLASS_FOOTER, silent)
+
     load_config()
     parseAndGenerate(
         outFilename, subclassFilename, prefix,
         xschemaFileName, behaviorFilename, catalogFilename,
-        processIncludes, superModule=superModule)
+        processIncludes, options, args, superModule=superModule)
 
 
 if __name__ == '__main__':
diff --git a/generateDS.txt b/generateDS.txt
index ab8558c..eebc634 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -3,7 +3,7 @@ generateDS -- Generate Data Structures from XML Schema
 ======================================================
 
 :author: Dave Kuhlman
-:contact: dkuhlman@pacbell.net
+:contact: dkuhlman (at) davekuhlman (dot) org
 :address:
     http://www.davekuhlman.org
 
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.11b
+:revision: 2.24b
 
 .. version
 
@@ -100,6 +100,10 @@ and extend multiple subclass files which use a single, common
 superclass file, thus implementing a number of different processes
 on the same XML document type.
 
+``generateDS.py`` can be run under either Python 2 or Python 3.  The
+generated Python code (both superclass and subclass modules) can be
+run under either Python 2 or Python 3.
+
 This document explains (1) how to use ``generateDS.py``; (2) how
 to use the Python code and data structures that it generates; and
 (3) how to modify the generated code for special purposes.
@@ -149,9 +153,21 @@ http://www.davekuhlman.org/generateds_tutorial.html
 How to build and install it
 ===========================
 
-Newer versions of Python have XML support in the Python standard
-library. For older versions of Python, install PyXML. You can find
-it at: http://pyxml.sourceforge.net/
+Requirements
+--------------
+
+``Lxml`` is used both by ``generateDS.py`` and by the code it
+generates.  ``Lxml`` is available at the Python Package Index
+https://pypi.python.org/pypi/lxml/ and at the ``Lxml`` project home
+site http://lxml.de/.
+
+Older versions of Python XML support can sometimes cause problems.
+If you receive a traceback that includes "_xmlplus", then you will
+need to remove that ``_xmlplus`` package.
+
+
+Installation
+--------------
 
 De-compress the ``generateDS`` distribution file. Use something
 like the following::
@@ -184,8 +200,8 @@ librarytemplate_howto.html
 
 And the package building support itself is here:
 `LibraryTemplate --
-http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip
-<http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip>`_.
+http://www.davekuhlman.org/librarytemplate-1.0a.zip
+<http://www.davekuhlman.org/librarytemplate-1.0a.zip>`_.
 It is also included in the generateDS distribution package.
 
 
@@ -205,8 +221,9 @@ it will write subclass stubs to the file peoplesubs.py::
 
 Here is the usage message displayed by ``generateDS.py``::
 
+
     Synopsis:
-        Generate Python classes from XML Schema definition.
+        Generate Python classes from XML schema definition.
         Input is read from in_xsd_file or, if "-" (dash) arg, from stdin.
         Output is written to files named in "-o" and "-s" options.
     Usage:
@@ -223,16 +240,28 @@ Here is the usage message displayed by ``generateDS.py``::
         -b <behaviorfilename>    Input file name for behaviors added to subclasses
         -m                       Generate properties for member variables
         -c <xmlcatalogfilename>  Input file name to load an XML catalog
+        --one-file-per-xsd       Create a python module for each XSD processed.
+        --output-directory="XXX" Used in conjunction with --one-file-per-xsd.
+                                 The directory where the modules will be created.
+        --module-suffix="XXX"    To be used in conjunction with --one-file-per-xsd.
+                                 Append XXX to the end of each file created.
         --subclass-suffix="XXX"  Append XXX to the generated subclass names.
                                  Default="Sub".
-        --root-element="XXX"     Assume XXX is root element of instance docs.
-                                 Default is first element defined in schema.
-                                 Also see section "Recognizing the top level
+        --root-element="XX"      When parsing, assume XX is root element of
+        --root-element="XX|YY"   instance docs.  Default is first element defined
+                                 in schema.  If YY is added, then YY is used as the
+                                 top level class; if YY omitted XX is the default.
+                                 class. Also see section "Recognizing the top level
                                  element" in the documentation.
-        --super="XXX"            Super module name in generated in subclass
+        --super="XXX"            Super module name in generated subclass
                                  module. Default="???"
         --validator-bodies=path  Path to a directory containing files that provide
                                  bodies (implementations) of validator methods.
+        --use-old-simpletype-validators
+                                 Use the old style simpleType validator functions
+                                 stored in a specified directory, instead of the
+                                 new style validators generated directly from the
+                                 XML schema.  See option --validator-bodies.
         --use-getter-setter      Generate getter and setter methods.  Values:
                                  "old" - Name getters/setters getVar()/setVar().
                                  "new" - Name getters/setters get_var()/set_var().
@@ -249,10 +278,10 @@ Here is the usage message displayed by ``generateDS.py``::
                                  generated files. This is useful if you want
                                  to minimize the amount of (no-operation)
                                  changes to the generated python code.
-        --no-process-includes    Do not process included XML Schema files.  By
+        --no-process-includes    Do not process included XML schema files.  By
                                  default, generateDS.py will insert content
                                  from files referenced by <include ... />
-                                 elements into the XML Schema to be processed.
+                                 elements into the XML schema to be processed.
         --silence                Normally, the code generated with generateDS
                                  echoes the information being parsed. To prevent
                                  the echo from occurring, use the --silence switch.
@@ -284,8 +313,16 @@ Here is the usage message displayed by ``generateDS.py``::
                                          to XML)
                                  Example: "write etree"
                                  Default: "write"
+        --preserve-cdata-tags    Preserve CDATA tags.  Default: False
+        --cleanup-name-list=<replacement-map>
+                                 Specifies list of 2-tuples used for cleaning
+                                 names.  First element is a regular expression
+                                 search pattern and second is a replacement.
+                                 Example: "[('[-:.]', '_'), ('^__', 'Special')]"
+                                 Default: "[('[-:.]', '_')]"
         -q, --no-questions       Do not ask questions, for example,
                                  force overwrite.
+        --no-warnings            Do not print warning messages.
         --session=mysession.session
                                  Load and use options from session file. You can
                                  create session file in generateds_gui.py.  Or,
@@ -308,7 +345,11 @@ Here is the usage message displayed by ``generateDS.py``::
     also generates member specifications in each class (in a dictionary).
 
 
-The following command line flags are recognized by ``generateDS.py``:
+
+Command line options
+----------------------
+
+The following command line options are recognized by ``generateDS.py``:
 
 o <filename>
     Write the data representation classes to file filename.
@@ -360,10 +401,24 @@ m
 c <xmlcatalogfilename>
     Specify the file to be used as an XML catalog.  This file will
     be used by process_includes.py if needed to resolve references
-    in <import> and <include> elements in the XML Schema.  For more
-    information on XML catalogs, see:
+    in <xs:import> and <xs:include> elements in the XML Schema.  For
+    more information on XML catalogs, see:
     http://en.wikipedia.org/wiki/XML_Catalog
 
+one-file-per-xsd
+    Create a separate Python module for each XML Schema document
+    processed (for example, using <xs:include> or <xs:import>).  For
+    help with using this option, see `"One Per" -- generating
+    separate files from imported/included schemas`_.
+
+output-directory <directory>
+    When used with ``one-file-per-xsd``, create generated output
+    files in path ``<directory>``.
+
+module-suffix <suffix>
+    When used with ``one-file-per-xsd``, append ``<suffix>`` to the
+    end of each module name.
+
 subclass-suffix=<suffix>
     Append suffix to the name of classes generated in the subclass
     file.  The default, if omitted, is "Sub".  For example, the
@@ -377,11 +432,16 @@ subclass-suffix=<suffix>
 
         generateDS.py --subclass-suffix="" -s actions.py mydef.xsd
 
-root-element=<element_name>
-    Make element_name the assumed root of instance documents.  The
-    default is the name of the element whose definition is first
-    in the XML Schema document.  This flag effects the parsing
-    functions (for example, parse(), parseString()).
+root-element=<element_name> -OR- <element_name>|<class_name>
+    Make ``element_name`` the assumed root of instance documents.
+    The default is the name of the element whose definition is first
+    in the XML Schema document.  If ``class_name`` is also present
+    (after a vertical bar), then ``class_name`` is assumed to be the
+    name of the class to be created from the root (top level)
+    element when parsing an XML instance document.  If
+    ``class_name`` is omitted, the default class name is the same as
+    ``element_name``.  This flag effects the parsing functions (for
+    example, parse(), parseString(), etc).
 
 super=<module_name>
     Make module_name the name of the superclass module imported
@@ -403,6 +463,22 @@ validator-bodies=<path>
     files, lines with "##" in the first two columns are ignored
     and are not inserted.
 
+use-old-simpletype-validators
+    ``generateDS.py`` is capable of generating validator bodies --
+    the code that validates data content in an XML instance
+    docuement and writes out warning messages if that data does not
+    satisfy the facets in the ``xs:restriction`` in the
+    ``xs:simpleType`` defintion in the XML schema.  Use this option
+    if you want to use your own validation bodies/code defined in a
+    specified directory .  See option ``--validator-bodies`` for
+    information on that.  *Without* this option
+    (``--use-old-simpletype-validators``), the validator code will
+    be generated directly from the XML schema, which is the default.
+
+    This option can also be used to generate code that does *no*
+    validation.  See `simpleType and validators`_ and `Turning off
+    validation of simpleType data`_ for more information.
+
 use-getter-setter
     ``generateDS.py`` now generates getter and setter methods (for
     variable "abc", for example) with the names get_abc() and
@@ -438,7 +514,12 @@ no-process-includes
     Do not process included XML Schema files.  By default,
     generateDS.py will insert content from files referenced by
     ``<include ... />`` elements into the XML Schema to be processed.
-    See section `Include file processing`_.
+    See section `Include file processing`_.  Note that include
+    processing, which is performed in ``process_includes.py`` is
+    required for generating validator bodies from the XML schema,
+    because the Lxml ElementTree produced in ``process_includes.py``
+    is needed to generate the validator code.  So, using this option
+    also turns off automatic generation of validator code.
 
 silence
     Normally, the code generated with generateDS echoes the
@@ -500,6 +581,33 @@ export
     For example: ``--export="write etree"`` and ``--export="write"``.  The
     default is: ``--export="write literal"``.
 
+preserve-cdata-tags
+    Preserve CDATA tags.  Normally, CDATA tags ("<![CDATA[ ... ]]>")
+    are dropped while parsing an XML instance document.  If this
+    option is included, the generated code will preserve those tags
+    and will write them out during export.  The default is False.
+
+cleanup-name-list=<replacement-map>
+    Specifies replacement pairs to be used when cleaning up names.
+    Must be a string representation of a Python list of 2-tuples.
+    The values of each pair (2-tuple) must be strings.  The first
+    item of each pair is a pattern and must be a valid Python
+    regular expression (see
+    https://docs.python.org/2/library/re.html#module-re) The second
+    item of each pair is a string that will replace anything matched
+    by the pattern.  Also see `Cleaning up names with special characters etc.`_
+    
+    The intension is to enable us to replace
+    special characters in names that would cause the generation of
+    invalid Python names, for example the names of generated
+    classes.  However, since a string replacement is
+    performed, you can replace any single character or sequence of
+    characters by any other single character or sequence of
+    characters.  Example:
+    ``[(':', 'colon'), ('-', 'dash'), ('.', 'dot')]``.
+    
+    The default when omitted is ``[('[-:.]', '_')]``.
+
 q, no-questions
     Do not ask questions.  For example, if the "-f" command line
     option is omitted and the ouput file exists, then generateDS.py
@@ -507,6 +615,10 @@ q, no-questions
     case, when "-q" is used, the "-f" must be used to force the
     output file to be written.
 
+no-warnings
+    While running generateDS.py, do not print warning messages that
+    would be written to stderr.
+
 session=mysession.session
     Load and use options from session file. You can create a
     session file in generateds_gui.py, the graphical front-end for
@@ -514,24 +626,29 @@ session=mysession.session
     used to override options in the session file.  A session file
     is an XML document, so you can modify it with a text editor.
 
-fix-type-names="oldname1:newname1;oldname2:newname2;..."
-    Fix up (replace) complex type names.  Using this option will
-    replace the following: (1) the 'name' attribute of a
-    complexType; (2) the 'type' attribute of each element that
-    refers to the type; and (3) the 'base' attribute of each
-    extension that refers to the type.  These fixups happen before
-    information is collected from the schema for code generation.
-    Therefore, using this option is effectively equivalent to
-    copying your schema, then editing it with your text editor, then
-    generating code from the modified schema.
+fix-type-names="oldname1:newname1;oldname2:newname2;..." Fix up
+    (replace) complex type names.  Using this option will replace
+    the following: (1) the 'name' attribute of a complexType; (2)
+    the 'type' attribute of each element that refers to the type;
+    and (3) the 'base' attribute of each extension that refers to
+    the type.  These fixups happen before information is collected
+    from the schema for code generation. Therefore, using this
+    option is effectively equivalent to copying your schema, then
+    editing it with your text editor, then generating code from the
+    modified schema.  If a new name is not specified, the default is
+    to replace the old name with the old name plus an added "xx"
+    suffix.  Examples::
+
+        $ generateDS.py --fix-type-names="type1:type1Aux"
+        $ generateDS.py --fix-type-names="type1;type2:type2Repl"
 
 version
-    Print out the current version of generateDS.py and immediately
-    exit.
+    Print out the current version of ``generateDS.py`` and
+    immediately exit.
 
 
-Name conflicts
---------------
+Name conflicts etc.
+---------------------
 
 Conflicts with Python keywords
 ..............................
@@ -582,9 +699,55 @@ generateDS.py modifies the name of the attribute by adding "_attr"
 to its name.
 
 
+Cleaning up names with special characters etc.
+................................................
+
+``generateDS.py`` attempts to clean up names that contain special
+characters.  For example, a complexType whose name contains a dash
+would generate a Python class with an invalid name.  But, you can
+use this facility to make other changes to names as well.
+
+The command line option ``--cleanup-name-list`` specifies
+replacement pairs to be used when cleaning up (and modifying) names.
+The value of this option must be a string representation of a Python
+list of 2-tuples.  The values of each pair (2-tuple) must be
+strings.  The first item of each pair is a pattern and must be a
+valid Python regular expression (see
+https://docs.python.org/2/library/re.html#module-re) The second item
+of each pair is a string that will replace anything matched by the
+pattern.  The intension is to enable us to replace special
+characters in names that would cause the generation of invalid
+Python names, for example the names of generated classes.  However,
+since a string replacement is performed, you can replace any single
+character or sequence of characters by any other single character or
+sequence of characters.
+
+For example, the following option, in addition to performing the
+default replacements of "-", ":", and "." by an underscore, would
+also replace the string "Type" when it occurs at the end of a name,
+by "Class"::
+
+    --cleanup-name-list="[('[-:.]', '_'), ('Type$', 'Class')]"
+
+This would cause the name "big-data-Type" to become "big_data_Class".
+
+The default when this option is omitted is ``[('[-:.]', '_')]``.
+
+The order of replacements performed is the same as the order of the
+tuples in the list.  So, replacements performed by pattern
+replacement pairs (2-tuples) later in the list (to the right) will
+be performed after those earlier (to the left), and may overwrite
+earlier replacements.
+
+See the notes on the command line option ``--cleanup-name-list`` for
+more on this.  Or, run ``$ generateDS.py --help``.
+
+
 The graphical user interface -- How to use it
 ==============================================================
 
+**Note:** The graphical user interface is no longer supported.
+
 Here are a few notes on how to use the GUI front-end.
 
 - ``generateds_gui.py`` is installed when you do the standard
@@ -672,6 +835,63 @@ you will need to use the "-a" command line option when you run
     generateDS.py -a "xsd:" --super=mylib -o mylib.py -s myapp.py someschema.xsd
 
 
+Using multiple subclass modules with the same superclass module
+-----------------------------------------------------------------
+
+Suppose that from a single XML schema, you have generated a
+superclass module and a subclass module (using the "-o" and "-s"
+command line options).  Now you make a copy of the subclass module.
+Next you add special and different code to each of the subclass
+modules.  You can run these two subclass modules separately and
+(after a bit of debugging) each works fine.  And, you can import
+each subclass module in separate applications, and things are still
+good.  However, if you import both subclass modules into a single
+application, you find that one of them is "ignored" by the
+superclass module when it parses XML instance documents and builds
+classes.  Effectively, each subclass module, when it is imported,
+sets a class variable (``subclass``) in each superclass to the
+subclass to be used by the superclass, and the last subclass
+imported module wins.
+
+There are two alternative solutions to this problem:
+
+1. Use the script/function provided by the distribution in file
+   ``fix_subclass_refs.py``.  The doc string in that module explains
+   how to use it and gives an example of its use.
+
+2. Each generated superclass module (starting with ``generateDS.py``
+   version 2-19a) contains a global variable
+   ``CurrentSubclassModule_``.  The value of this variable, if it is
+   not None, overrides the value of the class variable ``subclass``
+   in each generated superclass.  You can change the value of this
+   variable before parsing an XML document and building instances of
+   the generated classes to determine which subclass module is to be
+   used during the "build" phase.  
+
+   Here is an example of the use of this feature::
+
+       #!/usr/bin/env python
+
+       import lib01suba
+       import lib01subb
+
+       def test():
+           lib01suba.supermod.CurrentSubclassModule_ = lib01suba
+           roota = lib01suba.parse('test01.xml', silence=True)
+           lib01subb.supermod.CurrentSubclassModule_ = lib01subb
+           rootb = lib01subb.parse('test01.xml', silence=True)
+           roota.show()
+           print '-' * 50
+           rootb.show()
+
+       test()
+
+The second alternative (above) is likely to be a more convenient
+solution in most cases.  But, there are possibly use cases where the
+use of ``fix_subclass_refs.py`` or a modified version of it will be
+helpful.
+
+
 Supported features of XML Schema
 ================================
 
@@ -896,8 +1116,63 @@ that element has a (non-None) value.
 simpleType and validators
 -------------------------
 
-Here are a few notes that should help you use validator methods to
-enforce restrictions.
+Generating validator bodies from XML schema
+.............................................
+
+If you do *not* use the ``--use-old-simpletype-validators`` command line
+option, then ``generateDS.py`` will generate validation code
+directly from the restrictions specified inside the ``simpleType``
+definitions in your XML schema.
+
+Here is a bit of explanation of what that generated code will do.
+
+- The generated validation code checks the global variable
+  ``Validate_simpletypes_``.  Set that variable to ``False`` to turn
+  off validation.
+
+- In the case of some XML schema built-in simple types, the
+  generated validation code calls ``gds_validate_xxx``, where "xxx"
+  is a base, simple type.  In some cases, you will be able to add
+  additional code to that method to perform custom checking.  See
+  section `Overridable methods`_ for information on how to use and
+  override that class.
+
+- When validation finds data that fails to validate, it generates a
+  warning (using the ``warnings`` module from the Python standard
+  library), not an exception, so that processing continues.
+
+- The validation code is generated in a separate method named
+  ``validate_xxx``, where "xxx" is the name of the data element.
+  This method is called in the ``build`` method as the input data is
+  parsed and instances of the generated classes are created to hold
+  it.  Your own code can also call this method whenever you'd like
+  to perform on the data in that element/field.
+
+- There are rules for how checking should be performed when (1)
+  there are multiple restrictions in a single ``simpleType`` and
+  when there are restrictions in a ``simpleType`` and it base simple
+  types.  ``generateds.py`` attempts to follow those rules in
+  generating validation code.  For information about that, see:
+  http://www.w3.org/TR/xmlschema-2/#rf-facets.  Pattern facets are
+  especially tricky, because pattern restrictions at the same level
+  are OR-ed together, while pattern restrictions at different levels
+  are AND-ed together.  See:
+  http://www.w3.org/TR/xmlschema-2/#rf-pattern.
+
+- The validation method also performs type conversion for some
+  simple types, for example, string to int for integers, string to
+  float for floats, etc.
+
+
+User written validator bodies
+...............................
+
+This is the older, more manual method.  In order to generate code
+that uses this method, use command line option
+``--use-old-simpletype-validators``.
+
+Here are a few notes that should help you *write your own* validator
+methods to enforce restrictions.
 
 - Default behavior -- The generated code, by default, treats the
   value of a member whose type is a ``simpleType`` as if it were
@@ -1007,6 +1282,34 @@ following limitations (among others, I'm sure):
 - Attributes defined as a simple type are not supported.
 
 
+Turning off validation of ``simpleType`` data
+...............................................
+
+If you do not want validation performed on ``simpleType`` data, you
+have these options:
+
+1. When generating your code, use the
+   ``--use-old-simpletype-validators`` command line option but do
+   *not* use the ``--validator-bodies`` command line option.  This
+   will result in validator methods that have empty bodies (only a
+   ``pass`` statement).
+
+2. Or, when you run your generated code, set the variable
+   ``Validate_simpletypes_`` to ``False``.  This global variable is
+   near the top of your generated module.  It can be set to ``True``
+   or ``False`` before and during processing to turn validation on
+   and off.
+
+
+Additional notes on ``simpleType`` validation
+...............................................
+
+Don't forget that ``xmllint`` can also be used to perform
+validation against the XML scheme.  This validation includes
+checking against ``simpleType`` restrictions.  See
+http://xmlsoft.org/ for more information on ``xmllint``.
+
+
 Include file processing
 -----------------------
 
@@ -1020,13 +1323,6 @@ inserted in the XML Schema by importing and using
 ``process_includes.py``, which is included in the ``generateDS.py``
 distribution.
 
-``process_includes.py`` will use either ``lxml`` or ``ElementTree``,
-but its preference is ``lxml`` because ``lxml`` attempts to preserve
-namespace prefixes.  So if your XML Schemas have ``<include ... />``
-elements in them, you might want to consider installing ``lxml``, even
-though ``ElementTree`` is in the Python standard library for Python
-versions >= 2.5.
-
 The include file processing is capable of retrieve included files
 via FTP and HTTP internet protocols as well as from the local file
 system.
@@ -1622,7 +1918,69 @@ convenience method ``gds_reverse_node_mapping`` from superclass
 ``GeneratedsSuper``.  Again, see the code above for an example.
 
 
-How-to Use the generated source code
+Specifying names for anonymous nested type definitions
+--------------------------------------------------------
+
+``generateDS.py`` automatically assigns names for types (and the
+classes generated from them), when that type definition (for
+example, ``xs:complexType``) does not have a name and it is nested
+inside another type definition.  However, these assigned names, in
+part because of the need to make them unique, can be difficult to
+predict.
+
+Therefore, ``generateDS.py`` provides a way to specify the names of
+the Python classes generated from these anonymous, nested types.  To
+do so, follow these steps:
+
+1. Create a module named ``gds_inner_name_map``
+   (``gds_inner_name_map.py``).
+   
+2. Place that module where Python can import it when you run
+   ``generateDS.py``.  You can do this either by adding an
+   additional directory to the environment variable ``PYTHONPATH``
+   or by placing ``gds_inner_name_map.py`` in a directory that is
+   already on Python's search path for modules.  You can check this
+   by running the following Python code snippet::
+
+       import sys
+       print sys.path
+
+   Also see: https://docs.python.org/2/library/sys.html#sys.path
+
+3. In module ``gds_inner_name_map``, define a global variable
+   ``Inner_name_map``.  The value of this variable should be a
+   dictionary that maps 2-tuples containing (a) the name of the
+   grandparent type and (b) the name of the parent type onto the new
+   name.
+
+If ``generateDS.py`` cannot import ``Inner_name_map`` from
+``gds_inner_name_map``, then it will, by default, generate unique
+names.  In particular, it automatically generates names for
+anonymous, nested types when the following Python statement fails::
+
+    from gds_inner_name_map import Inner_name_map
+
+Here is an example of module ``gds_inner_name_map.py``::
+
+    Inner_name_map = {
+        ("classAType", "inner"): "inner_001",
+        ("classBType", "inner"): "inner_002",
+    }
+
+Usage hints:
+
+- When ``generateDS.py`` succeeds in importing ``Inner_name_map``
+  from ``gds_inner_name_map``, but *cannot* find one of the required
+  mappings in that dictionary, it will throw an exception and print
+  out the missing mapping.  You can copy this line; paste it into
+  your ``gds_inner_name_map.py``; and edit it so as to specify the
+  class name of your choice.
+
+- Make sure that the names you specify are unique within your XML
+  schema.
+
+
+How to use the generated source code
 =======================================
 
 The parsing functions
@@ -2255,9 +2613,10 @@ default methods in the following places:
 - In a class named ``GeneratedsSuper`` in a separate module named
   ``generatedssuper``.  Since this class would replace the
   default implementations, you should provide implementations of
-  all the default methods listed above in that class.  The
-  distribution contains a ``generatedssuper.py`` which you can
-  modify for your specific needs.
+  all the default methods listed above in that class.  To create
+  your own version, copy and paste the default implementation of
+  class ``GeneratedsSuper`` from your generated module into a file
+  named ``generatedssuper.py``, then modify that.
 
 - In individual generated (super) classes (the ones generated with
   the "-o" command line option) using the `User Methods`_ feature.
@@ -2335,6 +2694,61 @@ that complexType definition.  This dictionary is named
 with the "-o" option.
 
 
+"One Per" -- generating separate files from imported/included schemas
+=======================================================================
+
+The ``--one-file-per-xsd`` command line option enables you to
+generate a separate Python module for each XML schema that is
+imported or included (using ``<xs:import>`` or ``<xs:include>``) by
+a "master" schema.  Then, in your Python application, these modules
+can then be imported separately.  Alternatively, these modules can
+be placed in a Python package (a directory containing a file named
+"__init__.py").  See
+http://docs.python.org/2/tutorial/modules.html#packages for more on
+Python packages.
+
+Here is a sample use::
+
+    $ ../generateDS.py --one-file-per-xsd --output-directory="OnePer" --module-suffix="One" one_per.xsd
+
+The above command does the following:
+
+- It generates one Python module for each XML schema that is
+  included/imported by ``one_per.xsd``.
+
+- It places the generated output files in the directory ``OnePer``.
+
+- It adds "One" as a suffix to the name of each generated module.
+
+Here are a few hints, guidelines, and suggestions:
+
+- At least one element definition in an included/imported module
+  must be a root element definition in order to cause a
+  module to be generated for that schema.  In other words, the
+  module must contain an element definition of the form::
+
+      <xs:element name="Sample" type="sampleType" />
+
+- You may want to write a separate "master" schema that includes
+  each of the schemas for which you want to generate a separate
+  Python module.
+
+- Use the ``--output-directory=<directory>`` command line option to
+  tell ``generateDS.py`` to generate the Python modules in a
+  specific directory.  The directory must already exist.
+
+- Use the ``--module-suffix=<suffix>`` command line option to add a
+  specifc suffix to each module name (the part immediately before
+  the extension).  For example, the option ``--module-suffix=Abc``
+  causes ``generateDS.py`` to generate a file named "schema1Abc.py"
+  instead of "schema1.py".
+
+- If you want to import files from the output directory and it is
+  not in ``sys.path``, add a file named "__init__.py" to that
+  directory.  The existence of the file ``__init__.py`` turns the
+  directory into a Python package.
+
+
 How to modify the generated code
 ================================
 
@@ -2415,8 +2829,8 @@ Suggested uses:
   documents. The following paper discusses and compares this
   technique with the use of XSLT: `XSLT and generateDS --
   Analysis, Comparison, and Evaluation --
-  http://www.rexx.com/~dkuhlman/xsltvsgenerateds.html
-  <http://www.rexx.com/~dkuhlman/xsltvsgenerateds.html>`_.
+  http://www.davekuhlman.org/xsltvsgenerateds.html
+  <http://www.davekuhlman.org/xsltvsgenerateds.html>`_.
 
 - Anything that requires a *customized* tree walk of the XML
   document. Because you can add methods to the generated classes
@@ -2431,8 +2845,23 @@ Django -- Generating Models and Forms
 ``generateDS.py`` can be used to generate Django models and Django
 forms that represent the data structures defined in an XML Schema.
 
+**Note:** In order to use this capability, you must obtain the
+"source" distribution of ``generateDS.py``.  You can do this either
+(1) by downloading ``generateDS-x.xxy.tar.gz`` from the Python
+Package Index or (2) by downloading the distribution from Bitbucket
+at https://bitbucket.org/dkuhlman/generateds.  In particular,
+installing ``generateDS.py`` using ``pip`` does not give you all the
+files you need in order to use this capability.
+
+*Note:* You only need to obtain the source distribution (so that you
+can copy the files in the ``django/`` directory, for example); you
+do not necessarily need to install from it.  If you have already
+installed ``generateDS.py`` using ``pip`` or ``easy_install``, you
+do not need to re-install from the source tree.
+
 There are support files in the ``django`` directory in the
-distribution.
+source distribution (but *not* in the version install using ``pip``
+or ``easy_install``).
 
 Here is an overview of the process:
 
@@ -2446,6 +2875,12 @@ Here is an overview of the process:
 
 The script ``gends_run_gen_django.py`` performs these three steps.
 
+In order to use the script ``gends_run_gen_django.py``, you may need
+to tell it where the ``generateDS.py`` script is located.  If so,
+use the "-p" command line option.  For more information, do::
+
+    python gends_run_gen_django.py --help
+
 
 How to generate Django models and forms
 .........................................
@@ -2474,8 +2909,9 @@ Now, follow these steps:
        $ mkdir WorkDir
        $ cd WorkDir
 
-2. Copy the files in from the sub directory ``django/`` in the
-   distribution to the current directory::
+2. Copy the files in from the sub directory ``django/`` in the of
+   the source distribution of ``generateDS.py`` to the current
+   directory::
 
        $ cp /my_sources/generateDS-n.nn/django/* .
 
@@ -2488,6 +2924,10 @@ Now, follow these steps:
 
        $ ./gends_run_gen_django.py myschema.xsd
 
+   There are additional command line options for
+   ``gends_run_gen_django.py``.  For help, run
+   ``$ python gends_run_gen_django.py --help``.
+
 5. Copy the generated files  ``models.py`` and ``forms.py`` to your
    Django application.
 
@@ -2654,15 +3094,6 @@ script scans your XML Schema document and, recursively, documents
 that are included looking for ``include`` elements; it inserts all
 content into a single document, which it writes out.
 
-Since ``process_includes.py`` uses the ElementTree API, in order
-to use ``process_includes.py`` you will need one of the following:
-
-- Python 2.5 or newer -- ElementTree is in the Python-2.5 distribution.  Or,
-
-- `ElementTree`_.  Or,
-
-- `lxml`_ -- another implementation of the ElementTree API.
-
 Here are samples of how you might use ``process_includes.py``, if
 your schema contains ``include`` elements.
 
@@ -2708,16 +3139,10 @@ See also
 
 `Dave's Page`_: My home page, which contains more Python stuff.
 
-.. _`Dave's Page`: http://www.rexx.com/~dkuhlman
-
-
-
+.. _`Dave's Page`: http://www.davekuhlman.org
 
 .. _`ElementTree`: http://effbot.org/zone/element-index.htm
 
-.. _`lxml`: http://codespeak.net/lxml/
-
-
-
-
+.. _`lxml`: http://lxml.de/index.html
 
+.. vim:ft=rst:
diff --git a/generateds_config.py b/generateds_config.py
new file mode 100644
index 0000000..5c2c8ab
--- /dev/null
+++ b/generateds_config.py
@@ -0,0 +1,4 @@
+
+NameTable = {
+    'range': 'range_',
+}
diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html
new file mode 100644
index 0000000..5593b50
--- /dev/null
+++ b/generateds_gui_notes.html
@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" />
+<title>GenerateDS GUI Notes</title>
+<meta name="author" content="Dave Kuhlman" />
+<style type="text/css">
+
+/* css */
+
+body {
+  font: 90% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+  background: #ffffff;
+  color: black;
+  margin: 2em;
+  padding: 2em;
+}
+
+a[href] {
+  color: #436976;
+  background-color: transparent;
+}
+
+a.toc-backref {
+  text-decoration: none;
+}
+
+h1 a[href] {
+  text-decoration: none;
+  color: #fcb100;
+  background-color: transparent;
+}
+
+a.strong {
+  font-weight: bold;
+}
+
+img {
+  margin: 0;
+  border: 0;
+}
+
+p {
+  margin: 0.5em 0 1em 0;
+  line-height: 1.5em;
+}
+p a {
+  text-decoration: underline;
+}
+p a:visited {
+  color: purple;
+  background-color: transparent;
+}
+p a:active {
+  color: red;
+  background-color: transparent;
+}
+a:hover {
+  text-decoration: none;
+}
+p img {
+  border: 0;
+  margin: 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  color: #003a6b;
+  background-color: transparent;
+  font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+  margin: 0;
+  padding-top: 0.5em;
+}
+
+h1 {
+  font-size: 160%;
+  margin-bottom: 0.5em;
+  border-bottom: 1px solid #fcb100;
+}
+h2 {
+  font-size: 140%;
+  margin-bottom: 0.5em;
+  border-bottom: 1px solid #aaa;
+}
+h3 {
+  font-size: 130%;
+  margin-bottom: 0.5em;
+  text-decoration: underline;
+}
+h4 {
+  font-size: 110%;
+  font-weight: bold;
+}
+h5 {
+  font-size: 100%;
+  font-weight: bold;
+}
+h6 {
+  font-size: 80%;
+  font-weight: bold;
+}
+
+ul a, ol a {
+  text-decoration: underline;
+}
+
+dt {
+  font-weight: bold;
+}
+dt a {
+  text-decoration: none;
+}
+
+dd {
+  line-height: 1.5em;
+  margin-bottom: 1em;
+}
+
+legend {
+  background: #ffffff;
+  padding: 0.5em;
+}
+
+form {
+  margin: 0;
+}
+
+
+dl.form {
+  margin: 0;
+  padding: 1em;
+}
+
+dl.form dt {
+  width: 30%;
+  float: left;
+  margin: 0;
+  padding: 0 0.5em 0.5em 0;
+  text-align: right;
+}
+
+input {
+  font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+  color: black;
+  background-color: white;
+  vertical-align: middle;
+}
+
+abbr, acronym, .explain {
+  color: black;
+  background-color: transparent;
+}
+
+q, blockquote {
+}
+
+code, pre {
+  font-family: monospace;
+  font-size: 1.2em;
+  display: block;
+  padding: 10px;
+  border: 1px solid #838183;
+  background-color: #eee;
+  color: #000;
+  overflow: auto;
+  margin: 0.5em 1em;
+}
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+tt.docutils {
+  background-color: #dddddd;
+}
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+</head>
+<body>
+<div class="document" id="generateds-gui-notes">
+<h1 class="title">GenerateDS GUI Notes</h1>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>Dave Kuhlman</td></tr>
+<tr><th class="docinfo-name">Contact:</th>
+<td>dkuhlman (at) davekuhlman (dot) org</td></tr>
+<tr><th class="docinfo-name">Address:</th>
+<td><pre class="address">
+<a class="first last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a>
+</pre>
+</td></tr>
+</tbody>
+</table>
+<!-- Do not modify the following version comments.
+They are used by updateversion.py. -->
+<!-- version -->
+<table class="docutils field-list" frame="void" rules="none">
+<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.24b</td>
+</tr>
+</tbody>
+</table>
+<!-- version -->
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">date:</th><td class="field-body">January 16, 2017</td>
+</tr>
+</tbody>
+</table>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">copyright:</th><td class="field-body">Copyright (c) 2016 Dave Kuhlman. This documentation
+and the software it describes is covered by The MIT License:
+<a class="reference external" href="http://www.opensource.org/licenses/mit-license.php">http://www.opensource.org/licenses/mit-license.php</a>.</td>
+</tr>
+<tr class="field"><th class="field-name">abstract:</th><td class="field-body">This document describes generateds_ui.py, the graphical
+front end to generateDS.py.</td>
+</tr>
+</tbody>
+</table>
+<div class="contents topic" id="contents">
+<p class="topic-title first">Contents</p>
+<ul class="auto-toc simple">
+<li><a class="reference internal" href="#introduction" id="id1">1&nbsp;&nbsp;&nbsp;Introduction</a></li>
+<li><a class="reference internal" href="#requirements" id="id2">2&nbsp;&nbsp;&nbsp;Requirements</a></li>
+<li><a class="reference internal" href="#usage-notes" id="id3">3&nbsp;&nbsp;&nbsp;Usage notes</a><ul class="auto-toc">
+<li><a class="reference internal" href="#what-it-does" id="id4">3.1&nbsp;&nbsp;&nbsp;What it does</a></li>
+<li><a class="reference internal" href="#how-to-use-it" id="id5">3.2&nbsp;&nbsp;&nbsp;How to use it</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#internationalization" id="id6">4&nbsp;&nbsp;&nbsp;Internationalization</a><ul class="auto-toc">
+<li><a class="reference internal" href="#preparation" id="id7">4.1&nbsp;&nbsp;&nbsp;Preparation</a></li>
+<li><a class="reference internal" href="#installation-and-setup" id="id8">4.2&nbsp;&nbsp;&nbsp;Installation and setup</a></li>
+<li><a class="reference internal" href="#additional-information" id="id9">4.3&nbsp;&nbsp;&nbsp;Additional information</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="introduction">
+<h1><a class="toc-backref" href="#id1">1&nbsp;&nbsp;&nbsp;Introduction</a></h1>
+<p><tt class="docutils literal">generateds_gui.py</tt> provides a graphical front end for
+<tt class="docutils literal">generateDS.py</tt>.  Some may find it easier to configure and to
+select and set options for <tt class="docutils literal">generateDS.py</tt> using this graphical
+application.</p>
+</div>
+<div class="section" id="requirements">
+<h1><a class="toc-backref" href="#id2">2&nbsp;&nbsp;&nbsp;Requirements</a></h1>
+<p>You will need Gtk support for Python in order to run
+<tt class="docutils literal">generateds_gui.py</tt>.</p>
+<p>You must run <tt class="docutils literal">generateds_gui.py</tt> under Python 3.  Python 2 is not
+supported.</p>
+<p>Note that you can use the &quot;--session&quot; command line flag supported by
+<tt class="docutils literal">generateDS.py</tt> on a machine that does not have Python Gtk support
+installed.</p>
+</div>
+<div class="section" id="usage-notes">
+<h1><a class="toc-backref" href="#id3">3&nbsp;&nbsp;&nbsp;Usage notes</a></h1>
+<div class="section" id="what-it-does">
+<h2><a class="toc-backref" href="#id4">3.1&nbsp;&nbsp;&nbsp;What it does</a></h2>
+<p>Here are some of the different ways that you can use
+<tt class="docutils literal">generateds_gui.py</tt>:</p>
+<ol class="arabic simple">
+<li>You can generate modules from within <tt class="docutils literal">generateds_gui.py</tt> using
+the &quot;Generate&quot; item in the &quot;Tools&quot; menu.</li>
+<li>You can produce and view a command line that reflects your
+configuration using the &quot;Generate CL&quot; item in the &quot;Tools&quot; menu,
+and then you can copy and paste the resulting command line into a
+<tt class="docutils literal">bash</tt> script (for Linux) or a <tt class="docutils literal">.bat</tt> file (for MS Windows),
+which you can then run from the command line.</li>
+<li>You can run the session file that you've saved with the
+&quot;--session&quot; command line flag supported by <tt class="docutils literal">generateDS.py</tt>.</li>
+<li>You can load a previously saved session file into
+<tt class="docutils literal">generateds_gui.py</tt> using the &quot;--session&quot; command line option,
+and then modify that session and/or use it to generate modules,
+or to generate a command line.</li>
+</ol>
+</div>
+<div class="section" id="how-to-use-it">
+<h2><a class="toc-backref" href="#id5">3.2&nbsp;&nbsp;&nbsp;How to use it</a></h2>
+<p>You can get some help by running the following:</p>
+<pre class="literal-block">
+$ ./generateds_gui.py --help
+</pre>
+<p>Command line options and arguments:</p>
+<pre class="literal-block">
+Usage:
+python generateds_gui.py [options] --session=&lt;some_session_file.session&gt;
+example:
+        python generateds_gui.py --session=generator01.session
+Options:
+  -h, --help            show this help message and exit
+  --exec-path=EXEC_PATH
+                                                path to executable generated in command line.
+                                                Example: &quot;python /path/to/generateDS.py&quot;.  Default:
+                                                &quot;./generateDS.py&quot;.  Use Tools/Generate CL (Ctrl-T) to
+                                                see it.
+  --impl-gui=IMPL_GUI   name of glade file that defines the GUI if not
+                                                embedded.
+  -s SESSION, --session=SESSION
+                                                name of a session file to be loaded.
+</pre>
+<dl class="docutils">
+<dt>exec-path</dt>
+<dd>If your copy of <tt class="docutils literal">generateDS.py</tt> is in a special location, you
+can specify that location using this option.  The version of
+<tt class="docutils literal">generateDS.py</tt> at that location will be run when you select
+the &quot;Generate&quot; item from the &quot;Tools&quot; menu.</dd>
+<dt>impl-gui</dt>
+<dd>The file <tt class="docutils literal">generateds_gui.glade</tt> specifies and describes the
+user interface.  This file has been embedded into
+<tt class="docutils literal">generateds_gui.py</tt>.  If you modify <tt class="docutils literal">generateds_gui.glade</tt>
+and want to use that modified version, specify it with this
+option.</dd>
+<dt>s, session</dt>
+<dd>If you have created and saved a session file using
+<tt class="docutils literal">generateds_gui.py</tt> and want to load that file the next time
+you run <tt class="docutils literal">generateds_gui.py</tt>, use this option.  Alternatively,
+once <tt class="docutils literal">generateds_gui.py</tt> has been started, you can use the
+&quot;Load session&quot; item under the &quot;File&quot; menu.</dd>
+</dl>
+</div>
+</div>
+<div class="section" id="internationalization">
+<h1><a class="toc-backref" href="#id6">4&nbsp;&nbsp;&nbsp;Internationalization</a></h1>
+<p><em>Note:</em> This work on internationalization for generateds_gui is
+experimental and does not yet work.</p>
+<div class="section" id="preparation">
+<h2><a class="toc-backref" href="#id7">4.1&nbsp;&nbsp;&nbsp;Preparation</a></h2>
+<p>Here is what I've done:</p>
+<pre class="literal-block">
+$ cd generateds/gui/
+$ mkdir po
+# Create the template file.
+$ xgettext -k_ -kN_ -o po/generateds_gui.pot generateds_gui.glade
+# Create a file for the translator.  This one is for the Russian language.
+$ msginit --locale=ru --input=generateds_gui.pot
+</pre>
+<p>And, after someone has added their translations (for example, to
+<tt class="docutils literal">ru.po</tt>), we translate it to binary with the following command:</p>
+<pre class="literal-block">
+$ msgfmt -o generateds_gui.mo ru.po
+</pre>
+<p>Finally, move the binary file to the appropriate directory under the
+directory containing the executable (<tt class="docutils literal">generateds_gui.py</tt>).  See
+<a class="reference internal" href="#installation-and-setup">Installation and setup</a>.</p>
+</div>
+<div class="section" id="installation-and-setup">
+<h2><a class="toc-backref" href="#id8">4.2&nbsp;&nbsp;&nbsp;Installation and setup</a></h2>
+<p>Now we have to move the <tt class="docutils literal">.mo</tt> file where it will be used when we
+run <tt class="docutils literal">generateds_gui.py</tt>.  We place it in a sub-directory under the
+location of <tt class="docutils literal">generateds_gui.py</tt> itself.</p>
+<pre class="literal-block">
+$ cd /directory/containing/generateds_gui.py
+$ mkdir locale
+$ mkdir locale/ru
+$ mkdir locale/ru/LC_MESSAGES
+$ mv generateds_gui.mo locale/ru/LC_MESSAGES/
+</pre>
+</div>
+<div class="section" id="additional-information">
+<h2><a class="toc-backref" href="#id9">4.3&nbsp;&nbsp;&nbsp;Additional information</a></h2>
+<p>Here are some helpful references:</p>
+<ul class="simple">
+<li><a class="reference external" href="https://en.wikipedia.org/wiki/Gettext">https://en.wikipedia.org/wiki/Gettext</a></li>
+<li><a class="reference external" href="http://faq.pygtk.org/index.py?req=show&amp;file=faq22.002.htp">http://faq.pygtk.org/index.py?req=show&amp;file=faq22.002.htp</a></li>
+<li><a class="reference external" href="http://www.servin.com/linux/GladeInternationalization.html">http://www.servin.com/linux/GladeInternationalization.html</a></li>
+<li><a class="reference external" href="http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/">http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/</a></li>
+</ul>
+<!-- vim:ft=rst: -->
+</div>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="generateds_gui_notes.txt">View document source</a>.
+Generated on: 2017-01-17 00:01 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>
+</body>
+</html>
diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt
new file mode 100644
index 0000000..25921cc
--- /dev/null
+++ b/generateds_gui_notes.txt
@@ -0,0 +1,188 @@
+======================
+GenerateDS GUI Notes
+======================
+
+:author: Dave Kuhlman
+:contact: dkuhlman (at) davekuhlman (dot) org
+:address:
+    http://www.davekuhlman.org
+
+.. Do not modify the following version comments.
+   They are used by updateversion.py.
+
+.. version
+
+:revision: 2.24b
+
+.. version
+
+:date: |date|
+
+.. |date| date:: %B %d, %Y
+
+
+:copyright: Copyright (c) 2016 Dave Kuhlman. This documentation
+    and the software it describes is covered by The MIT License:
+    http://www.opensource.org/licenses/mit-license.php.
+
+:abstract: This document describes generateds_ui.py, the graphical
+    front end to generateDS.py.
+
+.. sectnum::    :depth: 4
+
+.. contents::
+    :depth: 4
+
+
+Introduction
+==============
+
+``generateds_gui.py`` provides a graphical front end for
+``generateDS.py``.  Some may find it easier to configure and to
+select and set options for ``generateDS.py`` using this graphical
+application.
+
+
+Requirements
+==============
+
+You will need Gtk support for Python in order to run
+``generateds_gui.py``.
+
+You must run ``generateds_gui.py`` under Python 3.  Python 2 is not
+supported.
+
+Note that you can use the "--session" command line flag supported by
+``generateDS.py`` on a machine that does not have Python Gtk support
+installed.
+
+
+Usage notes
+=============
+
+What it does
+--------------
+
+Here are some of the different ways that you can use
+``generateds_gui.py``:
+
+#. You can generate modules from within ``generateds_gui.py`` using
+   the "Generate" item in the "Tools" menu.
+
+#. You can produce and view a command line that reflects your
+   configuration using the "Generate CL" item in the "Tools" menu,
+   and then you can copy and paste the resulting command line into a
+   ``bash`` script (for Linux) or a ``.bat`` file (for MS Windows),
+   which you can then run from the command line.
+
+#. You can run the session file that you've saved with the
+   "--session" command line flag supported by ``generateDS.py``.
+
+#. You can load a previously saved session file into
+   ``generateds_gui.py`` using the "--session" command line option,
+   and then modify that session and/or use it to generate modules,
+   or to generate a command line.
+
+
+How to use it
+---------------
+
+You can get some help by running the following::
+
+    $ ./generateds_gui.py --help
+
+Command line options and arguments::
+
+	Usage:
+        python generateds_gui.py [options] --session=<some_session_file.session>
+	example:
+		python generateds_gui.py --session=generator01.session
+	Options:
+	  -h, --help            show this help message and exit
+	  --exec-path=EXEC_PATH
+							path to executable generated in command line.
+							Example: "python /path/to/generateDS.py".  Default:
+							"./generateDS.py".  Use Tools/Generate CL (Ctrl-T) to
+							see it.
+	  --impl-gui=IMPL_GUI   name of glade file that defines the GUI if not
+							embedded.
+	  -s SESSION, --session=SESSION
+							name of a session file to be loaded.
+
+exec-path
+    If your copy of ``generateDS.py`` is in a special location, you
+    can specify that location using this option.  The version of
+    ``generateDS.py`` at that location will be run when you select
+    the "Generate" item from the "Tools" menu.
+
+impl-gui
+    The file ``generateds_gui.glade`` specifies and describes the
+    user interface.  This file has been embedded into
+    ``generateds_gui.py``.  If you modify ``generateds_gui.glade``
+    and want to use that modified version, specify it with this
+    option.
+
+s, session
+    If you have created and saved a session file using
+    ``generateds_gui.py`` and want to load that file the next time
+    you run ``generateds_gui.py``, use this option.  Alternatively,
+    once ``generateds_gui.py`` has been started, you can use the
+    "Load session" item under the "File" menu.
+
+
+Internationalization
+======================
+
+*Note:* This work on internationalization for generateds_gui is
+experimental and does not yet work.
+
+Preparation
+-------------
+
+Here is what I've done::
+
+    $ cd generateds/gui/
+    $ mkdir po
+    # Create the template file.
+    $ xgettext -k_ -kN_ -o po/generateds_gui.pot generateds_gui.glade 
+    # Create a file for the translator.  This one is for the Russian language.
+    $ msginit --locale=ru --input=generateds_gui.pot 
+
+And, after someone has added their translations (for example, to
+``ru.po``), we translate it to binary with the following command::
+
+    $ msgfmt -o generateds_gui.mo ru.po
+
+Finally, move the binary file to the appropriate directory under the
+directory containing the executable (``generateds_gui.py``).  See
+`Installation and setup`_.
+
+
+Installation and setup
+------------------------
+
+Now we have to move the ``.mo`` file where it will be used when we
+run ``generateds_gui.py``.  We place it in a sub-directory under the
+location of ``generateds_gui.py`` itself.
+
+::
+
+    $ cd /directory/containing/generateds_gui.py
+    $ mkdir locale
+    $ mkdir locale/ru
+    $ mkdir locale/ru/LC_MESSAGES
+    $ mv generateds_gui.mo locale/ru/LC_MESSAGES/
+
+
+Additional information
+------------------------
+
+Here are some helpful references:
+
+- https://en.wikipedia.org/wiki/Gettext
+- http://faq.pygtk.org/index.py?req=show&file=faq22.002.htp
+- http://www.servin.com/linux/GladeInternationalization.html
+- http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/
+
+
+.. vim:ft=rst:
diff --git a/gui/README.txt b/gui/README.txt
new file mode 100644
index 0000000..1b167b3
--- /dev/null
+++ b/gui/README.txt
@@ -0,0 +1,74 @@
+======================================
+Internationalizing generateds_gui.py
+======================================
+
+Overview
+==========
+
+This document describes the procedure for translating the strings
+used in ``generateds_gui.py`` to another language.
+
+In summary, the procedure is the following:
+
+1. Run ``forgui.py`` with the "-c" command line option to create a
+   translation (dictionary) file.
+
+2. Edit the new translation (dictionary) file and add translations
+   of the strings in it.
+
+3. Run ``forgui.py`` with the "-d" command line option to create a
+   new glade file.
+
+Users can now run ``generateds_gui.py`` with the "--impl-gui" option
+to reference the new glade file so as to use the new translation.
+
+
+Details
+=========
+
+Run "forgui.py -c"
+--------------------
+
+This will produce a new dictionary (translation) file that you will
+use to specify your translations.
+
+For example, the following will the file ``fr.dictionary``::
+
+    $ python forgui.py generateds_gui.glade -c fr.dictionary
+
+Edit the new translation
+--------------------------
+
+In the new dictionary (translation) file, you will find lines of the
+form::
+
+    an english language string<-|->an english language string
+
+Replace the characters to the right of ``<-|->`` with the equivalent
+phrase in the target language.
+
+
+Run "forgui.py -d"
+--------------------
+
+This will produce a new glade file containing your translations.
+
+For example, the following will produce the file
+``generateds_gui_fr.glade``::
+
+    $ python forgui.py generateds_gui.py -d fr.dictionary
+
+
+Using the new translation
+---------------------------
+
+Users will use the new translation by running ``generateds_gui.py``
+with the "--impl-gui" command line option.
+
+For example, the translation created in the above example can be run
+as follows::
+
+    $ python generateds_gui.py --impl-gui=generateds_gui_fr.glade
+
+
+.. vim:ft=rst:
diff --git a/gui/en.dictionary b/gui/en.dictionary
new file mode 100644
index 0000000..e69de29
diff --git a/gui/forGUI.xsd b/gui/forGUI.xsd
new file mode 100644
index 0000000..acc8c12
--- /dev/null
+++ b/gui/forGUI.xsd
@@ -0,0 +1,287 @@
+<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:element name="interface">
+    <xs:annotation>
+      <xs:documentation>Generated with glade 3.18.3</xs:documentation>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="requires">
+          <xs:complexType>
+            <xs:simpleContent>
+              <xs:extension base="xs:string">
+                <xs:attribute type="xs:string" name="lib"/>
+                <xs:attribute type="xs:float" name="version"/>
+              </xs:extension>
+            </xs:simpleContent>
+          </xs:complexType>
+        </xs:element>
+        <xs:element name="object" maxOccurs="unbounded" minOccurs="0">
+          <xs:complexType mixed="true">
+            <xs:sequence>
+              <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                <xs:complexType>
+                  <xs:simpleContent>
+                    <xs:extension base="xs:string">
+                      <xs:attribute type="xs:string" name="name" use="optional"/>
+                      <xs:attribute type="xs:string" name="translatable" use="optional"/>
+                    </xs:extension>
+                  </xs:simpleContent>
+                </xs:complexType>
+              </xs:element>
+              <xs:element name="accel-groups" minOccurs="0">
+                <xs:complexType>
+                  <xs:sequence>
+                    <xs:element name="group">
+                      <xs:complexType>
+                        <xs:simpleContent>
+                          <xs:extension base="xs:string">
+                            <xs:attribute type="xs:string" name="name"/>
+                          </xs:extension>
+                        </xs:simpleContent>
+                      </xs:complexType>
+                    </xs:element>
+                  </xs:sequence>
+                </xs:complexType>
+              </xs:element>
+              <xs:element name="signal" minOccurs="0">
+                <xs:complexType>
+                  <xs:simpleContent>
+                    <xs:extension base="xs:string">
+                      <xs:attribute type="xs:string" name="name"/>
+                      <xs:attribute type="xs:string" name="handler"/>
+                      <xs:attribute type="xs:string" name="swapped"/>
+                    </xs:extension>
+                  </xs:simpleContent>
+                </xs:complexType>
+              </xs:element>
+              <xs:element name="child" minOccurs="0">
+                <xs:complexType>
+                  <xs:sequence>
+                    <xs:element name="object">
+                      <xs:complexType>
+                        <xs:sequence>
+                          <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                            <xs:complexType>
+                              <xs:simpleContent>
+                                <xs:extension base="xs:string">
+                                  <xs:attribute type="xs:string" name="name" use="optional"/>
+                                </xs:extension>
+                              </xs:simpleContent>
+                            </xs:complexType>
+                          </xs:element>
+                          <xs:element name="child" maxOccurs="unbounded" minOccurs="0">
+                            <xs:complexType>
+                              <xs:sequence>
+                                <xs:element name="object" minOccurs="0">
+                                  <xs:complexType>
+                                    <xs:sequence>
+                                      <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                                        <xs:complexType>
+                                          <xs:simpleContent>
+                                            <xs:extension base="xs:string">
+                                              <xs:attribute type="xs:string" name="name" use="optional"/>
+                                            </xs:extension>
+                                          </xs:simpleContent>
+                                        </xs:complexType>
+                                      </xs:element>
+                                      <xs:element name="child" maxOccurs="unbounded" minOccurs="0">
+                                        <xs:complexType>
+                                          <xs:sequence>
+                                            <xs:element name="object">
+                                              <xs:complexType>
+                                                <xs:sequence>
+                                                  <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                                                    <xs:complexType>
+                                                      <xs:simpleContent>
+                                                        <xs:extension base="xs:string">
+                                                          <xs:attribute type="xs:string" name="name" use="optional"/>
+                                                          <xs:attribute type="xs:string" name="translatable" use="optional"/>
+                                                        </xs:extension>
+                                                      </xs:simpleContent>
+                                                    </xs:complexType>
+                                                  </xs:element>
+                                                  <xs:element name="child" minOccurs="0">
+                                                    <xs:complexType>
+                                                      <xs:sequence>
+                                                        <xs:element name="object">
+                                                          <xs:complexType>
+                                                            <xs:sequence>
+                                                              <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                                                                <xs:complexType>
+                                                                  <xs:simpleContent>
+                                                                    <xs:extension base="xs:string">
+                                                                      <xs:attribute type="xs:string" name="name" use="optional"/>
+                                                                    </xs:extension>
+                                                                  </xs:simpleContent>
+                                                                </xs:complexType>
+                                                              </xs:element>
+                                                              <xs:element name="child" maxOccurs="unbounded" minOccurs="0">
+                                                                <xs:complexType>
+                                                                  <xs:sequence>
+                                                                    <xs:element type="xs:string" name="placeholder" minOccurs="0"/>
+                                                                    <xs:element name="object" minOccurs="0">
+                                                                      <xs:complexType>
+                                                                        <xs:sequence>
+                                                                          <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                                                                            <xs:complexType>
+                                                                              <xs:simpleContent>
+                                                                                <xs:extension base="xs:string">
+                                                                                  <xs:attribute type="xs:string" name="name" use="optional"/>
+                                                                                  <xs:attribute type="xs:string" name="translatable" use="optional"/>
+                                                                                </xs:extension>
+                                                                              </xs:simpleContent>
+                                                                            </xs:complexType>
+                                                                          </xs:element>
+                                                                          <xs:element name="signal" minOccurs="0">
+                                                                            <xs:complexType>
+                                                                              <xs:simpleContent>
+                                                                                <xs:extension base="xs:string">
+                                                                                  <xs:attribute type="xs:string" name="name" use="optional"/>
+                                                                                  <xs:attribute type="xs:string" name="handler" use="optional"/>
+                                                                                  <xs:attribute type="xs:string" name="swapped" use="optional"/>
+                                                                                </xs:extension>
+                                                                              </xs:simpleContent>
+                                                                            </xs:complexType>
+                                                                          </xs:element>
+                                                                          <xs:element name="accelerator" minOccurs="0">
+                                                                            <xs:complexType>
+                                                                              <xs:simpleContent>
+                                                                                <xs:extension base="xs:string">
+                                                                                  <xs:attribute type="xs:string" name="key" use="optional"/>
+                                                                                  <xs:attribute type="xs:string" name="signal" use="optional"/>
+                                                                                  <xs:attribute type="xs:string" name="modifiers" use="optional"/>
+                                                                                </xs:extension>
+                                                                              </xs:simpleContent>
+                                                                            </xs:complexType>
+                                                                          </xs:element>
+                                                                          <xs:element name="child" minOccurs="0">
+                                                                            <xs:complexType>
+                                                                              <xs:sequence>
+                                                                                <xs:element type="xs:string" name="placeholder"/>
+                                                                              </xs:sequence>
+                                                                            </xs:complexType>
+                                                                          </xs:element>
+                                                                        </xs:sequence>
+                                                                        <xs:attribute type="xs:string" name="class" use="optional"/>
+                                                                        <xs:attribute type="xs:string" name="id" use="optional"/>
+                                                                      </xs:complexType>
+                                                                    </xs:element>
+                                                                    <xs:element name="packing" minOccurs="0">
+                                                                      <xs:complexType>
+                                                                        <xs:sequence>
+                                                                          <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                                                                            <xs:complexType>
+                                                                              <xs:simpleContent>
+                                                                                <xs:extension base="xs:byte">
+                                                                                  <xs:attribute type="xs:string" name="name" use="optional"/>
+                                                                                </xs:extension>
+                                                                              </xs:simpleContent>
+                                                                            </xs:complexType>
+                                                                          </xs:element>
+                                                                        </xs:sequence>
+                                                                      </xs:complexType>
+                                                                    </xs:element>
+                                                                  </xs:sequence>
+                                                                </xs:complexType>
+                                                              </xs:element>
+                                                            </xs:sequence>
+                                                            <xs:attribute type="xs:string" name="class" use="optional"/>
+                                                            <xs:attribute type="xs:string" name="id" use="optional"/>
+                                                          </xs:complexType>
+                                                        </xs:element>
+                                                      </xs:sequence>
+                                                      <xs:attribute type="xs:string" name="type" use="optional"/>
+                                                    </xs:complexType>
+                                                  </xs:element>
+                                                  <xs:element name="signal" minOccurs="0">
+                                                    <xs:complexType>
+                                                      <xs:simpleContent>
+                                                        <xs:extension base="xs:string">
+                                                          <xs:attribute type="xs:string" name="name" use="optional"/>
+                                                          <xs:attribute type="xs:string" name="handler" use="optional"/>
+                                                          <xs:attribute type="xs:string" name="swapped" use="optional"/>
+                                                        </xs:extension>
+                                                      </xs:simpleContent>
+                                                    </xs:complexType>
+                                                  </xs:element>
+                                                </xs:sequence>
+                                                <xs:attribute type="xs:string" name="class" use="optional"/>
+                                                <xs:attribute type="xs:string" name="id" use="optional"/>
+                                              </xs:complexType>
+                                            </xs:element>
+                                            <xs:element name="packing" minOccurs="0">
+                                              <xs:complexType>
+                                                <xs:sequence>
+                                                  <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                                                    <xs:complexType>
+                                                      <xs:simpleContent>
+                                                        <xs:extension base="xs:string">
+                                                          <xs:attribute type="xs:string" name="name" use="optional"/>
+                                                        </xs:extension>
+                                                      </xs:simpleContent>
+                                                    </xs:complexType>
+                                                  </xs:element>
+                                                </xs:sequence>
+                                              </xs:complexType>
+                                            </xs:element>
+                                          </xs:sequence>
+                                        </xs:complexType>
+                                      </xs:element>
+                                    </xs:sequence>
+                                    <xs:attribute type="xs:string" name="class" use="optional"/>
+                                    <xs:attribute type="xs:string" name="id" use="optional"/>
+                                  </xs:complexType>
+                                </xs:element>
+                                <xs:element name="packing" minOccurs="0">
+                                  <xs:complexType>
+                                    <xs:sequence>
+                                      <xs:element name="property" maxOccurs="unbounded" minOccurs="0">
+                                        <xs:complexType>
+                                          <xs:simpleContent>
+                                            <xs:extension base="xs:string">
+                                              <xs:attribute type="xs:string" name="name" use="optional"/>
+                                            </xs:extension>
+                                          </xs:simpleContent>
+                                        </xs:complexType>
+                                      </xs:element>
+                                    </xs:sequence>
+                                  </xs:complexType>
+                                </xs:element>
+                                <xs:element type="xs:string" name="placeholder" minOccurs="0"/>
+                              </xs:sequence>
+                              <xs:attribute type="xs:string" name="internal-child" use="optional"/>
+                            </xs:complexType>
+                          </xs:element>
+                        </xs:sequence>
+                        <xs:attribute type="xs:string" name="class" use="optional"/>
+                        <xs:attribute type="xs:string" name="id" use="optional"/>
+                      </xs:complexType>
+                    </xs:element>
+                  </xs:sequence>
+                  <xs:attribute type="xs:string" name="internal-child" use="optional"/>
+                </xs:complexType>
+              </xs:element>
+              <xs:element name="action-widgets" minOccurs="0">
+                <xs:complexType>
+                  <xs:sequence>
+                    <xs:element name="action-widget">
+                      <xs:complexType>
+                        <xs:simpleContent>
+                          <xs:extension base="xs:string">
+                            <xs:attribute type="xs:byte" name="response"/>
+                          </xs:extension>
+                        </xs:simpleContent>
+                      </xs:complexType>
+                    </xs:element>
+                  </xs:sequence>
+                </xs:complexType>
+              </xs:element>
+            </xs:sequence>
+            <xs:attribute type="xs:string" name="class" use="optional"/>
+            <xs:attribute type="xs:string" name="id" use="optional"/>
+          </xs:complexType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
\ No newline at end of file
diff --git a/gui/forgui.py b/gui/forgui.py
new file mode 100644
index 0000000..e68ae19
--- /dev/null
+++ b/gui/forgui.py
@@ -0,0 +1,3911 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+##VERSION##
+VERSION = '2.22a'
+##VERSION##
+
+"""
+FILE TRANSLATOR *.GLADE FOR GENERATEDS_GUI.
+
+Usage:
+    python forgui.py <The fully qualified name of the base file.glade> -c <The fully qualified name of the base file.dictionary>
+
+    python forgui.py <The fully qualified name of the base file.glade> -d  <The fully qualified name of the language file.dictionary>
+    
+Example:
+    Step1: Create a base file dictionary interface based on generateds_gui.glade
+        >>>python forgui.py d:\Python33\Scripts\generateds_gui.glade -c d:\Python33\Scripts\en.dictionary
+        
+    Step2: Open the resulting file <..\en.dictionary> and translate into Russian language. Keep under the name <..\rus.dictionary>.
+    
+               <English key> [<-|->] <Language value>
+               
+           ... User methods module:<-|->Пользовательский модуль методов:
+           ... Validator bodies path:<-|->Путь корпусов контрольного устройства:
+           ... _Capture CL<-|->_Capture CL
+           ... _File<-|->_Файл
+           ... _Generate<-|->_Произвести
+           ... _Help<-|->_Помощь
+           ... _Tools<-|->_Инструменты
+           ............................
+    
+    Step3: Create a new file based on glade generateds_gui. glade using dictionary Eng. dictionary. At the output of the get file .glade generateds_gui_rus.
+        >>>python forgui.py d:\Python33\Scripts\generateds_gui.glade -d  d:\Python33\Scripts\rus.dictionary 
+"""
+#
+# Generated Tue Apr 19 17:15:20 2016 by generateDS.py version 2.22a.
+#
+# Command line options:
+#   ('--no-questions', '')
+#   ('-f', '')
+#   ('-o', 'D:\\Python33\\Scripts\\forGUI.py')
+#   ('--external-encoding', 'utf-8')
+#
+# Command line arguments:
+#   D:\Python33\Scripts\forGUI.xsd
+#
+# Command line:
+#   d:\Python33\Scripts\generateDS.py --no-questions -f -o "D:\Python33\Scripts\forGUI.py" --external-encoding="utf-8" D:\Python33\Scripts\forGUI.xsd
+#
+# Current working directory (os.getcwd()):
+#   Scripts
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+from lxml import etree as etree_
+
+#----------------------------------USER FUNCTION----------------------------------------------
+import os.path 
+LIST_HELPNAMES = {}
+
+def create_dictfiles(args):
+    s = list(LIST_HELPNAMES.keys())
+    s.sort()
+    start_dictfile = open(str(args[2]), 'w', encoding='utf-8')
+    for e in s:
+        print('''%s<-|->%s''' % (e.replace('\n', ' '),e), file=start_dictfile)
+    start_dictfile.close()
+        
+def read_dictfiles(args):
+    dict_file = open(args[2], 'r', encoding='utf-8')
+    d = {}
+    list_d = dict_file.readlines()
+    for s in list_d:
+        e = s.split("<-|->")
+        d[e[0].replace('\\n', ' ')] = d.get(e[0].replace('\\n', ' '), re_.sub(r'\n$','',e[1]))
+    dict_file.close()
+    return d
+
+def appLIST_HELPNAMES(inst):
+    re_n = re_.compile(r'(.*\n.*)')
+    if len(inst.valueOf_) > 0:
+        rs = inst.valueOf_.replace('\n', '\\n')
+        rkey = rs.replace('\\n', ' ')
+        LIST_HELPNAMES[rkey] = LIST_HELPNAMES.get(rkey, rs)
+        inst.valueOf_ = re_.sub(r'\n$','', LIST_HELPNAMES[rkey].replace('\\n', '\n')) 
+
+#----------------------------------------------------------------------------------------------
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'utf-8'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(outfile, level, namespace, name, pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class interface(GeneratedsSuper):
+    """Generated with glade 3.18.3"""
+    subclass = None
+    superclass = None
+    def __init__(self, requires=None, object=None):
+        self.original_tagname_ = None
+        self.requires = requires
+        if object is None:
+            self.object = []
+        else:
+            self.object = object
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, interface)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if interface.subclass:
+            return interface.subclass(*args_, **kwargs_)
+        else:
+            return interface(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_requires(self): return self.requires
+    def set_requires(self, requires): self.requires = requires
+    def get_object(self): return self.object
+    def set_object(self, object): self.object = object
+    def add_object(self, value): self.object.append(value)
+    def insert_object_at(self, index, value): self.object.insert(index, value)
+    def replace_object_at(self, index, value): self.object[index] = value
+    def hasContent_(self):
+        if (
+            self.requires is not None or
+            self.object
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='interface', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='interface')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='interface', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='interface'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='interface', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.requires is not None:
+            self.requires.export(outfile, level, namespace_, name_='requires', pretty_print=pretty_print)
+        for object_ in self.object:
+            object_.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'requires':
+            obj_ = requiresType.factory()
+            obj_.build(child_)
+            self.requires = obj_
+            obj_.original_tagname_ = 'requires'
+        elif nodeName_ == 'object':
+            obj_ = objectType.factory()
+            obj_.build(child_)
+            self.object.append(obj_)
+            obj_.original_tagname_ = 'object'
+# end class interface
+
+
+class requiresType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, lib=None, version=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.lib = _cast(None, lib)
+        self.version = _cast(float, version)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, requiresType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if requiresType.subclass:
+            return requiresType.subclass(*args_, **kwargs_)
+        else:
+            return requiresType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_lib(self): return self.lib
+    def set_lib(self, lib): self.lib = lib
+    def get_version(self): return self.version
+    def set_version(self, version): self.version = version
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='requiresType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='requiresType')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='requiresType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='requiresType'):
+        if self.lib is not None and 'lib' not in already_processed:
+            already_processed.add('lib')
+            outfile.write(' lib=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.lib), input_name='lib')), ))
+        if self.version is not None and 'version' not in already_processed:
+            already_processed.add('version')
+            outfile.write(' version="%s"' % self.gds_format_float(self.version, input_name='version'))
+    def exportChildren(self, outfile, level, namespace_='', name_='requiresType', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('lib', node)
+        if value is not None and 'lib' not in already_processed:
+            already_processed.add('lib')
+            self.lib = value
+        value = find_attr_value_('version', node)
+        if value is not None and 'version' not in already_processed:
+            already_processed.add('version')
+            try:
+                self.version = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (version): %s' % exp)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class requiresType
+
+
+class objectType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, class_=None, id=None, property=None, accel_groups=None, signal=None, child=None, action_widgets=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
+        self.class_ = _cast(None, class_)
+        self.id = _cast(None, id)
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+        self.accel_groups = accel_groups
+        self.signal = signal
+        self.child = child
+        self.action_widgets = action_widgets
+        self.valueOf_ = valueOf_
+        if mixedclass_ is None:
+            self.mixedclass_ = MixedContainer
+        else:
+            self.mixedclass_ = mixedclass_
+        if content_ is None:
+            self.content_ = []
+        else:
+            self.content_ = content_
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, objectType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if objectType.subclass:
+            return objectType.subclass(*args_, **kwargs_)
+        else:
+            return objectType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def get_accel_groups(self): return self.accel_groups
+    def set_accel_groups(self, accel_groups): self.accel_groups = accel_groups
+    def get_signal(self): return self.signal
+    def set_signal(self, signal): self.signal = signal
+    def get_child(self): return self.child
+    def set_child(self, child): self.child = child
+    def get_action_widgets(self): return self.action_widgets
+    def set_action_widgets(self, action_widgets): self.action_widgets = action_widgets
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            self.property or
+            self.accel_groups is not None or
+            self.signal is not None or
+            self.child is not None or
+            self.action_widgets is not None or
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='objectType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='objectType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType'):
+        if self.class_ is not None and 'class_' not in already_processed:
+            already_processed.add('class_')
+            outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='objectType', fromsubclass_=False, pretty_print=True):
+        if not fromsubclass_:
+            for item_ in self.content_:
+                item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        if node.text is not None:
+            obj_ = self.mixedclass_(MixedContainer.CategoryText,
+                MixedContainer.TypeNone, '', node.text)
+            self.content_.append(obj_)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('class', node)
+        if value is not None and 'class' not in already_processed:
+            already_processed.add('class')
+            self.class_ = value
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType.factory()
+            obj_.build(child_)
+            obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+                MixedContainer.TypeNone, 'property', obj_)
+            self.content_.append(obj_)
+            if hasattr(self, 'add_property'):
+              self.add_property(obj_.value)
+            elif hasattr(self, 'set_property'):
+              self.set_property(obj_.value)
+        elif nodeName_ == 'accel-groups':
+            obj_ = accel_groupsType.factory()
+            obj_.build(child_)
+            obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+                MixedContainer.TypeNone, 'accel-groups', obj_)
+            self.content_.append(obj_)
+            if hasattr(self, 'add_accel-groups'):
+              self.add_accel-groups(obj_.value)
+            elif hasattr(self, 'set_accel-groups'):
+              self.set_accel-groups(obj_.value)
+        elif nodeName_ == 'signal':
+            obj_ = signalType.factory()
+            obj_.build(child_)
+            obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+                MixedContainer.TypeNone, 'signal', obj_)
+            self.content_.append(obj_)
+            if hasattr(self, 'add_signal'):
+              self.add_signal(obj_.value)
+            elif hasattr(self, 'set_signal'):
+              self.set_signal(obj_.value)
+        elif nodeName_ == 'child':
+            obj_ = childType.factory()
+            obj_.build(child_)
+            obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+                MixedContainer.TypeNone, 'child', obj_)
+            self.content_.append(obj_)
+            if hasattr(self, 'add_child'):
+              self.add_child(obj_.value)
+            elif hasattr(self, 'set_child'):
+              self.set_child(obj_.value)
+        elif nodeName_ == 'action-widgets':
+            obj_ = action_widgetsType.factory()
+            obj_.build(child_)
+            obj_ = self.mixedclass_(MixedContainer.CategoryComplex,
+                MixedContainer.TypeNone, 'action-widgets', obj_)
+            self.content_.append(obj_)
+            if hasattr(self, 'add_action-widgets'):
+              self.add_action-widgets(obj_.value)
+            elif hasattr(self, 'set_action-widgets'):
+              self.set_action-widgets(obj_.value)
+        if not fromsubclass_ and child_.tail is not None:
+            obj_ = self.mixedclass_(MixedContainer.CategoryText,
+                MixedContainer.TypeNone, '', child_.tail)
+            self.content_.append(obj_)
+# end class objectType
+
+
+class propertyType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, translatable=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.translatable = _cast(None, translatable)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType.subclass:
+            return propertyType.subclass(*args_, **kwargs_)
+        else:
+            return propertyType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_translatable(self): return self.translatable
+    def set_translatable(self, translatable): self.translatable = translatable
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+        if self.translatable is not None and 'translatable' not in already_processed:
+            already_processed.add('translatable')
+
+            appLIST_HELPNAMES(self)
+            outfile.write(' translatable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.translatable), input_name='translatable')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('translatable', node)
+        if value is not None and 'translatable' not in already_processed:
+            already_processed.add('translatable')
+
+            self.translatable = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+
+def rv_isbool(namespacedef_):
+    if isinstance(namespacedef_, bool):
+        namespacedef_ = ''
+    return namespacedef_
+
+# end class propertyType
+
+
+class accel_groupsType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, group=None):
+        self.original_tagname_ = None
+        self.group = group
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, accel_groupsType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if accel_groupsType.subclass:
+            return accel_groupsType.subclass(*args_, **kwargs_)
+        else:
+            return accel_groupsType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_group(self): return self.group
+    def set_group(self, group): self.group = group
+    def hasContent_(self):
+        if (
+            self.group is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='accel-groupsType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='accel-groupsType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='accel-groupsType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='accel-groupsType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='accel-groupsType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.group is not None:
+            self.group.export(outfile, level, namespace_, name_='group', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'group':
+            obj_ = groupType.factory()
+            obj_.build(child_)
+            self.group = obj_
+            obj_.original_tagname_ = 'group'
+# end class accel_groupsType
+
+
+class groupType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, groupType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if groupType.subclass:
+            return groupType.subclass(*args_, **kwargs_)
+        else:
+            return groupType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='groupType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='groupType')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='groupType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='groupType'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='groupType', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class groupType
+
+
+class signalType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, handler=None, swapped=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.handler = _cast(None, handler)
+        self.swapped = _cast(None, swapped)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, signalType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if signalType.subclass:
+            return signalType.subclass(*args_, **kwargs_)
+        else:
+            return signalType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_handler(self): return self.handler
+    def set_handler(self, handler): self.handler = handler
+    def get_swapped(self): return self.swapped
+    def set_swapped(self, swapped): self.swapped = swapped
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='signalType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='signalType')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='signalType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='signalType'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+        if self.handler is not None and 'handler' not in already_processed:
+            already_processed.add('handler')
+            outfile.write(' handler=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.handler), input_name='handler')), ))
+        if self.swapped is not None and 'swapped' not in already_processed:
+            already_processed.add('swapped')
+            outfile.write(' swapped=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.swapped), input_name='swapped')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='signalType', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('handler', node)
+        if value is not None and 'handler' not in already_processed:
+            already_processed.add('handler')
+            self.handler = value
+        value = find_attr_value_('swapped', node)
+        if value is not None and 'swapped' not in already_processed:
+            already_processed.add('swapped')
+            self.swapped = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class signalType
+
+
+class childType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, internal_child=None, object=None):
+        self.original_tagname_ = None
+        self.internal_child = _cast(None, internal_child)
+        self.object = object
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, childType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if childType.subclass:
+            return childType.subclass(*args_, **kwargs_)
+        else:
+            return childType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_object(self): return self.object
+    def set_object(self, object): self.object = object
+    def get_internal_child(self): return self.internal_child
+    def set_internal_child(self, internal_child): self.internal_child = internal_child
+    def hasContent_(self):
+        if (
+            self.object is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='childType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='childType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType'):
+        if self.internal_child is not None and 'internal_child' not in already_processed:
+            already_processed.add('internal_child')
+            outfile.write(' internal-child=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.internal_child), input_name='internal-child')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='childType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.object is not None:
+            self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('internal-child', node)
+        if value is not None and 'internal-child' not in already_processed:
+            already_processed.add('internal-child')
+            self.internal_child = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'object':
+            obj_ = objectType1.factory()
+            obj_.build(child_)
+            self.object = obj_
+            obj_.original_tagname_ = 'object'
+# end class childType
+
+
+class objectType1(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, class_=None, id=None, property=None, child=None):
+        self.original_tagname_ = None
+        self.class_ = _cast(None, class_)
+        self.id = _cast(None, id)
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+        if child is None:
+            self.child = []
+        else:
+            self.child = child
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, objectType1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if objectType1.subclass:
+            return objectType1.subclass(*args_, **kwargs_)
+        else:
+            return objectType1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def get_child(self): return self.child
+    def set_child(self, child): self.child = child
+    def add_child(self, value): self.child.append(value)
+    def insert_child_at(self, index, value): self.child.insert(index, value)
+    def replace_child_at(self, index, value): self.child[index] = value
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def hasContent_(self):
+        if (
+            self.property or
+            self.child
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='objectType1', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='objectType1', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType1'):
+        if self.class_ is not None and 'class_' not in already_processed:
+            already_processed.add('class_')
+            outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='objectType1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for property_ in self.property:
+            property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print)
+        for child_ in self.child:
+            child_.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('class', node)
+        if value is not None and 'class' not in already_processed:
+            already_processed.add('class')
+            self.class_ = value
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType2.factory()
+            obj_.build(child_)
+            self.property.append(obj_)
+            obj_.original_tagname_ = 'property'
+        elif nodeName_ == 'child':
+            obj_ = childType3.factory()
+            obj_.build(child_)
+            self.child.append(obj_)
+            obj_.original_tagname_ = 'child'
+# end class objectType1
+
+
+class propertyType2(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType2.subclass:
+            return propertyType2.subclass(*args_, **kwargs_)
+        else:
+            return propertyType2(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType2', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType2')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType2', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType2'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType2', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class propertyType2
+
+
+class childType3(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, internal_child=None, object=None, packing=None, placeholder=None):
+        self.original_tagname_ = None
+        self.internal_child = _cast(None, internal_child)
+        self.object = object
+        self.packing = packing
+        self.placeholder = placeholder
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, childType3)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if childType3.subclass:
+            return childType3.subclass(*args_, **kwargs_)
+        else:
+            return childType3(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_object(self): return self.object
+    def set_object(self, object): self.object = object
+    def get_packing(self): return self.packing
+    def set_packing(self, packing): self.packing = packing
+    def get_placeholder(self): return self.placeholder
+    def set_placeholder(self, placeholder): self.placeholder = placeholder
+    def get_internal_child(self): return self.internal_child
+    def set_internal_child(self, internal_child): self.internal_child = internal_child
+    def hasContent_(self):
+        if (
+            self.object is not None or
+            self.packing is not None or
+            self.placeholder is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='childType3', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType3')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='childType3', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType3'):
+        if self.internal_child is not None and 'internal_child' not in already_processed:
+            already_processed.add('internal_child')
+            outfile.write(' internal-child=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.internal_child), input_name='internal-child')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='childType3', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.object is not None:
+            self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print)
+        if self.packing is not None:
+            self.packing.export(outfile, level, namespace_, name_='packing', pretty_print=pretty_print)
+        if self.placeholder is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%splaceholder>%s</%splaceholder>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.placeholder), input_name='placeholder')), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('internal-child', node)
+        if value is not None and 'internal-child' not in already_processed:
+            already_processed.add('internal-child')
+            self.internal_child = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'object':
+            obj_ = objectType4.factory()
+            obj_.build(child_)
+            self.object = obj_
+            obj_.original_tagname_ = 'object'
+        elif nodeName_ == 'packing':
+            obj_ = packingType21.factory()
+            obj_.build(child_)
+            self.packing = obj_
+            obj_.original_tagname_ = 'packing'
+        elif nodeName_ == 'placeholder':
+            placeholder_ = child_.text
+            placeholder_ = self.gds_validate_string(placeholder_, node, 'placeholder')
+            self.placeholder = placeholder_
+# end class childType3
+
+
+class objectType4(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, class_=None, id=None, property=None, child=None):
+        self.original_tagname_ = None
+        self.class_ = _cast(None, class_)
+        self.id = _cast(None, id)
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+        if child is None:
+            self.child = []
+        else:
+            self.child = child
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, objectType4)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if objectType4.subclass:
+            return objectType4.subclass(*args_, **kwargs_)
+        else:
+            return objectType4(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def get_child(self): return self.child
+    def set_child(self, child): self.child = child
+    def add_child(self, value): self.child.append(value)
+    def insert_child_at(self, index, value): self.child.insert(index, value)
+    def replace_child_at(self, index, value): self.child[index] = value
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def hasContent_(self):
+        if (
+            self.property or
+            self.child
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='objectType4', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType4')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='objectType4', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType4'):
+        if self.class_ is not None and 'class_' not in already_processed:
+            already_processed.add('class_')
+            outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='objectType4', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for property_ in self.property:
+            property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print)
+        for child_ in self.child:
+            child_.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('class', node)
+        if value is not None and 'class' not in already_processed:
+            already_processed.add('class')
+            self.class_ = value
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType5.factory()
+            obj_.build(child_)
+            self.property.append(obj_)
+            obj_.original_tagname_ = 'property'
+        elif nodeName_ == 'child':
+            obj_ = childType6.factory()
+            obj_.build(child_)
+            self.child.append(obj_)
+            obj_.original_tagname_ = 'child'
+# end class objectType4
+
+
+class propertyType5(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType5)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType5.subclass:
+            return propertyType5.subclass(*args_, **kwargs_)
+        else:
+            return propertyType5(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType5', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType5')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType5', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType5'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType5', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class propertyType5
+
+
+class childType6(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, object=None, packing=None):
+        self.original_tagname_ = None
+        self.object = object
+        self.packing = packing
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, childType6)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if childType6.subclass:
+            return childType6.subclass(*args_, **kwargs_)
+        else:
+            return childType6(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_object(self): return self.object
+    def set_object(self, object): self.object = object
+    def get_packing(self): return self.packing
+    def set_packing(self, packing): self.packing = packing
+    def hasContent_(self):
+        if (
+            self.object is not None or
+            self.packing is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='childType6', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType6')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='childType6', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType6'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='childType6', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.object is not None:
+            self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print)
+        if self.packing is not None:
+            self.packing.export(outfile, level, namespace_, name_='packing', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'object':
+            obj_ = objectType7.factory()
+            obj_.build(child_)
+            self.object = obj_
+            obj_.original_tagname_ = 'object'
+        elif nodeName_ == 'packing':
+            obj_ = packingType19.factory()
+            obj_.build(child_)
+            self.packing = obj_
+            obj_.original_tagname_ = 'packing'
+# end class childType6
+
+
+class objectType7(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, class_=None, id=None, property=None, child=None, signal=None):
+        self.original_tagname_ = None
+        self.class_ = _cast(None, class_)
+        self.id = _cast(None, id)
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+        self.child = child
+        self.signal = signal
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, objectType7)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if objectType7.subclass:
+            return objectType7.subclass(*args_, **kwargs_)
+        else:
+            return objectType7(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def get_child(self): return self.child
+    def set_child(self, child): self.child = child
+    def get_signal(self): return self.signal
+    def set_signal(self, signal): self.signal = signal
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def hasContent_(self):
+        if (
+            self.property or
+            self.child is not None or
+            self.signal is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='objectType7', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType7')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='objectType7', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType7'):
+        if self.class_ is not None and 'class_' not in already_processed:
+            already_processed.add('class_')
+            outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='objectType7', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for property_ in self.property:
+            property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print)
+        if self.child is not None:
+            self.child.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print)
+        if self.signal is not None:
+            self.signal.export(outfile, level, namespace_, name_='signal', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('class', node)
+        if value is not None and 'class' not in already_processed:
+            already_processed.add('class')
+            self.class_ = value
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType8.factory()
+            obj_.build(child_)
+            self.property.append(obj_)
+            obj_.original_tagname_ = 'property'
+        elif nodeName_ == 'child':
+            obj_ = childType9.factory()
+            obj_.build(child_)
+            self.child = obj_
+            obj_.original_tagname_ = 'child'
+        elif nodeName_ == 'signal':
+            obj_ = signalType18.factory()
+            obj_.build(child_)
+            self.signal = obj_
+            obj_.original_tagname_ = 'signal'
+# end class objectType7
+
+
+class propertyType8(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, translatable=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.translatable = _cast(None, translatable)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType8)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType8.subclass:
+            return propertyType8.subclass(*args_, **kwargs_)
+        else:
+            return propertyType8(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_translatable(self): return self.translatable
+    def set_translatable(self, translatable): self.translatable = translatable
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType8', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType8')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType8', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType8'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+        if self.translatable is not None and 'translatable' not in already_processed:
+            already_processed.add('translatable')
+            appLIST_HELPNAMES(self)
+            outfile.write(' translatable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.translatable), input_name='translatable')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType8', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('translatable', node)
+        if value is not None and 'translatable' not in already_processed:
+            already_processed.add('translatable')
+            
+            self.translatable = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class propertyType8
+
+
+class childType9(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, type_=None, object=None):
+        self.original_tagname_ = None
+        self.type_ = _cast(None, type_)
+        self.object = object
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, childType9)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if childType9.subclass:
+            return childType9.subclass(*args_, **kwargs_)
+        else:
+            return childType9(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_object(self): return self.object
+    def set_object(self, object): self.object = object
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def hasContent_(self):
+        if (
+            self.object is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='childType9', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType9')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='childType9', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType9'):
+        if self.type_ is not None and 'type_' not in already_processed:
+            already_processed.add('type_')
+            outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='childType9', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.object is not None:
+            self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('type', node)
+        if value is not None and 'type' not in already_processed:
+            already_processed.add('type')
+            self.type_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'object':
+            obj_ = objectType10.factory()
+            obj_.build(child_)
+            self.object = obj_
+            obj_.original_tagname_ = 'object'
+# end class childType9
+
+
+class objectType10(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, class_=None, id=None, property=None, child=None):
+        self.original_tagname_ = None
+        self.class_ = _cast(None, class_)
+        self.id = _cast(None, id)
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+        if child is None:
+            self.child = []
+        else:
+            self.child = child
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, objectType10)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if objectType10.subclass:
+            return objectType10.subclass(*args_, **kwargs_)
+        else:
+            return objectType10(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def get_child(self): return self.child
+    def set_child(self, child): self.child = child
+    def add_child(self, value): self.child.append(value)
+    def insert_child_at(self, index, value): self.child.insert(index, value)
+    def replace_child_at(self, index, value): self.child[index] = value
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def hasContent_(self):
+        if (
+            self.property or
+            self.child
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='objectType10', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType10')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='objectType10', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType10'):
+        if self.class_ is not None and 'class_' not in already_processed:
+            already_processed.add('class_')
+            outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='objectType10', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for property_ in self.property:
+            property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print)
+        for child_ in self.child:
+            child_.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('class', node)
+        if value is not None and 'class' not in already_processed:
+            already_processed.add('class')
+            self.class_ = value
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType11.factory()
+            obj_.build(child_)
+            self.property.append(obj_)
+            obj_.original_tagname_ = 'property'
+        elif nodeName_ == 'child':
+            obj_ = childType12.factory()
+            obj_.build(child_)
+            self.child.append(obj_)
+            obj_.original_tagname_ = 'child'
+# end class objectType10
+
+
+class propertyType11(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType11)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType11.subclass:
+            return propertyType11.subclass(*args_, **kwargs_)
+        else:
+            return propertyType11(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType11', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType11')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType11', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType11'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType11', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class propertyType11
+
+
+class childType12(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, placeholder=None, object=None, packing=None):
+        self.original_tagname_ = None
+        self.placeholder = placeholder
+        self.object = object
+        self.packing = packing
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, childType12)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if childType12.subclass:
+            return childType12.subclass(*args_, **kwargs_)
+        else:
+            return childType12(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_placeholder(self): return self.placeholder
+    def set_placeholder(self, placeholder): self.placeholder = placeholder
+    def get_object(self): return self.object
+    def set_object(self, object): self.object = object
+    def get_packing(self): return self.packing
+    def set_packing(self, packing): self.packing = packing
+    def hasContent_(self):
+        if (
+            self.placeholder is not None or
+            self.object is not None or
+            self.packing is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='childType12', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType12')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='childType12', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType12'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='childType12', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.placeholder is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%splaceholder>%s</%splaceholder>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.placeholder), input_name='placeholder')), namespace_, eol_))
+        if self.object is not None:
+            self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print)
+        if self.packing is not None:
+            self.packing.export(outfile, level, namespace_, name_='packing', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'placeholder':
+            placeholder_ = child_.text
+            placeholder_ = self.gds_validate_string(placeholder_, node, 'placeholder')
+            self.placeholder = placeholder_
+        elif nodeName_ == 'object':
+            obj_ = objectType13.factory()
+            obj_.build(child_)
+            self.object = obj_
+            obj_.original_tagname_ = 'object'
+        elif nodeName_ == 'packing':
+            obj_ = packingType.factory()
+            obj_.build(child_)
+            self.packing = obj_
+            obj_.original_tagname_ = 'packing'
+# end class childType12
+
+
+class objectType13(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, class_=None, id=None, property=None, signal=None, accelerator=None, child=None):
+        self.original_tagname_ = None
+        self.class_ = _cast(None, class_)
+        self.id = _cast(None, id)
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+        self.signal = signal
+        self.accelerator = accelerator
+        self.child = child
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, objectType13)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if objectType13.subclass:
+            return objectType13.subclass(*args_, **kwargs_)
+        else:
+            return objectType13(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def get_signal(self): return self.signal
+    def set_signal(self, signal): self.signal = signal
+    def get_accelerator(self): return self.accelerator
+    def set_accelerator(self, accelerator): self.accelerator = accelerator
+    def get_child(self): return self.child
+    def set_child(self, child): self.child = child
+    def get_class(self): return self.class_
+    def set_class(self, class_): self.class_ = class_
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def hasContent_(self):
+        if (
+            self.property or
+            self.signal is not None or
+            self.accelerator is not None or
+            self.child is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='objectType13', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType13')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='objectType13', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType13'):
+        if self.class_ is not None and 'class_' not in already_processed:
+            already_processed.add('class_')
+            outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='objectType13', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for property_ in self.property:
+            property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print)
+        if self.signal is not None:
+            self.signal.export(outfile, level, namespace_, name_='signal', pretty_print=pretty_print)
+        if self.accelerator is not None:
+            self.accelerator.export(outfile, level, namespace_, name_='accelerator', pretty_print=pretty_print)
+        if self.child is not None:
+            self.child.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('class', node)
+        if value is not None and 'class' not in already_processed:
+            already_processed.add('class')
+            self.class_ = value
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType14.factory()
+            obj_.build(child_)
+            self.property.append(obj_)
+            obj_.original_tagname_ = 'property'
+        elif nodeName_ == 'signal':
+            obj_ = signalType15.factory()
+            obj_.build(child_)
+            self.signal = obj_
+            obj_.original_tagname_ = 'signal'
+        elif nodeName_ == 'accelerator':
+            obj_ = acceleratorType.factory()
+            obj_.build(child_)
+            self.accelerator = obj_
+            obj_.original_tagname_ = 'accelerator'
+        elif nodeName_ == 'child':
+            obj_ = childType16.factory()
+            obj_.build(child_)
+            self.child = obj_
+            obj_.original_tagname_ = 'child'
+# end class objectType13
+
+
+class propertyType14(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, translatable=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.translatable = _cast(None, translatable)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType14)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType14.subclass:
+            return propertyType14.subclass(*args_, **kwargs_)
+        else:
+            return propertyType14(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_translatable(self): return self.translatable
+    def set_translatable(self, translatable): self.translatable = translatable
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType14', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType14')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType14', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType14'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+        if self.translatable is not None and 'translatable' not in already_processed:
+            already_processed.add('translatable')
+            appLIST_HELPNAMES(self)
+            outfile.write(' translatable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.translatable), input_name='translatable')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType14', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('translatable', node)
+        if value is not None and 'translatable' not in already_processed:
+            already_processed.add('translatable')
+            self.translatable = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class propertyType14
+
+
+class signalType15(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, handler=None, swapped=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.handler = _cast(None, handler)
+        self.swapped = _cast(None, swapped)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, signalType15)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if signalType15.subclass:
+            return signalType15.subclass(*args_, **kwargs_)
+        else:
+            return signalType15(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_handler(self): return self.handler
+    def set_handler(self, handler): self.handler = handler
+    def get_swapped(self): return self.swapped
+    def set_swapped(self, swapped): self.swapped = swapped
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='signalType15', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='signalType15')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='signalType15', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='signalType15'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+        if self.handler is not None and 'handler' not in already_processed:
+            already_processed.add('handler')
+            outfile.write(' handler=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.handler), input_name='handler')), ))
+        if self.swapped is not None and 'swapped' not in already_processed:
+            already_processed.add('swapped')
+            outfile.write(' swapped=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.swapped), input_name='swapped')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='signalType15', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('handler', node)
+        if value is not None and 'handler' not in already_processed:
+            already_processed.add('handler')
+            self.handler = value
+        value = find_attr_value_('swapped', node)
+        if value is not None and 'swapped' not in already_processed:
+            already_processed.add('swapped')
+            self.swapped = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class signalType15
+
+
+class acceleratorType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, key=None, signal=None, modifiers=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.key = _cast(None, key)
+        self.signal = _cast(None, signal)
+        self.modifiers = _cast(None, modifiers)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, acceleratorType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if acceleratorType.subclass:
+            return acceleratorType.subclass(*args_, **kwargs_)
+        else:
+            return acceleratorType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_key(self): return self.key
+    def set_key(self, key): self.key = key
+    def get_signal(self): return self.signal
+    def set_signal(self, signal): self.signal = signal
+    def get_modifiers(self): return self.modifiers
+    def set_modifiers(self, modifiers): self.modifiers = modifiers
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='acceleratorType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='acceleratorType')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='acceleratorType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='acceleratorType'):
+        if self.key is not None and 'key' not in already_processed:
+            already_processed.add('key')
+            outfile.write(' key=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.key), input_name='key')), ))
+        if self.signal is not None and 'signal' not in already_processed:
+            already_processed.add('signal')
+            outfile.write(' signal=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.signal), input_name='signal')), ))
+        if self.modifiers is not None and 'modifiers' not in already_processed:
+            already_processed.add('modifiers')
+            outfile.write(' modifiers=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.modifiers), input_name='modifiers')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='acceleratorType', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('key', node)
+        if value is not None and 'key' not in already_processed:
+            already_processed.add('key')
+            self.key = value
+        value = find_attr_value_('signal', node)
+        if value is not None and 'signal' not in already_processed:
+            already_processed.add('signal')
+            self.signal = value
+        value = find_attr_value_('modifiers', node)
+        if value is not None and 'modifiers' not in already_processed:
+            already_processed.add('modifiers')
+            self.modifiers = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class acceleratorType
+
+
+class childType16(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, placeholder=None):
+        self.original_tagname_ = None
+        self.placeholder = placeholder
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, childType16)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if childType16.subclass:
+            return childType16.subclass(*args_, **kwargs_)
+        else:
+            return childType16(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_placeholder(self): return self.placeholder
+    def set_placeholder(self, placeholder): self.placeholder = placeholder
+    def hasContent_(self):
+        if (
+            self.placeholder is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='childType16', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType16')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='childType16', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType16'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='childType16', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.placeholder is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%splaceholder>%s</%splaceholder>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.placeholder), input_name='placeholder')), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'placeholder':
+            placeholder_ = child_.text
+            placeholder_ = self.gds_validate_string(placeholder_, node, 'placeholder')
+            self.placeholder = placeholder_
+# end class childType16
+
+
+class packingType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, property=None):
+        self.original_tagname_ = None
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, packingType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if packingType.subclass:
+            return packingType.subclass(*args_, **kwargs_)
+        else:
+            return packingType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def hasContent_(self):
+        if (
+            self.property
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='packingType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='packingType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='packingType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='packingType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='packingType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for property_ in self.property:
+            property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType17.factory()
+            obj_.build(child_)
+            self.property.append(obj_)
+            obj_.original_tagname_ = 'property'
+# end class packingType
+
+
+class propertyType17(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType17)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType17.subclass:
+            return propertyType17.subclass(*args_, **kwargs_)
+        else:
+            return propertyType17(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType17', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType17')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType17', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType17'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType17', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class propertyType17
+
+
+class signalType18(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, handler=None, swapped=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.handler = _cast(None, handler)
+        self.swapped = _cast(None, swapped)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, signalType18)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if signalType18.subclass:
+            return signalType18.subclass(*args_, **kwargs_)
+        else:
+            return signalType18(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_handler(self): return self.handler
+    def set_handler(self, handler): self.handler = handler
+    def get_swapped(self): return self.swapped
+    def set_swapped(self, swapped): self.swapped = swapped
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='signalType18', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='signalType18')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='signalType18', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='signalType18'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+        if self.handler is not None and 'handler' not in already_processed:
+            already_processed.add('handler')
+            outfile.write(' handler=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.handler), input_name='handler')), ))
+        if self.swapped is not None and 'swapped' not in already_processed:
+            already_processed.add('swapped')
+            outfile.write(' swapped=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.swapped), input_name='swapped')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='signalType18', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+        value = find_attr_value_('handler', node)
+        if value is not None and 'handler' not in already_processed:
+            already_processed.add('handler')
+            self.handler = value
+        value = find_attr_value_('swapped', node)
+        if value is not None and 'swapped' not in already_processed:
+            already_processed.add('swapped')
+            self.swapped = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class signalType18
+
+
+class packingType19(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, property=None):
+        self.original_tagname_ = None
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, packingType19)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if packingType19.subclass:
+            return packingType19.subclass(*args_, **kwargs_)
+        else:
+            return packingType19(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def hasContent_(self):
+        if (
+            self.property
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='packingType19', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='packingType19')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='packingType19', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='packingType19'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='packingType19', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for property_ in self.property:
+            property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType20.factory()
+            obj_.build(child_)
+            self.property.append(obj_)
+            obj_.original_tagname_ = 'property'
+# end class packingType19
+
+
+class propertyType20(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType20)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType20.subclass:
+            return propertyType20.subclass(*args_, **kwargs_)
+        else:
+            return propertyType20(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType20', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType20')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType20', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType20'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType20', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class propertyType20
+
+
+class packingType21(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, property=None):
+        self.original_tagname_ = None
+        if property is None:
+            self.property = []
+        else:
+            self.property = property
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, packingType21)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if packingType21.subclass:
+            return packingType21.subclass(*args_, **kwargs_)
+        else:
+            return packingType21(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_property(self): return self.property
+    def set_property(self, property): self.property = property
+    def add_property(self, value): self.property.append(value)
+    def insert_property_at(self, index, value): self.property.insert(index, value)
+    def replace_property_at(self, index, value): self.property[index] = value
+    def hasContent_(self):
+        if (
+            self.property
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='packingType21', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='packingType21')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='packingType21', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='packingType21'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='packingType21', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for property_ in self.property:
+            property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'property':
+            obj_ = propertyType22.factory()
+            obj_.build(child_)
+            self.property.append(obj_)
+            obj_.original_tagname_ = 'property'
+# end class packingType21
+
+
+class propertyType22(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, name=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.name = _cast(None, name)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, propertyType22)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if propertyType22.subclass:
+            return propertyType22.subclass(*args_, **kwargs_)
+        else:
+            return propertyType22(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_name(self): return self.name
+    def set_name(self, name): self.name = name
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='propertyType22', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType22')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType22', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType22'):
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='propertyType22', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class propertyType22
+
+
+class action_widgetsType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, action_widget=None):
+        self.original_tagname_ = None
+        self.action_widget = action_widget
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, action_widgetsType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if action_widgetsType.subclass:
+            return action_widgetsType.subclass(*args_, **kwargs_)
+        else:
+            return action_widgetsType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_action_widget(self): return self.action_widget
+    def set_action_widget(self, action_widget): self.action_widget = action_widget
+    def hasContent_(self):
+        if (
+            self.action_widget is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='action-widgetsType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='action-widgetsType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='action-widgetsType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='action-widgetsType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='action-widgetsType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.action_widget is not None:
+            self.action_widget.export(outfile, level, namespace_, name_='action-widget', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'action-widget':
+            obj_ = action_widgetType.factory()
+            obj_.build(child_)
+            self.action_widget = obj_
+            obj_.original_tagname_ = 'action-widget'
+# end class action_widgetsType
+
+
+class action_widgetType(GeneratedsSuper):
+    subclass = None
+    superclass = None
+    def __init__(self, response=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.response = _cast(int, response)
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, action_widgetType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if action_widgetType.subclass:
+            return action_widgetType.subclass(*args_, **kwargs_)
+        else:
+            return action_widgetType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_response(self): return self.response
+    def set_response(self, response): self.response = response
+    def get_valueOf_(self): return self.valueOf_
+    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
+    def hasContent_(self):
+        if (
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='action-widgetType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='action-widgetType')
+        if self.hasContent_():
+            outfile.write('>')
+            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_))))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='action-widgetType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='action-widgetType'):
+        if self.response is not None and 'response' not in already_processed:
+            already_processed.add('response')
+            outfile.write(' response="%s"' % self.gds_format_integer(self.response, input_name='response'))
+    def exportChildren(self, outfile, level, namespace_='', name_='action-widgetType', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        self.valueOf_ = get_all_text_(node)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('response', node)
+        if value is not None and 'response' not in already_processed:
+            already_processed.add('response')
+            try:
+                self.response = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class action_widgetType
+
+
+GDSClassesMapping = {
+    'accel-groups': accel_groupsType,
+    'accelerator': acceleratorType,
+    'action-widget': action_widgetType,
+    'action-widgets': action_widgetsType,
+    'child': childType16,
+    'group': groupType,
+    'object': objectType13,
+    'packing': packingType,
+    'property': propertyType22,
+    'requires': requiresType,
+    'signal': signalType15,
+}
+
+
+USAGE_TEXT = """
+Usage:
+    python forgui.py <The fully qualified name of the base file.glade> -c <The fully qualified name of the base file.dictionary>
+
+    python forgui.py <The fully qualified name of the base file.glade> -d  <The fully qualified name of the language file.dictionary>
+    
+Example:
+    Step1: Create a base file dictionary interface based on generateds_gui.glade
+        >>>python forgui.py d:\Python33\Scripts\generateds_gui.glade -c d:\Python33\Scripts\en.dictionary
+        
+    Step2: Open the resulting file en. dictionary and translate into Russian language. Keep under the name rus. dictionary.
+    
+               <English key> [<-|->] <Language value>
+               
+           ... User methods module:<-|->Пользовательский модуль методов:
+           ... Validator bodies path:<-|->Путь корпусов контрольного устройства:
+           ... _Capture CL<-|->_Capture CL
+           ... _File<-|->_Файл
+           ... _Generate<-|->_Произвести
+           ... _Help<-|->_Помощь
+           ... _Tools<-|->_Инструменты
+           ............................
+    
+    Step3: Create a new file based on glade generateds_gui. glade using dictionary Eng. dictionary. At the output of the get file .glade generateds_gui_rus.
+        >>>python forgui.py d:\Python33\Scripts\generateds_gui.glade -d  d:\Python33\Scripts\rus.dictionary 
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'interface'
+        rootClass = interface
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'interface'
+        rootClass = interface
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'interface'
+        rootClass = interface
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'interface'
+        rootClass = interface
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from forGUI import *\n\n')
+        sys.stdout.write('import forGUI as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) > 0:
+        # python forgui.py d:\Python33\Scripts\generateds_gui.glade -d  d:\Python33\Scripts\rus.dictionary 
+        if args[1] == '-d':
+            global LIST_HELPNAMES
+            LIST_HELPNAMES = read_dictfiles(args)
+            root = parse(args[0], silence=True)
+            path_glade, filename_glade = os.path.split(args[0]) 
+            basename_glade, extension_glade = os.path.splitext(filename_glade)
+            path_dictionary , filename_dictionary  = os.path.split(args[2])
+            export_file_name = os.path.join(path_glade, basename_glade+'_'+os.path.splitext(filename_dictionary)[0]+extension_glade)
+            export_file = open(export_file_name, 'w', encoding='utf-8')
+            #export_file = sys.stdout
+            export_file.write('<?xml version="1.0" encoding="UTF-8"?>\n')
+            root.export(export_file, 0)
+            export_file.close()
+        # python forgui.py d:\Python33\Scripts\generateds_gui.glade -c d:\Python33\Scripts\en.dictionary
+        elif args[1] == '-c':
+            parse(args[0], silence=False)
+            create_dictfiles(args)
+    else:
+        usage()
+        
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "accel_groupsType",
+    "acceleratorType",
+    "action_widgetType",
+    "action_widgetsType",
+    "childType",
+    "childType12",
+    "childType16",
+    "childType3",
+    "childType6",
+    "childType9",
+    "groupType",
+    "interface",
+    "objectType",
+    "objectType1",
+    "objectType10",
+    "objectType13",
+    "objectType4",
+    "objectType7",
+    "packingType",
+    "packingType19",
+    "packingType21",
+    "propertyType",
+    "propertyType11",
+    "propertyType14",
+    "propertyType17",
+    "propertyType2",
+    "propertyType20",
+    "propertyType22",
+    "propertyType5",
+    "propertyType8",
+    "requiresType",
+    "signalType",
+    "signalType15",
+    "signalType18"
+]
diff --git a/gui/generateds_gui.glade b/gui/generateds_gui.glade
index 763ed91..a64fc51 100644
--- a/gui/generateds_gui.glade
+++ b/gui/generateds_gui.glade
@@ -1,89 +1,186 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
 <interface>
-  <requires lib="gtk+" version="2.16"/>
-  <!-- interface-naming-policy project-wide -->
+  <requires lib="gtk+" version="3.0"/>
+  <object class="GtkAccelGroup" id="accelgroup1"/>
+  <object class="GtkDialog" id="content_dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Messages and Content</property>
+    <property name="default_width">800</property>
+    <property name="default_height">600</property>
+    <property name="type_hint">normal</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox3">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="content_dialog_ok_button">
+                <property name="label" translatable="yes">OK</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="activate" handler="on_ok_button_activate" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolledwindow1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="min_content_width">250</property>
+            <property name="min_content_height">500</property>
+            <child>
+              <object class="GtkTextView" id="content_textview">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="editable">False</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">content_dialog_ok_button</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkImage" id="image1">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-save</property>
+  </object>
+  <object class="GtkImage" id="image2">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-save-as</property>
+  </object>
+  <object class="GtkImage" id="image3">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-open</property>
+  </object>
+  <object class="GtkImage" id="image4">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-clear</property>
+  </object>
   <object class="GtkWindow" id="window1">
+    <property name="can_focus">False</property>
     <accel-groups>
       <group name="accelgroup1"/>
     </accel-groups>
-    <signal name="delete_event" handler="on_window_delete_event"/>
+    <signal name="delete-event" handler="on_window_delete_event" swapped="no"/>
     <child>
       <object class="GtkVBox" id="vbox1">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <child>
           <object class="GtkMenuBar" id="menubar1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <child>
               <object class="GtkMenuItem" id="menuitem1">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_File</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="menu1">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkImageMenuItem" id="clear_menuitem">
                         <property name="label">Clear</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="image">image4</property>
                         <property name="use_stock">False</property>
                         <property name="accel_group">accelgroup1</property>
+                        <signal name="activate" handler="on_clear_menuitem_activate" swapped="no"/>
                         <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_clear_menuitem_activate"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="open_session_menuitem">
                         <property name="label">_Load session</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Load a previous saved session.</property>
                         <property name="use_underline">True</property>
                         <property name="image">image3</property>
                         <property name="use_stock">False</property>
                         <property name="accel_group">accelgroup1</property>
+                        <signal name="activate" handler="on_open_session_menuitem_activate" swapped="no"/>
                         <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_open_session_menuitem_activate"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="save_session_menuitem">
                         <property name="label">_Save session</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Save the current session.</property>
                         <property name="use_underline">True</property>
                         <property name="image">image1</property>
                         <property name="use_stock">False</property>
                         <property name="accel_group">accelgroup1</property>
+                        <signal name="activate" handler="on_save_session_menuitem_activate" swapped="no"/>
                         <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_save_session_menuitem_activate"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="save_session_as_menuitem">
                         <property name="label">Save session as ...</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Save the current session in
 file chosen by the user.</property>
                         <property name="image">image2</property>
                         <property name="use_stock">False</property>
                         <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_save_session_as_menuitem_activate"/>
+                        <signal name="activate" handler="on_save_session_as_menuitem_activate" swapped="no"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkSeparatorMenuItem" id="menuitem5">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="imagemenuitem5">
                         <property name="label">gtk-quit</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Exit from the application.</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_quit_menu_item_activate"/>
+                        <signal name="activate" handler="on_quit_menu_item_activate" swapped="no"/>
                       </object>
                     </child>
                   </object>
@@ -93,30 +190,34 @@ file chosen by the user.</property>
             <child>
               <object class="GtkMenuItem" id="menuitem2">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Tools</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="menu2">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkMenuItem" id="capture_cl_menuitem">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Capture the command line that would be used
 to generate the bindings modules.</property>
                         <property name="label" translatable="yes">_Capture CL</property>
                         <property name="use_underline">True</property>
+                        <signal name="activate" handler="on_capture_cl_menuitem_activate" swapped="no"/>
                         <accelerator key="t" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_capture_cl_menuitem_activate"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkMenuItem" id="generate_menuitem">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property>
                         <property name="label" translatable="yes">_Generate</property>
                         <property name="use_underline">True</property>
+                        <signal name="activate" handler="on_generate_menuitem_activate" swapped="no"/>
                         <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_generate_menuitem_activate"/>
                       </object>
                     </child>
                   </object>
@@ -126,19 +227,22 @@ to generate the bindings modules.</property>
             <child>
               <object class="GtkMenuItem" id="menuitem4">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Help</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="menu3">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkImageMenuItem" id="imagemenuitem10">
                         <property name="label">gtk-about</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_about_menu_item_activate"/>
+                        <signal name="activate" handler="on_about_menu_item_activate" swapped="no"/>
                       </object>
                     </child>
                   </object>
@@ -148,1099 +252,1384 @@ to generate the bindings modules.</property>
           </object>
           <packing>
             <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="position">0</property>
           </packing>
         </child>
         <child>
-          <object class="GtkTable" id="table1">
+          <object class="GtkScrolledWindow" id="scrolledwindow2">
             <property name="visible">True</property>
-            <property name="n_rows">23</property>
-            <property name="n_columns">4</property>
-            <child>
-              <object class="GtkLabel" id="label1">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Input schema file:</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label2">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Output superclass file:</property>
-              </object>
-              <packing>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label3">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Output subclass file:</property>
-              </object>
-              <packing>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label4">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Overwrite without asking:</property>
-              </object>
-              <packing>
-                <property name="top_attach">3</property>
-                <property name="bottom_attach">4</property>
-              </packing>
-            </child>
+            <property name="can_focus">True</property>
+            <property name="shadow_type">in</property>
+            <property name="min_content_width">1000</property>
+            <property name="min_content_height">600</property>
             <child>
-              <object class="GtkCheckButton" id="force_checkbutton">
-                <property name="label" translatable="yes">Force</property>
+              <object class="GtkViewport" id="viewport1">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Always overwrite output files.
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkTable" id="table1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="n_rows">29</property>
+                    <property name="n_columns">4</property>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Input schema file:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Output superclass file:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Output subclass file:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Overwrite without asking:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">3</property>
+                        <property name="bottom_attach">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="force_checkbutton">
+                        <property name="label" translatable="yes">Force</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Always overwrite output files.
 Do not ask for confirmation.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">3</property>
-                <property name="bottom_attach">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="input_schema_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">3</property>
+                        <property name="bottom_attach">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="input_schema_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">The path and name of the
 input XML schema defining the
 bindings to be generated.</property>
-                <property name="invisible_char">●</property>
-                <property name="width_chars">80</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="output_superclass_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the output file
+                        <property name="invisible_char">●</property>
+                        <property name="width_chars">80</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="output_superclass_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">The path and name of the output file
 to be generated and to contain the 
 superclasses.</property>
-                <property name="invisible_char">●</property>
-                <signal name="changed" handler="on_output_superclass_entry_changed"/>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="output_subclass_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the output file
+                        <property name="invisible_char">●</property>
+                        <signal name="changed" handler="on_output_superclass_entry_changed" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="output_subclass_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">The path and name of the output file
 to be generated and to contain the 
 subclasses.</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label5">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Prefix (for class names):</property>
-              </object>
-              <packing>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="prefix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Prefix for class names.</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label6">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Namespace prefix:</property>
-              </object>
-              <packing>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="namespace_prefix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
-                <property name="tooltip_text" translatable="yes">Override default namespace
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label5">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Prefix (for class names):</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">4</property>
+                        <property name="bottom_attach">5</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="prefix_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Prefix for class names.</property>
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">4</property>
+                        <property name="bottom_attach">5</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label6">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Namespace prefix:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">5</property>
+                        <property name="bottom_attach">6</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="namespace_prefix_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+                        <property name="tooltip_text" translatable="yes">Override default namespace
 prefix in schema file.
 Example: -a "xsd:"
 Default: "xs:".</property>
-                <property name="invisible_char">●</property>
-                <signal name="changed" handler="on_namespace_prefix_entry_changed"/>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label7">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Behavior file name:</property>
-              </object>
-              <packing>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="behavior_filename_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Input file name for behaviors
+                        <property name="invisible_char">●</property>
+                        <signal name="changed" handler="on_namespace_prefix_entry_changed" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">5</property>
+                        <property name="bottom_attach">6</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label7">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Behavior file name:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="behavior_filename_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Input file name for behaviors
 added to subclasses.</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label8">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Generate Python properties:</property>
-              </object>
-              <packing>
-                <property name="top_attach">7</property>
-                <property name="bottom_attach">8</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="properties_checkbutton">
-                <property name="label" translatable="yes">Properties</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Generate Python properties for member variables
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label8">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Generate Python properties:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">7</property>
+                        <property name="bottom_attach">8</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="properties_checkbutton">
+                        <property name="label" translatable="yes">Properties</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Generate Python properties for member variables
 so that the value can be retrieved and modified
 without calling getter and setter functions.
 </property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">7</property>
-                <property name="bottom_attach">8</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label9">
-                <property name="visible">True</property>
-                <property name="tooltip_text" translatable="yes">Search these directories for additional
-schema files</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Search path:</property>
-              </object>
-              <packing>
-                <property name="top_attach">8</property>
-                <property name="bottom_attach">9</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="search_path_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Search these directories for additional
-schema files.</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">8</property>
-                <property name="bottom_attach">9</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label10">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Subclass suffix:</property>
-              </object>
-              <packing>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="subclass_suffix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names.
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">7</property>
+                        <property name="bottom_attach">8</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label10">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Subclass suffix:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">9</property>
+                        <property name="bottom_attach">10</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="subclass_suffix_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names.
 Default="Sub".</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label11">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Root element:</property>
-              </object>
-              <packing>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="root_element_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Assume that this value is the name
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">9</property>
+                        <property name="bottom_attach">10</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label11">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Root element:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">10</property>
+                        <property name="bottom_attach">11</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="root_element_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Assume that this value is the name
 of the root element of instance docs.
 Default is first element defined in schema.</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="input_schema_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the input schema file.</property>
-                <signal name="clicked" handler="on_input_schema_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_superclass_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property>
-                <signal name="clicked" handler="on_output_superclass_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_subclass_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property>
-                <signal name="clicked" handler="on_output_subclass_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="behavior_filename_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the nput file name for
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">10</property>
+                        <property name="bottom_attach">11</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="input_schema_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the input schema file.</property>
+                        <signal name="clicked" handler="on_input_schema_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_superclass_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property>
+                        <signal name="clicked" handler="on_output_superclass_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_subclass_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property>
+                        <signal name="clicked" handler="on_output_subclass_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="behavior_filename_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the nput file name for
 behaviors added to subclasses.</property>
-                <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label12">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Superclass module:</property>
-              </object>
-              <packing>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="superclass_module_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Superclass module name in subclass module.
+                        <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label12">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Superclass module:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">11</property>
+                        <property name="bottom_attach">12</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="superclass_module_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Superclass module name in subclass module.
 Default="???".</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label13">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Use old getters and setters:</property>
-              </object>
-              <packing>
-                <property name="top_attach">12</property>
-                <property name="bottom_attach">13</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="old_getters_setters_checkbutton">
-                <property name="label" translatable="yes">Old getters and setters</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(),
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">11</property>
+                        <property name="bottom_attach">12</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label13">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Use old getters and setters:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">12</property>
+                        <property name="bottom_attach">13</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="old_getters_setters_checkbutton">
+                        <property name="label" translatable="yes">Old getters and setters</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(),
 instead of get_var() and set_var().</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">12</property>
-                <property name="bottom_attach">13</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label14">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Validator bodies path:</property>
-              </object>
-              <packing>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label15">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">User methods module:</property>
-              </object>
-              <packing>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label16">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No dates:</property>
-              </object>
-              <packing>
-                <property name="top_attach">15</property>
-                <property name="bottom_attach">16</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label17">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No versions:</property>
-              </object>
-              <packing>
-                <property name="top_attach">16</property>
-                <property name="bottom_attach">17</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_dates_checkbutton">
-                <property name="label" translatable="yes">No dates in generated output</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not include the current date in the generated
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">12</property>
+                        <property name="bottom_attach">13</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label14">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Validator bodies path:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">13</property>
+                        <property name="bottom_attach">14</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label15">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">User methods module:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">14</property>
+                        <property name="bottom_attach">15</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label16">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">No dates:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">15</property>
+                        <property name="bottom_attach">16</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label17">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">No versions:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">16</property>
+                        <property name="bottom_attach">17</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="no_dates_checkbutton">
+                        <property name="label" translatable="yes">No dates in generated output</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Do not include the current date in the generated
 files. This is useful if you want to minimize
 the amount of (no-operation) changes to the
 generated python code.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">15</property>
-                <property name="bottom_attach">16</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="validator_bodies_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">15</property>
+                        <property name="bottom_attach">16</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="validator_bodies_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide
 bodies (implementations) of validator methods.</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="validator_bodies_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">13</property>
+                        <property name="bottom_attach">14</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="validator_bodies_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide
 bodies (implementations) of validator methods.</property>
-                <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_versions_checkbutton">
-                <property name="label" translatable="yes">No version info in generated output</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not include the current version in the generated
+                        <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">13</property>
+                        <property name="bottom_attach">14</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="no_versions_checkbutton">
+                        <property name="label" translatable="yes">No version info in generated output</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Do not include the current version in the generated
 files. This is useful if you want to minimize
 the amount of (no-operation) changes to the
 generated python code.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">16</property>
-                <property name="bottom_attach">17</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="user_methods_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods.  See
-section "User Methods" in the documentation.</property>
-                <signal name="clicked" handler="on_user_methods_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="user_methods_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Optional module containing user methods.  See
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">16</property>
+                        <property name="bottom_attach">17</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="user_methods_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods.  See
 section "User Methods" in the documentation.</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label18">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No process includes:</property>
-              </object>
-              <packing>
-                <property name="top_attach">17</property>
-                <property name="bottom_attach">18</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label19">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Silence:</property>
-              </object>
-              <packing>
-                <property name="top_attach">18</property>
-                <property name="bottom_attach">19</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_process_includes_checkbutton">
-                <property name="label" translatable="yes">Do not process includes in schema</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not process included XML Schema files.  By
+                        <signal name="clicked" handler="on_user_methods_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">14</property>
+                        <property name="bottom_attach">15</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="user_methods_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Optional module containing user methods.  See
+section "User Methods" in the documentation.</property>
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">14</property>
+                        <property name="bottom_attach">15</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label18">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">No process includes:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">17</property>
+                        <property name="bottom_attach">18</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label19">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Silence:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">18</property>
+                        <property name="bottom_attach">19</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="no_process_includes_checkbutton">
+                        <property name="label" translatable="yes">Do not process includes in schema</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Do not process included XML Schema files.  By
 default, generateDS.py will insert content
 from files referenced by &lt;include ... /&gt;
 elements into the XML Schema to be processed.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">17</property>
-                <property name="bottom_attach">18</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="silence_checkbutton">
-                <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">17</property>
+                        <property name="bottom_attach">18</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="silence_checkbutton">
+                        <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS
 echoes the information being parsed. Use
 this option to turn off that behavior.
 </property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">18</property>
-                <property name="bottom_attach">19</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label20">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Namespace definitions:</property>
-              </object>
-              <packing>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label21">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">External encoding:</property>
-              </object>
-              <packing>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label22">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Member specs:</property>
-              </object>
-              <packing>
-                <property name="top_attach">22</property>
-                <property name="bottom_attach">23</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="namespace_defs_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">18</property>
+                        <property name="bottom_attach">19</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label20">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Namespace definitions:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">19</property>
+                        <property name="bottom_attach">20</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label21">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">External encoding:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">20</property>
+                        <property name="bottom_attach">21</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label22">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Member specs:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">22</property>
+                        <property name="bottom_attach">23</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="namespace_defs_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the
 value for the namespacedef_ parameter of
 the export() method by the generated
 parse() and parseString() functions.
 Default=''.  Example:
 xmlns:abc="http://www.abc.com"</property>
-                <property name="invisible_char">●</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="external_encoding_entry">
-                <property name="visible">True</property>
-                <property name="tooltip_text" translatable="yes">Encode output written by the generated export
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">19</property>
+                        <property name="bottom_attach">20</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="external_encoding_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Encode output written by the generated export
 methods using this encoding.  Default, if omitted,
 is the value returned by sys.getdefaultencoding().
 Example: utf-8.</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="member_specs_combobox_container">
-                <property name="visible">True</property>
-                <child>
-                  <placeholder/>
-                </child>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">22</property>
-                <property name="bottom_attach">23</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton">
-                <property name="label" translatable="yes">Empty</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Assume an empty namespace
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">20</property>
+                        <property name="bottom_attach">21</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkHBox" id="member_specs_combobox_container">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">22</property>
+                        <property name="bottom_attach">23</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton">
+                        <property name="label" translatable="yes">Empty</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Assume an empty namespace
 prefix in the XML schema, not
 the default ("xs:").</property>
-                <property name="draw_indicator">True</property>
-                <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="auto_super_checkbutton">
-                <property name="label" translatable="yes">Auto</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Use the superclass file name
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">5</property>
+                        <property name="bottom_attach">6</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="auto_super_checkbutton">
+                        <property name="label" translatable="yes">Auto</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Use the superclass file name
 stem as the super-class module
 name.</property>
-                <property name="draw_indicator">True</property>
-                <signal name="toggled" handler="on_auto_super_checkbutton_toggled"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="input_schema_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_superclass_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_subclass_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="prefix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="namespace_prefix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="behavior_filename_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="search_path_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the search path entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">8</property>
-                <property name="bottom_attach">9</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="subclass_suffix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="root_element_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the root element entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="superclass_module_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="validator_bodies_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="user_methods_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="namespace_defs_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="external_encoding_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label23">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Get encoded</property>
-              </object>
-              <packing>
-                <property name="top_attach">21</property>
-                <property name="bottom_attach">22</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="get_encoded_checkbutton">
-                <property name="label" translatable="yes">Getters return encoded values by default</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Getters return encoded value by default if true.
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="on_auto_super_checkbutton_toggled" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">11</property>
+                        <property name="bottom_attach">12</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="input_schema_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_superclass_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_subclass_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="prefix_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">4</property>
+                        <property name="bottom_attach">5</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="namespace_prefix_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">5</property>
+                        <property name="bottom_attach">6</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="behavior_filename_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="subclass_suffix_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">9</property>
+                        <property name="bottom_attach">10</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="root_element_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the root element entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">10</property>
+                        <property name="bottom_attach">11</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="superclass_module_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">11</property>
+                        <property name="bottom_attach">12</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="validator_bodies_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">13</property>
+                        <property name="bottom_attach">14</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="user_methods_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">14</property>
+                        <property name="bottom_attach">15</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="namespace_defs_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">19</property>
+                        <property name="bottom_attach">20</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="external_encoding_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">20</property>
+                        <property name="bottom_attach">21</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label23">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Get encoded:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">21</property>
+                        <property name="bottom_attach">22</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="get_encoded_checkbutton">
+                        <property name="label" translatable="yes">Getters return encoded values by default</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Getters return encoded value by default if true.
 Can be changed at run-time by either
 (1) changing global variable GetEncodedValue or
 (2) using optional parameter to getter.</property>
-                <property name="draw_indicator">True</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">21</property>
+                        <property name="bottom_attach">22</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label24">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Exports:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">23</property>
+                        <property name="bottom_attach">24</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="export_spec_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Specifies export functions to be generated.  Value is a whitespace separated list of any of the following: "write" (write XML to file), "literal" (write out python code), "etree" (build element tree (can serialize to XML)).            Example: "write etree".  Default: "write".</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">23</property>
+                        <property name="bottom_attach">24</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label25">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">One file per XSD:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">24</property>
+                        <property name="bottom_attach">25</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="one_file_per_xsd_checkbutton">
+                        <property name="label" translatable="yes">Create a python module for each XSD processed.</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Create a python module for each XSD processed.</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">24</property>
+                        <property name="bottom_attach">25</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label26">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Output directory:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">25</property>
+                        <property name="bottom_attach">26</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="output_directory_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Used in conjunction with --one-file-per-xsd.  The directory where the modules will be created.</property>
+                        <property name="invisible_char">●</property>
+                        <property name="width_chars">80</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">25</property>
+                        <property name="bottom_attach">26</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_directory_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the output directory for one-file-per-xsd.</property>
+                        <signal name="clicked" handler="on_output_directory_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">25</property>
+                        <property name="bottom_attach">26</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_directory_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the output directory entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">25</property>
+                        <property name="bottom_attach">26</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="export_spec_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the exports entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">23</property>
+                        <property name="bottom_attach">24</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label27">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Module suffix:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">26</property>
+                        <property name="bottom_attach">27</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label28">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Preserve CData tags:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">27</property>
+                        <property name="bottom_attach">28</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label29">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Cleanup name list:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">28</property>
+                        <property name="bottom_attach">29</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="module_suffix_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">To be used in conjunction with --one-file-per-xsd.  Append XXX to the end of each file created.</property>
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">26</property>
+                        <property name="bottom_attach">27</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="cleanup_name_list_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Specifies list of 2-tuples used for cleaning names.  First element is a regular expression search pattern and second is a replacement. Example: "[('[-:.]', '_'), ('^__', 'Special')]".  Default: "[('[-:.]', '_')]".</property>
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">28</property>
+                        <property name="bottom_attach">29</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="preserve_cdata_tags_checkbutton">
+                        <property name="label" translatable="yes">Preserve CData tags</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Preserve CDATA tags.  Default: False.</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">27</property>
+                        <property name="bottom_attach">28</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="module_suffix_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the module suffix entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">26</property>
+                        <property name="bottom_attach">27</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="cleanup_name_list_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the cleanup name list entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">28</property>
+                        <property name="bottom_attach">29</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
+                </child>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">21</property>
-                <property name="bottom_attach">22</property>
-              </packing>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
             </child>
           </object>
           <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
             <property name="position">1</property>
           </packing>
         </child>
         <child>
           <object class="GtkHBox" id="hbox1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="homogeneous">True</property>
             <child>
               <object class="GtkButton" id="generate_button">
@@ -1249,9 +1638,11 @@ Can be changed at run-time by either
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property>
-                <signal name="clicked" handler="on_generate_button_clicked"/>
+                <signal name="clicked" handler="on_generate_button_clicked" swapped="no"/>
               </object>
               <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
                 <property name="position">0</property>
               </packing>
             </child>
@@ -1262,24 +1653,30 @@ Can be changed at run-time by either
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="tooltip_text" translatable="yes">Exit from the application.</property>
-                <signal name="clicked" handler="on_quit_button_clicked"/>
+                <signal name="clicked" handler="on_quit_button_clicked" swapped="no"/>
               </object>
               <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
                 <property name="position">1</property>
               </packing>
             </child>
           </object>
           <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
             <property name="position">2</property>
           </packing>
         </child>
         <child>
           <object class="GtkStatusbar" id="statusbar1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="spacing">2</property>
           </object>
           <packing>
             <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="position">3</property>
           </packing>
         </child>
@@ -1289,84 +1686,9 @@ Can be changed at run-time by either
       </object>
     </child>
   </object>
-  <object class="GtkAccelGroup" id="accelgroup1"/>
-  <object class="GtkDialog" id="content_dialog">
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">Messages and Content</property>
-    <property name="default_width">800</property>
-    <property name="default_height">600</property>
-    <property name="type_hint">normal</property>
-    <child internal-child="vbox">
-      <object class="GtkVBox" id="dialog-vbox3">
-        <property name="visible">True</property>
-        <property name="spacing">2</property>
-        <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow1">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hscrollbar_policy">automatic</property>
-            <property name="vscrollbar_policy">automatic</property>
-            <child>
-              <object class="GtkTextView" id="content_textview">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="editable">False</property>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area3">
-            <property name="visible">True</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="content_dialog_ok_button">
-                <property name="label" translatable="yes">OK</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <signal name="activate" handler="on_ok_button_activate"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="0">content_dialog_ok_button</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkImage" id="image1">
-    <property name="visible">True</property>
-    <property name="stock">gtk-save</property>
-  </object>
-  <object class="GtkImage" id="image2">
-    <property name="visible">True</property>
-    <property name="stock">gtk-save-as</property>
-  </object>
-  <object class="GtkImage" id="image3">
-    <property name="visible">True</property>
-    <property name="stock">gtk-open</property>
-  </object>
-  <object class="GtkImage" id="image4">
-    <property name="visible">True</property>
-    <property name="stock">gtk-clear</property>
-  </object>
   <object class="GtkImage" id="image5">
     <property name="visible">True</property>
+    <property name="can_focus">False</property>
     <property name="stock">gtk-missing-image</property>
   </object>
 </interface>
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index 272b6e7..41864be 100755
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -1,14 +1,24 @@
 #!/usr/bin/env python
-
 import sys
 import os
 from optparse import OptionParser
-from ConfigParser import ConfigParser
-from xml.dom import minidom
+from configparser import ConfigParser
 from xml.parsers import expat
 import subprocess
 import re
-import gtk
+import locale
+import gettext
+
+
+if sys.version_info.major == 2:
+    import gtk
+else:
+    # https://sourceforge.net/projects/pygobjectwin32/files/
+    # https://blogs.gnome.org/kittykat/2014/01/29/developing-gtk-3-apps-with-python-on-windows/
+    import gi
+    gi.require_version('Gtk', '3.0')
+    from gi.repository import Gtk as gtk
+
 # import pango
 from libgenerateDS.gui import generateds_gui_session
 #import generateds_gui_session
@@ -20,7 +30,7 @@ from libgenerateDS.gui import generateds_gui_session
 ## ipshell = IPShellEmbed(args,
 ##     banner = 'Dropping into IPython',
 ##     exit_msg = 'Leaving Interpreter, back to program.')
-## 
+##
 # Then use the following line where and when you want to drop into the
 # IPython shell:
 #    ipshell('<some message> -- Entering ipshell.\\nHit Ctrl-D to exit')
@@ -31,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.11b'
+VERSION = '2.24b'
 ##VERSION##
 
 
@@ -59,9 +69,15 @@ CmdTemplate = (
     '%(namespace_defs)s' +
     '%(external_encoding)s' +
     '%(member_specs)s' +
+    '%(export_spec)s' +
+    '%(one_file_per_xsd)s' +
+    '%(output_directory)s' +
+    '%(module_suffix)s' +
+    '%(preserve_cdata_tags)s' +
+    '%(cleanup_name_list)s' +
     ' %(input_schema)s' +
     ''
-    )
+)
 CaptureCmdTemplate = (
     '%(exec_path)s --no-questions' +
     '%(force)s' +
@@ -84,14 +100,20 @@ CaptureCmdTemplate = (
     '%(namespace_defs)s' +
     '%(external_encoding)s' +
     '%(member_specs)s' +
+    '%(export_spec)s' +
+    '%(one_file_per_xsd)s' +
+    '%(output_directory)s' +
+    '%(module_suffix)s' +
+    '%(preserve_cdata_tags)s' +
+    '%(cleanup_name_list)s' +
     ' \\\n    %(input_schema)s' +
     ''
-    )
+)
 ErrorMessages = [
     '',
     'Must enter input schema name.',
     'Must enter either output superclass name or output subclass file name.',
-    ]
+]
 Memberspecs_tooltip_text = '''\
 Generate member (type) specifications in each
 class: a dictionary of instances of class
@@ -110,12 +132,24 @@ class UIItemSpec(object):
         self.name = name
         self.ui_type = ui_type
         self.access_action = access_action
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def get_ui_type(self): return self.ui_type
-    def set_ui_type(self, ui_type): self.ui_type = ui_type
-    def get_access_action(self): return self.access_action
-    def set_access_action(self, access_action): self.access_action = access_action
+
+    def get_name(self):
+        return self.name
+
+    def set_name(self, name):
+        self.name = name
+
+    def get_ui_type(self):
+        return self.ui_type
+
+    def set_ui_type(self, ui_type):
+        self.ui_type = ui_type
+
+    def get_access_action(self):
+        return self.access_action
+
+    def set_access_action(self, access_action):
+        self.access_action = access_action
 
 
 class GeneratedsGui(object):
@@ -124,6 +158,7 @@ class GeneratedsGui(object):
         global Builder
         # Default values
         Builder = gtk.Builder()
+        Builder.set_translation_domain('generateds_gui')
         self.options = options
         # self.ui_spec_filename = ui_spec_filename
         self.filename = None
@@ -132,11 +167,12 @@ class GeneratedsGui(object):
         self.ui_obj_dict = {}
         self.session_filename = None
         self.current_folder = None
-        # use GtkBuilder to build our interface from the XML file 
+        # use GtkBuilder to build our interface from the XML file
         ui_spec_filename = options.impl_gui
         try:
             if ui_spec_filename is None:
-                Builder.add_from_string(Ui_spec, len(Ui_spec))
+                Builder.add_from_string(branch_version(
+                    'Ui_spec, len(Ui_spec)', 'Ui_spec'))
             else:
                 Builder.add_from_file(ui_spec_filename)
         except:
@@ -153,14 +189,16 @@ class GeneratedsGui(object):
                 setattr(self, s1, bgo(s1))
                 self.ui_obj_dict[s1] = bgo(s1)
         # Create the member-specs combobox.
-        member_specs_combobox = gtk.combo_box_new_text()
+        member_specs_combobox = branch_version(
+            'gtk.combo_box_new_text()', 'gtk.ComboBoxText()')
         member_specs_combobox.set_name('member_specs_combobox')
         member_specs_combobox.set_tooltip_text(Memberspecs_tooltip_text)
         self.ui_obj_dict['member_specs_combobox'] = member_specs_combobox
         member_specs_combobox.append_text("none")
         member_specs_combobox.append_text("list")
         member_specs_combobox.append_text("dict")
-        member_specs_combobox_container = bgo('member_specs_combobox_container')
+        member_specs_combobox_container = bgo(
+            'member_specs_combobox_container')
         member_specs_combobox_container.add(member_specs_combobox)
         member_specs_combobox.set_active(0)
         member_specs_combobox.show()
@@ -169,9 +207,12 @@ class GeneratedsGui(object):
         Builder.connect_signals(self)
         Builder.connect_signals(self.content_dialog)
         # set the default icon to the GTK "edit" icon
-        gtk.window_set_default_icon_name(gtk.STOCK_EDIT)
+        branch_version(
+            'gtk.window_set_default_icon_name(gtk.STOCK_EDIT)',
+            'gtk.Window.set_default_icon_name(gtk.STOCK_EDIT)')
         # setup and initialize our statusbar
-        self.statusbar_cid = self.statusbar.get_context_id("Tutorial GTK+ Text Editor")
+        self.statusbar_cid = self.statusbar.get_context_id(
+            "Tutorial GTK+ Text Editor")
         self.reset_default_status()
         self.params = generateds_gui_session.sessionType()
         # Load a session if specified.
@@ -187,8 +228,8 @@ class GeneratedsGui(object):
             self.trans_gui_2_obj()
             self.saved_params = self.params.copy()
 
-    # When our window is destroyed, we want to break out of the GTK main loop. 
-    # We do this by calling gtk_main_quit(). We could have also just specified 
+    # When our window is destroyed, we want to break out of the GTK main loop.
+    # We do this by calling gtk_main_quit(). We could have also just specified
     # gtk_main_quit as the handler in Glade!
     def on_window_destroy(self, widget, data=None):
         self.trans_gui_2_obj()
@@ -196,23 +237,40 @@ class GeneratedsGui(object):
 ##         self.dump_params('params:', self.params)
         if self.params != self.saved_params:
             message = 'Session data has changed.\n\nSave?'
-            dialog = gtk.MessageDialog(None,
-                gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                gtk.MESSAGE_ERROR,
-                gtk.BUTTONS_NONE,
-                message)
-            dialog.add_buttons(
-                gtk.STOCK_YES, gtk.RESPONSE_YES,
-                '_Discard', 1,
-                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+            if sys.version_info.major == 2:
+                dialog = gtk.MessageDialog(
+                    None,
+                    gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+                    gtk.MESSAGE_ERROR,
+                    gtk.BUTTONS_NONE,
+                    message)
+                dialog.add_buttons(
+                    gtk.STOCK_YES, gtk.RESPONSE_YES,
+                    '_Discard', 1,
+                    gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                )
+            else:
+                dialog = gtk.MessageDialog(
+                    None,
+                    (gtk.DialogFlags.MODAL |
+                        gtk.DialogFlags.DESTROY_WITH_PARENT),
+                    gtk.MessageType.ERROR,
+                    gtk.ButtonsType.NONE,
+                    message)
+                dialog.add_buttons(
+                    gtk.STOCK_YES, gtk.ResponseType.YES,
+                    '_Discard', 1,
+                    gtk.STOCK_CANCEL, gtk.ResponseType.CANCEL,
                 )
             response = dialog.run()
             dialog.destroy()
-            if response == gtk.RESPONSE_YES:
+            if response == branch_version(
+                    'gtk.RESPONSE_YES', 'gtk.ResponseType.YES'):
                 self.save_session_action()
             elif response == 1:
                 pass
-            elif response == gtk.RESPONSE_CANCEL:
+            elif response == branch_version(
+                    'gtk.RESPONSE_CANCEL', 'gtk.ResponseType.CANCEL'):
                 return
         gtk.main_quit()
 
@@ -227,7 +285,7 @@ class GeneratedsGui(object):
 
     # Get the values from the widgets in the UI.
     # Format the command line.
-    # Generate the output files.    
+    # Generate the output files.
     def on_generate_menuitem_activate(self, menuitem, data=None):
         self.trans_gui_2_obj()
         params_dict = self.trans_params_2_dict()
@@ -257,6 +315,8 @@ class GeneratedsGui(object):
             cmd = cmd.replace(' --', ' \\\n    --')
             cmd = cmd.replace(' -o', ' \\\n    -o')
             cmd = cmd.replace(' -s', ' \\\n    -s')
+            cmd = cmd.replace(' -f', ' \\\n    -f')
+            cmd = cmd.replace(' -m', ' \\\n    -m')
             self.display_content('Command line', cmd)
         return True
 
@@ -274,8 +334,9 @@ class GeneratedsGui(object):
                     else:
                         self.params.set_member_specs('none')
                 else:
-                    s2 = '%s_%s' % (item.get_name(), item.get_ui_type(), )
-                    method = getattr(ui_obj, 'get_%s' % item.get_access_action())
+                    #s2 = '%s_%s' % (item.get_name(), item.get_ui_type(), )
+                    method = getattr(
+                        ui_obj, 'get_%s' % item.get_access_action())
                     value = method()
                     setattr(self.params, item.get_name(), value)
 
@@ -300,12 +361,13 @@ class GeneratedsGui(object):
                             value = False
                         elif item.get_ui_type() == 'combobox':
                             value = 0
-                    method = getattr(ui_obj,
+                    method = getattr(
+                        ui_obj,
                         'set_%s' % item.get_access_action())
                     method(value)
 
     def dump_params(self, msg, params):
-        print msg
+        print(msg)
         params.export(sys.stdout, 0, name_='session')
 
     def trans_params_2_dict(self):
@@ -323,35 +385,62 @@ class GeneratedsGui(object):
             self.transform_1_param(params, pd, 'namespace_prefix', 'a')
         self.transform_1_param(params, pd, 'behavior_filename', 'b')
         pd['properties'] = (' -m' if params.get_properties() else '')
-        self.transform_1_param(params, pd, 'subclass_suffix', 'subclass-suffix', True)
-        self.transform_1_param(params, pd, 'root_element', 'root-element', True)
-        self.transform_1_param(params, pd, 'superclass_module', 'super', True)
-        pd['old_getters_setters'] = (' --use-old-getter-setter' if params.get_old_getters_setters() else '')
-        self.transform_1_param(params, pd, 'user_methods', 'user-methods', True)
-        self.transform_1_param(params, pd, 'validator_bodies', 'validator-bodies', True)
+        self.transform_1_param(
+            params, pd, 'subclass_suffix', 'subclass-suffix', True)
+        self.transform_1_param(
+            params, pd, 'root_element', 'root-element', True)
+        self.transform_1_param(
+            params, pd, 'superclass_module', 'super', True)
+        pd['old_getters_setters'] = (
+            ' --use-old-getter-setter'
+            if params.get_old_getters_setters()
+            else '')
+        self.transform_1_param(
+            params, pd, 'user_methods', 'user-methods', True)
+        self.transform_1_param(
+            params, pd, 'validator_bodies', 'validator-bodies', True)
         pd['no_dates'] = (' --no-dates' if params.get_no_dates() else '')
-        pd['no_versions'] = (' --no-versions' if params.get_no_versions() else '')
-        pd['no_process_includes'] = (' --no-process-includes' if params.get_no_process_includes() else '')
+        pd['no_versions'] = (
+            ' --no-versions' if params.get_no_versions() else '')
+        pd['no_process_includes'] = (
+            ' --no-process-includes'
+            if params.get_no_process_includes()
+            else '')
         pd['silence'] = (' --silence' if params.get_silence() else '')
         # Special case for namespacedefs because of quoting.
-        #self.transform_1_param(params, pd, 'namespace_defs', 'namespacedef', True)
         name = 'namespace_defs'
         flag = 'namespacedef'
         value = getattr(params, name)
         params_dict[name] = (
-                " --%s='%s'" % (flag, value, )
-                if value.strip()
-                else '')
-        self.transform_1_param(params, pd, 'external_encoding', 'external-encoding', True)
+            " --%s='%s'" % (flag, value, )
+            if value.strip()
+            else '')
+        self.transform_1_param(
+            params, pd, 'external_encoding', 'external-encoding', True)
         if params.get_member_specs() == 'list':
             pd['member_specs'] = ' --member-specs=list'
         elif params.get_member_specs() == 'dict':
             pd['member_specs'] = ' --member-specs=dict'
         else:
             pd['member_specs'] = ''
+        self.transform_1_param(
+            params, pd, 'export_spec', 'export', True)
+        pd['one_file_per_xsd'] = (
+            ' --one-file-per-xsd' if params.get_one_file_per_xsd() else '')
+        self.transform_1_param(
+            params, pd, 'output_directory', 'output-directory', True)
+        self.transform_1_param(
+            params, pd, 'module_suffix', 'module-suffix', True)
+        pd['preserve_cdata_tags'] = (
+            ' --preserve-cdata-tags'
+            if params.get_preserve_cdata_tags()
+            else '')
+        self.transform_1_param(
+            params, pd, 'cleanup_name_list', 'cleanup-name-list', True)
         return pd
 
-    def transform_1_param(self, params, params_dict, name, flag, longopt=False):
+    def transform_1_param(
+            self, params, params_dict, name, flag, longopt=False):
         value = getattr(params, name)
         if longopt:
             params_dict[name] = (
@@ -376,26 +465,36 @@ class GeneratedsGui(object):
         msg = ''
         if not p['input_schema']:
             result = 1
-        elif not (p['output_superclass'] or
-            p['output_subclass']):
+        elif not (p['output_superclass'] or p['output_subclass']):
             result = 2
         if result:
             msg = ErrorMessages[result]
         return result, msg
 
-    # Clear all the fields/widgets to default values.    
+    # Clear all the fields/widgets to default values.
     def on_clear_menuitem_activate(self, menuitem, data=None):
         message = 'Clear all entries?\nAre you sure?'
-        dialog = gtk.MessageDialog(
-            None,
-            gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-            gtk.MESSAGE_WARNING,
-            gtk.BUTTONS_OK_CANCEL,
-            message
+
+        if sys.version_info.major == 2:
+            dialog = gtk.MessageDialog(
+                None,
+                gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+                gtk.MESSAGE_WARNING,
+                gtk.BUTTONS_OK_CANCEL,
+                message
+            )
+        else:
+            dialog = gtk.MessageDialog(
+                None,
+                gtk.DialogFlags.MODAL | gtk.DialogFlags.DESTROY_WITH_PARENT,
+                gtk.MessageType.WARNING,
+                gtk.ButtonsType.OK_CANCEL,
+                message
             )
         response = dialog.run()
         dialog.destroy()
-        if response == gtk.RESPONSE_OK:
+        if response == branch_version(
+                'gtk.RESPONSE_OK', 'gtk.ResponseType.OK'):
             self.session_filename = None
             self.params = generateds_gui_session.sessionType(
                 input_schema='',
@@ -421,13 +520,20 @@ class GeneratedsGui(object):
                 namespace_defs='',
                 external_encoding='',
                 member_specs='',
-                )
+                export_spec='',
+                one_file_per_xsd=False,
+                output_directory='',
+                module_suffix='',
+                preserve_cdata_tags=False,
+                cleanup_name_list='',
+            )
             self.trans_obj_2_gui()
 
     def run_command(self, cmd):
-        spobj = subprocess.Popen(cmd,
+        spobj = subprocess.Popen(
+            cmd,
             shell=True,
-            stdout=subprocess.PIPE, 
+            stdout=subprocess.PIPE,
             stderr=subprocess.PIPE,
             close_fds=False)
         outcontent = spobj.stdout.read()
@@ -441,7 +547,9 @@ class GeneratedsGui(object):
             error = True
         if not error:
             msg = 'Successfully generated.'
-            self.error_message(msg, gtk.MESSAGE_INFO)
+            self.error_message(
+                msg,
+                branch_version('gtk.MESSAGE_INFO', 'gtk.MessageType.INFO'))
 
     def display_content(self, title, content):
         #content_dialog = ContentDialog()
@@ -453,28 +561,47 @@ class GeneratedsGui(object):
 ##         self.dump_params('params:', self.params)
         if self.params != self.saved_params:
             message = 'Session data has changed.\n\nSave?'
-            dialog = gtk.MessageDialog(None,
-                gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                gtk.MESSAGE_ERROR,
-                gtk.BUTTONS_NONE,
-                message)
-            dialog.add_buttons(
-                gtk.STOCK_YES, gtk.RESPONSE_YES,
-                '_Discard', 1,
-                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+            if sys.version_info.major == 2:
+                dialog = gtk.MessageDialog(
+                    None,
+                    gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+                    gtk.MESSAGE_ERROR,
+                    gtk.BUTTONS_NONE,
+                    message)
+                dialog.add_buttons(
+                    gtk.STOCK_YES, gtk.RESPONSE_YES,
+                    '_Discard', 1,
+                    gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+                )
+            else:
+                dialog = gtk.MessageDialog(
+                    None,
+                    (gtk.DialogFlags.MODAL |
+                        gtk.DialogFlags.DESTROY_WITH_PARENT),
+                    gtk.MessageType.ERROR,
+                    gtk.ButtonsType.NONE,
+                    message)
+                dialog.add_buttons(
+                    gtk.STOCK_YES, gtk.ResponseType.YES,
+                    '_Discard', 1,
+                    gtk.STOCK_CANCEL, gtk.ResponseType.CANCEL,
                 )
             response = dialog.run()
             dialog.destroy()
-            if response == gtk.RESPONSE_YES:
+            if response == branch_version(
+                    'gtk.RESPONSE_YES', 'gtk.ResponseType.YES'):
                 self.save_session_action()
             elif response == 1:
                 pass
-            elif response == gtk.RESPONSE_CANCEL:
+            elif response == branch_version(
+                    'gtk.RESPONSE_CANCEL', 'gtk.ResponseType.CANCEL'):
                 return
         session_filename = self.choose_filename(
-            gtk.FILE_CHOOSER_ACTION_OPEN,
+            branch_version(
+                'gtk.FILE_CHOOSER_ACTION_OPEN',
+                'gtk.FileChooserAction.OPEN'),
             (('Session *.session', '*.session'),)
-            )
+        )
         if session_filename:
             self.session_filename = session_filename
             self.load_session(self.session_filename)
@@ -488,15 +615,22 @@ class GeneratedsGui(object):
     def save_session_action(self):
         if not self.session_filename:
             filename = self.choose_filename(
-                gtk.FILE_CHOOSER_ACTION_SAVE,
+                branch_version(
+                    'gtk.FILE_CHOOSER_ACTION_SAVE',
+                    'gtk.FileChooserAction.SAVE'),
                 (('Session *.session', '*.session'),),
                 confirm_overwrite=True,
                 initfilename=self.session_filename,
                 buttons=(
-                    gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                    gtk.STOCK_SAVE, gtk.RESPONSE_OK,
-                    )
+                    gtk.STOCK_CANCEL,
+                    branch_version(
+                        'gtk.RESPONSE_CANCEL',
+                        'gtk.ResponseType.CANCEL'),
+                    gtk.STOCK_SAVE, branch_version(
+                        'gtk.RESPONSE_OK',
+                        'gtk.ResponseType.OK'),
                 )
+            )
             if filename:
                 self.session_filename = filename
         if self.session_filename:
@@ -510,15 +644,22 @@ class GeneratedsGui(object):
 
     def on_save_session_as_menuitem_activate(self, menuitem, data=None):
         filename = self.choose_filename(
-            gtk.FILE_CHOOSER_ACTION_SAVE,
+            branch_version(
+                'gtk.FILE_CHOOSER_ACTION_SAVE',
+                'gtk.FileChooserAction.SAVE'),
             (('Session *.session', '*.session'),),
             confirm_overwrite=True,
             initfilename=self.session_filename,
             buttons=(
-                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                gtk.STOCK_SAVE, gtk.RESPONSE_OK,
-                )
+                gtk.STOCK_CANCEL,
+                branch_version(
+                    'gtk.RESPONSE_CANCEL',
+                    'gtk.ResponseType.CANCEL'),
+                gtk.STOCK_SAVE, branch_version(
+                    'gtk.RESPONSE_OK',
+                    'gtk.ResponseType.OK'),
             )
+        )
         if filename:
             self.session_filename = filename
             stem, ext = os.path.splitext(self.session_filename)
@@ -534,11 +675,13 @@ class GeneratedsGui(object):
         sessionObj = self.params
         outfile = open(filename, 'w')
         outfile.write('<?xml version="1.0" ?>\n')
-        sessionObj.export(outfile, 0, name_="session", 
+        sessionObj.export(
+            outfile, 0, name_="session",
             namespacedef_='')
         outfile.close()
         msg = 'Session saved to file:\n%s' % (filename, )
-        self.error_message(msg, gtk.MESSAGE_INFO)
+        msgTy = branch_version('gtk.MESSAGE_INFO', 'gtk.MessageType.INFO')
+        self.error_message(msg, msgTy)
         self.saved_params = self.params.copy()
 
     def load_session(self, filename):
@@ -547,7 +690,7 @@ class GeneratedsGui(object):
             rootNode = doc.getroot()
             rootTag, rootClass = generateds_gui_session.get_root_tag(rootNode)
             if rootClass is None:
-                rootTag = 'session'
+                #rootTag = 'session'
                 rootClass = generateds_gui_session.sessionType
             sessionObj = rootClass.factory()
             sessionObj.build(rootNode)
@@ -555,12 +698,12 @@ class GeneratedsGui(object):
             self.trans_obj_2_gui()
             self.trans_gui_2_obj()
             self.saved_params = self.params.copy()
-        except IOError, exp:
+        except IOError as exp:
             msg = str(exp)
-            self.error_message(msg, gtk.MESSAGE_ERROR)
-        except expat.ExpatError, exp:
+            self.error_message(msg)
+        except expat.ExpatError as exp:
             msg = '%s file: %s' % (str(exp), filename, )
-            self.error_message(msg, gtk.MESSAGE_ERROR)
+            self.error_message(msg)
 
     def on_about_menu_item_activate(self, menuitem, data=None):
         if self.about_dialog:
@@ -579,25 +722,41 @@ class GeneratedsGui(object):
         about_dialog.set_comments("GTK+ and Glade3 GUI front end")
         about_dialog.set_authors(authors)
         about_dialog.set_logo_icon_name(gtk.STOCK_EDIT)
+
         # callbacks for destroying the dialog
         def close(dialog, response, editor):
             editor.about_dialog = None
             dialog.destroy()
+
         def delete_event(dialog, event, editor):
             editor.about_dialog = None
             return True
+
         about_dialog.connect("response", close, self)
         about_dialog.connect("delete-event", delete_event, self)
         self.about_dialog = about_dialog
         about_dialog.show()
 
-    def error_message(self, message, message_type=gtk.MESSAGE_ERROR):
+    def error_message(self, message, message_type=None):
         # log to terminal window
         #print message
         # create an error message dialog and display modally to the user
-        dialog = gtk.MessageDialog(None,
-            gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-            message_type, gtk.BUTTONS_OK, message)
+        if message_type is None:
+            message_type = branch_version(
+                'gtk.MESSAGE_ERROR',
+                'gtk.MessageType.ERROR')
+        dialog = gtk.MessageDialog(
+            None,
+            branch_version(
+                'gtk.DIALOG_MODAL',
+                'gtk.DialogFlags.MODAL') |
+            branch_version(
+                'gtk.DIALOG_DESTROY_WITH_PARENT',
+                'gtk.DialogFlags.DESTROY_WITH_PARENT'),
+            message_type, branch_version(
+                'gtk.BUTTONS_OK',
+                'gtk.ButtonsType.OK'),
+            message)
         dialog.run()
         dialog.destroy()
 
@@ -607,7 +766,10 @@ class GeneratedsGui(object):
         self.statusbar.push(self.statusbar_cid, msg)
 
     def on_input_schema_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN,
+        filename = self.choose_filename(
+            branch_version(
+                'gtk.FILE_CHOOSER_ACTION_OPEN',
+                'gtk.FileChooserAction.OPEN'),
             (('Schemas *.xsd', '*.xsd'),))
         if filename:
             self.input_schema_entry.set_text(filename)
@@ -625,37 +787,66 @@ class GeneratedsGui(object):
             self.output_subclass_entry.set_text(filename)
 
     def on_behavior_filename_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN,
+        filename = self.choose_filename(
+            branch_version(
+                'gtk.FILE_CHOOSER_ACTION_OPEN',
+                'gtk.FileChooserAction.OPEN'),
             (('Python *.py', '*.py'),))
         if filename:
             self.behavior_filename_entry.set_text(filename)
 
     def on_validator_bodies_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
-            )
+        filename = self.choose_filename(
+            branch_version(
+                'gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER',
+                'gtk.FileChooserAction.SELECT_FOLDER'),
+        )
         if filename:
             self.validator_bodies_entry.set_text(filename)
 
     def on_user_methods_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN,
+        filename = self.choose_filename(
+            branch_version(
+                'gtk.FILE_CHOOSER_ACTION_OPEN',
+                'gtk.FileChooserAction.OPEN'),
             (('Python *.py', '*.py'),))
         if filename:
             self.user_methods_entry.set_text(filename)
 
-    def choose_filename(self, action=gtk.FILE_CHOOSER_ACTION_SAVE,
-        patterns=(), confirm_overwrite=False, initfilename=None,
-        buttons=None):
+    def on_output_directory_chooser_button_clicked(self, button, data=None):
+        filename = self.choose_filename(
+            branch_version(
+                'gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER',
+                'gtk.FileChooserAction.SELECT_FOLDER'),
+        )
+        if filename:
+            self.output_directory_entry.set_text(filename)
+
+    def choose_filename(
+            self,
+            action=None,
+            patterns=(),
+            confirm_overwrite=False,
+            initfilename=None,
+            buttons=None):
+        if action is None:
+            action = branch_version(
+                'gtk.FILE_CHOOSER_ACTION_SAVE', 'gtk.FileChooserAction.SAVE')
         filename = None
+        ty_CANCEL = branch_version(
+            'gtk.RESPONSE_CANCEL',
+            'gtk.ResponseType.CANCEL')
+        ty_OK = branch_version('gtk.RESPONSE_OK', 'gtk.ResponseType.OK')
         if buttons is None:
-            buttons=(
-                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                gtk.STOCK_OPEN, gtk.RESPONSE_OK,
-                )
+            buttons = (
+                gtk.STOCK_CANCEL, ty_CANCEL,
+                gtk.STOCK_OPEN, ty_OK,
+            )
         dialog = gtk.FileChooserDialog(
             title=None,
             action=action,
             buttons=buttons,
-            )
+        )
         if self.current_folder is not None:
             dialog.set_current_folder(self.current_folder)
         if initfilename is not None:
@@ -672,23 +863,25 @@ class GeneratedsGui(object):
             dialog.add_filter(filter)
         dialog.set_do_overwrite_confirmation(confirm_overwrite)
         response = dialog.run()
-        if response == gtk.RESPONSE_OK:
+        if response == branch_version(
+                'gtk.RESPONSE_OK', 'gtk.ResponseType.OK'):
             filename = dialog.get_filename()
             self.current_folder = dialog.get_current_folder()
-        elif response == gtk.RESPONSE_CANCEL:
+        elif response == branch_version(
+                'gtk.RESPONSE_CANCEL', 'gtk.ResponseType.CANCEL'):
             pass
         dialog.destroy()
         return filename
 
     def on_namespace_prefix_entry_changed(self, widget, data=None):
-        entry = self.ui_obj_dict['namespace_prefix_entry']
+        #entry = self.ui_obj_dict['namespace_prefix_entry']
         checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton']
         checkbutton.set_active(False)
         return True
 
     def on_empty_namespace_prefix_checkbutton_toggled(self, widget, data=None):
         entry = self.ui_obj_dict['namespace_prefix_entry']
-        checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton']
+        #checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton']
         if widget.get_active():
             entry.set_text('')
         return True
@@ -708,7 +901,7 @@ class GeneratedsGui(object):
         entry = self.ui_obj_dict['superclass_module_entry']
         superclass_entry = self.ui_obj_dict['output_superclass_entry']
         #checkbutton = self.auto_super_checkbutton
-        checkbutton = widget
+        #checkbutton = widget
         if widget.get_active():
             path = superclass_entry.get_text()
             if path:
@@ -718,7 +911,7 @@ class GeneratedsGui(object):
         return True
 
     def on_ok_button_activate(self, widget, data=None):
-        #print '(GeneratedsGui) widget:', widget
+        #print( '(GeneratedsGui) widget:', widget)
         response = self.content_dialog.on_ok_button_activate(
             self.content_dialog, data)
         return response
@@ -729,12 +922,17 @@ class GeneratedsGui(object):
     #   name of the button and the name of the related entry,
     #   for example, xxx_yyy_entry : xxx_yyy_clear_button.
     def on_clear_button_clicked(self, widget, data=None):
-        name = widget.get_name()
+        # http://python.6.x6.nabble.com/Confused-about-a-widget-s-name-td5015372.html
+        name = (
+            widget.get_name()
+            if sys.version_info.major == 2
+            else gtk.Buildable.get_name(widget))
         mo = GeneratedsGui.name_pat1.search(name)
-        stem = mo.group(1)
-        name1 = '%s_entry' % (stem, )
-        ui_obj = self.ui_obj_dict[name1]
-        ui_obj.set_text('')
+        if mo is not None:
+            stem = mo.group(1)
+            name1 = '%s_entry' % (stem, )
+            ui_obj = self.ui_obj_dict[name1]
+            ui_obj.set_text('')
 
     # Run main application window
     def main(self):
@@ -747,16 +945,18 @@ class ContentDialog(gtk.Dialog):
         global Builder
         self.content_dialog = Builder.get_object('content_dialog')
         self.content_textview = Builder.get_object('content_textview')
-        buf = self.content_textview.get_buffer().set_text('')
+        self.content_textview.get_buffer().set_text('')
 
     def show(self, content):
         #Builder.connect_signals(self)
+        if isinstance(content, bytes):
+            content = content.decode('utf-8')
         self.content_textview.get_buffer().set_text(content)
-        response = self.content_dialog.run()
+        self.content_dialog.run()
         self.content_dialog.hide()
 
     def on_ok_button_activate(self, widget, data=None):
-        #print '(content_dialog) widget:', widget
+        #print( '(content_dialog) widget:', widget)
         return False
 
 
@@ -764,12 +964,24 @@ class ContentDialog(gtk.Dialog):
 # Functions for internal use
 #
 
+def branch_version(for_2, for_3):
+    """
+    The Branch works depends on the version of Python
+    """
+    if sys.version_info.major == 2:
+        return eval(for_2)
+    elif sys.version_info.major == 3:
+        return eval(for_3)
+    else:
+        return eval(for_3)
+
+
 def capture_options(options):
     config_parser = ConfigParser()
     config_parser.read([
         os.path.expanduser('~/.generateds_gui.ini'),
         './generateds_gui.ini',
-        ])
+    ])
     section = 'general'
     names = ('exec-path', 'exec_path')
     capture_1_option(options, config_parser, section, names)
@@ -783,12 +995,14 @@ def capture_options(options):
     if options.exec_path is None:
         options.exec_path = 'generateDS.py'
 
+
 def capture_1_option(options, config_parser, section, names):
-    if (getattr(options, names[1]) is None and
-        config_parser.has_option(section, names[0])
-        ):
+    if (
+            getattr(options, names[1]) is None and
+            config_parser.has_option(section, names[0])):
         setattr(options, names[1], config_parser.get(section, names[0]))
 
+
 def capture_ui_names():
     items = generateds_gui_session.sessionType.member_data_items_
     for item in items:
@@ -809,9 +1023,10 @@ def capture_ui_names():
 
 
 USAGE_TEXT = """
-    python %prog [options] <somefile.xxx>
+    python %prog [options] --session=<some_session_file.session>
 example:
-    python %prog somefile.xxx"""
+    python %prog --session=generator01.session"""
+
 
 def usage(parser):
     parser.print_help()
@@ -820,30 +1035,41 @@ def usage(parser):
 
 def main():
     parser = OptionParser(USAGE_TEXT)
-    parser.add_option("--exec-path",
+    parser.add_option(
+        "--exec-path",
         type="string", action="store",
         dest="exec_path",
         #default="generateDS.py",
-        help='path to executable generated in command line.'
+        help=(
+            'path to executable generated in command line.'
             '  Example: "python /path/to/generateDS.py".'
             '  Default: "./generateDS.py".'
-            '  Use Tools/Generate CL (Ctrl-T) to see it.'
-        )
-    parser.add_option("--impl-gui",
+            '  Use Tools/Generate CL (Ctrl-T) to see it.')
+    )
+    parser.add_option(
+        "--impl-gui",
         type="string", action="store",
         dest="impl_gui",
         help="name of glade file that defines the GUI if not embedded."
-        )
-    parser.add_option("-s", "--session",
+    )
+    parser.add_option(
+        "-s", "--session",
         type="string", action="store",
         dest="session",
         help="name of a session file to be loaded."
-        )
+    )
     (options, args) = parser.parse_args()
     capture_options(options)
     capture_ui_names()
     if len(args) > 0:
         usage(parser)
+    # Set up for internationalization.
+    app_name = 'generateds_gui'
+    dir_name = 'locale'
+    locale.setlocale(locale.LC_ALL, '')
+    gettext.bindtextdomain(app_name, dir_name)
+    gettext.textdomain(app_name)
+    # Start the app.
     editor = GeneratedsGui(options)
     editor.main()
 
@@ -851,94 +1077,189 @@ def main():
 ## UI_SPECIFICATION ##
 
 Ui_spec = """
-
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
 <interface>
-  <requires lib="gtk+" version="2.16"/>
-  <!-- interface-naming-policy project-wide -->
+  <requires lib="gtk+" version="3.0"/>
+  <object class="GtkAccelGroup" id="accelgroup1"/>
+  <object class="GtkDialog" id="content_dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Messages and Content</property>
+    <property name="default_width">800</property>
+    <property name="default_height">600</property>
+    <property name="type_hint">normal</property>
+    <child internal-child="vbox">
+      <object class="GtkBox" id="dialog-vbox3">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="content_dialog_ok_button">
+                <property name="label" translatable="yes">OK</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="activate" handler="on_ok_button_activate" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolledwindow1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="min_content_width">250</property>
+            <property name="min_content_height">500</property>
+            <child>
+              <object class="GtkTextView" id="content_textview">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="editable">False</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">content_dialog_ok_button</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkImage" id="image1">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-save</property>
+  </object>
+  <object class="GtkImage" id="image2">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-save-as</property>
+  </object>
+  <object class="GtkImage" id="image3">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-open</property>
+  </object>
+  <object class="GtkImage" id="image4">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-clear</property>
+  </object>
   <object class="GtkWindow" id="window1">
+    <property name="can_focus">False</property>
     <accel-groups>
       <group name="accelgroup1"/>
     </accel-groups>
-    <signal name="delete_event" handler="on_window_delete_event"/>
+    <signal name="delete-event" handler="on_window_delete_event" swapped="no"/>
     <child>
       <object class="GtkVBox" id="vbox1">
         <property name="visible">True</property>
-        <property name="orientation">vertical</property>
+        <property name="can_focus">False</property>
         <child>
           <object class="GtkMenuBar" id="menubar1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <child>
               <object class="GtkMenuItem" id="menuitem1">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_File</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="menu1">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkImageMenuItem" id="clear_menuitem">
                         <property name="label">Clear</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="image">image4</property>
                         <property name="use_stock">False</property>
                         <property name="accel_group">accelgroup1</property>
+                        <signal name="activate" handler="on_clear_menuitem_activate" swapped="no"/>
                         <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_clear_menuitem_activate"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="open_session_menuitem">
                         <property name="label">_Load session</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Load a previous saved session.</property>
                         <property name="use_underline">True</property>
                         <property name="image">image3</property>
                         <property name="use_stock">False</property>
                         <property name="accel_group">accelgroup1</property>
+                        <signal name="activate" handler="on_open_session_menuitem_activate" swapped="no"/>
                         <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_open_session_menuitem_activate"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="save_session_menuitem">
                         <property name="label">_Save session</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Save the current session.</property>
                         <property name="use_underline">True</property>
                         <property name="image">image1</property>
                         <property name="use_stock">False</property>
                         <property name="accel_group">accelgroup1</property>
+                        <signal name="activate" handler="on_save_session_menuitem_activate" swapped="no"/>
                         <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_save_session_menuitem_activate"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="save_session_as_menuitem">
                         <property name="label">Save session as ...</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Save the current session in
 file chosen by the user.</property>
                         <property name="image">image2</property>
                         <property name="use_stock">False</property>
                         <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_save_session_as_menuitem_activate"/>
+                        <signal name="activate" handler="on_save_session_as_menuitem_activate" swapped="no"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkSeparatorMenuItem" id="menuitem5">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="imagemenuitem5">
                         <property name="label">gtk-quit</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Exit from the application.</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_quit_menu_item_activate"/>
+                        <signal name="activate" handler="on_quit_menu_item_activate" swapped="no"/>
                       </object>
                     </child>
                   </object>
@@ -948,30 +1269,34 @@ file chosen by the user.</property>
             <child>
               <object class="GtkMenuItem" id="menuitem2">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Tools</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="menu2">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkMenuItem" id="capture_cl_menuitem">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Capture the command line that would be used
 to generate the bindings modules.</property>
                         <property name="label" translatable="yes">_Capture CL</property>
                         <property name="use_underline">True</property>
+                        <signal name="activate" handler="on_capture_cl_menuitem_activate" swapped="no"/>
                         <accelerator key="t" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_capture_cl_menuitem_activate"/>
                       </object>
                     </child>
                     <child>
                       <object class="GtkMenuItem" id="generate_menuitem">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property>
                         <property name="label" translatable="yes">_Generate</property>
                         <property name="use_underline">True</property>
+                        <signal name="activate" handler="on_generate_menuitem_activate" swapped="no"/>
                         <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_generate_menuitem_activate"/>
                       </object>
                     </child>
                   </object>
@@ -981,19 +1306,22 @@ to generate the bindings modules.</property>
             <child>
               <object class="GtkMenuItem" id="menuitem4">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Help</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="menu3">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkImageMenuItem" id="imagemenuitem10">
                         <property name="label">gtk-about</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_about_menu_item_activate"/>
+                        <signal name="activate" handler="on_about_menu_item_activate" swapped="no"/>
                       </object>
                     </child>
                   </object>
@@ -1003,1018 +1331,1384 @@ to generate the bindings modules.</property>
           </object>
           <packing>
             <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="position">0</property>
           </packing>
         </child>
         <child>
-          <object class="GtkTable" id="table1">
+          <object class="GtkScrolledWindow" id="scrolledwindow2">
             <property name="visible">True</property>
-            <property name="n_rows">22</property>
-            <property name="n_columns">4</property>
-            <child>
-              <object class="GtkLabel" id="label1">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Input schema file:</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label2">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Output superclass file:</property>
-              </object>
-              <packing>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label3">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Output subclass file:</property>
-              </object>
-              <packing>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label4">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Overwrite without asking:</property>
-              </object>
-              <packing>
-                <property name="top_attach">3</property>
-                <property name="bottom_attach">4</property>
-              </packing>
-            </child>
+            <property name="can_focus">True</property>
+            <property name="shadow_type">in</property>
+            <property name="min_content_width">1000</property>
+            <property name="min_content_height">600</property>
             <child>
-              <object class="GtkCheckButton" id="force_checkbutton">
-                <property name="label" translatable="yes">Force</property>
+              <object class="GtkViewport" id="viewport1">
                 <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Always overwrite output files.
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkTable" id="table1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="n_rows">29</property>
+                    <property name="n_columns">4</property>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Input schema file:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Output superclass file:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Output subclass file:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Overwrite without asking:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">3</property>
+                        <property name="bottom_attach">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="force_checkbutton">
+                        <property name="label" translatable="yes">Force</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Always overwrite output files.
 Do not ask for confirmation.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">3</property>
-                <property name="bottom_attach">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="input_schema_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">3</property>
+                        <property name="bottom_attach">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="input_schema_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">The path and name of the
 input XML schema defining the
 bindings to be generated.</property>
-                <property name="invisible_char">&#x25CF;</property>
-                <property name="width_chars">80</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="output_superclass_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the output file
+                        <property name="invisible_char">●</property>
+                        <property name="width_chars">80</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="output_superclass_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">The path and name of the output file
 to be generated and to contain the 
 superclasses.</property>
-                <property name="invisible_char">&#x25CF;</property>
-                <signal name="changed" handler="on_output_superclass_entry_changed"/>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="output_subclass_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the output file
+                        <property name="invisible_char">●</property>
+                        <signal name="changed" handler="on_output_superclass_entry_changed" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="output_subclass_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">The path and name of the output file
 to be generated and to contain the 
 subclasses.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label5">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Prefix (for class names):</property>
-              </object>
-              <packing>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="prefix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Prefix for class names.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label6">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Namespace prefix:</property>
-              </object>
-              <packing>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="namespace_prefix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
-                <property name="tooltip_text" translatable="yes">Override default namespace
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label5">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Prefix (for class names):</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">4</property>
+                        <property name="bottom_attach">5</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="prefix_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Prefix for class names.</property>
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">4</property>
+                        <property name="bottom_attach">5</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label6">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Namespace prefix:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">5</property>
+                        <property name="bottom_attach">6</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="namespace_prefix_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+                        <property name="tooltip_text" translatable="yes">Override default namespace
 prefix in schema file.
 Example: -a "xsd:"
 Default: "xs:".</property>
-                <property name="invisible_char">&#x25CF;</property>
-                <signal name="changed" handler="on_namespace_prefix_entry_changed"/>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label7">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Behavior file name:</property>
-              </object>
-              <packing>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="behavior_filename_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Input file name for behaviors
+                        <property name="invisible_char">●</property>
+                        <signal name="changed" handler="on_namespace_prefix_entry_changed" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">5</property>
+                        <property name="bottom_attach">6</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label7">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Behavior file name:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="behavior_filename_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Input file name for behaviors
 added to subclasses.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label8">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Generate Python properties:</property>
-              </object>
-              <packing>
-                <property name="top_attach">7</property>
-                <property name="bottom_attach">8</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="properties_checkbutton">
-                <property name="label" translatable="yes">Properties</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Generate Python properties for member variables
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label8">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Generate Python properties:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">7</property>
+                        <property name="bottom_attach">8</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="properties_checkbutton">
+                        <property name="label" translatable="yes">Properties</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Generate Python properties for member variables
 so that the value can be retrieved and modified
 without calling getter and setter functions.
 </property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">7</property>
-                <property name="bottom_attach">8</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label10">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Subclass suffix:</property>
-              </object>
-              <packing>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="subclass_suffix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names.
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">7</property>
+                        <property name="bottom_attach">8</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label10">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Subclass suffix:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">9</property>
+                        <property name="bottom_attach">10</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="subclass_suffix_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names.
 Default="Sub".</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label11">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Root element:</property>
-              </object>
-              <packing>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="root_element_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Assume that this value is the name
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">9</property>
+                        <property name="bottom_attach">10</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label11">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Root element:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">10</property>
+                        <property name="bottom_attach">11</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="root_element_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Assume that this value is the name
 of the root element of instance docs.
 Default is first element defined in schema.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="input_schema_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the input schema file.</property>
-                <signal name="clicked" handler="on_input_schema_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_superclass_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property>
-                <signal name="clicked" handler="on_output_superclass_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_subclass_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property>
-                <signal name="clicked" handler="on_output_subclass_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="behavior_filename_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the nput file name for
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">10</property>
+                        <property name="bottom_attach">11</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="input_schema_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the input schema file.</property>
+                        <signal name="clicked" handler="on_input_schema_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_superclass_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property>
+                        <signal name="clicked" handler="on_output_superclass_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_subclass_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property>
+                        <signal name="clicked" handler="on_output_subclass_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="behavior_filename_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the nput file name for
 behaviors added to subclasses.</property>
-                <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label12">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Superclass module:</property>
-              </object>
-              <packing>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="superclass_module_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Superclass module name in subclass module.
+                        <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label12">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Superclass module:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">11</property>
+                        <property name="bottom_attach">12</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="superclass_module_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Superclass module name in subclass module.
 Default="???".</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label13">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Use old getters and setters:</property>
-              </object>
-              <packing>
-                <property name="top_attach">12</property>
-                <property name="bottom_attach">13</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="old_getters_setters_checkbutton">
-                <property name="label" translatable="yes">Old getters and setters</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(),
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">11</property>
+                        <property name="bottom_attach">12</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label13">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Use old getters and setters:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">12</property>
+                        <property name="bottom_attach">13</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="old_getters_setters_checkbutton">
+                        <property name="label" translatable="yes">Old getters and setters</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(),
 instead of get_var() and set_var().</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">12</property>
-                <property name="bottom_attach">13</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label14">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Validator bodies path:</property>
-              </object>
-              <packing>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label15">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">User methods module:</property>
-              </object>
-              <packing>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label16">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No dates:</property>
-              </object>
-              <packing>
-                <property name="top_attach">15</property>
-                <property name="bottom_attach">16</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label17">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No versions:</property>
-              </object>
-              <packing>
-                <property name="top_attach">16</property>
-                <property name="bottom_attach">17</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_dates_checkbutton">
-                <property name="label" translatable="yes">No dates in generated output</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not include the current date in the generated
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">12</property>
+                        <property name="bottom_attach">13</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label14">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Validator bodies path:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">13</property>
+                        <property name="bottom_attach">14</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label15">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">User methods module:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">14</property>
+                        <property name="bottom_attach">15</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label16">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">No dates:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">15</property>
+                        <property name="bottom_attach">16</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label17">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">No versions:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">16</property>
+                        <property name="bottom_attach">17</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="no_dates_checkbutton">
+                        <property name="label" translatable="yes">No dates in generated output</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Do not include the current date in the generated
 files. This is useful if you want to minimize
 the amount of (no-operation) changes to the
 generated python code.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">15</property>
-                <property name="bottom_attach">16</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="validator_bodies_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">15</property>
+                        <property name="bottom_attach">16</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="validator_bodies_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide
 bodies (implementations) of validator methods.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="validator_bodies_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">13</property>
+                        <property name="bottom_attach">14</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="validator_bodies_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide
 bodies (implementations) of validator methods.</property>
-                <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_versions_checkbutton">
-                <property name="label" translatable="yes">No version info in generated output</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not include the current version in the generated
+                        <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">13</property>
+                        <property name="bottom_attach">14</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="no_versions_checkbutton">
+                        <property name="label" translatable="yes">No version info in generated output</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Do not include the current version in the generated
 files. This is useful if you want to minimize
 the amount of (no-operation) changes to the
 generated python code.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">16</property>
-                <property name="bottom_attach">17</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="user_methods_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods.  See
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">16</property>
+                        <property name="bottom_attach">17</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="user_methods_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods.  See
 section "User Methods" in the documentation.</property>
-                <signal name="clicked" handler="on_user_methods_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="user_methods_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Optional module containing user methods.  See
+                        <signal name="clicked" handler="on_user_methods_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">14</property>
+                        <property name="bottom_attach">15</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="user_methods_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Optional module containing user methods.  See
 section "User Methods" in the documentation.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label18">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No process includes:</property>
-              </object>
-              <packing>
-                <property name="top_attach">17</property>
-                <property name="bottom_attach">18</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label19">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Silence:</property>
-              </object>
-              <packing>
-                <property name="top_attach">18</property>
-                <property name="bottom_attach">19</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_process_includes_checkbutton">
-                <property name="label" translatable="yes">Do not process includes in schema</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not process included XML Schema files.  By
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">14</property>
+                        <property name="bottom_attach">15</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label18">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">No process includes:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">17</property>
+                        <property name="bottom_attach">18</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label19">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Silence:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">18</property>
+                        <property name="bottom_attach">19</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="no_process_includes_checkbutton">
+                        <property name="label" translatable="yes">Do not process includes in schema</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Do not process included XML Schema files.  By
 default, generateDS.py will insert content
 from files referenced by &lt;include ... /&gt;
 elements into the XML Schema to be processed.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">17</property>
-                <property name="bottom_attach">18</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="silence_checkbutton">
-                <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">17</property>
+                        <property name="bottom_attach">18</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="silence_checkbutton">
+                        <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS
 echoes the information being parsed. Use
 this option to turn off that behavior.
 </property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">18</property>
-                <property name="bottom_attach">19</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label20">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Namespace definitions:</property>
-              </object>
-              <packing>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label21">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">External encoding:</property>
-              </object>
-              <packing>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label22">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Member specs:</property>
-              </object>
-              <packing>
-                <property name="top_attach">21</property>
-                <property name="bottom_attach">22</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="namespace_defs_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">18</property>
+                        <property name="bottom_attach">19</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label20">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Namespace definitions:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">19</property>
+                        <property name="bottom_attach">20</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label21">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">External encoding:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">20</property>
+                        <property name="bottom_attach">21</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label22">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Member specs:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">22</property>
+                        <property name="bottom_attach">23</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="namespace_defs_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the
 value for the namespacedef_ parameter of
 the export() method by the generated
 parse() and parseString() functions.
 Default=''.  Example:
 xmlns:abc="http://www.abc.com"</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="external_encoding_entry">
-                <property name="visible">True</property>
-                <property name="tooltip_text" translatable="yes">Encode output written by the generated export
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">19</property>
+                        <property name="bottom_attach">20</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="external_encoding_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Encode output written by the generated export
 methods using this encoding.  Default, if omitted,
 is the value returned by sys.getdefaultencoding().
 Example: utf-8.</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="member_specs_combobox_container">
-                <property name="visible">True</property>
-                <child>
-                  <placeholder/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">20</property>
+                        <property name="bottom_attach">21</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkHBox" id="member_specs_combobox_container">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">22</property>
+                        <property name="bottom_attach">23</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton">
+                        <property name="label" translatable="yes">Empty</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Assume an empty namespace
+prefix in the XML schema, not
+the default ("xs:").</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">5</property>
+                        <property name="bottom_attach">6</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="auto_super_checkbutton">
+                        <property name="label" translatable="yes">Auto</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Use the superclass file name
+stem as the super-class module
+name.</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                        <signal name="toggled" handler="on_auto_super_checkbutton_toggled" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">11</property>
+                        <property name="bottom_attach">12</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="input_schema_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_superclass_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_subclass_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">2</property>
+                        <property name="bottom_attach">3</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="prefix_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">4</property>
+                        <property name="bottom_attach">5</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="namespace_prefix_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">5</property>
+                        <property name="bottom_attach">6</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="behavior_filename_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">6</property>
+                        <property name="bottom_attach">7</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="subclass_suffix_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">9</property>
+                        <property name="bottom_attach">10</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="root_element_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the root element entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">10</property>
+                        <property name="bottom_attach">11</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="superclass_module_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">11</property>
+                        <property name="bottom_attach">12</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="validator_bodies_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">13</property>
+                        <property name="bottom_attach">14</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="user_methods_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">14</property>
+                        <property name="bottom_attach">15</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="namespace_defs_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">19</property>
+                        <property name="bottom_attach">20</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="external_encoding_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">20</property>
+                        <property name="bottom_attach">21</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label23">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Get encoded:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">21</property>
+                        <property name="bottom_attach">22</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="get_encoded_checkbutton">
+                        <property name="label" translatable="yes">Getters return encoded values by default</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Getters return encoded value by default if true.
+Can be changed at run-time by either
+(1) changing global variable GetEncodedValue or
+(2) using optional parameter to getter.</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">21</property>
+                        <property name="bottom_attach">22</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label24">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Exports:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">23</property>
+                        <property name="bottom_attach">24</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="export_spec_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Specifies export functions to be generated.  Value is a whitespace separated list of any of the following: "write" (write XML to file), "literal" (write out python code), "etree" (build element tree (can serialize to XML)).            Example: "write etree".  Default: "write".</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">23</property>
+                        <property name="bottom_attach">24</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label25">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">One file per XSD:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">24</property>
+                        <property name="bottom_attach">25</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="one_file_per_xsd_checkbutton">
+                        <property name="label" translatable="yes">Create a python module for each XSD processed.</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Create a python module for each XSD processed.</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">24</property>
+                        <property name="bottom_attach">25</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label26">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Output directory:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">25</property>
+                        <property name="bottom_attach">26</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="output_directory_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Used in conjunction with --one-file-per-xsd.  The directory where the modules will be created.</property>
+                        <property name="invisible_char">●</property>
+                        <property name="width_chars">80</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">25</property>
+                        <property name="bottom_attach">26</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_directory_chooser_button">
+                        <property name="label" translatable="yes">Choose</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Choose the output directory for one-file-per-xsd.</property>
+                        <signal name="clicked" handler="on_output_directory_chooser_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">2</property>
+                        <property name="right_attach">3</property>
+                        <property name="top_attach">25</property>
+                        <property name="bottom_attach">26</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="output_directory_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the output directory entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">25</property>
+                        <property name="bottom_attach">26</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="export_spec_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the exports entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">23</property>
+                        <property name="bottom_attach">24</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label27">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Module suffix:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">26</property>
+                        <property name="bottom_attach">27</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label28">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Preserve CData tags:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">27</property>
+                        <property name="bottom_attach">28</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label29">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Cleanup name list:</property>
+                        <property name="xalign">0</property>
+                      </object>
+                      <packing>
+                        <property name="top_attach">28</property>
+                        <property name="bottom_attach">29</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="module_suffix_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">To be used in conjunction with --one-file-per-xsd.  Append XXX to the end of each file created.</property>
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">26</property>
+                        <property name="bottom_attach">27</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkEntry" id="cleanup_name_list_entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="tooltip_text" translatable="yes">Specifies list of 2-tuples used for cleaning names.  First element is a regular expression search pattern and second is a replacement. Example: "[('[-:.]', '_'), ('^__', 'Special')]".  Default: "[('[-:.]', '_')]".</property>
+                        <property name="invisible_char">●</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">28</property>
+                        <property name="bottom_attach">29</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkCheckButton" id="preserve_cdata_tags_checkbutton">
+                        <property name="label" translatable="yes">Preserve CData tags</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="tooltip_text" translatable="yes">Preserve CDATA tags.  Default: False.</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">27</property>
+                        <property name="bottom_attach">28</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="module_suffix_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the module suffix entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">26</property>
+                        <property name="bottom_attach">27</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="cleanup_name_list_clear_button">
+                        <property name="label">gtk-clear</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                        <property name="tooltip_text" translatable="yes">Clear the cleanup name list entry.</property>
+                        <property name="use_stock">True</property>
+                        <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                      </object>
+                      <packing>
+                        <property name="left_attach">3</property>
+                        <property name="right_attach">4</property>
+                        <property name="top_attach">28</property>
+                        <property name="bottom_attach">29</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </object>
                 </child>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">21</property>
-                <property name="bottom_attach">22</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton">
-                <property name="label" translatable="yes">Empty</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Assume an empty namespace
-prefix in the XML schema, not
-the default ("xs:").</property>
-                <property name="draw_indicator">True</property>
-                <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="auto_super_checkbutton">
-                <property name="label" translatable="yes">Auto</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Use the superclass file name
-stem as the super-class module
-name.</property>
-                <property name="draw_indicator">True</property>
-                <signal name="toggled" handler="on_auto_super_checkbutton_toggled"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="input_schema_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_superclass_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_subclass_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="prefix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="namespace_prefix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="behavior_filename_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="subclass_suffix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="root_element_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the root element entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="superclass_module_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="validator_bodies_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="user_methods_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="namespace_defs_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="external_encoding_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
             </child>
           </object>
           <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
             <property name="position">1</property>
           </packing>
         </child>
         <child>
           <object class="GtkHBox" id="hbox1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="homogeneous">True</property>
             <child>
               <object class="GtkButton" id="generate_button">
@@ -2023,9 +2717,11 @@ name.</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property>
-                <signal name="clicked" handler="on_generate_button_clicked"/>
+                <signal name="clicked" handler="on_generate_button_clicked" swapped="no"/>
               </object>
               <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
                 <property name="position">0</property>
               </packing>
             </child>
@@ -2036,24 +2732,30 @@ name.</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="tooltip_text" translatable="yes">Exit from the application.</property>
-                <signal name="clicked" handler="on_quit_button_clicked"/>
+                <signal name="clicked" handler="on_quit_button_clicked" swapped="no"/>
               </object>
               <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
                 <property name="position">1</property>
               </packing>
             </child>
           </object>
           <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
             <property name="position">2</property>
           </packing>
         </child>
         <child>
           <object class="GtkStatusbar" id="statusbar1">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="spacing">2</property>
           </object>
           <packing>
             <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="position">3</property>
           </packing>
         </child>
@@ -2063,86 +2765,9 @@ name.</property>
       </object>
     </child>
   </object>
-  <object class="GtkAccelGroup" id="accelgroup1"/>
-  <object class="GtkDialog" id="content_dialog">
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">Messages and Content</property>
-    <property name="default_width">800</property>
-    <property name="default_height">600</property>
-    <property name="type_hint">normal</property>
-    <property name="has_separator">False</property>
-    <child internal-child="vbox">
-      <object class="GtkVBox" id="dialog-vbox3">
-        <property name="visible">True</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
-        <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow1">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hscrollbar_policy">automatic</property>
-            <property name="vscrollbar_policy">automatic</property>
-            <child>
-              <object class="GtkTextView" id="content_textview">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="editable">False</property>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area3">
-            <property name="visible">True</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="content_dialog_ok_button">
-                <property name="label" translatable="yes">OK</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <signal name="activate" handler="on_ok_button_activate"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="0">content_dialog_ok_button</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkImage" id="image1">
-    <property name="visible">True</property>
-    <property name="stock">gtk-save</property>
-  </object>
-  <object class="GtkImage" id="image2">
-    <property name="visible">True</property>
-    <property name="stock">gtk-save-as</property>
-  </object>
-  <object class="GtkImage" id="image3">
-    <property name="visible">True</property>
-    <property name="stock">gtk-open</property>
-  </object>
-  <object class="GtkImage" id="image4">
-    <property name="visible">True</property>
-    <property name="stock">gtk-clear</property>
-  </object>
   <object class="GtkImage" id="image5">
     <property name="visible">True</property>
+    <property name="can_focus">False</property>
     <property name="stock">gtk-missing-image</property>
   </object>
 </interface>
@@ -2152,7 +2777,5 @@ name.</property>
 # Do not change the above 3 lines.
 
 
-    
 if __name__ == "__main__":
     main()
-    
diff --git a/gui/generateds_gui_rus.glade b/gui/generateds_gui_rus.glade
new file mode 100644
index 0000000..153fc4c
--- /dev/null
+++ b/gui/generateds_gui_rus.glade
@@ -0,0 +1,1691 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+    <requires lib="gtk+" version="3."/>
+    <object class="GtkAccelGroup" id="accelgroup1"/>
+    <object class="GtkDialog" id="content_dialog">
+        <property name="can_focus">False</property>
+        <property name="border_width">5</property>
+        <property name="title" translatable="yes">Сообщения и контент</property>
+        <property name="default_width">800</property>
+        <property name="default_height">600</property>
+        <property name="type_hint">normal</property>
+        <child internal-child="vbox">
+            <object class="GtkBox" id="dialog-vbox3">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="spacing">2</property>
+                <child internal-child="action_area">
+                    <object class="GtkButtonBox" id="dialog-action_area3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="layout_style">end</property>
+                        <child>
+                            <object class="GtkButton" id="content_dialog_ok_button">
+                                <property name="label" translatable="yes">OK</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <signal name="activate" handler="on_ok_button_activate" swapped="no"/>
+                            </object>
+                            <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                            </packing>
+                        </child>
+                    </object>
+                    <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="pack_type">end</property>
+                        <property name="position">0</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkScrolledWindow" id="scrolledwindow1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="min_content_width">250</property>
+                        <property name="min_content_height">500</property>
+                        <child>
+                            <object class="GtkTextView" id="content_textview">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="editable">False</property>
+                            </object>
+                        </child>
+                    </object>
+                    <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                    </packing>
+                </child>
+            </object>
+        </child>
+        <action-widgets>
+            <action-widget response="0">content_dialog_ok_button</action-widget>
+        </action-widgets>
+    </object>
+    <object class="GtkImage" id="image1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="stock">gtk-save</property>
+    </object>
+    <object class="GtkImage" id="image2">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="stock">gtk-save-as</property>
+    </object>
+    <object class="GtkImage" id="image3">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="stock">gtk-open</property>
+    </object>
+    <object class="GtkImage" id="image4">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="stock">gtk-clear</property>
+    </object>
+    <object class="GtkWindow" id="window1">
+        <property name="can_focus">False</property>
+        <accel-groups>
+            <group name="accelgroup1"/>
+        </accel-groups>
+        <signal name="delete-event" handler="on_window_delete_event" swapped="no"/>
+        <child>
+            <object class="GtkVBox" id="vbox1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                    <object class="GtkMenuBar" id="menubar1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                            <object class="GtkMenuItem" id="menuitem1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="label" translatable="yes">_Файл</property>
+                                <property name="use_underline">True</property>
+                                <child type="submenu">
+                                    <object class="GtkMenu" id="menu1">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <child>
+                                            <object class="GtkImageMenuItem" id="clear_menuitem">
+                                                <property name="label">Clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="image">image4</property>
+                                                <property name="use_stock">False</property>
+                                                <property name="accel_group">accelgroup1</property>
+                                                <signal name="activate" handler="on_clear_menuitem_activate" swapped="no"/>
+                                                <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                                            </object>
+                                        </child>
+                                        <child>
+                                            <object class="GtkImageMenuItem" id="open_session_menuitem">
+                                                <property name="label">_Load session</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Загрузите предыдущую сохраненную сессию.</property>
+                                                <property name="use_underline">True</property>
+                                                <property name="image">image3</property>
+                                                <property name="use_stock">False</property>
+                                                <property name="accel_group">accelgroup1</property>
+                                                <signal name="activate" handler="on_open_session_menuitem_activate" swapped="no"/>
+                                                <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                                            </object>
+                                        </child>
+                                        <child>
+                                            <object class="GtkImageMenuItem" id="save_session_menuitem">
+                                                <property name="label">_Save session</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Сохранить текущую сессию.</property>
+                                                <property name="use_underline">True</property>
+                                                <property name="image">image1</property>
+                                                <property name="use_stock">False</property>
+                                                <property name="accel_group">accelgroup1</property>
+                                                <signal name="activate" handler="on_save_session_menuitem_activate" swapped="no"/>
+                                                <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                                            </object>
+                                        </child>
+                                        <child>
+                                            <object class="GtkImageMenuItem" id="save_session_as_menuitem">
+                                                <property name="label">Save session as ...</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Сохранить текущую сессию в
+файле, выбранном пользователем.</property>
+                                                <property name="image">image2</property>
+                                                <property name="use_stock">False</property>
+                                                <property name="accel_group">accelgroup1</property>
+                                                <signal name="activate" handler="on_save_session_as_menuitem_activate" swapped="no"/>
+                                            </object>
+                                        </child>
+                                        <child>
+                                            <object class="GtkSeparatorMenuItem" id="menuitem5">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                            </object>
+                                        </child>
+                                        <child>
+                                            <object class="GtkImageMenuItem" id="imagemenuitem5">
+                                                <property name="label">gtk-quit</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Выход из приложения.</property>
+                                                <property name="use_underline">True</property>
+                                                <property name="use_stock">True</property>
+                                                <property name="accel_group">accelgroup1</property>
+                                                <signal name="activate" handler="on_quit_menu_item_activate" swapped="no"/>
+                                            </object>
+                                        </child>
+                                    </object>
+                                </child>
+                            </object>
+                        </child>
+                        <child>
+                            <object class="GtkMenuItem" id="menuitem2">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="label" translatable="yes">_Инструменты</property>
+                                <property name="use_underline">True</property>
+                                <child type="submenu">
+                                    <object class="GtkMenu" id="menu2">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <child>
+                                            <object class="GtkMenuItem" id="capture_cl_menuitem">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Получить командную строку, которая использовалась бы
+, чтобы произвести модули (bindings modules).</property>
+                                                <property name="label" translatable="yes">_Capture CL</property>
+                                                <property name="use_underline">True</property>
+                                                <signal name="activate" handler="on_capture_cl_menuitem_activate" swapped="no"/>
+                                                <accelerator key="t" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                                            </object>
+                                        </child>
+                                        <child>
+                                            <object class="GtkMenuItem" id="generate_menuitem">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="tooltip_text" translatable="yes">Генерировать модули привязки.</property>
+                                                <property name="label" translatable="yes">_Произвести</property>
+                                                <property name="use_underline">True</property>
+                                                <signal name="activate" handler="on_generate_menuitem_activate" swapped="no"/>
+                                                <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                                            </object>
+                                        </child>
+                                    </object>
+                                </child>
+                            </object>
+                        </child>
+                        <child>
+                            <object class="GtkMenuItem" id="menuitem4">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="label" translatable="yes">_Помощь</property>
+                                <property name="use_underline">True</property>
+                                <child type="submenu">
+                                    <object class="GtkMenu" id="menu3">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <child>
+                                            <object class="GtkImageMenuItem" id="imagemenuitem10">
+                                                <property name="label">gtk-about</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="use_underline">True</property>
+                                                <property name="use_stock">True</property>
+                                                <property name="accel_group">accelgroup1</property>
+                                                <signal name="activate" handler="on_about_menu_item_activate" swapped="no"/>
+                                            </object>
+                                        </child>
+                                    </object>
+                                </child>
+                            </object>
+                        </child>
+                    </object>
+                    <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkScrolledWindow" id="scrolledwindow2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="shadow_type">in</property>
+                        <property name="min_content_width">1000</property>
+                        <property name="min_content_height">600</property>
+                        <child>
+                            <object class="GtkViewport" id="viewport1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                    <object class="GtkTable" id="table1">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="n_rows">29</property>
+                                        <property name="n_columns">4</property>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label1">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Введите файл схемы:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label2">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Выходной файл суперкласса:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label3">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Выходной файл подкласса:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">2</property>
+                                                <property name="bottom_attach">3</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label4">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Перезапись без вопросов:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">3</property>
+                                                <property name="bottom_attach">4</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="force_checkbutton">
+                                                <property name="label" translatable="yes">Ускоорить</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Всегда перезаписывать выходные файлы.
+без запроса подтверждение.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">3</property>
+                                                <property name="bottom_attach">4</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="input_schema_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Путь и название
+вводят XML-схему, определяющую
+привязки, которые будут произведены.</property>
+                                                <property name="invisible_char">-</property>
+                                                <property name="width_chars">80</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="output_superclass_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Путь и название выходного файла
+, чтобы быть сгенерированными и содержать
+суперклассы.</property>
+                                                <property name="invisible_char">-</property>
+                                                <signal name="changed" handler="on_output_superclass_entry_changed" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="output_subclass_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Путь и название выходного файла
+, чтобы быть сгенерированными и содержать
+подклассы.</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">2</property>
+                                                <property name="bottom_attach">3</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label5">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Префикс (для названий классов):</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="prefix_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Префикс для названий классов.</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label6">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Префикс пространства имен:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">5</property>
+                                                <property name="bottom_attach">6</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="namespace_prefix_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+                                                <property name="tooltip_text" translatable="yes">Переопределите пространство имен по умолчанию
+префикс в файле схемы. Пример
+:-a "xsd": Значение по умолчанию
+: "xs":.</property>
+                                                <property name="invisible_char">-</property>
+                                                <signal name="changed" handler="on_namespace_prefix_entry_changed" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">5</property>
+                                                <property name="bottom_attach">6</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label7">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Имя файла поведения:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">6</property>
+                                                <property name="bottom_attach">7</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="behavior_filename_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Введите имя файла для поведений
+добавлемых к подклассам.</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">6</property>
+                                                <property name="bottom_attach">7</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label8">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Генерировать свойства  Python:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">7</property>
+                                                <property name="bottom_attach">8</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="properties_checkbutton">
+                                                <property name="label" translatable="yes">Свойства</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Генерировать свойства Python для переменных-членов
+так, чтобы значение могло быть восстановлено и изменено
+, не называя функции getter и setter.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">7</property>
+                                                <property name="bottom_attach">8</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label10">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Суффикс подкласса:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">9</property>
+                                                <property name="bottom_attach">10</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="subclass_suffix_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Дополнительный текст к сгенерированными подназваниям классов. Значение по умолчанию
+= "Sub".</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">9</property>
+                                                <property name="bottom_attach">10</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label11">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Элемент корня:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">10</property>
+                                                <property name="bottom_attach">11</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="root_element_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Предположите, что это значение - имя
+элемента корня документа
+, Значение по умолчанию - первый элемент, определенный в схеме.</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">10</property>
+                                                <property name="bottom_attach">11</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="input_schema_chooser_button">
+                                                <property name="label" translatable="yes">Выбрать</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Выберите входной файл схемы.</property>
+                                                <signal name="clicked" handler="on_input_schema_chooser_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="output_superclass_chooser_button">
+                                                <property name="label" translatable="yes">Выбрать</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Выберите выходной файл привязки суперкласса.</property>
+                                                <signal name="clicked" handler="on_output_superclass_chooser_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="output_subclass_chooser_button">
+                                                <property name="label" translatable="yes">Выбрать</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Выберите выходной файл привязки подкласса.</property>
+                                                <signal name="clicked" handler="on_output_subclass_chooser_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                                <property name="top_attach">2</property>
+                                                <property name="bottom_attach">3</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="behavior_filename_chooser_button">
+                                                <property name="label" translatable="yes">Выбрать</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Choose the nput file name for
+behaviors added to subclasses.</property>
+                                                <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                                <property name="top_attach">6</property>
+                                                <property name="bottom_attach">7</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label12">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Модуль суперкласса:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">11</property>
+                                                <property name="bottom_attach">12</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="superclass_module_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Имя модуля суперкласса в модуле подкласса. Значение по умолчанию
+= "???".</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">11</property>
+                                                <property name="bottom_attach">12</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label13">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Использовать старые  getter и setter:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">12</property>
+                                                <property name="bottom_attach">13</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="old_getters_setters_checkbutton">
+                                                <property name="label" translatable="yes">Старые getter и setter</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Называть getter и setter getVar () и setVar (),
+вместо get_var () и set_var ().</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">12</property>
+                                                <property name="bottom_attach">13</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label14">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Путь корпусов контрольного устройства:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">13</property>
+                                                <property name="bottom_attach">14</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label15">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Пользовательский модуль методов:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">14</property>
+                                                <property name="bottom_attach">15</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label16">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Никакие даты:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">15</property>
+                                                <property name="bottom_attach">16</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label17">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Никакие версии:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">16</property>
+                                                <property name="bottom_attach">17</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="no_dates_checkbutton">
+                                                <property name="label" translatable="yes">Никакие даты в произведенном выводе</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Не включать текущую дату в произведенные
+файлы. Это полезно, если Вы хотите минимизировать
+, количество изменений (no-operation)
+в сгенрированном  коде питона.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">15</property>
+                                                <property name="bottom_attach">16</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="validator_bodies_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Путь к каталогу, содержащему файлы, которые обеспечивают
+корпуса (внедрения) методов контрольного устройства.</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">13</property>
+                                                <property name="bottom_attach">14</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="validator_bodies_chooser_button">
+                                                <property name="label" translatable="yes">Выбрать</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Выберите путь к каталогу, содержащему файлы, которые обеспечивают
+органы (реализации) методов проверки.</property>
+                                                <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                                <property name="top_attach">13</property>
+                                                <property name="bottom_attach">14</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="no_versions_checkbutton">
+                                                <property name="label" translatable="yes">Никакая информация о версии в произведенном выводе</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Не включайть текущую версию в произведенные
+файлы. Это полезно, если Вы хотите минимизировать
+, количество изменений (no-operationт)
+в сгенрированном  коде питона.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">16</property>
+                                                <property name="bottom_attach">17</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="user_methods_button">
+                                                <property name="label" translatable="yes">Выбрать</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Выберите дополнительный модуль, содержащий пользовательские методы. См.
+секцию "User Methods" в документации.</property>
+                                                <signal name="clicked" handler="on_user_methods_chooser_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                                <property name="top_attach">14</property>
+                                                <property name="bottom_attach">15</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="user_methods_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Дополнительный модуль, содержащий пользовательские методы. См.
+секцию "Пользовательские Методы" в документации.</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">14</property>
+                                                <property name="bottom_attach">15</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label18">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Никакой процесс не включает:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">17</property>
+                                                <property name="bottom_attach">18</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label19">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Тишина:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">18</property>
+                                                <property name="bottom_attach">19</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="no_process_includes_checkbutton">
+                                                <property name="label" translatable="yes">Не обрабатывать включения в схему</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Не обрабатывать включенные файлы XML-схемы.
+Значением по умолчанию generateDS.py вставит контент
+от файлов, на которые ссылаются &amp;lt;включают.../&amp;gt;
+элементы в XML-схемы, которая будет обработана.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">17</property>
+                                                <property name="bottom_attach">18</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="silence_checkbutton">
+                                                <property name="label" translatable="yes">Генерировать код, который не повторяет разобранный XML</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Обычно, код, произведенный с generateDS
+, повторяет разбираемую информацию. Используйте
+эта опция, чтобы выключить это поведение.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">18</property>
+                                                <property name="bottom_attach">19</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label20">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Определения пространства имен:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">19</property>
+                                                <property name="bottom_attach">20</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label21">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Внешнее кодировка:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">20</property>
+                                                <property name="bottom_attach">21</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label22">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Спецификации членов:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">22</property>
+                                                <property name="bottom_attach">23</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="namespace_defs_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Определение пространства имен, которое будет передано в как
+, оценивает за namespacedef_ параметр
+экспорт () метод сгенерированными разбором
+() и parseString () функции. Значение по умолчанию
+= ''. Пример:
+xmlns:abc = "http://www.abc.com"</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">19</property>
+                                                <property name="bottom_attach">20</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="external_encoding_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Закодируйте вывод, полученый сгенерированными экспортом
+методы, используя это кодирование. Значение по умолчанию, если опущено,
+является значением, возвращенным sys.getdefaultencoding (). Пример
+: utf-8.</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">20</property>
+                                                <property name="bottom_attach">21</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkHBox" id="member_specs_combobox_container">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <child>
+                                                    <placeholder></placeholder>
+                                                </child>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">22</property>
+                                                <property name="bottom_attach">23</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton">
+                                                <property name="label" translatable="yes">Свободный</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Пустое пространство имен
+префикс в XML-схеме, не
+значение по умолчанию ("xs":).</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                                <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                                <property name="top_attach">5</property>
+                                                <property name="bottom_attach">6</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="auto_super_checkbutton">
+                                                <property name="label" translatable="yes">Автоматически</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Используйте имя файла суперкласса
+как основа  имени модуля
+суперкласса.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                                <signal name="toggled" handler="on_auto_super_checkbutton_toggled" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                                <property name="top_attach">11</property>
+                                                <property name="bottom_attach">12</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="input_schema_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле входного файла схемы.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="output_superclass_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле выходного файла суперкласса.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="output_subclass_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле  выходного файла подкласса.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">2</property>
+                                                <property name="bottom_attach">3</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="prefix_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле префикса.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">4</property>
+                                                <property name="bottom_attach">5</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="namespace_prefix_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле префикса пространства имен XML.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">5</property>
+                                                <property name="bottom_attach">6</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="behavior_filename_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле имени файла поведения.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">6</property>
+                                                <property name="bottom_attach">7</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="subclass_suffix_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить суффикс подкласса.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">9</property>
+                                                <property name="bottom_attach">10</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="root_element_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле элемента корня.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">10</property>
+                                                <property name="bottom_attach">11</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="superclass_module_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле модуля суперкласса.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">11</property>
+                                                <property name="bottom_attach">12</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="validator_bodies_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле пути контрольных методов.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">13</property>
+                                                <property name="bottom_attach">14</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="user_methods_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле пользовательского модуля методов.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">14</property>
+                                                <property name="bottom_attach">15</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="namespace_defs_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле определений пространства имен.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">19</property>
+                                                <property name="bottom_attach">20</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="external_encoding_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле внешней кодировки.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">20</property>
+                                                <property name="bottom_attach">21</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label23">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Получить в кодировке:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">21</property>
+                                                <property name="bottom_attach">22</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="get_encoded_checkbutton">
+                                                <property name="label" translatable="yes">getter(ы) возвращают закодированные значения по умолчанию</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">getter(ы)возвращают закодированное значение по умолчанию если истина.
+Может быть изменен во времени выполнения или
+(1) глобальная переменная замены GetEncodedValue или
+(2) использовать дополнительный параметр getter</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">21</property>
+                                                <property name="bottom_attach">22</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label24">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Экспорт:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">23</property>
+                                                <property name="bottom_attach">24</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="export_spec_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Определяет экспортные функции, которые будут произведены. Значение - отделенный список разделителя любого следующего: "write" (записать XML файл), "literal" (записать код питона), "etree" (создают дерево элемента (может преобразовать в последовательную форму к XML)). Пример: "write etree". Значение по умолчанию: "write".</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">23</property>
+                                                <property name="bottom_attach">24</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label25">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Один файл XSD:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">24</property>
+                                                <property name="bottom_attach">25</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="one_file_per_xsd_checkbutton">
+                                                <property name="label" translatable="yes">Создавать модуль питона для каждого обработанного XSD.</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Создавать модуль питона для каждого обработанного XSD.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">24</property>
+                                                <property name="bottom_attach">25</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label26">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Каталог Output:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">25</property>
+                                                <property name="bottom_attach">26</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="output_directory_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Используемый вместе с --one-file-per-xsd. Каталог, где будут созданы модули.</property>
+                                                <property name="invisible_char">-</property>
+                                                <property name="width_chars">80</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">25</property>
+                                                <property name="bottom_attach">26</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="output_directory_chooser_button">
+                                                <property name="label" translatable="yes">Выбрать</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Выберите выходной каталог для one-file-per-xsd.</property>
+                                                <signal name="clicked" handler="on_output_directory_chooser_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">2</property>
+                                                <property name="right_attach">3</property>
+                                                <property name="top_attach">25</property>
+                                                <property name="bottom_attach">26</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="output_directory_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле выходного каталога .</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">25</property>
+                                                <property name="bottom_attach">26</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="export_spec_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле экспорт.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">23</property>
+                                                <property name="bottom_attach">24</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label27">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Суффикс модуля</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">26</property>
+                                                <property name="bottom_attach">27</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label28">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Сохранить теги CData:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">27</property>
+                                                <property name="bottom_attach">28</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkLabel" id="label29">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="label" translatable="yes">Список имени очистки:</property>
+                                                <property name="xalign">0</property>
+                                            </object>
+                                            <packing>
+                                                <property name="top_attach">28</property>
+                                                <property name="bottom_attach">29</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="module_suffix_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Использоваться вместе с  --one-file-per-xsd. Добавить XXX в конец каждого созданного файла.</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">26</property>
+                                                <property name="bottom_attach">27</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkEntry" id="cleanup_name_list_entry">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="tooltip_text" translatable="yes">Определяет список 2 кортежей, используемых для очистки имен. Первый элемент - образец поиска регулярного выражения, и второй замена. Пример: "[(' [-:]'. '_ '), ('^ __ ', 'Особенный')]". Значение по умолчанию: "[(' [-:]'.', _ ')]".</property>
+                                                <property name="invisible_char">-</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">28</property>
+                                                <property name="bottom_attach">29</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkCheckButton" id="preserve_cdata_tags_checkbutton">
+                                                <property name="label" translatable="yes">Сохранить теги CData</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">False</property>
+                                                <property name="tooltip_text" translatable="yes">Сохранить теги CDATA. Значение по умолчанию: False.</property>
+                                                <property name="xalign">0</property>
+                                                <property name="draw_indicator">True</property>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">27</property>
+                                                <property name="bottom_attach">28</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="module_suffix_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле суффикса модуля.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">26</property>
+                                                <property name="bottom_attach">27</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <object class="GtkButton" id="cleanup_name_list_clear_button">
+                                                <property name="label">gtk-clear</property>
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="receives_default">True</property>
+                                                <property name="tooltip_text" translatable="yes">Очистить поле списка имени очистки.</property>
+                                                <property name="use_stock">True</property>
+                                                <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/>
+                                            </object>
+                                            <packing>
+                                                <property name="left_attach">3</property>
+                                                <property name="right_attach">4</property>
+                                                <property name="top_attach">28</property>
+                                                <property name="bottom_attach">29</property>
+                                            </packing>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                        <child>
+                                            <placeholder></placeholder>
+                                        </child>
+                                    </object>
+                                </child>
+                            </object>
+                        </child>
+                    </object>
+                    <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkHBox" id="hbox1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="homogeneous">True</property>
+                        <child>
+                            <object class="GtkButton" id="generate_button">
+                                <property name="label" translatable="yes">Генерировать</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="tooltip_text" translatable="yes">Генерировать модули привязки.</property>
+                                <signal name="clicked" handler="on_generate_button_clicked" swapped="no"/>
+                            </object>
+                            <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">0</property>
+                            </packing>
+                        </child>
+                        <child>
+                            <object class="GtkButton" id="quit_button">
+                                <property name="label" translatable="yes">Выход</property>
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="receives_default">True</property>
+                                <property name="tooltip_text" translatable="yes">Выход из приложения.</property>
+                                <signal name="clicked" handler="on_quit_button_clicked" swapped="no"/>
+                            </object>
+                            <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                            </packing>
+                        </child>
+                    </object>
+                    <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">2</property>
+                    </packing>
+                </child>
+                <child>
+                    <object class="GtkStatusbar" id="statusbar1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">2</property>
+                    </object>
+                    <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">3</property>
+                    </packing>
+                </child>
+                <child>
+                    <placeholder></placeholder>
+                </child>
+            </object>
+        </child>
+    </object>
+    <object class="GtkImage" id="image5">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="stock">gtk-missing-image</property>
+    </object>
+</interface>
diff --git a/gui/generateds_gui_session.py b/gui/generateds_gui_session.py
index 6280722..1d11fb4 100644
--- a/gui/generateds_gui_session.py
+++ b/gui/generateds_gui_session.py
@@ -1,64 +1,45 @@
 #!/usr/bin/env python
-# -*- coding: utf-8 -*- 
+# -*- coding: utf-8 -*-
 
 #
-# Generated Wed Dec  8 14:24:46 2010 by generateDS.py version 2.3a.
+# Generated Fri Apr  8 12:08:30 2016 by generateDS.py version 2.21a.
+#
+# Command line options:
+#   ('-f', '')
+#   ('-o', 'generateds_gui_session.py')
+#   ('--member-specs', 'list')
+#
+# Command line arguments:
+#   generateds_gui_session.xsd
+#
+# Command line:
+#   ../generateDS.py -f -o "generateds_gui_session.py" --member-specs="list" generateds_gui_session.xsd
+#
+# Current working directory (os.getcwd()):
+#   gui
 #
 
 import sys
-import getopt
 import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+from lxml import etree as etree_
 
-etree_ = None
-Verbose_import_ = False
-(   XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-    ) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError("Failed to import ElementTree from any known place")
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-        'parser' not in kwargs):
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -70,23 +51,321 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
         def gds_format_float(self, input_data, input_name=''):
-            return '%f' % input_data
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
-            return '%s' % input_data
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
         def gds_str_lower(self, instring):
             return instring.lower()
-                    
-                    
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
 
 #
 # If you have installed IPython you can uncomment and use the following.
@@ -109,29 +388,52 @@ except ImportError, exp:
 
 ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
-STRING_CLEANUP_PAT = re_.compile(r"[\n\r\s]+")
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
 #
 
-def showIndent(outfile, level):
-    for idx in range(level):
-        outfile.write('    ')
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
+
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -144,6 +446,7 @@ def quote_attrib(inStr):
         s1 = '"%s"' % s1
     return s1
 
+
 def quote_python(inStr):
     s1 = inStr
     if s1.find("'") == -1:
@@ -171,14 +474,26 @@ def get_all_text_(node):
     return text
 
 
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
 class GDSParseError(Exception):
     pass
 
+
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -197,6 +512,7 @@ class MixedContainer:
     TypeDecimal = 5
     TypeDouble = 6
     TypeBoolean = 7
+    TypeBase64 = 8
     def __init__(self, category, content_type, name, value):
         self.category = category
         self.content_type = content_type
@@ -210,39 +526,82 @@ class MixedContainer:
         return self.value
     def getName(self):
         return self.name
-    def export(self, outfile, level, name, namespace):
+    def export(self, outfile, level, name, namespace, pretty_print=True):
         if self.category == MixedContainer.CategoryText:
             # Prevent exporting empty content as empty lines.
-            if self.value.strip(): 
+            if self.value.strip():
                 outfile.write(self.value)
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace,name)
+            self.value.export(outfile, level, namespace, name, pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
-            outfile.write('<%s>%s</%s>' % (self.name, self.value, self.name))
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
         elif self.content_type == MixedContainer.TypeInteger or \
                 self.content_type == MixedContainer.TypeBoolean:
-            outfile.write('<%s>%d</%s>' % (self.name, self.value, self.name))
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
         elif self.content_type == MixedContainer.TypeFloat or \
                 self.content_type == MixedContainer.TypeDecimal:
-            outfile.write('<%s>%f</%s>' % (self.name, self.value, self.name))
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
         elif self.content_type == MixedContainer.TypeDouble:
-            outfile.write('<%s>%g</%s>' % (self.name, self.value, self.name))
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
     def exportLiteral(self, outfile, level, name):
         if self.category == MixedContainer.CategoryText:
             showIndent(outfile, level)
-            outfile.write('model_.MixedContainer(%d, %d, "%s", "%s"),\n' % \
-                (self.category, self.content_type, self.name, self.value))
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
         elif self.category == MixedContainer.CategorySimple:
             showIndent(outfile, level)
-            outfile.write('model_.MixedContainer(%d, %d, "%s", "%s"),\n' % \
-                (self.category, self.content_type, self.name, self.value))
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
         else:    # category == MixedContainer.CategoryComplex
             showIndent(outfile, level)
-            outfile.write('model_.MixedContainer(%d, %d, "%s",\n' % \
-                (self.category, self.content_type, self.name,))
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
             self.value.exportLiteral(outfile, level + 1)
             showIndent(outfile, level)
             outfile.write(')\n')
@@ -268,6 +627,7 @@ class MemberSpec_(object):
     def set_container(self, container): self.container = container
     def get_container(self): return self.container
 
+
 def _cast(typ, value):
     if typ is None or value is None:
         return value
@@ -282,59 +642,71 @@ class SessionTypeMixin(object):
         """Produce a copy of myself.
         """
         new_session = sessionType(
-            input_schema = self.input_schema,
-            output_superclass = self.output_superclass,
-            output_subclass = self.output_subclass,
-            force = self.force,
-            prefix = self.prefix,
-            namespace_prefix = self.namespace_prefix,
-            empty_namespace_prefix = self.empty_namespace_prefix,
-            behavior_filename = self.behavior_filename,
-            properties = self.properties,
-            subclass_suffix = self.subclass_suffix,
-            root_element = self.root_element,
-            superclass_module = self.superclass_module,
-            auto_super = self.auto_super,
-            old_getters_setters = self.old_getters_setters,
-            validator_bodies = self.validator_bodies,
-            user_methods = self.user_methods,
-            no_dates = self.no_dates,
-            no_versions = self.no_versions,
-            no_process_includes = self.no_process_includes,
-            silence = self.silence,
-            namespace_defs = self.namespace_defs,
-            external_encoding = self.external_encoding,
-            member_specs = self.member_specs,
-            )
+            input_schema=self.input_schema,
+            output_superclass=self.output_superclass,
+            output_subclass=self.output_subclass,
+            force=self.force,
+            prefix=self.prefix,
+            namespace_prefix=self.namespace_prefix,
+            empty_namespace_prefix=self.empty_namespace_prefix,
+            behavior_filename=self.behavior_filename,
+            properties=self.properties,
+            subclass_suffix=self.subclass_suffix,
+            root_element=self.root_element,
+            superclass_module=self.superclass_module,
+            auto_super=self.auto_super,
+            old_getters_setters=self.old_getters_setters,
+            validator_bodies=self.validator_bodies,
+            user_methods=self.user_methods,
+            no_dates=self.no_dates,
+            no_versions=self.no_versions,
+            no_process_includes=self.no_process_includes,
+            silence=self.silence,
+            namespace_defs=self.namespace_defs,
+            external_encoding=self.external_encoding,
+            member_specs=self.member_specs,
+            export_spec=self.export_spec,
+            one_file_per_xsd=self.one_file_per_xsd,
+            output_directory=self.output_directory,
+            module_suffix=self.module_suffix,
+            preserve_cdata_tags=self.preserve_cdata_tags,
+            cleanup_name_list=self.cleanup_name_list,
+        )
         return new_session
 
     def __eq__(self, obj):
         """Implement the == operator.
         """
         if (
-            obj.input_schema == self.input_schema and
-            obj.output_superclass == self.output_superclass and
-            obj.output_subclass == self.output_subclass and
-            obj.force == self.force and
-            obj.prefix == self.prefix and
-            obj.namespace_prefix == self.namespace_prefix and
-            obj.empty_namespace_prefix == self.empty_namespace_prefix and
-            obj.behavior_filename == self.behavior_filename and
-            obj.properties == self.properties and
-            obj.subclass_suffix == self.subclass_suffix and
-            obj.root_element == self.root_element and
-            obj.superclass_module == self.superclass_module and
-            obj.auto_super == self.auto_super and
-            obj.old_getters_setters == self.old_getters_setters and
-            obj.validator_bodies == self.validator_bodies and
-            obj.user_methods == self.user_methods and
-            obj.no_dates == self.no_dates and
-            obj.no_versions == self.no_versions and
-            obj.no_process_includes == self.no_process_includes and
-            obj.silence == self.silence and
-            obj.namespace_defs == self.namespace_defs and
-            obj.external_encoding == self.external_encoding and
-            obj.member_specs == self.member_specs):
+                obj.input_schema == self.input_schema and
+                obj.output_superclass == self.output_superclass and
+                obj.output_subclass == self.output_subclass and
+                obj.force == self.force and
+                obj.prefix == self.prefix and
+                obj.namespace_prefix == self.namespace_prefix and
+                obj.empty_namespace_prefix == self.empty_namespace_prefix and
+                obj.behavior_filename == self.behavior_filename and
+                obj.properties == self.properties and
+                obj.subclass_suffix == self.subclass_suffix and
+                obj.root_element == self.root_element and
+                obj.superclass_module == self.superclass_module and
+                obj.auto_super == self.auto_super and
+                obj.old_getters_setters == self.old_getters_setters and
+                obj.validator_bodies == self.validator_bodies and
+                obj.user_methods == self.user_methods and
+                obj.no_dates == self.no_dates and
+                obj.no_versions == self.no_versions and
+                obj.no_process_includes == self.no_process_includes and
+                obj.silence == self.silence and
+                obj.namespace_defs == self.namespace_defs and
+                obj.external_encoding == self.external_encoding and
+                obj.member_specs == self.member_specs and
+                obj.export_spec == self.export_spec and
+                obj.one_file_per_xsd == self.one_file_per_xsd and
+                obj.output_directory == self.output_directory and
+                obj.module_suffix == self.module_suffix and
+                obj.preserve_cdata_tags == self.preserve_cdata_tags and
+                obj.cleanup_name_list == self.cleanup_name_list):
             return True
         else:
             return False
@@ -344,10 +716,12 @@ class SessionTypeMixin(object):
         """
         return not self.__eq__(obj)
 
+
 #
 # Data representation classes.
 #
 
+
 class sessionType(GeneratedsSuper, SessionTypeMixin):
     member_data_items_ = [
         MemberSpec_('input_schema', 'xs:string', 0),
@@ -372,11 +746,19 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
         MemberSpec_('silence', 'xs:boolean', 0),
         MemberSpec_('namespace_defs', 'xs:string', 0),
         MemberSpec_('external_encoding', 'xs:string', 0),
+        MemberSpec_('get_encoded', 'xs:boolean', 0),
         MemberSpec_('member_specs', 'xs:string', 0),
-        ]
+        MemberSpec_('export_spec', 'xs:string', 0),
+        MemberSpec_('one_file_per_xsd', 'xs:boolean', 0),
+        MemberSpec_('output_directory', 'xs:string', 0),
+        MemberSpec_('module_suffix', 'xs:string', 0),
+        MemberSpec_('preserve_cdata_tags', 'xs:boolean', 0),
+        MemberSpec_('cleanup_name_list', 'xs:string', 0),
+    ]
     subclass = None
     superclass = None
-    def __init__(self, input_schema=None, output_superclass=None, output_subclass=None, force=None, prefix=None, namespace_prefix=None, empty_namespace_prefix=None, behavior_filename=None, properties=None, subclass_suffix=None, root_element=None, superclass_module=None, auto_super=None, old_getters_setters=None, validator_bodies=None, user_methods=None, no_dates=None, no_versions=None, no_process_includes=None, silence=None, namespace_defs=None, external_encoding=None, member_specs=None):
+    def __init__(self, input_schema=None, output_superclass=None, output_subclass=None, force=None, prefix=None, namespace_prefix=None, empty_namespace_prefix=None, behavior_filename=None, properties=None, subclass_suffix=None, root_element=None, superclass_module=None, auto_super=None, old_getters_setters=None, validator_bodies=None, user_methods=None, no_dates=None, no_versions=None, no_process_includes=None, silence=None, namespace_defs=None, external_encoding=None, get_encoded=None, member_specs=None, export_spec=None, one_file_per_xsd=None, output_directory=None, module_suffix=None, preserve_cdata_tags=None, cleanup_name_list=None):
+        self.original_tagname_ = None
         self.input_schema = input_schema
         self.output_superclass = output_superclass
         self.output_subclass = output_subclass
@@ -399,8 +781,20 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
         self.silence = silence
         self.namespace_defs = namespace_defs
         self.external_encoding = external_encoding
+        self.get_encoded = get_encoded
         self.member_specs = member_specs
+        self.export_spec = export_spec
+        self.one_file_per_xsd = one_file_per_xsd
+        self.output_directory = output_directory
+        self.module_suffix = module_suffix
+        self.preserve_cdata_tags = preserve_cdata_tags
+        self.cleanup_name_list = cleanup_name_list
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, sessionType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if sessionType.subclass:
             return sessionType.subclass(*args_, **kwargs_)
         else:
@@ -450,91 +844,22 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
     def set_namespace_defs(self, namespace_defs): self.namespace_defs = namespace_defs
     def get_external_encoding(self): return self.external_encoding
     def set_external_encoding(self, external_encoding): self.external_encoding = external_encoding
+    def get_get_encoded(self): return self.get_encoded
+    def set_get_encoded(self, get_encoded): self.get_encoded = get_encoded
     def get_member_specs(self): return self.member_specs
     def set_member_specs(self, member_specs): self.member_specs = member_specs
-    def export(self, outfile, level, namespace_='', name_='sessionType', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='sessionType')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='sessionType'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='sessionType'):
-        if self.input_schema is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sinput_schema>%s</%sinput_schema>\n' % (namespace_, self.gds_format_string(quote_xml(self.input_schema).encode(ExternalEncoding), input_name='input_schema'), namespace_))
-        if self.output_superclass is not None:
-            showIndent(outfile, level)
-            outfile.write('<%soutput_superclass>%s</%soutput_superclass>\n' % (namespace_, self.gds_format_string(quote_xml(self.output_superclass).encode(ExternalEncoding), input_name='output_superclass'), namespace_))
-        if self.output_subclass is not None:
-            showIndent(outfile, level)
-            outfile.write('<%soutput_subclass>%s</%soutput_subclass>\n' % (namespace_, self.gds_format_string(quote_xml(self.output_subclass).encode(ExternalEncoding), input_name='output_subclass'), namespace_))
-        if self.force is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sforce>%s</%sforce>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.force)), input_name='force'), namespace_))
-        if self.prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sprefix>%s</%sprefix>\n' % (namespace_, self.gds_format_string(quote_xml(self.prefix).encode(ExternalEncoding), input_name='prefix'), namespace_))
-        if self.namespace_prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('<%snamespace_prefix>%s</%snamespace_prefix>\n' % (namespace_, self.gds_format_string(quote_xml(self.namespace_prefix).encode(ExternalEncoding), input_name='namespace_prefix'), namespace_))
-        if self.empty_namespace_prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sempty_namespace_prefix>%s</%sempty_namespace_prefix>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.empty_namespace_prefix)), input_name='empty_namespace_prefix'), namespace_))
-        if self.behavior_filename is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sbehavior_filename>%s</%sbehavior_filename>\n' % (namespace_, self.gds_format_string(quote_xml(self.behavior_filename).encode(ExternalEncoding), input_name='behavior_filename'), namespace_))
-        if self.properties is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sproperties>%s</%sproperties>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.properties)), input_name='properties'), namespace_))
-        if self.subclass_suffix is not None:
-            showIndent(outfile, level)
-            outfile.write('<%ssubclass_suffix>%s</%ssubclass_suffix>\n' % (namespace_, self.gds_format_string(quote_xml(self.subclass_suffix).encode(ExternalEncoding), input_name='subclass_suffix'), namespace_))
-        if self.root_element is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sroot_element>%s</%sroot_element>\n' % (namespace_, self.gds_format_string(quote_xml(self.root_element).encode(ExternalEncoding), input_name='root_element'), namespace_))
-        if self.superclass_module is not None:
-            showIndent(outfile, level)
-            outfile.write('<%ssuperclass_module>%s</%ssuperclass_module>\n' % (namespace_, self.gds_format_string(quote_xml(self.superclass_module).encode(ExternalEncoding), input_name='superclass_module'), namespace_))
-        if self.auto_super is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sauto_super>%s</%sauto_super>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.auto_super)), input_name='auto_super'), namespace_))
-        if self.old_getters_setters is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sold_getters_setters>%s</%sold_getters_setters>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.old_getters_setters)), input_name='old_getters_setters'), namespace_))
-        if self.validator_bodies is not None:
-            showIndent(outfile, level)
-            outfile.write('<%svalidator_bodies>%s</%svalidator_bodies>\n' % (namespace_, self.gds_format_string(quote_xml(self.validator_bodies).encode(ExternalEncoding), input_name='validator_bodies'), namespace_))
-        if self.user_methods is not None:
-            showIndent(outfile, level)
-            outfile.write('<%suser_methods>%s</%suser_methods>\n' % (namespace_, self.gds_format_string(quote_xml(self.user_methods).encode(ExternalEncoding), input_name='user_methods'), namespace_))
-        if self.no_dates is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sno_dates>%s</%sno_dates>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_dates)), input_name='no_dates'), namespace_))
-        if self.no_versions is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sno_versions>%s</%sno_versions>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_versions)), input_name='no_versions'), namespace_))
-        if self.no_process_includes is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sno_process_includes>%s</%sno_process_includes>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_process_includes)), input_name='no_process_includes'), namespace_))
-        if self.silence is not None:
-            showIndent(outfile, level)
-            outfile.write('<%ssilence>%s</%ssilence>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.silence)), input_name='silence'), namespace_))
-        if self.namespace_defs is not None:
-            showIndent(outfile, level)
-            outfile.write('<%snamespace_defs>%s</%snamespace_defs>\n' % (namespace_, self.gds_format_string(quote_xml(self.namespace_defs).encode(ExternalEncoding), input_name='namespace_defs'), namespace_))
-        if self.external_encoding is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sexternal_encoding>%s</%sexternal_encoding>\n' % (namespace_, self.gds_format_string(quote_xml(self.external_encoding).encode(ExternalEncoding), input_name='external_encoding'), namespace_))
-        if self.member_specs is not None:
-            showIndent(outfile, level)
-            outfile.write('<%smember_specs>%s</%smember_specs>\n' % (namespace_, self.gds_format_string(quote_xml(self.member_specs).encode(ExternalEncoding), input_name='member_specs'), namespace_))
+    def get_export_spec(self): return self.export_spec
+    def set_export_spec(self, export_spec): self.export_spec = export_spec
+    def get_one_file_per_xsd(self): return self.one_file_per_xsd
+    def set_one_file_per_xsd(self, one_file_per_xsd): self.one_file_per_xsd = one_file_per_xsd
+    def get_output_directory(self): return self.output_directory
+    def set_output_directory(self, output_directory): self.output_directory = output_directory
+    def get_module_suffix(self): return self.module_suffix
+    def set_module_suffix(self, module_suffix): self.module_suffix = module_suffix
+    def get_preserve_cdata_tags(self): return self.preserve_cdata_tags
+    def set_preserve_cdata_tags(self, preserve_cdata_tags): self.preserve_cdata_tags = preserve_cdata_tags
+    def get_cleanup_name_list(self): return self.cleanup_name_list
+    def set_cleanup_name_list(self, cleanup_name_list): self.cleanup_name_list = cleanup_name_list
     def hasContent_(self):
         if (
             self.input_schema is not None or
@@ -559,104 +884,154 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
             self.silence is not None or
             self.namespace_defs is not None or
             self.external_encoding is not None or
-            self.member_specs is not None
-            ):
+            self.get_encoded is not None or
+            self.member_specs is not None or
+            self.export_spec is not None or
+            self.one_file_per_xsd is not None or
+            self.output_directory is not None or
+            self.module_suffix is not None or
+            self.preserve_cdata_tags is not None or
+            self.cleanup_name_list is not None
+        ):
             return True
         else:
             return False
-    def exportLiteral(self, outfile, level, name_='sessionType'):
-        level += 1
-        self.exportLiteralAttributes(outfile, level, name_)
+    def export(self, outfile, level, namespace_='', name_='sessionType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='sessionType')
         if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, name_):
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='sessionType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='sessionType'):
         pass
-    def exportLiteralChildren(self, outfile, level, name_):
+    def exportChildren(self, outfile, level, namespace_='', name_='sessionType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
         if self.input_schema is not None:
-            showIndent(outfile, level)
-            outfile.write('input_schema=%s,\n' % quote_python(self.input_schema).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinput_schema>%s</%sinput_schema>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.input_schema), input_name='input_schema')), namespace_, eol_))
         if self.output_superclass is not None:
-            showIndent(outfile, level)
-            outfile.write('output_superclass=%s,\n' % quote_python(self.output_superclass).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%soutput_superclass>%s</%soutput_superclass>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.output_superclass), input_name='output_superclass')), namespace_, eol_))
         if self.output_subclass is not None:
-            showIndent(outfile, level)
-            outfile.write('output_subclass=%s,\n' % quote_python(self.output_subclass).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%soutput_subclass>%s</%soutput_subclass>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.output_subclass), input_name='output_subclass')), namespace_, eol_))
         if self.force is not None:
-            showIndent(outfile, level)
-            outfile.write('force=%s,\n' % self.force)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sforce>%s</%sforce>%s' % (namespace_, self.gds_format_boolean(self.force, input_name='force'), namespace_, eol_))
         if self.prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('prefix=%s,\n' % quote_python(self.prefix).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sprefix>%s</%sprefix>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.prefix), input_name='prefix')), namespace_, eol_))
         if self.namespace_prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('namespace_prefix=%s,\n' % quote_python(self.namespace_prefix).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snamespace_prefix>%s</%snamespace_prefix>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.namespace_prefix), input_name='namespace_prefix')), namespace_, eol_))
         if self.empty_namespace_prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('empty_namespace_prefix=%s,\n' % self.empty_namespace_prefix)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sempty_namespace_prefix>%s</%sempty_namespace_prefix>%s' % (namespace_, self.gds_format_boolean(self.empty_namespace_prefix, input_name='empty_namespace_prefix'), namespace_, eol_))
         if self.behavior_filename is not None:
-            showIndent(outfile, level)
-            outfile.write('behavior_filename=%s,\n' % quote_python(self.behavior_filename).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sbehavior_filename>%s</%sbehavior_filename>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.behavior_filename), input_name='behavior_filename')), namespace_, eol_))
         if self.properties is not None:
-            showIndent(outfile, level)
-            outfile.write('properties=%s,\n' % self.properties)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sproperties>%s</%sproperties>%s' % (namespace_, self.gds_format_boolean(self.properties, input_name='properties'), namespace_, eol_))
         if self.subclass_suffix is not None:
-            showIndent(outfile, level)
-            outfile.write('subclass_suffix=%s,\n' % quote_python(self.subclass_suffix).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%ssubclass_suffix>%s</%ssubclass_suffix>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.subclass_suffix), input_name='subclass_suffix')), namespace_, eol_))
         if self.root_element is not None:
-            showIndent(outfile, level)
-            outfile.write('root_element=%s,\n' % quote_python(self.root_element).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sroot_element>%s</%sroot_element>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.root_element), input_name='root_element')), namespace_, eol_))
         if self.superclass_module is not None:
-            showIndent(outfile, level)
-            outfile.write('superclass_module=%s,\n' % quote_python(self.superclass_module).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%ssuperclass_module>%s</%ssuperclass_module>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.superclass_module), input_name='superclass_module')), namespace_, eol_))
         if self.auto_super is not None:
-            showIndent(outfile, level)
-            outfile.write('auto_super=%s,\n' % self.auto_super)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sauto_super>%s</%sauto_super>%s' % (namespace_, self.gds_format_boolean(self.auto_super, input_name='auto_super'), namespace_, eol_))
         if self.old_getters_setters is not None:
-            showIndent(outfile, level)
-            outfile.write('old_getters_setters=%s,\n' % self.old_getters_setters)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sold_getters_setters>%s</%sold_getters_setters>%s' % (namespace_, self.gds_format_boolean(self.old_getters_setters, input_name='old_getters_setters'), namespace_, eol_))
         if self.validator_bodies is not None:
-            showIndent(outfile, level)
-            outfile.write('validator_bodies=%s,\n' % quote_python(self.validator_bodies).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%svalidator_bodies>%s</%svalidator_bodies>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.validator_bodies), input_name='validator_bodies')), namespace_, eol_))
         if self.user_methods is not None:
-            showIndent(outfile, level)
-            outfile.write('user_methods=%s,\n' % quote_python(self.user_methods).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%suser_methods>%s</%suser_methods>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.user_methods), input_name='user_methods')), namespace_, eol_))
         if self.no_dates is not None:
-            showIndent(outfile, level)
-            outfile.write('no_dates=%s,\n' % self.no_dates)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sno_dates>%s</%sno_dates>%s' % (namespace_, self.gds_format_boolean(self.no_dates, input_name='no_dates'), namespace_, eol_))
         if self.no_versions is not None:
-            showIndent(outfile, level)
-            outfile.write('no_versions=%s,\n' % self.no_versions)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sno_versions>%s</%sno_versions>%s' % (namespace_, self.gds_format_boolean(self.no_versions, input_name='no_versions'), namespace_, eol_))
         if self.no_process_includes is not None:
-            showIndent(outfile, level)
-            outfile.write('no_process_includes=%s,\n' % self.no_process_includes)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sno_process_includes>%s</%sno_process_includes>%s' % (namespace_, self.gds_format_boolean(self.no_process_includes, input_name='no_process_includes'), namespace_, eol_))
         if self.silence is not None:
-            showIndent(outfile, level)
-            outfile.write('silence=%s,\n' % self.silence)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%ssilence>%s</%ssilence>%s' % (namespace_, self.gds_format_boolean(self.silence, input_name='silence'), namespace_, eol_))
         if self.namespace_defs is not None:
-            showIndent(outfile, level)
-            outfile.write('namespace_defs=%s,\n' % quote_python(self.namespace_defs).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snamespace_defs>%s</%snamespace_defs>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.namespace_defs), input_name='namespace_defs')), namespace_, eol_))
         if self.external_encoding is not None:
-            showIndent(outfile, level)
-            outfile.write('external_encoding=%s,\n' % quote_python(self.external_encoding).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sexternal_encoding>%s</%sexternal_encoding>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.external_encoding), input_name='external_encoding')), namespace_, eol_))
+        if self.get_encoded is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sget_encoded>%s</%sget_encoded>%s' % (namespace_, self.gds_format_boolean(self.get_encoded, input_name='get_encoded'), namespace_, eol_))
         if self.member_specs is not None:
-            showIndent(outfile, level)
-            outfile.write('member_specs=%s,\n' % quote_python(self.member_specs).encode(ExternalEncoding))
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%smember_specs>%s</%smember_specs>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.member_specs), input_name='member_specs')), namespace_, eol_))
+        if self.export_spec is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sexport_spec>%s</%sexport_spec>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.export_spec), input_name='export_spec')), namespace_, eol_))
+        if self.one_file_per_xsd is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sone_file_per_xsd>%s</%sone_file_per_xsd>%s' % (namespace_, self.gds_format_boolean(self.one_file_per_xsd, input_name='one_file_per_xsd'), namespace_, eol_))
+        if self.output_directory is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%soutput_directory>%s</%soutput_directory>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.output_directory), input_name='output_directory')), namespace_, eol_))
+        if self.module_suffix is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%smodule_suffix>%s</%smodule_suffix>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.module_suffix), input_name='module_suffix')), namespace_, eol_))
+        if self.preserve_cdata_tags is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%spreserve_cdata_tags>%s</%spreserve_cdata_tags>%s' % (namespace_, self.gds_format_boolean(self.preserve_cdata_tags, input_name='preserve_cdata_tags'), namespace_, eol_))
+        if self.cleanup_name_list is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%scleanup_name_list>%s</%scleanup_name_list>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.cleanup_name_list), input_name='cleanup_name_list')), namespace_, eol_))
     def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, nodeName_)
+            self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'input_schema':
             input_schema_ = child_.text
+            input_schema_ = self.gds_validate_string(input_schema_, node, 'input_schema')
             self.input_schema = input_schema_
         elif nodeName_ == 'output_superclass':
             output_superclass_ = child_.text
+            output_superclass_ = self.gds_validate_string(output_superclass_, node, 'output_superclass')
             self.output_superclass = output_superclass_
         elif nodeName_ == 'output_subclass':
             output_subclass_ = child_.text
+            output_subclass_ = self.gds_validate_string(output_subclass_, node, 'output_subclass')
             self.output_subclass = output_subclass_
         elif nodeName_ == 'force':
             sval_ = child_.text
@@ -666,12 +1041,15 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'force')
             self.force = ival_
         elif nodeName_ == 'prefix':
             prefix_ = child_.text
+            prefix_ = self.gds_validate_string(prefix_, node, 'prefix')
             self.prefix = prefix_
         elif nodeName_ == 'namespace_prefix':
             namespace_prefix_ = child_.text
+            namespace_prefix_ = self.gds_validate_string(namespace_prefix_, node, 'namespace_prefix')
             self.namespace_prefix = namespace_prefix_
         elif nodeName_ == 'empty_namespace_prefix':
             sval_ = child_.text
@@ -681,9 +1059,11 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'empty_namespace_prefix')
             self.empty_namespace_prefix = ival_
         elif nodeName_ == 'behavior_filename':
             behavior_filename_ = child_.text
+            behavior_filename_ = self.gds_validate_string(behavior_filename_, node, 'behavior_filename')
             self.behavior_filename = behavior_filename_
         elif nodeName_ == 'properties':
             sval_ = child_.text
@@ -693,15 +1073,19 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'properties')
             self.properties = ival_
         elif nodeName_ == 'subclass_suffix':
             subclass_suffix_ = child_.text
+            subclass_suffix_ = self.gds_validate_string(subclass_suffix_, node, 'subclass_suffix')
             self.subclass_suffix = subclass_suffix_
         elif nodeName_ == 'root_element':
             root_element_ = child_.text
+            root_element_ = self.gds_validate_string(root_element_, node, 'root_element')
             self.root_element = root_element_
         elif nodeName_ == 'superclass_module':
             superclass_module_ = child_.text
+            superclass_module_ = self.gds_validate_string(superclass_module_, node, 'superclass_module')
             self.superclass_module = superclass_module_
         elif nodeName_ == 'auto_super':
             sval_ = child_.text
@@ -711,6 +1095,7 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'auto_super')
             self.auto_super = ival_
         elif nodeName_ == 'old_getters_setters':
             sval_ = child_.text
@@ -720,12 +1105,15 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'old_getters_setters')
             self.old_getters_setters = ival_
         elif nodeName_ == 'validator_bodies':
             validator_bodies_ = child_.text
+            validator_bodies_ = self.gds_validate_string(validator_bodies_, node, 'validator_bodies')
             self.validator_bodies = validator_bodies_
         elif nodeName_ == 'user_methods':
             user_methods_ = child_.text
+            user_methods_ = self.gds_validate_string(user_methods_, node, 'user_methods')
             self.user_methods = user_methods_
         elif nodeName_ == 'no_dates':
             sval_ = child_.text
@@ -735,6 +1123,7 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'no_dates')
             self.no_dates = ival_
         elif nodeName_ == 'no_versions':
             sval_ = child_.text
@@ -744,6 +1133,7 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'no_versions')
             self.no_versions = ival_
         elif nodeName_ == 'no_process_includes':
             sval_ = child_.text
@@ -753,6 +1143,7 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'no_process_includes')
             self.no_process_includes = ival_
         elif nodeName_ == 'silence':
             sval_ = child_.text
@@ -762,85 +1153,176 @@ class sessionType(GeneratedsSuper, SessionTypeMixin):
                 ival_ = False
             else:
                 raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'silence')
             self.silence = ival_
         elif nodeName_ == 'namespace_defs':
             namespace_defs_ = child_.text
+            namespace_defs_ = self.gds_validate_string(namespace_defs_, node, 'namespace_defs')
             self.namespace_defs = namespace_defs_
         elif nodeName_ == 'external_encoding':
             external_encoding_ = child_.text
+            external_encoding_ = self.gds_validate_string(external_encoding_, node, 'external_encoding')
             self.external_encoding = external_encoding_
+        elif nodeName_ == 'get_encoded':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'get_encoded')
+            self.get_encoded = ival_
         elif nodeName_ == 'member_specs':
             member_specs_ = child_.text
+            member_specs_ = self.gds_validate_string(member_specs_, node, 'member_specs')
             self.member_specs = member_specs_
+        elif nodeName_ == 'export_spec':
+            export_spec_ = child_.text
+            export_spec_ = self.gds_validate_string(export_spec_, node, 'export_spec')
+            self.export_spec = export_spec_
+        elif nodeName_ == 'one_file_per_xsd':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'one_file_per_xsd')
+            self.one_file_per_xsd = ival_
+        elif nodeName_ == 'output_directory':
+            output_directory_ = child_.text
+            output_directory_ = self.gds_validate_string(output_directory_, node, 'output_directory')
+            self.output_directory = output_directory_
+        elif nodeName_ == 'module_suffix':
+            module_suffix_ = child_.text
+            module_suffix_ = self.gds_validate_string(module_suffix_, node, 'module_suffix')
+            self.module_suffix = module_suffix_
+        elif nodeName_ == 'preserve_cdata_tags':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'preserve_cdata_tags')
+            self.preserve_cdata_tags = ival_
+        elif nodeName_ == 'cleanup_name_list':
+            cleanup_name_list_ = child_.text
+            cleanup_name_list_ = self.gds_validate_string(cleanup_name_list_, node, 'cleanup_name_list')
+            self.cleanup_name_list = cleanup_name_list_
 # end class sessionType
 
 
+GDSClassesMapping = {
+    'session': sessionType,
+}
+
+
 USAGE_TEXT = """
 Usage: python <Parser>.py [ -s ] <in_xml_file>
 """
 
+
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
 def get_root_tag(node):
     tag = Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = globals().get(tag)
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
     return tag, rootClass
 
 
-def parse(inFileName):
-    doc = parsexml_(inFileName)
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'session'
+        rootTag = 'sessionType'
         rootClass = sessionType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0, name_=rootTag, 
-        namespacedef_='')
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
     return rootObj
 
 
-def parseString(inString):
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'sessionType'
+        rootClass = sessionType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'session'
+        rootTag = 'sessionType'
         rootClass = sessionType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0, name_="session",
-        namespacedef_='')
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
     return rootObj
 
 
-def parseLiteral(inFileName):
-    doc = parsexml_(inFileName)
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'session'
+        rootTag = 'sessionType'
         rootClass = sessionType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
-    sys.stdout.write('#from generateds_gui_session import *\n\n')
-    sys.stdout.write('import generateds_gui_session as model_\n\n')
-    sys.stdout.write('rootObj = model_.rootTag(\n')
-    rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
-    sys.stdout.write(')\n')
+    if not silence:
+        sys.stdout.write('#from generateds_gui_session import *\n\n')
+        sys.stdout.write('import generateds_gui_session as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
     return rootObj
 
 
@@ -859,4 +1341,4 @@ if __name__ == '__main__':
 
 __all__ = [
     "sessionType"
-    ]
+]
diff --git a/gui/generateds_gui_session.xsd b/gui/generateds_gui_session.xsd
index bb49045..986a982 100644
--- a/gui/generateds_gui_session.xsd
+++ b/gui/generateds_gui_session.xsd
@@ -29,6 +29,12 @@
       <xs:element name="external_encoding" type="xs:string" />
       <xs:element name="get_encoded" type="xs:boolean" />
       <xs:element name="member_specs" type="xs:string" />
+      <xs:element name="export_spec" type="xs:string" />
+      <xs:element name="one_file_per_xsd" type="xs:boolean" />
+      <xs:element name="output_directory" type="xs:string" />
+      <xs:element name="module_suffix" type="xs:string" />
+      <xs:element name="preserve_cdata_tags" type="xs:boolean" />
+      <xs:element name="cleanup_name_list" type="xs:string" />
     </xs:sequence>
   </xs:complexType>
 
diff --git a/gui/run_generate_session b/gui/run_generate_session
new file mode 100755
index 0000000..1abdbd2
--- /dev/null
+++ b/gui/run_generate_session
@@ -0,0 +1,5 @@
+#!/bin/bash
+../generateDS.py \
+    -o generateds_gui_session.py \
+    --member-specs=list \
+    generateds_gui_session.xsd
diff --git a/gui/rus.dictionary b/gui/rus.dictionary
new file mode 100644
index 0000000..99b9b14
--- /dev/null
+++ b/gui/rus.dictionary
@@ -0,0 +1,108 @@
+Always overwrite output files.\nDo not ask for confirmation.<-|->Всегда перезаписывать выходные файлы.\nбез запроса подтверждение.
+Append this text to the generated subclass names.\nDefault="Sub".<-|->Дополнительный текст к сгенерированными подназваниям классов. Значение по умолчанию\n= "Sub".
+Assume an empty namespace\nprefix in the XML schema, not\nthe default ("xs:").<-|->Пустое пространство имен\nпрефикс в XML-схеме, не\nзначение по умолчанию ("xs":).
+Assume that this value is the name\nof the root element of instance docs.\nDefault is first element defined in schema.<-|->Предположите, что это значение - имя\nэлемента корня документа\n, Значение по умолчанию - первый элемент, определенный в схеме.
+Auto<-|->Автоматически
+Behavior file name:<-|->Имя файла поведения:
+Capture the command line that would be used\nto generate the bindings modules.<-|->Получить командную строку, которая использовалась бы\n, чтобы произвести модули (bindings modules).
+Choose<-|->Выбрать
+Choose the input schema file.<-|->Выберите входной файл схемы.
+Choose the input file name for\nbehaviors added to subclasses.<-|->Выберите входное имя файла для\nповедений, добавленных к подклассам.
+Choose the optional module containing user methods.  See\nsection "User Methods" in the documentation.<-|->Выберите дополнительный модуль, содержащий пользовательские методы. См.\nсекцию "User Methods" в документации.
+Choose the output directory for one-file-per-xsd.<-|->Выберите выходной каталог для one-file-per-xsd.
+Choose the output subclass bindings file.<-|->Выберите выходной файл привязки подкласса.
+Choose the output superclass bindings file.<-|->Выберите выходной файл привязки суперкласса.
+Choose the path to a directory containing files that provide\nbodies (implementations) of validator methods.<-|->Выберите путь к каталогу, содержащему файлы, которые обеспечивают\nорганы (реализации) методов проверки.
+Cleanup name list:<-|->Список имени очистки:
+Clear the XML namespace prefix entry.<-|->Очистить поле префикса пространства имен XML.
+Clear the behavior file name entry.<-|->Очистить поле имени файла поведения.
+Clear the cleanup name list entry.<-|->Очистить поле списка имени очистки.
+Clear the exports entry.<-|->Очистить поле экспорт.
+Clear the external encoding entry.<-|->Очистить поле внешней кодировки.
+Clear the input schema file entry.<-|->Очистить поле входного файла схемы.
+Clear the module suffix entry.<-|->Очистить поле суффикса модуля.
+Clear the namespace definitions entry.<-|->Очистить поле определений пространства имен.
+Clear the output directory entry.<-|->Очистить поле выходного каталога .
+Clear the output subclass file entry.<-|->Очистить поле  выходного файла подкласса.
+Clear the output superclass file entry.<-|->Очистить поле выходного файла суперкласса.
+Clear the prefix entry.<-|->Очистить поле префикса.
+Clear the root element entry.<-|->Очистить поле элемента корня.
+Clear the subclass suffix.<-|->Очистить суффикс подкласса.
+Clear the superclass module entry.<-|->Очистить поле модуля суперкласса.
+Clear the user methods module entry.<-|->Очистить поле пользовательского модуля методов.
+Clear the validator bodies path entry.<-|->Очистить поле пути контрольных методов.
+Create a python module for each XSD processed.<-|->Создавать модуль питона для каждого обработанного XSD.
+Do not include the current date in the generated\nfiles. This is useful if you want to minimize\nthe amount of (no-operation) changes to the\ngenerated python code.<-|->Не включать текущую дату в произведенные\nфайлы. Это полезно, если Вы хотите минимизировать\n, количество изменений (no-operation)\nв сгенрированном  коде питона.
+Do not include the current version in the generated\nfiles. This is useful if you want to minimize\nthe amount of (no-operation) changes to the\ngenerated python code.<-|->Не включайть текущую версию в произведенные\nфайлы. Это полезно, если Вы хотите минимизировать\n, количество изменений (no-operationт)\nв сгенрированном  коде питона.
+Do not process included XML Schema files.  By\ndefault, generateDS.py will insert content\nfrom files referenced by <include ... />\nelements into the XML Schema to be processed.<-|->Не обрабатывать включенные файлы XML-схемы.\nЗначением по умолчанию generateDS.py вставит контент\nот файлов, на которые ссылаются &lt;включают.../&gt;\nэлементы в XML-схемы, которая будет обработана.
+Do not process includes in schema<-|->Не обрабатывать включения в схему
+Empty<-|->Свободный
+Encode output written by the generated export\nmethods using this encoding.  Default, if omitted,\nis the value returned by sys.getdefaultencoding().\nExample: utf-8.<-|->Закодируйте вывод, полученый сгенерированными экспортом\nметоды, используя это кодирование. Значение по умолчанию, если опущено,\nявляется значением, возвращенным sys.getdefaultencoding (). Пример\n: utf-8.
+Exit from the application.<-|->Выход из приложения.
+Exports:<-|->Экспорт:
+External encoding:<-|->Внешнее кодировка:
+Force<-|->Ускоорить
+Generate<-|->Генерировать
+Generate Python properties for member variables\nso that the value can be retrieved and modified\nwithout calling getter and setter functions.\n<-|->Генерировать свойства Python для переменных-членов\nтак, чтобы значение могло быть восстановлено и изменено\n, не называя функции getter и setter.\n
+Generate Python properties:<-|->Генерировать свойства  Python:
+Generate code that does not echo the parsed XML<-|->Генерировать код, который не повторяет разобранный XML
+Generate the bindings modules.<-|->Генерировать модули привязки.
+Get encoded:<-|->Получить в кодировке:
+Getters return encoded value by default if true.\nCan be changed at run-time by either\n(1) changing global variable GetEncodedValue or\n(2) using optional parameter to getter.<-|->getter(ы)возвращают закодированное значение по умолчанию если истина.\nМожет быть изменен во времени выполнения или\n(1) глобальная переменная замены GetEncodedValue или\n(2) использовать дополнительный параметр getter
+Getters return encoded values by default<-|->getter(ы) возвращают закодированные значения по умолчанию
+Input file name for behaviors\nadded to subclasses.<-|->Введите имя файла для поведений\nдобавлемых к подклассам.
+Input schema file:<-|->Введите файл схемы:
+Load a previous saved session.<-|->Загрузите предыдущую сохраненную сессию.
+Member specs:<-|->Спецификации членов:
+Messages and Content<-|->Сообщения и контент
+Module suffix:<-|->Суффикс модуля
+Name getters and setters getVar() and setVar(),\ninstead of get_var() and set_var().<-|->Называть getter и setter getVar () и setVar (),\nвместо get_var () и set_var ().
+Namespace definition to be passed in as the\nvalue for the namespacedef_ parameter of\nthe export() method by the generated\nparse() and parseString() functions.\nDefault=''.  Example:\nxmlns:abc="http://www.abc.com"<-|->Определение пространства имен, которое будет передано в как\n, оценивает за namespacedef_ параметр\nэкспорт () метод сгенерированными разбором\n() и parseString () функции. Значение по умолчанию\n= ''. Пример:\nxmlns:abc = "http://www.abc.com"
+Namespace definitions:<-|->Определения пространства имен:
+Namespace prefix:<-|->Префикс пространства имен:
+No dates in generated output<-|->Никакие даты в произведенном выводе
+No dates:<-|->Никакие даты:
+No process includes:<-|->Никакой процесс не включает:
+No version info in generated output<-|->Никакая информация о версии в произведенном выводе
+No versions:<-|->Никакие версии:
+Normally, the code generated with generateDS\nechoes the information being parsed. Use\nthis option to turn off that behavior.\n<-|->Обычно, код, произведенный с generateDS\n, повторяет разбираемую информацию. Используйте\nэта опция, чтобы выключить это поведение.\n
+OK<-|->OK
+Old getters and setters<-|->Старые getter и setter
+One file per XSD:<-|->Один файл XSD:
+Optional module containing user methods.  See\nsection "User Methods" in the documentation.<-|->Дополнительный модуль, содержащий пользовательские методы. См.\nсекцию "Пользовательские Методы" в документации.
+Output directory:<-|->Каталог Output:
+Output subclass file:<-|->Выходной файл подкласса:
+Output superclass file:<-|->Выходной файл суперкласса:
+Override default namespace\nprefix in schema file.\nExample: -a "xsd:"\nDefault: "xs:".<-|->Переопределите пространство имен по умолчанию\nпрефикс в файле схемы. Пример\n:-a "xsd": Значение по умолчанию\n: "xs":.
+Overwrite without asking:<-|->Перезапись без вопросов:
+Path to a directory containing files that provide\nbodies (implementations) of validator methods.<-|->Путь к каталогу, содержащему файлы, которые обеспечивают\nкорпуса (внедрения) методов контрольного устройства.
+Prefix (for class names):<-|->Префикс (для названий классов):
+Prefix for class names.<-|->Префикс для названий классов.
+Preserve CDATA tags.  Default: False.<-|->Сохранить теги CDATA. Значение по умолчанию: False.
+Preserve CData tags<-|->Сохранить теги CData
+Preserve CData tags:<-|->Сохранить теги CData:
+Properties<-|->Свойства
+Quit<-|->Выход
+Root element:<-|->Элемент корня:
+Save the current session in\nfile chosen by the user.<-|->Сохранить текущую сессию в\nфайле, выбранном пользователем.
+Save the current session.<-|->Сохранить текущую сессию.
+Silence:<-|->Тишина:
+Specifies export functions to be generated.  Value is a whitespace separated list of any of the following: "write" (write XML to file), "literal" (write out python code), "etree" (build element tree (can serialize to XML)).            Example: "write etree".  Default: "write".<-|->Определяет экспортные функции, которые будут произведены. Значение - отделенный список разделителя любого следующего: "write" (записать XML файл), "literal" (записать код питона), "etree" (создают дерево элемента (может преобразовать в последовательную форму к XML)). Пример: "write etree". Значение по умолчанию: "write".
+Specifies list of 2-tuples used for cleaning names.  First element is a regular expression search pattern and second is a replacement. Example: "[('[-:.]', '_'), ('^__', 'Special')]".  Default: "[('[-:.]', '_')]".<-|->Определяет список 2 кортежей, используемых для очистки имен. Первый элемент - образец поиска регулярного выражения, и второй замена. Пример: "[(' [-:]'. '_ '), ('^ __ ', 'Особенный')]". Значение по умолчанию: "[(' [-:]'.', _ ')]".
+Subclass suffix:<-|->Суффикс подкласса:
+Superclass module name in subclass module.\nDefault="???".<-|->Имя модуля суперкласса в модуле подкласса. Значение по умолчанию\n= "???".
+Superclass module:<-|->Модуль суперкласса:
+The path and name of the\ninput XML schema defining the\nbindings to be generated.<-|->Путь и название\nвводят XML-схему, определяющую\nпривязки, которые будут произведены.
+The path and name of the output file\nto be generated and to contain the \nsubclasses.<-|->Путь и название выходного файла\n, чтобы быть сгенерированными и содержать\nподклассы.
+The path and name of the output file\nto be generated and to contain the \nsuperclasses.<-|->Путь и название выходного файла\n, чтобы быть сгенерированными и содержать\nсуперклассы.
+To be used in conjunction with --one-file-per-xsd.  Append XXX to the end of each file created.<-|->Использоваться вместе с  --one-file-per-xsd. Добавить XXX в конец каждого созданного файла.
+Use old getters and setters:<-|->Использовать старые  getter и setter:
+Use the superclass file name\nstem as the super-class module\nname.<-|->Используйте имя файла суперкласса\nкак основа  имени модуля\nсуперкласса.
+Used in conjunction with --one-file-per-xsd.  The directory where the modules will be created.<-|->Используемый вместе с --one-file-per-xsd. Каталог, где будут созданы модули.
+User methods module:<-|->Пользовательский модуль методов:
+Validator bodies path:<-|->Путь корпусов контрольного устройства:
+_Capture CL<-|->_Capture CL
+_File<-|->_Файл
+_Generate<-|->_Произвести
+_Help<-|->_Помощь
+_Tools<-|->_Инструменты
diff --git a/libgenerateDS/gui/generateds_gui.py b/libgenerateDS/gui/generateds_gui.py
deleted file mode 100755
index 272b6e7..0000000
--- a/libgenerateDS/gui/generateds_gui.py
+++ /dev/null
@@ -1,2158 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import os
-from optparse import OptionParser
-from ConfigParser import ConfigParser
-from xml.dom import minidom
-from xml.parsers import expat
-import subprocess
-import re
-import gtk
-# import pango
-from libgenerateDS.gui import generateds_gui_session
-#import generateds_gui_session
-
-## import warnings
-## warnings.warn('importing IPShellEmbed', UserWarning)
-## from IPython.Shell import IPShellEmbed
-## args = ''
-## ipshell = IPShellEmbed(args,
-##     banner = 'Dropping into IPython',
-##     exit_msg = 'Leaving Interpreter, back to program.')
-## 
-# Then use the following line where and when you want to drop into the
-# IPython shell:
-#    ipshell('<some message> -- Entering ipshell.\\nHit Ctrl-D to exit')
-
-# Globals and constants:
-
-#
-# Do not modify the following VERSION comments.
-# Used by updateversion.py.
-##VERSION##
-VERSION = '2.11b'
-##VERSION##
-
-
-Builder = None
-ParamNameList = []
-CmdTemplate = (
-    '%(exec_path)s --no-questions' +
-    '%(force)s' +
-    '%(output_superclass)s' +
-    '%(output_subclass)s' +
-    '%(prefix)s' +
-    '%(namespace_prefix)s' +
-    '%(behavior_filename)s' +
-    '%(properties)s' +
-    '%(old_getters_setters)s' +
-    '%(subclass_suffix)s' +
-    '%(root_element)s' +
-    '%(superclass_module)s' +
-    '%(validator_bodies)s' +
-    '%(user_methods)s' +
-    '%(no_dates)s' +
-    '%(no_versions)s' +
-    '%(no_process_includes)s' +
-    '%(silence)s' +
-    '%(namespace_defs)s' +
-    '%(external_encoding)s' +
-    '%(member_specs)s' +
-    ' %(input_schema)s' +
-    ''
-    )
-CaptureCmdTemplate = (
-    '%(exec_path)s --no-questions' +
-    '%(force)s' +
-    '%(properties)s' +
-    '%(namespace_prefix)s' +
-    '%(output_superclass)s' +
-    '%(output_subclass)s' +
-    '%(prefix)s' +
-    '%(behavior_filename)s' +
-    '%(old_getters_setters)s' +
-    '%(subclass_suffix)s' +
-    '%(root_element)s' +
-    '%(superclass_module)s' +
-    '%(validator_bodies)s' +
-    '%(user_methods)s' +
-    '%(no_dates)s' +
-    '%(no_versions)s' +
-    '%(no_process_includes)s' +
-    '%(silence)s' +
-    '%(namespace_defs)s' +
-    '%(external_encoding)s' +
-    '%(member_specs)s' +
-    ' \\\n    %(input_schema)s' +
-    ''
-    )
-ErrorMessages = [
-    '',
-    'Must enter input schema name.',
-    'Must enter either output superclass name or output subclass file name.',
-    ]
-Memberspecs_tooltip_text = '''\
-Generate member (type) specifications in each
-class: a dictionary of instances of class
-MemberSpec_ containing member name, type,
-and array or not.  Allowed values are
-"list" or "dict".  Default: None.
-'''
-
-
-#
-# Classes
-#
-
-class UIItemSpec(object):
-    def __init__(self, name='', ui_type='', access_action=''):
-        self.name = name
-        self.ui_type = ui_type
-        self.access_action = access_action
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def get_ui_type(self): return self.ui_type
-    def set_ui_type(self, ui_type): self.ui_type = ui_type
-    def get_access_action(self): return self.access_action
-    def set_access_action(self, access_action): self.access_action = access_action
-
-
-class GeneratedsGui(object):
-
-    def __init__(self, options):
-        global Builder
-        # Default values
-        Builder = gtk.Builder()
-        self.options = options
-        # self.ui_spec_filename = ui_spec_filename
-        self.filename = None
-        self.about_dialog = None
-        self.params = generateds_gui_session.sessionType()
-        self.ui_obj_dict = {}
-        self.session_filename = None
-        self.current_folder = None
-        # use GtkBuilder to build our interface from the XML file 
-        ui_spec_filename = options.impl_gui
-        try:
-            if ui_spec_filename is None:
-                Builder.add_from_string(Ui_spec, len(Ui_spec))
-            else:
-                Builder.add_from_file(ui_spec_filename)
-        except:
-            msg = "Failed to load UI XML file: %s" % ui_spec_filename
-            self.error_message(msg)
-            sys.exit(1)
-        # get the widgets which will be referenced in callbacks
-        bgo = Builder.get_object
-        self.window = bgo("window1")
-        self.statusbar = bgo("statusbar1")
-        for item in ParamNameList:
-            if item.get_ui_type() != 'combobox':
-                s1 = '%s_%s' % (item.get_name(), item.get_ui_type(), )
-                setattr(self, s1, bgo(s1))
-                self.ui_obj_dict[s1] = bgo(s1)
-        # Create the member-specs combobox.
-        member_specs_combobox = gtk.combo_box_new_text()
-        member_specs_combobox.set_name('member_specs_combobox')
-        member_specs_combobox.set_tooltip_text(Memberspecs_tooltip_text)
-        self.ui_obj_dict['member_specs_combobox'] = member_specs_combobox
-        member_specs_combobox.append_text("none")
-        member_specs_combobox.append_text("list")
-        member_specs_combobox.append_text("dict")
-        member_specs_combobox_container = bgo('member_specs_combobox_container')
-        member_specs_combobox_container.add(member_specs_combobox)
-        member_specs_combobox.set_active(0)
-        member_specs_combobox.show()
-        self.content_dialog = ContentDialog()
-        # connect signals
-        Builder.connect_signals(self)
-        Builder.connect_signals(self.content_dialog)
-        # set the default icon to the GTK "edit" icon
-        gtk.window_set_default_icon_name(gtk.STOCK_EDIT)
-        # setup and initialize our statusbar
-        self.statusbar_cid = self.statusbar.get_context_id("Tutorial GTK+ Text Editor")
-        self.reset_default_status()
-        self.params = generateds_gui_session.sessionType()
-        # Load a session if specified.
-        session = self.options.session
-        if session:
-            session = os.path.abspath(session)
-            self.session_filename = session
-            self.load_session(session)
-            msg = 'Session file: %s' % (self.session_filename, )
-            self.statusbar.pop(self.statusbar_cid)
-            self.statusbar.push(self.statusbar_cid, msg)
-        else:
-            self.trans_gui_2_obj()
-            self.saved_params = self.params.copy()
-
-    # When our window is destroyed, we want to break out of the GTK main loop. 
-    # We do this by calling gtk_main_quit(). We could have also just specified 
-    # gtk_main_quit as the handler in Glade!
-    def on_window_destroy(self, widget, data=None):
-        self.trans_gui_2_obj()
-##         self.dump_params('saved_params:', self.saved_params)
-##         self.dump_params('params:', self.params)
-        if self.params != self.saved_params:
-            message = 'Session data has changed.\n\nSave?'
-            dialog = gtk.MessageDialog(None,
-                gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                gtk.MESSAGE_ERROR,
-                gtk.BUTTONS_NONE,
-                message)
-            dialog.add_buttons(
-                gtk.STOCK_YES, gtk.RESPONSE_YES,
-                '_Discard', 1,
-                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                )
-            response = dialog.run()
-            dialog.destroy()
-            if response == gtk.RESPONSE_YES:
-                self.save_session_action()
-            elif response == 1:
-                pass
-            elif response == gtk.RESPONSE_CANCEL:
-                return
-        gtk.main_quit()
-
-    def on_window_delete_event(self, widget, event, data=None):
-        self.on_window_destroy(widget, data)
-
-    def on_quit_menu_item_activate(self, widget, data=None):
-        self.on_window_destroy(widget, data)
-
-    def on_quit_button_clicked(self, widget, data=None):
-        self.on_window_destroy(widget, data)
-
-    # Get the values from the widgets in the UI.
-    # Format the command line.
-    # Generate the output files.    
-    def on_generate_menuitem_activate(self, menuitem, data=None):
-        self.trans_gui_2_obj()
-        params_dict = self.trans_params_2_dict()
-        result, msg = self.validate_params(params_dict)
-        if result:
-            self.statusbar.pop(self.statusbar_cid)
-            self.statusbar.push(self.statusbar_cid, 'Error: %s' % (msg, ))
-            self.error_message(msg)
-        else:
-            cmd = self.create_command_line(params_dict, CmdTemplate)
-            #print 'cmd: %s' % (cmd, )
-            self.run_command(cmd)
-        return True
-
-    on_generate_button_clicked = on_generate_menuitem_activate
-
-    def on_capture_cl_menuitem_activate(self, menuitem, data=None):
-        self.trans_gui_2_obj()
-        params_dict = self.trans_params_2_dict()
-        result, msg = self.validate_params(params_dict)
-        if result:
-            self.statusbar.pop(self.statusbar_cid)
-            self.statusbar.push(self.statusbar_cid, 'Error: %s' % (msg, ))
-            self.error_message(msg)
-        else:
-            cmd = self.create_command_line(params_dict, CaptureCmdTemplate)
-            cmd = cmd.replace(' --', ' \\\n    --')
-            cmd = cmd.replace(' -o', ' \\\n    -o')
-            cmd = cmd.replace(' -s', ' \\\n    -s')
-            self.display_content('Command line', cmd)
-        return True
-
-    def trans_gui_2_obj(self):
-        for item in ParamNameList:
-            ui_name = '%s_%s' % (item.get_name(), item.get_ui_type(), )
-            ui_obj = self.ui_obj_dict[ui_name]
-            if ui_obj is not None:
-                if item.get_name() == 'member_specs':
-                    value = ui_obj.get_active()
-                    if value == 1:
-                        self.params.set_member_specs('list')
-                    elif value == 2:
-                        self.params.set_member_specs('dict')
-                    else:
-                        self.params.set_member_specs('none')
-                else:
-                    s2 = '%s_%s' % (item.get_name(), item.get_ui_type(), )
-                    method = getattr(ui_obj, 'get_%s' % item.get_access_action())
-                    value = method()
-                    setattr(self.params, item.get_name(), value)
-
-    def trans_obj_2_gui(self):
-        for item in ParamNameList:
-            ui_name = '%s_%s' % (item.get_name(), item.get_ui_type(), )
-            ui_obj = self.ui_obj_dict[ui_name]
-            if ui_obj is not None:
-                if item.get_name() == 'member_specs':
-                    if self.params.get_member_specs() == 'list':
-                        ui_obj.set_active(1)
-                    elif self.params.get_member_specs() == 'dict':
-                        ui_obj.set_active(2)
-                    else:
-                        ui_obj.set_active(0)
-                else:
-                    value = getattr(self.params, item.get_name())
-                    if value is None:
-                        if item.get_ui_type() == 'entry':
-                            value = ''
-                        elif item.get_ui_type() == 'checkbutton':
-                            value = False
-                        elif item.get_ui_type() == 'combobox':
-                            value = 0
-                    method = getattr(ui_obj,
-                        'set_%s' % item.get_access_action())
-                    method(value)
-
-    def dump_params(self, msg, params):
-        print msg
-        params.export(sys.stdout, 0, name_='session')
-
-    def trans_params_2_dict(self):
-        params = self.params
-        params_dict = {}
-        pd = params_dict
-        pd['input_schema'] = getattr(params, 'input_schema')
-        self.transform_1_param(params, pd, 'output_superclass', 'o')
-        self.transform_1_param(params, pd, 'output_subclass', 's')
-        pd['force'] = (' -f' if params.get_force() else '')
-        self.transform_1_param(params, pd, 'prefix', 'p')
-        if params.get_empty_namespace_prefix():
-            pd['namespace_prefix'] = ' -a ""'
-        else:
-            self.transform_1_param(params, pd, 'namespace_prefix', 'a')
-        self.transform_1_param(params, pd, 'behavior_filename', 'b')
-        pd['properties'] = (' -m' if params.get_properties() else '')
-        self.transform_1_param(params, pd, 'subclass_suffix', 'subclass-suffix', True)
-        self.transform_1_param(params, pd, 'root_element', 'root-element', True)
-        self.transform_1_param(params, pd, 'superclass_module', 'super', True)
-        pd['old_getters_setters'] = (' --use-old-getter-setter' if params.get_old_getters_setters() else '')
-        self.transform_1_param(params, pd, 'user_methods', 'user-methods', True)
-        self.transform_1_param(params, pd, 'validator_bodies', 'validator-bodies', True)
-        pd['no_dates'] = (' --no-dates' if params.get_no_dates() else '')
-        pd['no_versions'] = (' --no-versions' if params.get_no_versions() else '')
-        pd['no_process_includes'] = (' --no-process-includes' if params.get_no_process_includes() else '')
-        pd['silence'] = (' --silence' if params.get_silence() else '')
-        # Special case for namespacedefs because of quoting.
-        #self.transform_1_param(params, pd, 'namespace_defs', 'namespacedef', True)
-        name = 'namespace_defs'
-        flag = 'namespacedef'
-        value = getattr(params, name)
-        params_dict[name] = (
-                " --%s='%s'" % (flag, value, )
-                if value.strip()
-                else '')
-        self.transform_1_param(params, pd, 'external_encoding', 'external-encoding', True)
-        if params.get_member_specs() == 'list':
-            pd['member_specs'] = ' --member-specs=list'
-        elif params.get_member_specs() == 'dict':
-            pd['member_specs'] = ' --member-specs=dict'
-        else:
-            pd['member_specs'] = ''
-        return pd
-
-    def transform_1_param(self, params, params_dict, name, flag, longopt=False):
-        value = getattr(params, name)
-        if longopt:
-            params_dict[name] = (
-                ' --%s="%s"' % (flag, value, )
-                if value.strip()
-                else '')
-        else:
-            params_dict[name] = (
-                ' -%s "%s"' % (flag, value, )
-                if value.strip()
-                else '')
-
-    def create_command_line(self, params_dict, template):
-        params_dict['exec_path'] = self.options.exec_path
-        cmd = template % params_dict
-        return cmd
-
-    def validate_params(self, params_dict):
-        p = params_dict
-        #print sorted(p.keys())
-        result = 0
-        msg = ''
-        if not p['input_schema']:
-            result = 1
-        elif not (p['output_superclass'] or
-            p['output_subclass']):
-            result = 2
-        if result:
-            msg = ErrorMessages[result]
-        return result, msg
-
-    # Clear all the fields/widgets to default values.    
-    def on_clear_menuitem_activate(self, menuitem, data=None):
-        message = 'Clear all entries?\nAre you sure?'
-        dialog = gtk.MessageDialog(
-            None,
-            gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-            gtk.MESSAGE_WARNING,
-            gtk.BUTTONS_OK_CANCEL,
-            message
-            )
-        response = dialog.run()
-        dialog.destroy()
-        if response == gtk.RESPONSE_OK:
-            self.session_filename = None
-            self.params = generateds_gui_session.sessionType(
-                input_schema='',
-                output_superclass='',
-                output_subclass='',
-                force=False,
-                prefix='',
-                namespace_prefix='',
-                empty_namespace_prefix=False,
-                behavior_filename='',
-                properties=False,
-                subclass_suffix='',
-                root_element='',
-                superclass_module='',
-                auto_super=False,
-                old_getters_setters=False,
-                validator_bodies='',
-                user_methods='',
-                no_dates=False,
-                no_versions=False,
-                no_process_includes=False,
-                silence=False,
-                namespace_defs='',
-                external_encoding='',
-                member_specs='',
-                )
-            self.trans_obj_2_gui()
-
-    def run_command(self, cmd):
-        spobj = subprocess.Popen(cmd,
-            shell=True,
-            stdout=subprocess.PIPE, 
-            stderr=subprocess.PIPE,
-            close_fds=False)
-        outcontent = spobj.stdout.read()
-        errcontent = spobj.stderr.read()
-        error = False
-        if outcontent.strip():
-            self.display_content('Messages', outcontent)
-            error = True
-        if errcontent.strip():
-            self.display_content('Errors', errcontent)
-            error = True
-        if not error:
-            msg = 'Successfully generated.'
-            self.error_message(msg, gtk.MESSAGE_INFO)
-
-    def display_content(self, title, content):
-        #content_dialog = ContentDialog()
-        self.content_dialog.show(content)
-
-    def on_open_session_menuitem_activate(self, menuitem, data=None):
-        self.trans_gui_2_obj()
-##         self.dump_params('saved_params:', self.saved_params)
-##         self.dump_params('params:', self.params)
-        if self.params != self.saved_params:
-            message = 'Session data has changed.\n\nSave?'
-            dialog = gtk.MessageDialog(None,
-                gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                gtk.MESSAGE_ERROR,
-                gtk.BUTTONS_NONE,
-                message)
-            dialog.add_buttons(
-                gtk.STOCK_YES, gtk.RESPONSE_YES,
-                '_Discard', 1,
-                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                )
-            response = dialog.run()
-            dialog.destroy()
-            if response == gtk.RESPONSE_YES:
-                self.save_session_action()
-            elif response == 1:
-                pass
-            elif response == gtk.RESPONSE_CANCEL:
-                return
-        session_filename = self.choose_filename(
-            gtk.FILE_CHOOSER_ACTION_OPEN,
-            (('Session *.session', '*.session'),)
-            )
-        if session_filename:
-            self.session_filename = session_filename
-            self.load_session(self.session_filename)
-            msg = 'Session file: %s' % (self.session_filename, )
-            self.statusbar.pop(self.statusbar_cid)
-            self.statusbar.push(self.statusbar_cid, msg)
-
-    def on_save_session_menuitem_activate(self, menuitem, data=None):
-        self.save_session_action()
-
-    def save_session_action(self):
-        if not self.session_filename:
-            filename = self.choose_filename(
-                gtk.FILE_CHOOSER_ACTION_SAVE,
-                (('Session *.session', '*.session'),),
-                confirm_overwrite=True,
-                initfilename=self.session_filename,
-                buttons=(
-                    gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                    gtk.STOCK_SAVE, gtk.RESPONSE_OK,
-                    )
-                )
-            if filename:
-                self.session_filename = filename
-        if self.session_filename:
-            stem, ext = os.path.splitext(self.session_filename)
-            if not ext:
-                self.session_filename += '.session'
-            self.save_session(self.session_filename)
-            msg = 'Session file: %s' % (self.session_filename, )
-            self.statusbar.pop(self.statusbar_cid)
-            self.statusbar.push(self.statusbar_cid, msg)
-
-    def on_save_session_as_menuitem_activate(self, menuitem, data=None):
-        filename = self.choose_filename(
-            gtk.FILE_CHOOSER_ACTION_SAVE,
-            (('Session *.session', '*.session'),),
-            confirm_overwrite=True,
-            initfilename=self.session_filename,
-            buttons=(
-                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                gtk.STOCK_SAVE, gtk.RESPONSE_OK,
-                )
-            )
-        if filename:
-            self.session_filename = filename
-            stem, ext = os.path.splitext(self.session_filename)
-            if not ext:
-                self.session_filename += '.session'
-            self.save_session(self.session_filename)
-            msg = 'Session file: %s' % (self.session_filename, )
-            self.statusbar.pop(self.statusbar_cid)
-            self.statusbar.push(self.statusbar_cid, msg)
-
-    def save_session(self, filename):
-        self.trans_gui_2_obj()
-        sessionObj = self.params
-        outfile = open(filename, 'w')
-        outfile.write('<?xml version="1.0" ?>\n')
-        sessionObj.export(outfile, 0, name_="session", 
-            namespacedef_='')
-        outfile.close()
-        msg = 'Session saved to file:\n%s' % (filename, )
-        self.error_message(msg, gtk.MESSAGE_INFO)
-        self.saved_params = self.params.copy()
-
-    def load_session(self, filename):
-        try:
-            doc = generateds_gui_session.parsexml_(filename)
-            rootNode = doc.getroot()
-            rootTag, rootClass = generateds_gui_session.get_root_tag(rootNode)
-            if rootClass is None:
-                rootTag = 'session'
-                rootClass = generateds_gui_session.sessionType
-            sessionObj = rootClass.factory()
-            sessionObj.build(rootNode)
-            self.params = sessionObj
-            self.trans_obj_2_gui()
-            self.trans_gui_2_obj()
-            self.saved_params = self.params.copy()
-        except IOError, exp:
-            msg = str(exp)
-            self.error_message(msg, gtk.MESSAGE_ERROR)
-        except expat.ExpatError, exp:
-            msg = '%s file: %s' % (str(exp), filename, )
-            self.error_message(msg, gtk.MESSAGE_ERROR)
-
-    def on_about_menu_item_activate(self, menuitem, data=None):
-        if self.about_dialog:
-            self.about_dialog.present()
-            return
-        authors = [
-            'Dave Kuhlman <dkuhlman@rexx.com>',
-        ]
-        about_dialog = gtk.AboutDialog()
-        about_dialog.set_transient_for(self.window)
-        about_dialog.set_destroy_with_parent(True)
-        about_dialog.set_name("generateDS.py Python bindings generator")
-        about_dialog.set_version(VERSION)
-        about_dialog.set_copyright("Copyright \xc2\xa9 2009 Dave Kuhlman")
-        about_dialog.set_website("http://www.rexx.com/~dkuhlman")
-        about_dialog.set_comments("GTK+ and Glade3 GUI front end")
-        about_dialog.set_authors(authors)
-        about_dialog.set_logo_icon_name(gtk.STOCK_EDIT)
-        # callbacks for destroying the dialog
-        def close(dialog, response, editor):
-            editor.about_dialog = None
-            dialog.destroy()
-        def delete_event(dialog, event, editor):
-            editor.about_dialog = None
-            return True
-        about_dialog.connect("response", close, self)
-        about_dialog.connect("delete-event", delete_event, self)
-        self.about_dialog = about_dialog
-        about_dialog.show()
-
-    def error_message(self, message, message_type=gtk.MESSAGE_ERROR):
-        # log to terminal window
-        #print message
-        # create an error message dialog and display modally to the user
-        dialog = gtk.MessageDialog(None,
-            gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-            message_type, gtk.BUTTONS_OK, message)
-        dialog.run()
-        dialog.destroy()
-
-    def reset_default_status(self):
-        msg = "Session file: (UNTITLED)"
-        self.statusbar.pop(self.statusbar_cid)
-        self.statusbar.push(self.statusbar_cid, msg)
-
-    def on_input_schema_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN,
-            (('Schemas *.xsd', '*.xsd'),))
-        if filename:
-            self.input_schema_entry.set_text(filename)
-
-    def on_output_superclass_chooser_button_clicked(self, widget, data=None):
-        filename = self.choose_filename(patterns=(('Python *.py', '*.py'), ))
-        if filename:
-            self.output_superclass_entry.set_text(filename)
-            #self.on_output_superclass_entry_changed(
-            #    self.output_superclass_entry, data)
-
-    def on_output_subclass_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(patterns=(('Python *.py', '*.py'), ))
-        if filename:
-            self.output_subclass_entry.set_text(filename)
-
-    def on_behavior_filename_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN,
-            (('Python *.py', '*.py'),))
-        if filename:
-            self.behavior_filename_entry.set_text(filename)
-
-    def on_validator_bodies_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
-            )
-        if filename:
-            self.validator_bodies_entry.set_text(filename)
-
-    def on_user_methods_chooser_button_clicked(self, button, data=None):
-        filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN,
-            (('Python *.py', '*.py'),))
-        if filename:
-            self.user_methods_entry.set_text(filename)
-
-    def choose_filename(self, action=gtk.FILE_CHOOSER_ACTION_SAVE,
-        patterns=(), confirm_overwrite=False, initfilename=None,
-        buttons=None):
-        filename = None
-        if buttons is None:
-            buttons=(
-                gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                gtk.STOCK_OPEN, gtk.RESPONSE_OK,
-                )
-        dialog = gtk.FileChooserDialog(
-            title=None,
-            action=action,
-            buttons=buttons,
-            )
-        if self.current_folder is not None:
-            dialog.set_current_folder(self.current_folder)
-        if initfilename is not None:
-            dialog.set_filename(initfilename)
-        if patterns:
-            filter = gtk.FileFilter()
-            for name, pattern in patterns:
-                filter.set_name(name)
-                filter.add_pattern(pattern)
-            dialog.add_filter(filter)
-            filter = gtk.FileFilter()
-            filter.set_name("All files *.*")
-            filter.add_pattern("*")
-            dialog.add_filter(filter)
-        dialog.set_do_overwrite_confirmation(confirm_overwrite)
-        response = dialog.run()
-        if response == gtk.RESPONSE_OK:
-            filename = dialog.get_filename()
-            self.current_folder = dialog.get_current_folder()
-        elif response == gtk.RESPONSE_CANCEL:
-            pass
-        dialog.destroy()
-        return filename
-
-    def on_namespace_prefix_entry_changed(self, widget, data=None):
-        entry = self.ui_obj_dict['namespace_prefix_entry']
-        checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton']
-        checkbutton.set_active(False)
-        return True
-
-    def on_empty_namespace_prefix_checkbutton_toggled(self, widget, data=None):
-        entry = self.ui_obj_dict['namespace_prefix_entry']
-        checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton']
-        if widget.get_active():
-            entry.set_text('')
-        return True
-
-    def on_output_superclass_entry_changed(self, widget, data=None):
-        entry = self.ui_obj_dict['superclass_module_entry']
-        checkbutton = self.auto_super_checkbutton
-        if checkbutton.get_active():
-            path = widget.get_text()
-            if path:
-                stem = os.path.splitext(os.path.split(path)[1])[0]
-                if stem:
-                    entry.set_text(stem)
-        return True
-
-    def on_auto_super_checkbutton_toggled(self, widget, data=None):
-        entry = self.ui_obj_dict['superclass_module_entry']
-        superclass_entry = self.ui_obj_dict['output_superclass_entry']
-        #checkbutton = self.auto_super_checkbutton
-        checkbutton = widget
-        if widget.get_active():
-            path = superclass_entry.get_text()
-            if path:
-                stem = os.path.splitext(os.path.split(path)[1])[0]
-                if stem:
-                    entry.set_text(stem)
-        return True
-
-    def on_ok_button_activate(self, widget, data=None):
-        #print '(GeneratedsGui) widget:', widget
-        response = self.content_dialog.on_ok_button_activate(
-            self.content_dialog, data)
-        return response
-
-    name_pat1 = re.compile(r'^(.*)_clear_button')
-
-    # This method keys off the correspondence between the
-    #   name of the button and the name of the related entry,
-    #   for example, xxx_yyy_entry : xxx_yyy_clear_button.
-    def on_clear_button_clicked(self, widget, data=None):
-        name = widget.get_name()
-        mo = GeneratedsGui.name_pat1.search(name)
-        stem = mo.group(1)
-        name1 = '%s_entry' % (stem, )
-        ui_obj = self.ui_obj_dict[name1]
-        ui_obj.set_text('')
-
-    # Run main application window
-    def main(self):
-        self.window.show()
-        gtk.main()
-
-
-class ContentDialog(gtk.Dialog):
-    def __init__(self):
-        global Builder
-        self.content_dialog = Builder.get_object('content_dialog')
-        self.content_textview = Builder.get_object('content_textview')
-        buf = self.content_textview.get_buffer().set_text('')
-
-    def show(self, content):
-        #Builder.connect_signals(self)
-        self.content_textview.get_buffer().set_text(content)
-        response = self.content_dialog.run()
-        self.content_dialog.hide()
-
-    def on_ok_button_activate(self, widget, data=None):
-        #print '(content_dialog) widget:', widget
-        return False
-
-
-#
-# Functions for internal use
-#
-
-def capture_options(options):
-    config_parser = ConfigParser()
-    config_parser.read([
-        os.path.expanduser('~/.generateds_gui.ini'),
-        './generateds_gui.ini',
-        ])
-    section = 'general'
-    names = ('exec-path', 'exec_path')
-    capture_1_option(options, config_parser, section, names)
-##     names = ('impl-schema', 'impl_schema')
-##     capture_1_option(options, config_parser, section, names)
-    names = ('impl-gui', 'impl_gui')
-    capture_1_option(options, config_parser, section, names)
-    names = ('session', 'session')
-    capture_1_option(options, config_parser, section, names)
-    # Set some defaults.
-    if options.exec_path is None:
-        options.exec_path = 'generateDS.py'
-
-def capture_1_option(options, config_parser, section, names):
-    if (getattr(options, names[1]) is None and
-        config_parser.has_option(section, names[0])
-        ):
-        setattr(options, names[1], config_parser.get(section, names[0]))
-
-def capture_ui_names():
-    items = generateds_gui_session.sessionType.member_data_items_
-    for item in items:
-        ui_item = UIItemSpec(item.get_name())
-        if item.get_name() == 'member_specs':
-            ui_item.set_ui_type('combobox')
-            ui_item.set_access_action('active')
-        elif item.get_data_type() == 'xs:string':
-            ui_item.set_ui_type('entry')
-            ui_item.set_access_action('text')
-        elif item.get_data_type() == 'xs:boolean':
-            ui_item.set_ui_type('checkbutton')
-            ui_item.set_access_action('active')
-        ParamNameList.append(ui_item)
-##     print 'ParamNameList:'
-##     for item in ParamNameList:
-##         print '    %s  %s' % (item.get_name(), item.get_ui_type(), )
-
-
-USAGE_TEXT = """
-    python %prog [options] <somefile.xxx>
-example:
-    python %prog somefile.xxx"""
-
-def usage(parser):
-    parser.print_help()
-    sys.exit(1)
-
-
-def main():
-    parser = OptionParser(USAGE_TEXT)
-    parser.add_option("--exec-path",
-        type="string", action="store",
-        dest="exec_path",
-        #default="generateDS.py",
-        help='path to executable generated in command line.'
-            '  Example: "python /path/to/generateDS.py".'
-            '  Default: "./generateDS.py".'
-            '  Use Tools/Generate CL (Ctrl-T) to see it.'
-        )
-    parser.add_option("--impl-gui",
-        type="string", action="store",
-        dest="impl_gui",
-        help="name of glade file that defines the GUI if not embedded."
-        )
-    parser.add_option("-s", "--session",
-        type="string", action="store",
-        dest="session",
-        help="name of a session file to be loaded."
-        )
-    (options, args) = parser.parse_args()
-    capture_options(options)
-    capture_ui_names()
-    if len(args) > 0:
-        usage(parser)
-    editor = GeneratedsGui(options)
-    editor.main()
-
-# Do not change the next 3 lines.
-## UI_SPECIFICATION ##
-
-Ui_spec = """
-
-<?xml version="1.0"?>
-<interface>
-  <requires lib="gtk+" version="2.16"/>
-  <!-- interface-naming-policy project-wide -->
-  <object class="GtkWindow" id="window1">
-    <accel-groups>
-      <group name="accelgroup1"/>
-    </accel-groups>
-    <signal name="delete_event" handler="on_window_delete_event"/>
-    <child>
-      <object class="GtkVBox" id="vbox1">
-        <property name="visible">True</property>
-        <property name="orientation">vertical</property>
-        <child>
-          <object class="GtkMenuBar" id="menubar1">
-            <property name="visible">True</property>
-            <child>
-              <object class="GtkMenuItem" id="menuitem1">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">_File</property>
-                <property name="use_underline">True</property>
-                <child type="submenu">
-                  <object class="GtkMenu" id="menu1">
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkImageMenuItem" id="clear_menuitem">
-                        <property name="label">Clear</property>
-                        <property name="visible">True</property>
-                        <property name="image">image4</property>
-                        <property name="use_stock">False</property>
-                        <property name="accel_group">accelgroup1</property>
-                        <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_clear_menuitem_activate"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkImageMenuItem" id="open_session_menuitem">
-                        <property name="label">_Load session</property>
-                        <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Load a previous saved session.</property>
-                        <property name="use_underline">True</property>
-                        <property name="image">image3</property>
-                        <property name="use_stock">False</property>
-                        <property name="accel_group">accelgroup1</property>
-                        <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_open_session_menuitem_activate"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkImageMenuItem" id="save_session_menuitem">
-                        <property name="label">_Save session</property>
-                        <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Save the current session.</property>
-                        <property name="use_underline">True</property>
-                        <property name="image">image1</property>
-                        <property name="use_stock">False</property>
-                        <property name="accel_group">accelgroup1</property>
-                        <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_save_session_menuitem_activate"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkImageMenuItem" id="save_session_as_menuitem">
-                        <property name="label">Save session as ...</property>
-                        <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Save the current session in
-file chosen by the user.</property>
-                        <property name="image">image2</property>
-                        <property name="use_stock">False</property>
-                        <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_save_session_as_menuitem_activate"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkSeparatorMenuItem" id="menuitem5">
-                        <property name="visible">True</property>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkImageMenuItem" id="imagemenuitem5">
-                        <property name="label">gtk-quit</property>
-                        <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Exit from the application.</property>
-                        <property name="use_underline">True</property>
-                        <property name="use_stock">True</property>
-                        <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_quit_menu_item_activate"/>
-                      </object>
-                    </child>
-                  </object>
-                </child>
-              </object>
-            </child>
-            <child>
-              <object class="GtkMenuItem" id="menuitem2">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">_Tools</property>
-                <property name="use_underline">True</property>
-                <child type="submenu">
-                  <object class="GtkMenu" id="menu2">
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkMenuItem" id="capture_cl_menuitem">
-                        <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Capture the command line that would be used
-to generate the bindings modules.</property>
-                        <property name="label" translatable="yes">_Capture CL</property>
-                        <property name="use_underline">True</property>
-                        <accelerator key="t" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_capture_cl_menuitem_activate"/>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkMenuItem" id="generate_menuitem">
-                        <property name="visible">True</property>
-                        <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property>
-                        <property name="label" translatable="yes">_Generate</property>
-                        <property name="use_underline">True</property>
-                        <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/>
-                        <signal name="activate" handler="on_generate_menuitem_activate"/>
-                      </object>
-                    </child>
-                  </object>
-                </child>
-              </object>
-            </child>
-            <child>
-              <object class="GtkMenuItem" id="menuitem4">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">_Help</property>
-                <property name="use_underline">True</property>
-                <child type="submenu">
-                  <object class="GtkMenu" id="menu3">
-                    <property name="visible">True</property>
-                    <child>
-                      <object class="GtkImageMenuItem" id="imagemenuitem10">
-                        <property name="label">gtk-about</property>
-                        <property name="visible">True</property>
-                        <property name="use_underline">True</property>
-                        <property name="use_stock">True</property>
-                        <property name="accel_group">accelgroup1</property>
-                        <signal name="activate" handler="on_about_menu_item_activate"/>
-                      </object>
-                    </child>
-                  </object>
-                </child>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkTable" id="table1">
-            <property name="visible">True</property>
-            <property name="n_rows">22</property>
-            <property name="n_columns">4</property>
-            <child>
-              <object class="GtkLabel" id="label1">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Input schema file:</property>
-              </object>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label2">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Output superclass file:</property>
-              </object>
-              <packing>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label3">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Output subclass file:</property>
-              </object>
-              <packing>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label4">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Overwrite without asking:</property>
-              </object>
-              <packing>
-                <property name="top_attach">3</property>
-                <property name="bottom_attach">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="force_checkbutton">
-                <property name="label" translatable="yes">Force</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Always overwrite output files.
-Do not ask for confirmation.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">3</property>
-                <property name="bottom_attach">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="input_schema_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the
-input XML schema defining the
-bindings to be generated.</property>
-                <property name="invisible_char">&#x25CF;</property>
-                <property name="width_chars">80</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="output_superclass_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the output file
-to be generated and to contain the 
-superclasses.</property>
-                <property name="invisible_char">&#x25CF;</property>
-                <signal name="changed" handler="on_output_superclass_entry_changed"/>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="output_subclass_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">The path and name of the output file
-to be generated and to contain the 
-subclasses.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label5">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Prefix (for class names):</property>
-              </object>
-              <packing>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="prefix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Prefix for class names.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label6">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Namespace prefix:</property>
-              </object>
-              <packing>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="namespace_prefix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
-                <property name="tooltip_text" translatable="yes">Override default namespace
-prefix in schema file.
-Example: -a "xsd:"
-Default: "xs:".</property>
-                <property name="invisible_char">&#x25CF;</property>
-                <signal name="changed" handler="on_namespace_prefix_entry_changed"/>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label7">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Behavior file name:</property>
-              </object>
-              <packing>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="behavior_filename_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Input file name for behaviors
-added to subclasses.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label8">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Generate Python properties:</property>
-              </object>
-              <packing>
-                <property name="top_attach">7</property>
-                <property name="bottom_attach">8</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="properties_checkbutton">
-                <property name="label" translatable="yes">Properties</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Generate Python properties for member variables
-so that the value can be retrieved and modified
-without calling getter and setter functions.
-</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">7</property>
-                <property name="bottom_attach">8</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label10">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Subclass suffix:</property>
-              </object>
-              <packing>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="subclass_suffix_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names.
-Default="Sub".</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label11">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Root element:</property>
-              </object>
-              <packing>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="root_element_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Assume that this value is the name
-of the root element of instance docs.
-Default is first element defined in schema.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="input_schema_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the input schema file.</property>
-                <signal name="clicked" handler="on_input_schema_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_superclass_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property>
-                <signal name="clicked" handler="on_output_superclass_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_subclass_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property>
-                <signal name="clicked" handler="on_output_subclass_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="behavior_filename_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the nput file name for
-behaviors added to subclasses.</property>
-                <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label12">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Superclass module:</property>
-              </object>
-              <packing>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="superclass_module_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Superclass module name in subclass module.
-Default="???".</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label13">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Use old getters and setters:</property>
-              </object>
-              <packing>
-                <property name="top_attach">12</property>
-                <property name="bottom_attach">13</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="old_getters_setters_checkbutton">
-                <property name="label" translatable="yes">Old getters and setters</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(),
-instead of get_var() and set_var().</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">12</property>
-                <property name="bottom_attach">13</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label14">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Validator bodies path:</property>
-              </object>
-              <packing>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label15">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">User methods module:</property>
-              </object>
-              <packing>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label16">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No dates:</property>
-              </object>
-              <packing>
-                <property name="top_attach">15</property>
-                <property name="bottom_attach">16</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label17">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No versions:</property>
-              </object>
-              <packing>
-                <property name="top_attach">16</property>
-                <property name="bottom_attach">17</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_dates_checkbutton">
-                <property name="label" translatable="yes">No dates in generated output</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not include the current date in the generated
-files. This is useful if you want to minimize
-the amount of (no-operation) changes to the
-generated python code.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">15</property>
-                <property name="bottom_attach">16</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="validator_bodies_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide
-bodies (implementations) of validator methods.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="validator_bodies_chooser_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide
-bodies (implementations) of validator methods.</property>
-                <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_versions_checkbutton">
-                <property name="label" translatable="yes">No version info in generated output</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not include the current version in the generated
-files. This is useful if you want to minimize
-the amount of (no-operation) changes to the
-generated python code.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">16</property>
-                <property name="bottom_attach">17</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="user_methods_button">
-                <property name="label" translatable="yes">Choose</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods.  See
-section "User Methods" in the documentation.</property>
-                <signal name="clicked" handler="on_user_methods_chooser_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="user_methods_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Optional module containing user methods.  See
-section "User Methods" in the documentation.</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label18">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">No process includes:</property>
-              </object>
-              <packing>
-                <property name="top_attach">17</property>
-                <property name="bottom_attach">18</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label19">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Silence:</property>
-              </object>
-              <packing>
-                <property name="top_attach">18</property>
-                <property name="bottom_attach">19</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="no_process_includes_checkbutton">
-                <property name="label" translatable="yes">Do not process includes in schema</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Do not process included XML Schema files.  By
-default, generateDS.py will insert content
-from files referenced by &lt;include ... /&gt;
-elements into the XML Schema to be processed.</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">17</property>
-                <property name="bottom_attach">18</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="silence_checkbutton">
-                <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS
-echoes the information being parsed. Use
-this option to turn off that behavior.
-</property>
-                <property name="draw_indicator">True</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">18</property>
-                <property name="bottom_attach">19</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label20">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Namespace definitions:</property>
-              </object>
-              <packing>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label21">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">External encoding:</property>
-              </object>
-              <packing>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="label22">
-                <property name="visible">True</property>
-                <property name="xalign">0</property>
-                <property name="label" translatable="yes">Member specs:</property>
-              </object>
-              <packing>
-                <property name="top_attach">21</property>
-                <property name="bottom_attach">22</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="namespace_defs_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the
-value for the namespacedef_ parameter of
-the export() method by the generated
-parse() and parseString() functions.
-Default=''.  Example:
-xmlns:abc="http://www.abc.com"</property>
-                <property name="invisible_char">&#x25CF;</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkEntry" id="external_encoding_entry">
-                <property name="visible">True</property>
-                <property name="tooltip_text" translatable="yes">Encode output written by the generated export
-methods using this encoding.  Default, if omitted,
-is the value returned by sys.getdefaultencoding().
-Example: utf-8.</property>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkHBox" id="member_specs_combobox_container">
-                <property name="visible">True</property>
-                <child>
-                  <placeholder/>
-                </child>
-              </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">21</property>
-                <property name="bottom_attach">22</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton">
-                <property name="label" translatable="yes">Empty</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Assume an empty namespace
-prefix in the XML schema, not
-the default ("xs:").</property>
-                <property name="draw_indicator">True</property>
-                <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkCheckButton" id="auto_super_checkbutton">
-                <property name="label" translatable="yes">Auto</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="tooltip_text" translatable="yes">Use the superclass file name
-stem as the super-class module
-name.</property>
-                <property name="draw_indicator">True</property>
-                <signal name="toggled" handler="on_auto_super_checkbutton_toggled"/>
-              </object>
-              <packing>
-                <property name="left_attach">2</property>
-                <property name="right_attach">3</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="input_schema_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_superclass_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="output_subclass_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="prefix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">4</property>
-                <property name="bottom_attach">5</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="namespace_prefix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">5</property>
-                <property name="bottom_attach">6</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="behavior_filename_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">6</property>
-                <property name="bottom_attach">7</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="subclass_suffix_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">9</property>
-                <property name="bottom_attach">10</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="root_element_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the root element entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">10</property>
-                <property name="bottom_attach">11</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="superclass_module_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">11</property>
-                <property name="bottom_attach">12</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="validator_bodies_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">13</property>
-                <property name="bottom_attach">14</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="user_methods_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">14</property>
-                <property name="bottom_attach">15</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="namespace_defs_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">19</property>
-                <property name="bottom_attach">20</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="external_encoding_clear_button">
-                <property name="label">gtk-clear</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property>
-                <property name="use_stock">True</property>
-                <signal name="clicked" handler="on_clear_button_clicked"/>
-              </object>
-              <packing>
-                <property name="left_attach">3</property>
-                <property name="right_attach">4</property>
-                <property name="top_attach">20</property>
-                <property name="bottom_attach">21</property>
-              </packing>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-          </object>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkHBox" id="hbox1">
-            <property name="visible">True</property>
-            <property name="homogeneous">True</property>
-            <child>
-              <object class="GtkButton" id="generate_button">
-                <property name="label" translatable="yes">Generate</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property>
-                <signal name="clicked" handler="on_generate_button_clicked"/>
-              </object>
-              <packing>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="quit_button">
-                <property name="label" translatable="yes">Quit</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="tooltip_text" translatable="yes">Exit from the application.</property>
-                <signal name="clicked" handler="on_quit_button_clicked"/>
-              </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkStatusbar" id="statusbar1">
-            <property name="visible">True</property>
-            <property name="spacing">2</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="position">3</property>
-          </packing>
-        </child>
-        <child>
-          <placeholder/>
-        </child>
-      </object>
-    </child>
-  </object>
-  <object class="GtkAccelGroup" id="accelgroup1"/>
-  <object class="GtkDialog" id="content_dialog">
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">Messages and Content</property>
-    <property name="default_width">800</property>
-    <property name="default_height">600</property>
-    <property name="type_hint">normal</property>
-    <property name="has_separator">False</property>
-    <child internal-child="vbox">
-      <object class="GtkVBox" id="dialog-vbox3">
-        <property name="visible">True</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">2</property>
-        <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow1">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hscrollbar_policy">automatic</property>
-            <property name="vscrollbar_policy">automatic</property>
-            <child>
-              <object class="GtkTextView" id="content_textview">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="editable">False</property>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area3">
-            <property name="visible">True</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="content_dialog_ok_button">
-                <property name="label" translatable="yes">OK</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <signal name="activate" handler="on_ok_button_activate"/>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="0">content_dialog_ok_button</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkImage" id="image1">
-    <property name="visible">True</property>
-    <property name="stock">gtk-save</property>
-  </object>
-  <object class="GtkImage" id="image2">
-    <property name="visible">True</property>
-    <property name="stock">gtk-save-as</property>
-  </object>
-  <object class="GtkImage" id="image3">
-    <property name="visible">True</property>
-    <property name="stock">gtk-open</property>
-  </object>
-  <object class="GtkImage" id="image4">
-    <property name="visible">True</property>
-    <property name="stock">gtk-clear</property>
-  </object>
-  <object class="GtkImage" id="image5">
-    <property name="visible">True</property>
-    <property name="stock">gtk-missing-image</property>
-  </object>
-</interface>
-"""
-
-## UI_SPECIFICATION ##
-# Do not change the above 3 lines.
-
-
-    
-if __name__ == "__main__":
-    main()
-    
diff --git a/libgenerateDS/gui/generateds_gui.py b/libgenerateDS/gui/generateds_gui.py
new file mode 120000
index 0000000..84913b4
--- /dev/null
+++ b/libgenerateDS/gui/generateds_gui.py
@@ -0,0 +1 @@
+../../gui/generateds_gui.py
\ No newline at end of file
diff --git a/libgenerateDS/gui/generateds_gui_session.py b/libgenerateDS/gui/generateds_gui_session.py
deleted file mode 100644
index 6280722..0000000
--- a/libgenerateDS/gui/generateds_gui_session.py
+++ /dev/null
@@ -1,862 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*- 
-
-#
-# Generated Wed Dec  8 14:24:46 2010 by generateDS.py version 2.3a.
-#
-
-import sys
-import getopt
-import re as re_
-
-etree_ = None
-Verbose_import_ = False
-(   XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-    ) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError("Failed to import ElementTree from any known place")
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-        'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# User methods
-#
-# Calls to the methods in these classes are generated by generateDS.py.
-# You can replace these methods by re-implementing the following class
-#   in a module named generatedssuper.py.
-
-try:
-    from generatedssuper import GeneratedsSuper
-except ImportError, exp:
-
-    class GeneratedsSuper(object):
-        def gds_format_string(self, input_data, input_name=''):
-            return input_data
-        def gds_format_integer(self, input_data, input_name=''):
-            return '%d' % input_data
-        def gds_format_float(self, input_data, input_name=''):
-            return '%f' % input_data
-        def gds_format_double(self, input_data, input_name=''):
-            return '%e' % input_data
-        def gds_format_boolean(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_str_lower(self, instring):
-            return instring.lower()
-                    
-                    
-
-#
-# If you have installed IPython you can uncomment and use the following.
-# IPython is available from http://ipython.scipy.org/.
-#
-
-## from IPython.Shell import IPShellEmbed
-## args = ''
-## ipshell = IPShellEmbed(args,
-##     banner = 'Dropping into IPython',
-##     exit_msg = 'Leaving Interpreter, back to program.')
-
-# Then use the following line where and when you want to drop into the
-# IPython shell:
-#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-Tag_pattern_ = re_.compile(r'({.*})?(.*)')
-STRING_CLEANUP_PAT = re_.compile(r"[\n\r\s]+")
-
-#
-# Support/utility functions.
-#
-
-def showIndent(outfile, level):
-    for idx in range(level):
-        outfile.write('    ')
-
-def quote_xml(inStr):
-    if not inStr:
-        return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
-    s1 = s1.replace('<', '&lt;')
-    s1 = s1.replace('>', '&gt;')
-    return s1
-
-def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
-    s1 = s1.replace('<', '&lt;')
-    s1 = s1.replace('>', '&gt;')
-    if '"' in s1:
-        if "'" in s1:
-            s1 = '"%s"' % s1.replace('"', "&quot;")
-        else:
-            s1 = "'%s'" % s1
-    else:
-        s1 = '"%s"' % s1
-    return s1
-
-def quote_python(inStr):
-    s1 = inStr
-    if s1.find("'") == -1:
-        if s1.find('\n') == -1:
-            return "'%s'" % s1
-        else:
-            return "'''%s'''" % s1
-    else:
-        if s1.find('"') != -1:
-            s1 = s1.replace('"', '\\"')
-        if s1.find('\n') == -1:
-            return '"%s"' % s1
-        else:
-            return '"""%s"""' % s1
-
-
-def get_all_text_(node):
-    if node.text is not None:
-        text = node.text
-    else:
-        text = ''
-    for child in node:
-        if child.tail is not None:
-            text += child.tail
-    return text
-
-
-class GDSParseError(Exception):
-    pass
-
-def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
-    raise GDSParseError(msg)
-
-
-class MixedContainer:
-    # Constants for category:
-    CategoryNone = 0
-    CategoryText = 1
-    CategorySimple = 2
-    CategoryComplex = 3
-    # Constants for content_type:
-    TypeNone = 0
-    TypeText = 1
-    TypeString = 2
-    TypeInteger = 3
-    TypeFloat = 4
-    TypeDecimal = 5
-    TypeDouble = 6
-    TypeBoolean = 7
-    def __init__(self, category, content_type, name, value):
-        self.category = category
-        self.content_type = content_type
-        self.name = name
-        self.value = value
-    def getCategory(self):
-        return self.category
-    def getContenttype(self, content_type):
-        return self.content_type
-    def getValue(self):
-        return self.value
-    def getName(self):
-        return self.name
-    def export(self, outfile, level, name, namespace):
-        if self.category == MixedContainer.CategoryText:
-            # Prevent exporting empty content as empty lines.
-            if self.value.strip(): 
-                outfile.write(self.value)
-        elif self.category == MixedContainer.CategorySimple:
-            self.exportSimple(outfile, level, name)
-        else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace,name)
-    def exportSimple(self, outfile, level, name):
-        if self.content_type == MixedContainer.TypeString:
-            outfile.write('<%s>%s</%s>' % (self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeInteger or \
-                self.content_type == MixedContainer.TypeBoolean:
-            outfile.write('<%s>%d</%s>' % (self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeFloat or \
-                self.content_type == MixedContainer.TypeDecimal:
-            outfile.write('<%s>%f</%s>' % (self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeDouble:
-            outfile.write('<%s>%g</%s>' % (self.name, self.value, self.name))
-    def exportLiteral(self, outfile, level, name):
-        if self.category == MixedContainer.CategoryText:
-            showIndent(outfile, level)
-            outfile.write('model_.MixedContainer(%d, %d, "%s", "%s"),\n' % \
-                (self.category, self.content_type, self.name, self.value))
-        elif self.category == MixedContainer.CategorySimple:
-            showIndent(outfile, level)
-            outfile.write('model_.MixedContainer(%d, %d, "%s", "%s"),\n' % \
-                (self.category, self.content_type, self.name, self.value))
-        else:    # category == MixedContainer.CategoryComplex
-            showIndent(outfile, level)
-            outfile.write('model_.MixedContainer(%d, %d, "%s",\n' % \
-                (self.category, self.content_type, self.name,))
-            self.value.exportLiteral(outfile, level + 1)
-            showIndent(outfile, level)
-            outfile.write(')\n')
-
-
-class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
-        self.name = name
-        self.data_type = data_type
-        self.container = container
-    def set_name(self, name): self.name = name
-    def get_name(self): return self.name
-    def set_data_type(self, data_type): self.data_type = data_type
-    def get_data_type_chain(self): return self.data_type
-    def get_data_type(self):
-        if isinstance(self.data_type, list):
-            if len(self.data_type) > 0:
-                return self.data_type[-1]
-            else:
-                return 'xs:string'
-        else:
-            return self.data_type
-    def set_container(self, container): self.container = container
-    def get_container(self): return self.container
-
-def _cast(typ, value):
-    if typ is None or value is None:
-        return value
-    return typ(value)
-
-#
-# Mixin class for additional behaviors.
-#
-
-class SessionTypeMixin(object):
-    def copy(self):
-        """Produce a copy of myself.
-        """
-        new_session = sessionType(
-            input_schema = self.input_schema,
-            output_superclass = self.output_superclass,
-            output_subclass = self.output_subclass,
-            force = self.force,
-            prefix = self.prefix,
-            namespace_prefix = self.namespace_prefix,
-            empty_namespace_prefix = self.empty_namespace_prefix,
-            behavior_filename = self.behavior_filename,
-            properties = self.properties,
-            subclass_suffix = self.subclass_suffix,
-            root_element = self.root_element,
-            superclass_module = self.superclass_module,
-            auto_super = self.auto_super,
-            old_getters_setters = self.old_getters_setters,
-            validator_bodies = self.validator_bodies,
-            user_methods = self.user_methods,
-            no_dates = self.no_dates,
-            no_versions = self.no_versions,
-            no_process_includes = self.no_process_includes,
-            silence = self.silence,
-            namespace_defs = self.namespace_defs,
-            external_encoding = self.external_encoding,
-            member_specs = self.member_specs,
-            )
-        return new_session
-
-    def __eq__(self, obj):
-        """Implement the == operator.
-        """
-        if (
-            obj.input_schema == self.input_schema and
-            obj.output_superclass == self.output_superclass and
-            obj.output_subclass == self.output_subclass and
-            obj.force == self.force and
-            obj.prefix == self.prefix and
-            obj.namespace_prefix == self.namespace_prefix and
-            obj.empty_namespace_prefix == self.empty_namespace_prefix and
-            obj.behavior_filename == self.behavior_filename and
-            obj.properties == self.properties and
-            obj.subclass_suffix == self.subclass_suffix and
-            obj.root_element == self.root_element and
-            obj.superclass_module == self.superclass_module and
-            obj.auto_super == self.auto_super and
-            obj.old_getters_setters == self.old_getters_setters and
-            obj.validator_bodies == self.validator_bodies and
-            obj.user_methods == self.user_methods and
-            obj.no_dates == self.no_dates and
-            obj.no_versions == self.no_versions and
-            obj.no_process_includes == self.no_process_includes and
-            obj.silence == self.silence and
-            obj.namespace_defs == self.namespace_defs and
-            obj.external_encoding == self.external_encoding and
-            obj.member_specs == self.member_specs):
-            return True
-        else:
-            return False
-
-    def __ne__(self, obj):
-        """Implement the != operator.
-        """
-        return not self.__eq__(obj)
-
-#
-# Data representation classes.
-#
-
-class sessionType(GeneratedsSuper, SessionTypeMixin):
-    member_data_items_ = [
-        MemberSpec_('input_schema', 'xs:string', 0),
-        MemberSpec_('output_superclass', 'xs:string', 0),
-        MemberSpec_('output_subclass', 'xs:string', 0),
-        MemberSpec_('force', 'xs:boolean', 0),
-        MemberSpec_('prefix', 'xs:string', 0),
-        MemberSpec_('namespace_prefix', 'xs:string', 0),
-        MemberSpec_('empty_namespace_prefix', 'xs:boolean', 0),
-        MemberSpec_('behavior_filename', 'xs:string', 0),
-        MemberSpec_('properties', 'xs:boolean', 0),
-        MemberSpec_('subclass_suffix', 'xs:string', 0),
-        MemberSpec_('root_element', 'xs:string', 0),
-        MemberSpec_('superclass_module', 'xs:string', 0),
-        MemberSpec_('auto_super', 'xs:boolean', 0),
-        MemberSpec_('old_getters_setters', 'xs:boolean', 0),
-        MemberSpec_('validator_bodies', 'xs:string', 0),
-        MemberSpec_('user_methods', 'xs:string', 0),
-        MemberSpec_('no_dates', 'xs:boolean', 0),
-        MemberSpec_('no_versions', 'xs:boolean', 0),
-        MemberSpec_('no_process_includes', 'xs:boolean', 0),
-        MemberSpec_('silence', 'xs:boolean', 0),
-        MemberSpec_('namespace_defs', 'xs:string', 0),
-        MemberSpec_('external_encoding', 'xs:string', 0),
-        MemberSpec_('member_specs', 'xs:string', 0),
-        ]
-    subclass = None
-    superclass = None
-    def __init__(self, input_schema=None, output_superclass=None, output_subclass=None, force=None, prefix=None, namespace_prefix=None, empty_namespace_prefix=None, behavior_filename=None, properties=None, subclass_suffix=None, root_element=None, superclass_module=None, auto_super=None, old_getters_setters=None, validator_bodies=None, user_methods=None, no_dates=None, no_versions=None, no_process_includes=None, silence=None, namespace_defs=None, external_encoding=None, member_specs=None):
-        self.input_schema = input_schema
-        self.output_superclass = output_superclass
-        self.output_subclass = output_subclass
-        self.force = force
-        self.prefix = prefix
-        self.namespace_prefix = namespace_prefix
-        self.empty_namespace_prefix = empty_namespace_prefix
-        self.behavior_filename = behavior_filename
-        self.properties = properties
-        self.subclass_suffix = subclass_suffix
-        self.root_element = root_element
-        self.superclass_module = superclass_module
-        self.auto_super = auto_super
-        self.old_getters_setters = old_getters_setters
-        self.validator_bodies = validator_bodies
-        self.user_methods = user_methods
-        self.no_dates = no_dates
-        self.no_versions = no_versions
-        self.no_process_includes = no_process_includes
-        self.silence = silence
-        self.namespace_defs = namespace_defs
-        self.external_encoding = external_encoding
-        self.member_specs = member_specs
-    def factory(*args_, **kwargs_):
-        if sessionType.subclass:
-            return sessionType.subclass(*args_, **kwargs_)
-        else:
-            return sessionType(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_input_schema(self): return self.input_schema
-    def set_input_schema(self, input_schema): self.input_schema = input_schema
-    def get_output_superclass(self): return self.output_superclass
-    def set_output_superclass(self, output_superclass): self.output_superclass = output_superclass
-    def get_output_subclass(self): return self.output_subclass
-    def set_output_subclass(self, output_subclass): self.output_subclass = output_subclass
-    def get_force(self): return self.force
-    def set_force(self, force): self.force = force
-    def get_prefix(self): return self.prefix
-    def set_prefix(self, prefix): self.prefix = prefix
-    def get_namespace_prefix(self): return self.namespace_prefix
-    def set_namespace_prefix(self, namespace_prefix): self.namespace_prefix = namespace_prefix
-    def get_empty_namespace_prefix(self): return self.empty_namespace_prefix
-    def set_empty_namespace_prefix(self, empty_namespace_prefix): self.empty_namespace_prefix = empty_namespace_prefix
-    def get_behavior_filename(self): return self.behavior_filename
-    def set_behavior_filename(self, behavior_filename): self.behavior_filename = behavior_filename
-    def get_properties(self): return self.properties
-    def set_properties(self, properties): self.properties = properties
-    def get_subclass_suffix(self): return self.subclass_suffix
-    def set_subclass_suffix(self, subclass_suffix): self.subclass_suffix = subclass_suffix
-    def get_root_element(self): return self.root_element
-    def set_root_element(self, root_element): self.root_element = root_element
-    def get_superclass_module(self): return self.superclass_module
-    def set_superclass_module(self, superclass_module): self.superclass_module = superclass_module
-    def get_auto_super(self): return self.auto_super
-    def set_auto_super(self, auto_super): self.auto_super = auto_super
-    def get_old_getters_setters(self): return self.old_getters_setters
-    def set_old_getters_setters(self, old_getters_setters): self.old_getters_setters = old_getters_setters
-    def get_validator_bodies(self): return self.validator_bodies
-    def set_validator_bodies(self, validator_bodies): self.validator_bodies = validator_bodies
-    def get_user_methods(self): return self.user_methods
-    def set_user_methods(self, user_methods): self.user_methods = user_methods
-    def get_no_dates(self): return self.no_dates
-    def set_no_dates(self, no_dates): self.no_dates = no_dates
-    def get_no_versions(self): return self.no_versions
-    def set_no_versions(self, no_versions): self.no_versions = no_versions
-    def get_no_process_includes(self): return self.no_process_includes
-    def set_no_process_includes(self, no_process_includes): self.no_process_includes = no_process_includes
-    def get_silence(self): return self.silence
-    def set_silence(self, silence): self.silence = silence
-    def get_namespace_defs(self): return self.namespace_defs
-    def set_namespace_defs(self, namespace_defs): self.namespace_defs = namespace_defs
-    def get_external_encoding(self): return self.external_encoding
-    def set_external_encoding(self, external_encoding): self.external_encoding = external_encoding
-    def get_member_specs(self): return self.member_specs
-    def set_member_specs(self, member_specs): self.member_specs = member_specs
-    def export(self, outfile, level, namespace_='', name_='sessionType', namespacedef_=''):
-        showIndent(outfile, level)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        self.exportAttributes(outfile, level, [], namespace_, name_='sessionType')
-        if self.hasContent_():
-            outfile.write('>\n')
-            self.exportChildren(outfile, level + 1, namespace_, name_)
-            showIndent(outfile, level)
-            outfile.write('</%s%s>\n' % (namespace_, name_))
-        else:
-            outfile.write('/>\n')
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='sessionType'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='sessionType'):
-        if self.input_schema is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sinput_schema>%s</%sinput_schema>\n' % (namespace_, self.gds_format_string(quote_xml(self.input_schema).encode(ExternalEncoding), input_name='input_schema'), namespace_))
-        if self.output_superclass is not None:
-            showIndent(outfile, level)
-            outfile.write('<%soutput_superclass>%s</%soutput_superclass>\n' % (namespace_, self.gds_format_string(quote_xml(self.output_superclass).encode(ExternalEncoding), input_name='output_superclass'), namespace_))
-        if self.output_subclass is not None:
-            showIndent(outfile, level)
-            outfile.write('<%soutput_subclass>%s</%soutput_subclass>\n' % (namespace_, self.gds_format_string(quote_xml(self.output_subclass).encode(ExternalEncoding), input_name='output_subclass'), namespace_))
-        if self.force is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sforce>%s</%sforce>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.force)), input_name='force'), namespace_))
-        if self.prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sprefix>%s</%sprefix>\n' % (namespace_, self.gds_format_string(quote_xml(self.prefix).encode(ExternalEncoding), input_name='prefix'), namespace_))
-        if self.namespace_prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('<%snamespace_prefix>%s</%snamespace_prefix>\n' % (namespace_, self.gds_format_string(quote_xml(self.namespace_prefix).encode(ExternalEncoding), input_name='namespace_prefix'), namespace_))
-        if self.empty_namespace_prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sempty_namespace_prefix>%s</%sempty_namespace_prefix>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.empty_namespace_prefix)), input_name='empty_namespace_prefix'), namespace_))
-        if self.behavior_filename is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sbehavior_filename>%s</%sbehavior_filename>\n' % (namespace_, self.gds_format_string(quote_xml(self.behavior_filename).encode(ExternalEncoding), input_name='behavior_filename'), namespace_))
-        if self.properties is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sproperties>%s</%sproperties>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.properties)), input_name='properties'), namespace_))
-        if self.subclass_suffix is not None:
-            showIndent(outfile, level)
-            outfile.write('<%ssubclass_suffix>%s</%ssubclass_suffix>\n' % (namespace_, self.gds_format_string(quote_xml(self.subclass_suffix).encode(ExternalEncoding), input_name='subclass_suffix'), namespace_))
-        if self.root_element is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sroot_element>%s</%sroot_element>\n' % (namespace_, self.gds_format_string(quote_xml(self.root_element).encode(ExternalEncoding), input_name='root_element'), namespace_))
-        if self.superclass_module is not None:
-            showIndent(outfile, level)
-            outfile.write('<%ssuperclass_module>%s</%ssuperclass_module>\n' % (namespace_, self.gds_format_string(quote_xml(self.superclass_module).encode(ExternalEncoding), input_name='superclass_module'), namespace_))
-        if self.auto_super is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sauto_super>%s</%sauto_super>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.auto_super)), input_name='auto_super'), namespace_))
-        if self.old_getters_setters is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sold_getters_setters>%s</%sold_getters_setters>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.old_getters_setters)), input_name='old_getters_setters'), namespace_))
-        if self.validator_bodies is not None:
-            showIndent(outfile, level)
-            outfile.write('<%svalidator_bodies>%s</%svalidator_bodies>\n' % (namespace_, self.gds_format_string(quote_xml(self.validator_bodies).encode(ExternalEncoding), input_name='validator_bodies'), namespace_))
-        if self.user_methods is not None:
-            showIndent(outfile, level)
-            outfile.write('<%suser_methods>%s</%suser_methods>\n' % (namespace_, self.gds_format_string(quote_xml(self.user_methods).encode(ExternalEncoding), input_name='user_methods'), namespace_))
-        if self.no_dates is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sno_dates>%s</%sno_dates>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_dates)), input_name='no_dates'), namespace_))
-        if self.no_versions is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sno_versions>%s</%sno_versions>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_versions)), input_name='no_versions'), namespace_))
-        if self.no_process_includes is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sno_process_includes>%s</%sno_process_includes>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_process_includes)), input_name='no_process_includes'), namespace_))
-        if self.silence is not None:
-            showIndent(outfile, level)
-            outfile.write('<%ssilence>%s</%ssilence>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.silence)), input_name='silence'), namespace_))
-        if self.namespace_defs is not None:
-            showIndent(outfile, level)
-            outfile.write('<%snamespace_defs>%s</%snamespace_defs>\n' % (namespace_, self.gds_format_string(quote_xml(self.namespace_defs).encode(ExternalEncoding), input_name='namespace_defs'), namespace_))
-        if self.external_encoding is not None:
-            showIndent(outfile, level)
-            outfile.write('<%sexternal_encoding>%s</%sexternal_encoding>\n' % (namespace_, self.gds_format_string(quote_xml(self.external_encoding).encode(ExternalEncoding), input_name='external_encoding'), namespace_))
-        if self.member_specs is not None:
-            showIndent(outfile, level)
-            outfile.write('<%smember_specs>%s</%smember_specs>\n' % (namespace_, self.gds_format_string(quote_xml(self.member_specs).encode(ExternalEncoding), input_name='member_specs'), namespace_))
-    def hasContent_(self):
-        if (
-            self.input_schema is not None or
-            self.output_superclass is not None or
-            self.output_subclass is not None or
-            self.force is not None or
-            self.prefix is not None or
-            self.namespace_prefix is not None or
-            self.empty_namespace_prefix is not None or
-            self.behavior_filename is not None or
-            self.properties is not None or
-            self.subclass_suffix is not None or
-            self.root_element is not None or
-            self.superclass_module is not None or
-            self.auto_super is not None or
-            self.old_getters_setters is not None or
-            self.validator_bodies is not None or
-            self.user_methods is not None or
-            self.no_dates is not None or
-            self.no_versions is not None or
-            self.no_process_includes is not None or
-            self.silence is not None or
-            self.namespace_defs is not None or
-            self.external_encoding is not None or
-            self.member_specs is not None
-            ):
-            return True
-        else:
-            return False
-    def exportLiteral(self, outfile, level, name_='sessionType'):
-        level += 1
-        self.exportLiteralAttributes(outfile, level, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.input_schema is not None:
-            showIndent(outfile, level)
-            outfile.write('input_schema=%s,\n' % quote_python(self.input_schema).encode(ExternalEncoding))
-        if self.output_superclass is not None:
-            showIndent(outfile, level)
-            outfile.write('output_superclass=%s,\n' % quote_python(self.output_superclass).encode(ExternalEncoding))
-        if self.output_subclass is not None:
-            showIndent(outfile, level)
-            outfile.write('output_subclass=%s,\n' % quote_python(self.output_subclass).encode(ExternalEncoding))
-        if self.force is not None:
-            showIndent(outfile, level)
-            outfile.write('force=%s,\n' % self.force)
-        if self.prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('prefix=%s,\n' % quote_python(self.prefix).encode(ExternalEncoding))
-        if self.namespace_prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('namespace_prefix=%s,\n' % quote_python(self.namespace_prefix).encode(ExternalEncoding))
-        if self.empty_namespace_prefix is not None:
-            showIndent(outfile, level)
-            outfile.write('empty_namespace_prefix=%s,\n' % self.empty_namespace_prefix)
-        if self.behavior_filename is not None:
-            showIndent(outfile, level)
-            outfile.write('behavior_filename=%s,\n' % quote_python(self.behavior_filename).encode(ExternalEncoding))
-        if self.properties is not None:
-            showIndent(outfile, level)
-            outfile.write('properties=%s,\n' % self.properties)
-        if self.subclass_suffix is not None:
-            showIndent(outfile, level)
-            outfile.write('subclass_suffix=%s,\n' % quote_python(self.subclass_suffix).encode(ExternalEncoding))
-        if self.root_element is not None:
-            showIndent(outfile, level)
-            outfile.write('root_element=%s,\n' % quote_python(self.root_element).encode(ExternalEncoding))
-        if self.superclass_module is not None:
-            showIndent(outfile, level)
-            outfile.write('superclass_module=%s,\n' % quote_python(self.superclass_module).encode(ExternalEncoding))
-        if self.auto_super is not None:
-            showIndent(outfile, level)
-            outfile.write('auto_super=%s,\n' % self.auto_super)
-        if self.old_getters_setters is not None:
-            showIndent(outfile, level)
-            outfile.write('old_getters_setters=%s,\n' % self.old_getters_setters)
-        if self.validator_bodies is not None:
-            showIndent(outfile, level)
-            outfile.write('validator_bodies=%s,\n' % quote_python(self.validator_bodies).encode(ExternalEncoding))
-        if self.user_methods is not None:
-            showIndent(outfile, level)
-            outfile.write('user_methods=%s,\n' % quote_python(self.user_methods).encode(ExternalEncoding))
-        if self.no_dates is not None:
-            showIndent(outfile, level)
-            outfile.write('no_dates=%s,\n' % self.no_dates)
-        if self.no_versions is not None:
-            showIndent(outfile, level)
-            outfile.write('no_versions=%s,\n' % self.no_versions)
-        if self.no_process_includes is not None:
-            showIndent(outfile, level)
-            outfile.write('no_process_includes=%s,\n' % self.no_process_includes)
-        if self.silence is not None:
-            showIndent(outfile, level)
-            outfile.write('silence=%s,\n' % self.silence)
-        if self.namespace_defs is not None:
-            showIndent(outfile, level)
-            outfile.write('namespace_defs=%s,\n' % quote_python(self.namespace_defs).encode(ExternalEncoding))
-        if self.external_encoding is not None:
-            showIndent(outfile, level)
-            outfile.write('external_encoding=%s,\n' % quote_python(self.external_encoding).encode(ExternalEncoding))
-        if self.member_specs is not None:
-            showIndent(outfile, level)
-            outfile.write('member_specs=%s,\n' % quote_python(self.member_specs).encode(ExternalEncoding))
-    def build(self, node):
-        self.buildAttributes(node, node.attrib, [])
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, nodeName_, from_subclass=False):
-        if nodeName_ == 'input_schema':
-            input_schema_ = child_.text
-            self.input_schema = input_schema_
-        elif nodeName_ == 'output_superclass':
-            output_superclass_ = child_.text
-            self.output_superclass = output_superclass_
-        elif nodeName_ == 'output_subclass':
-            output_subclass_ = child_.text
-            self.output_subclass = output_subclass_
-        elif nodeName_ == 'force':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.force = ival_
-        elif nodeName_ == 'prefix':
-            prefix_ = child_.text
-            self.prefix = prefix_
-        elif nodeName_ == 'namespace_prefix':
-            namespace_prefix_ = child_.text
-            self.namespace_prefix = namespace_prefix_
-        elif nodeName_ == 'empty_namespace_prefix':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.empty_namespace_prefix = ival_
-        elif nodeName_ == 'behavior_filename':
-            behavior_filename_ = child_.text
-            self.behavior_filename = behavior_filename_
-        elif nodeName_ == 'properties':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.properties = ival_
-        elif nodeName_ == 'subclass_suffix':
-            subclass_suffix_ = child_.text
-            self.subclass_suffix = subclass_suffix_
-        elif nodeName_ == 'root_element':
-            root_element_ = child_.text
-            self.root_element = root_element_
-        elif nodeName_ == 'superclass_module':
-            superclass_module_ = child_.text
-            self.superclass_module = superclass_module_
-        elif nodeName_ == 'auto_super':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.auto_super = ival_
-        elif nodeName_ == 'old_getters_setters':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.old_getters_setters = ival_
-        elif nodeName_ == 'validator_bodies':
-            validator_bodies_ = child_.text
-            self.validator_bodies = validator_bodies_
-        elif nodeName_ == 'user_methods':
-            user_methods_ = child_.text
-            self.user_methods = user_methods_
-        elif nodeName_ == 'no_dates':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.no_dates = ival_
-        elif nodeName_ == 'no_versions':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.no_versions = ival_
-        elif nodeName_ == 'no_process_includes':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.no_process_includes = ival_
-        elif nodeName_ == 'silence':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            self.silence = ival_
-        elif nodeName_ == 'namespace_defs':
-            namespace_defs_ = child_.text
-            self.namespace_defs = namespace_defs_
-        elif nodeName_ == 'external_encoding':
-            external_encoding_ = child_.text
-            self.external_encoding = external_encoding_
-        elif nodeName_ == 'member_specs':
-            member_specs_ = child_.text
-            self.member_specs = member_specs_
-# end class sessionType
-
-
-USAGE_TEXT = """
-Usage: python <Parser>.py [ -s ] <in_xml_file>
-"""
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def get_root_tag(node):
-    tag = Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = globals().get(tag)
-    return tag, rootClass
-
-
-def parse(inFileName):
-    doc = parsexml_(inFileName)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'session'
-        rootClass = sessionType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0, name_=rootTag, 
-        namespacedef_='')
-    return rootObj
-
-
-def parseString(inString):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'session'
-        rootClass = sessionType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    sys.stdout.write('<?xml version="1.0" ?>\n')
-    rootObj.export(sys.stdout, 0, name_="session",
-        namespacedef_='')
-    return rootObj
-
-
-def parseLiteral(inFileName):
-    doc = parsexml_(inFileName)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'session'
-        rootClass = sessionType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    sys.stdout.write('#from generateds_gui_session import *\n\n')
-    sys.stdout.write('import generateds_gui_session as model_\n\n')
-    sys.stdout.write('rootObj = model_.rootTag(\n')
-    rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
-    sys.stdout.write(')\n')
-    return rootObj
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) == 1:
-        parse(args[0])
-    else:
-        usage()
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
-
-
-__all__ = [
-    "sessionType"
-    ]
diff --git a/libgenerateDS/gui/generateds_gui_session.py b/libgenerateDS/gui/generateds_gui_session.py
new file mode 120000
index 0000000..15763a3
--- /dev/null
+++ b/libgenerateDS/gui/generateds_gui_session.py
@@ -0,0 +1 @@
+../../gui/generateds_gui_session.py
\ No newline at end of file
diff --git a/librarytemplate-1.0a.zip b/librarytemplate-1.0a.zip
index 36313a504fbc4cd9ecbd5edd471eb7dc426c432f..3abcb751cdb9c86cfca169cc3b903f354eee146e 100644
GIT binary patch
delta 1472
zcmZWpdo+}39R6m^7`cu$VlHQlYR6>^b0O+r#u%az;}S`6Dy$5#M;o!uj4~~Cu;VQi
z<*th*n>lE=spNLHR!EzoB27xvh-y(`zi)Q?r~S@(zRUCbz0do8=l7gvC;{v>7K?N+
z`Vevn;v_<aF+<PrJF8Hic&ku_7ZFpMmFuI3X6bP?vM^m3FsEqZVP%!V02#RKNB}Il
zp3($0Yie`~?lg>=Jz9W*pgCY<#*#Y0{Rn=@Fn~~)NgW8%-Wq|IsEdV{&n%j!g$-!3
zZ-Pub0fYUp?%w_bW^G#p#oLc9jGe7*luTD!q$PItei~H;HU+$IO^o|%C{H<T`fSO=
z&&SA<oHVJf8T!_?ey1$q=0S!XCPVd`Zn8kQc9lKj(UE}X`ck=RlD`M<Ziua`k*geU
zveDj6w(;Y^h%3vMnU4+$b<RFebR}DzaG@ppBuSWEc8{w~Fgp}1P<O2+wy>l<r6dp|
zd!HLz_U1tX>NS0Si;Co3`F&teU#KPRb#*#nTTOMr`moDgUQgY4?bn`-);VUDiYSIP
ze(G|YCg=2zC#4?Y#)H!w33qZ{$a!Ji?J+ETnaE@(-?7X_x9AkdXM~TDw{e<JJ4hE_
zG+0qa=H#)xQLPJkJM1*geEj))rq7nof3mhp$Y_(0JadeniZ!XCfn72tagMSBOHL_M
zo%@vUooE-X7Ig$pSfn>x{b>crn=5oOnB_e#O{+X?aM2^{I~tCx_ykF+cJH6QUqAhO
zbw|WVOZ~n9!ca=Y*zK)JiHd$3FhTIe*{<Cb07J<!@4<XET_ULyg;Vtl17H9(xk7i!
zI3{4qSeZvDK$-Gk&-9)#ztam(Jr@H(G+=5*1U#yVR1bC$;+U_dUl$@uDdXd>&orId
zlf|m_*gjWPzjgvI3O=*>&8_Vvm(%ZO(+=oW+OAyd6i{}jT_AMj$WPDQihp-eq*4j%
z?%q0l(l{oj(XQ(y-c^vqt{(}DJ!D}~ap_g1%g`a;s2u!mi$sjNs7iWZE>ntLG$V-z
z5Bo%BrFI^55O}BN^j&bd)IHJRmL(`^S@&3@tgoQE1h@3PYfV;$c&f*IqinKQPlbAt
zA3S$BylhxL5K2hf`-{lvb!vM|<5Pe2iT04<+>V98g-~~q{rEPV4V18JVqQb-aUDkQ
z^zP}&e`~=bPmMp!aFNCmQT}o5!vZr!nvDmG)h}Q;9xvz?DkkE@Y%5xumrLQ6^ZR5o
z*fuCV=xUZPlV>O)R`K6+Px{}yKG>74`Vc;-P($8^KW`pac7LcH7d!WqEDrGd_B^cP
z&`;D92T$Vv&I(~;^&8jQN5;?B-1x&Gri83+xGwlpe-wKoe%3D{(!Ex5DzTz4|IUKn
zAj3VXsF$9f@7)!-hM(Pi<KX9tL;XM6A9qt{P5P%byh>g(9%zBu#Ow9ks{iYz&w6FN
z(dCDlecY+M4e~2oh2Y7t;i9FbbJKJCO-SY3g_0+J?C2E;ytVSdmCA(yFcf@}GMwgZ
zfI)%;oMmjlAV~sDnC3w2psS4%u*mSlAX)Ms8;U|wgbF$w?tT>@l}t|z5*~0P87wiW
z=y3w5Vp#&Bxrr_o(t*7SP%H|Fcch{(5w(?a$8WT1?q~y&mcTiQ(Z|Tz*G}?kWEJAz
zaV7;^bfTi+2cj28Az|Rk6j*U`N6#W04eVqIQ2wBj6-4`=y&+3&RKjkDYIAT@tpty1
zh=U~%!+-f%u$2w(K!eLfP{_ukN<jtN9i9I#5zR3GD2@O<@#QlD-E6H@>gR~jcsj7=
g#-Sy2n4y9MIv%ug`Dm=IRts55ady_d%|MRv54&1o!~g&Q

delta 1404
zcmbQ7c`bu4z?+$civa{ShOyaB<kM!A^NI0!F<HS_ga;<0p2=Z5G0uSFC11SH86ckM
zC^>PxJxBcl7oXGHJb_%{$^24moB0_(3i2-Z`D!C{I;C$SBLl<N$-Ke_jFyuZ@`~3_
zHuOJiAkbR=zf0P&DP{c;79J0UP^OgzipO_eTh^I-v+vT1ru*k^dS*-x+weeh<GXv`
z-#z`bpxHQ8xyfkOT_3*W-+RS{vj45C?43V<s+L1isx1riHOa<%hhJY-)_BW&ooS)T
zqLqQ{t0veqXl_`nK8JhhvVUsHIZK;bj8}AD-d%sDZ2E<nY%JF=Scy*1-L25emguDt
z&3$ZL;>o%03%WWab!BB-i!IpYB6lS*98%=>%CB?#oN#Sr{*%x<)iTdYGGu?rIq6w-
z&ol9g(e73CoWsiZnR$=LtGTa>+JiecC#DqMx&1<Px!?ay?x*4`LRE5^{?79_v?l4!
zV&A;nr7ZpR(Z(+Fj=udzIOkpAXM5I@qIUBB`!$7oor7x@aAclNlb@({vsmcEn<|^0
zy>oWG|J*pMZ1<sm!W#V3x^?d>Y`Jro&D4r(UCUPE(x}UakJxQX`T0R;WAe|t#xLa_
z{7+f<Vi`kJ_x8lI+E4nJ^nHXAf}H;^I?Os*@rLWX?YXlp@4OW@N__Qa^&PWKt9G92
zw@O)|J?)(N<cA_|?CQ$yK9jb4Zq^e$#)2H9oB5?qGP3VJ@8TnH&2#d7>G^D+*gwg$
zxkaXzk?%nCH=E`80ruU%SpLsESzb=NUcJx5XTdX1pVA6$21b?_%nS@*V(BD%P{bcC
zukVsh%-Ez{>LAkD=+)8068zLEJm;bP#M(fqg`aNjv|#j_&A2kG?a8C+{pIK9oj)J-
z=&`b9uiv`8B|Gj%Zx(#6d9F1gA?V_jlqPZa{eFcPq_Q0suXW_u$Rl|0M{b8-{k(7e
zO6wOgs@g_Ox!C+V`iYtei~FlJQXjo!%z3KsUr3(P(j6LD{@BkqBz|h@?QO0{?yd_s
zICcKj>cwj(@3VPv;fc=cdo2DhG&`NkHz!Nmr1Z}?`@r*Y=W(w|ExjM7e$0P)Je2je
z#2khNoztd2wdI+b#B_ba#!MEw&$}1$ZR-uMubsm=A%syz--Oe$>XL1vr7-(rr>hZX
zIu@;I@=Dd;$+4=?ro>L}L3+}yg{d0+v45ZJ-xfTNFDf_W+2*N?({7wRT2hnqM<~i}
z+5Mh<mY1%IUAOdbTl*<}ndE$rs@8zsWx|(L3@w(_y?AdF5dL|q_kYjd?aQ57+4r>f
znJk~UT2l28qdynlXM@@^;t8!k!nf7z*&C;m&wWeKxOIndr_-Aw2X&>di%-^7aOIfU
z>f*B<oNpyJPgZc|W&!2=$+xsEC(9elvw$-DWHTK*W?+0z{-7r|xmPEcv3~MHo%d*Y
z`>w7Xv!#+dP>sxFD?K@;ry`R-=*mu(66IoJWnc!TE3odldMZqtB*8Kd^mxGr$xY_b
zmt*3W0t(7c_SW}g>X!z~ACVSh1?t>=e)4-g*~#WILX&^!^Dr68fF;vpL_x;F92H`q
z!t@m+BQbft8r$R<1};p#vT*Jn0|N!rB+9^`z#suG=71@dVM!ym99Xfn91qyBeI8)P
z_86)#eUJys>{VdrNl7e8)DH~-T0659=qB;WUkp_keI_>=sZO>ta$;NoWEC=%DuUJX
o7zZ$2Rs}Q5jD4B()WFR7YGRW=8#^$aPzQ5;O&r*IwL#7R01SjkmjD0&

diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index ca714f8..47bc84a 100644
--- a/librarytemplate_howto.html
+++ b/librarytemplate_howto.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" />
 <title>How to package a generateDS.py generated library</title>
 <meta name="author" content="Dave Kuhlman" />
 <style type="text/css">
@@ -187,9 +187,12 @@ div.warning p.admonition-title {
   font-family: sans-serif }
 
 tt.docutils {
-  background-color: #eeeeee;
+  background-color: #dddddd;
 }
 
+ul.auto-toc {
+  list-style-type: none }
+
 </style>
 </head>
 <body>
@@ -203,8 +206,8 @@ tt.docutils {
 <td>Dave Kuhlman</td></tr>
 <tr><th class="docinfo-name">Address:</th>
 <td><pre class="address">
-<a class="first reference external" href="mailto:dkuhlman&#64;rexx.com">dkuhlman&#64;rexx.com</a>
-<a class="last reference external" href="http://www.rexx.com/~dkuhlman">http://www.rexx.com/~dkuhlman</a>
+dkuhlman (at) davekuhlman (dot) org
+<a class="last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a>
 </pre>
 </td></tr>
 </tbody>
@@ -214,7 +217,7 @@ tt.docutils {
 <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.11a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td>
 </tr>
 </tbody>
 </table>
@@ -223,7 +226,7 @@ tt.docutils {
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">August 16, 2013</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">January 16, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -247,15 +250,15 @@ formats (for example HTML, LaTeX, PDF) with Sphinx</li>
 </ul>
 <p>The latest copy of these instructions is here:</p>
 <blockquote>
-<a class="reference external" href="http://www.rexx.com/~dkuhlman/librarytemplate_howto.html">http://www.rexx.com/~dkuhlman/librarytemplate_howto.html</a></blockquote>
+<a class="reference external" href="http://www.davekuhlman.org/librarytemplate_howto.html">http://www.davekuhlman.org/librarytemplate_howto.html</a></blockquote>
 <p>and the template package itself is here:</p>
 <blockquote>
-<a class="reference external" href="http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip">http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip</a></blockquote>
+<a class="reference external" href="http://www.davekuhlman.org/librarytemplate-1.0a.zip">http://www.davekuhlman.org/librarytemplate-1.0a.zip</a></blockquote>
 <p>These instructions assume the name &quot;peach&quot; as the name of the
 schema.  You should replace &quot;peach&quot; in these instructions with the
 name of your schema.</p>
 <p>Find out more about generateDS.py here:
-<a class="reference external" href="http://www.rexx.com/~dkuhlman/generateDS.html">http://www.rexx.com/~dkuhlman/generateDS.html</a></p>
+<a class="reference external" href="http://www.davekuhlman.org/generateDS.html">http://www.davekuhlman.org/generateDS.html</a></p>
 <p>You will need to install Sphinx in order to build the documentation
 in your package.  Learn about Sphinx here: <a class="reference external" href="http://sphinx.pocoo.org/">http://sphinx.pocoo.org/</a>.</p>
 </div>
@@ -377,6 +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-01-17 00:01 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 9948374..6969b4d 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -3,12 +3,12 @@ How to package a generateDS.py generated library
 ==================================================
 
 :author: Dave Kuhlman
-:address: dkuhlman@rexx.com
-    http://www.rexx.com/~dkuhlman
+:address: dkuhlman (at) davekuhlman (dot) org
+    http://www.davekuhlman.org
 
 .. version
 
-:revision: 2.11b
+:revision: 2.24b
 
 .. version
 
@@ -44,18 +44,18 @@ below will help you to create the following:
 
 The latest copy of these instructions is here:
 
-    http://www.rexx.com/~dkuhlman/librarytemplate_howto.html
+    http://www.davekuhlman.org/librarytemplate_howto.html
 
 and the template package itself is here:
 
-    http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip
+    http://www.davekuhlman.org/librarytemplate-1.0a.zip
 
 These instructions assume the name "peach" as the name of the
 schema.  You should replace "peach" in these instructions with the
 name of your schema.
 
 Find out more about generateDS.py here:
-http://www.rexx.com/~dkuhlman/generateDS.html
+http://www.davekuhlman.org/generateDS.html
 
 You will need to install Sphinx in order to build the documentation
 in your package.  Learn about Sphinx here: http://sphinx.pocoo.org/.
diff --git a/process_includes.py b/process_includes.py
index 4f4ab1d..8fe5493 100755
--- a/process_includes.py
+++ b/process_includes.py
@@ -15,13 +15,23 @@ Examples:
 
 import sys
 import os
-import urllib2
+if sys.version_info.major == 2:
+    import urllib2
+else:
+    import urllib.request
+    import urllib.error
+    import urllib.parse
 import copy
 from optparse import OptionParser, Values
 import itertools
 from copy import deepcopy
 from lxml import etree
 
+try:
+    from gds_inner_name_map import Inner_name_map
+except ImportError:
+    Inner_name_map = None
+
 
 #
 # Globals and constants
@@ -30,16 +40,25 @@ from lxml import etree
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.11b'
+VERSION = '2.24b'
 ##VERSION##
 
-Namespaces = {'xs': 'http://www.w3.org/2001/XMLSchema'}
-Xsd_namespace_uri = 'http://www.w3.org/2001/XMLSchema'
 CatalogDict = {}
 # the base url to use for all relative paths in the catalog
 CatalogBaseUrl = None
 
 
+#
+# Exceptions
+
+class SchemaIOError(IOError):
+    pass
+
+
+class InnerNameMapError(Exception):
+    pass
+
+
 def load_catalog(catalogpath):
     global CatalogBaseUrl
     if catalogpath:
@@ -61,7 +80,22 @@ def process_include_files(
         'force': False,
         'fixtypenames': fixtypenames,
     })
-    prep_schema_doc(infile, outfile, inpath, options)
+    doc = prep_schema_doc(infile, outfile, inpath, options)
+    return doc
+
+
+def get_all_root_file_paths(infile, inpath='', catalogpath=None):
+    load_catalog(catalogpath)
+
+    doc1 = etree.parse(infile)
+    root1 = doc1.getroot()
+    rootPaths = []
+    params = Params()
+    params.parent_url = infile
+    params.base_url = os.path.split(inpath)[0]
+    get_root_file_paths(root1, params, rootPaths)
+    rootPaths.append(inpath)
+    return rootPaths
 
 
 #
@@ -78,17 +112,10 @@ class Params(object):
     def __setattr__(self, name, value):
         if name not in self.members:
             raise AttributeError('Class %s has no set-able attribute "%s"' % (
-                self.__class__.__name__,  name, ))
+                self.__class__.__name__, name, ))
         self.__dict__[name] = value
 
 
-class SchemaIOError(IOError):
-    pass
-
-
-class RaiseComplexTypesError(Exception):
-    pass
-
 #
 # Functions for internal use and testing
 
@@ -103,8 +130,7 @@ def clear_includes_and_imports(node):
         node.replace(child, repl)
 
 
-def resolve_ref(node, params, options):
-    content = None
+def get_ref_info(node, params):
     # first look for the schema location in the catalog, if not
     # there, then see if it's specified in the node
     namespace = node.get('namespace')
@@ -122,7 +148,7 @@ def resolve_ref(node, params, options):
         msg = '*** Warning: missing "schemaLocation" attribute in %s\n' % (
             params.parent_url, )
         sys.stderr.write(msg)
-        return None
+        return (None, None)
     # Uncomment the next lines to help track down missing schemaLocation etc.
     # print '(resolve_ref) url: %s\n    parent-url: %s' % (
     #     url, params.parent_url, )
@@ -139,10 +165,19 @@ def resolve_ref(node, params, options):
     else:
         locn = url
         schema_name = url
-    if not (
-            url.startswith('/') or
-            url.startswith('http:') or
-            url.startswith('ftp:')):
+
+    return locn, schema_name
+
+
+def resolve_ref(node, params, options):
+    content = None
+
+    locn, schema_name = get_ref_info(node, params)
+
+    if locn is not None and not (
+            locn.startswith('/') or
+            locn.startswith('http:') or
+            locn.startswith('ftp:')):
         schema_name = os.path.abspath(locn)
     if locn is not None:
         if schema_name not in params.already_processed:
@@ -154,20 +189,26 @@ def resolve_ref(node, params, options):
 ##             print '    locn        : %s' % (locn, )
 ##             print '    schema_name : %s\n' % (schema_name, )
             if locn.startswith('http:') or locn.startswith('ftp:'):
+                if sys.version_info.major == 2:
+                    urllib_urlopen = urllib2.urlopen
+                    urllib_httperror = urllib2.HTTPError
+                else:
+                    urllib_urlopen = urllib.request.urlopen
+                    urllib_httperror = urllib.error.HTTPError
                 try:
-                    urlfile = urllib2.urlopen(locn)
+                    urlfile = urllib_urlopen(locn)
                     content = urlfile.read()
                     urlfile.close()
                     params.parent_url = locn
                     params.base_url = os.path.split(locn)[0]
-                except urllib2.HTTPError:
+                except urllib_httperror:
                     msg = "Can't find file %s referenced in %s." % (
                         locn, params.parent_url, )
                     raise SchemaIOError(msg)
             else:
                 if os.path.exists(locn):
                     infile = open(locn)
-                    content = infile.read()
+                    content = infile.read().encode()
                     infile.close()
                     params.parent_url = locn
                     params.base_url = os.path.split(locn)[0]
@@ -184,17 +225,23 @@ def resolve_ref(node, params, options):
 
 def collect_inserts(node, params, inserts, options):
     namespace = node.nsmap[node.prefix]
+    roots = []
     child_iter1 = node.iterfind('{%s}include' % (namespace, ))
     child_iter2 = node.iterfind('{%s}import' % (namespace, ))
     for child in itertools.chain(child_iter1, child_iter2):
-        collect_inserts_aux(child, params, inserts, options)
+        aux_roots = collect_inserts_aux(child, params, inserts, options)
+        roots.extend(aux_roots)
+
+    return roots
 
 
 def collect_inserts_aux(child, params, inserts, options):
+    roots = []
     save_base_url = params.base_url
     string_content = resolve_ref(child, params, options)
     if string_content is not None:
         root = etree.fromstring(string_content, base_url=params.base_url)
+        roots.append(root)
         for child1 in root:
             if not isinstance(child1, etree._Comment):
                 namespace = child1.nsmap[child1.prefix]
@@ -204,14 +251,42 @@ def collect_inserts_aux(child, params, inserts, options):
                     comment.tail = '\n'
                     inserts.append(comment)
                     inserts.append(child1)
-        collect_inserts(root, params, inserts, options)
+        insert_roots = collect_inserts(root, params, inserts, options)
+        roots.extend(insert_roots)
+    params.base_url = save_base_url
+    return roots
+
+
+def get_root_file_paths(node, params, rootPaths):
+
+    namespace = node.nsmap[node.prefix]
+    child_iter1 = node.iterfind('{%s}include' % (namespace, ))
+    child_iter2 = node.iterfind('{%s}import' % (namespace, ))
+    for child in itertools.chain(child_iter1, child_iter2):
+        get_root_file_paths_aux(child, params, rootPaths)
+
+
+def get_root_file_paths_aux(child, params, rootPaths):
+    save_base_url = params.base_url
+    path, _ = get_ref_info(child, params)
+    string_content = resolve_ref(child, params, None)
+    if string_content is not None:
+        root = etree.fromstring(string_content, base_url=params.base_url)
+        get_root_file_paths(root, params, rootPaths)
+
+    if path is not None and path not in rootPaths:
+        rootPaths.append(path)
+
     params.base_url = save_base_url
 
 
 def make_file(outFileName, options):
     outFile = None
     if (not options.force) and os.path.exists(outFileName):
-        reply = raw_input('File %s exists.  Overwrite? (y/n): ' % outFileName)
+        if sys.version_info.major == 3:
+            raw_input = input
+        reply = raw_input(
+            'File %s exists.  Overwrite? (y/n): ' % outFileName)
         if reply == 'y':
             outFile = open(outFileName, 'w')
     else:
@@ -235,7 +310,10 @@ def prep_schema_doc(infile, outfile, inpath, options):
     raise_anon_complextypes(root2)
     fix_type_names(root2, options)
     doc2 = etree.ElementTree(root2)
-    doc2.write(outfile)
+    if sys.version_info.major == 2:
+        doc2.write(outfile)
+    else:
+        outfile.write(etree.tostring(root2).decode('utf-8'))
     return doc2
 
 
@@ -259,10 +337,22 @@ def prep_schema(inpath, outpath, options):
 
 def process_groups(root):
     # Get all the xs:group definitions at top level.
-    defs = root.xpath('./xs:group', namespaces=Namespaces)
+    if root.prefix:
+        namespaces = {root.prefix: root.nsmap[root.prefix]}
+        pattern = './%s:group' % (root.prefix, )
+        defs = root.xpath(pattern, namespaces=namespaces)
+    else:
+        pattern = './group'
+        defs = root.xpath(pattern)
     defs = [node for node in defs if node.get('name') is not None]
     # Get all the xs:group references (below top level).
-    refs = root.xpath('./*//xs:group', namespaces=Namespaces)
+    if root.prefix:
+        namespaces = {root.prefix: root.nsmap[root.prefix]}
+        pattern = './*//%s:group' % (root.prefix, )
+        refs = root.xpath(pattern, namespaces=namespaces)
+    else:
+        pattern = './*//group'
+        refs = root.xpath(pattern)
     refs = [node for node in refs if node.get('ref') is not None]
     # Create a dictionary of the named model groups (definitions).
     def_dict = {}
@@ -352,23 +442,27 @@ def replace_group_defs(def_dict, refs):
         if name is None:
             continue
         def_node = def_dict.get(name)
+        namespaces = {def_node.prefix: def_node.nsmap[def_node.prefix]}
         if def_node is not None:
+            pattern = './%s:sequence|./%s:choice|./%s:all' % (
+                def_node.prefix, def_node.prefix, def_node.prefix, )
             content = def_node.xpath(
-                './xs:sequence|./xs:choice|./xs:all',
-                namespaces=Namespaces)
+                pattern,
+                namespaces=namespaces)
             if content:
                 content = content[0]
                 parent = ref_node.getparent()
                 for node in content:
-                    new_node = deepcopy(node)
-                    # Copy minOccurs and maxOccurs attributes to new node.
-                    value = ref_node.get('minOccurs')
-                    if value is not None:
-                        new_node.set('minOccurs', value)
-                    value = ref_node.get('maxOccurs')
-                    if value is not None:
-                        new_node.set('maxOccurs', value)
-                    ref_node.addprevious(new_node)
+                    if not isinstance(node, etree._Comment):
+                        new_node = deepcopy(node)
+                        # Copy minOccurs and maxOccurs attributes to new node.
+                        value = ref_node.get('minOccurs')
+                        if value is not None:
+                            new_node.set('minOccurs', value)
+                        value = ref_node.get('maxOccurs')
+                        if value is not None:
+                            new_node.set('maxOccurs', value)
+                        ref_node.addprevious(new_node)
                 parent.remove(ref_node)
 
 
@@ -393,10 +487,12 @@ def raise_anon_complextypes(root):
         pattern = './*/*//%s:complexType|./*/*//%s:simpleType' % (
             prefix, prefix, )
         element_tag = '{%s}element' % (root.nsmap[prefix], )
+        namespaces = {prefix: root.nsmap[prefix]}
+        defs = root.xpath(pattern, namespaces=namespaces)
     else:
         pattern = './*/*//complexType|./*/*//simpleType'
         element_tag = 'element'
-    defs = root.xpath(pattern, namespaces=Namespaces)
+        defs = root.xpath(pattern)
     for node in defs:
         parent = node.getparent()
         if parent.tag != element_tag:
@@ -405,7 +501,10 @@ def raise_anon_complextypes(root):
         if not name:
             continue
         type_name = '%sType' % (name, )
-        type_name, def_count = unique_name(type_name, def_names, def_count)
+        if Inner_name_map is None:
+            type_name, def_count = unique_name(type_name, def_names, def_count)
+        else:
+            type_name = map_inner_name(node, Inner_name_map)
         def_names.add(type_name)
         parent.set('type', type_name)
         node.set('name', type_name)
@@ -413,6 +512,35 @@ def raise_anon_complextypes(root):
         root.append(node)
 
 
+def map_inner_name(node, inner_name_map):
+    """Use a user-supplied mapping table to look up a name for this class/type.
+    """
+    # find the name for the enclosing type definition and
+    # the name of the type definition that encloses that.
+    node1 = node
+    name2 = node1.get('name')
+    while name2 is None:
+        node1 = node1.getparent()
+        if node1 is None:
+            raise InnerNameMapError('cannot find parent with "name" attribute')
+        name2 = node1.get('name')
+    node1 = node1.getparent()
+    name1 = node1.get('name')
+    while name1 is None:
+        node1 = node1.getparent()
+        if node1 is None:
+            raise InnerNameMapError('cannot find parent with "name" attribute')
+        name1 = node1.get('name')
+    new_name = inner_name_map.get((name1, name2))
+    if new_name is None:
+        msg1 = '("{}", "{}")'.format(
+            name1, name2)
+        sys.stderr.write('\n*** error.  Must add entry to inner_name_map:\n')
+        sys.stderr.write('\n    {}: "xxxx",\n\n'.format(msg1))
+        raise InnerNameMapError('mapping missing for {}'.format(msg1))
+    return new_name
+
+
 #
 # Collect the names of all currently defined types (complexType,
 #   simpleType, element).
@@ -428,11 +556,10 @@ def collect_type_names(node):
     else:
         pattern = './/complexType|.//simpleType|.//element'
         elements = node.xpath(pattern)
-    names = [
+    names = {
         el.attrib['name'] for el in elements if
         'name' in el.attrib and el.getchildren()
-    ]
-    names = set(names)
+    }
     return names
 
 
@@ -469,6 +596,10 @@ def main():
         "-f", "--force", action="store_true",
         dest="force", default=False,
         help="force overwrite without asking")
+    parser.add_option(
+        "--fix-type-names", action="store",
+        dest="fixtypenames", default=None,
+        help="Fix up (replace) complex type names.")
     (options, args) = parser.parse_args()
     if len(args) == 2:
         inpath = args[0]
diff --git a/setup.py b/setup.py
index 19d94e8..7963851 100644
--- a/setup.py
+++ b/setup.py
@@ -7,13 +7,13 @@ setup(name="generateDS",
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.11b",
+    version="2.24b",
 ##VERSION##
     author="Dave Kuhlman",
-    author_email="dkuhlman@rexx.com",
+    author_email="dkuhlman@davekuhlman.org",
     maintainer="Dave Kuhlman",
-    maintainer_email="dkuhlman@rexx.com",
-    url="http://www.rexx.com/~dkuhlman/generateDS.html",
+    maintainer_email="dkuhlman@davekuhlman.org",
+    url="http://www.davekuhlman.org/generateDS.html",
     description="Generate Python data structures and XML parser from Xschema",
     long_description="""\
 generateDS.py generates Python data structures (for example, class
@@ -32,6 +32,9 @@ XML document.""",
 ##         "gui.generateds_gui",
 ##         "gui.generateds_gui_session",
 ##         ],
+    py_modules=[
+        "process_includes", 
+        ],
     # include_package_data=True,
     packages = [
         "libgenerateDS",
@@ -45,5 +48,15 @@ XML document.""",
         "django/gends_extract_simple_types.py",
         "django/gends_generate_django.py",
         ],
+    entry_points = {
+        "console_scripts": [
+            "generateDS = generateDS:main",
+            "process_includes = process_includes:main",
+            "generateds_gui = generateds_gui:main",
+            "gends_run_gen_django = gends_run_gen_django:main",
+            "gends_extract_simple_types = gends_extract_simple_types:main",
+            "gends_generate_django = gends_generate_django:main",
+        ],
+      }
     )
 
diff --git a/tests/OnePer/compare b/tests/OnePer/compare
new file mode 100755
index 0000000..5e9838b
--- /dev/null
+++ b/tests/OnePer/compare
@@ -0,0 +1,7 @@
+#!/bin/bash
+#
+# Usage:
+#     ./compare N        where N = 0 or 1 or 2 or 3
+#
+#diffless.py oneperType0$1_?One.py
+diff -u oneperType0$1_2One.py oneperType0$1_1One.py | vim -R -
diff --git a/tests/OnePer/copy b/tests/OnePer/copy
new file mode 100755
index 0000000..4ff384f
--- /dev/null
+++ b/tests/OnePer/copy
@@ -0,0 +1,6 @@
+#!/bin/bash
+cp oneperType00_1One.py oneperType00_2One.py
+cp oneperType01_1One.py oneperType01_2One.py
+cp oneperType02_1One.py oneperType02_2One.py
+cp oneperType03_1One.py oneperType03_2One.py
+
diff --git a/tests/recursive_simpletype2_sup.py b/tests/OnePer/oneperType00_2One.py
similarity index 73%
rename from tests/recursive_simpletype2_sup.py
rename to tests/OnePer/oneperType00_2One.py
index a675310..99f1c66 100644
--- a/tests/recursive_simpletype2_sup.py
+++ b/tests/OnePer/oneperType00_2One.py
@@ -4,66 +4,55 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('--one-file-per-xsd', '')
+#   ('--output-directory', 'tests/OnePer')
+#   ('--module-suffix', 'One')
+#   ('--super', 'oneper2_sup')
+#
+# Command line arguments:
+#   tests/oneper00.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f --one-file-per-xsd --output-directory="tests/OnePer" --module-suffix="One" --super="oneper2_sup" tests/oneper00.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +64,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +80,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +149,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +204,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +215,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +238,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +262,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +294,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +364,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +412,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +430,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +515,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +556,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -608,119 +661,94 @@ def _cast(typ, value):
 #
 
 
-class PersonType(GeneratedsSuper):
+class oneperType00_1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('personId', 'xs:integer', 0),
-        MemberSpec_('fname', 'xs:string', 0),
-        MemberSpec_('lname', 'xs:string', 0),
+        MemberSpec_('inner01', 'oneperType01_1', 0),
+        MemberSpec_('inner02', 'oneperType01_2', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, personId=None, fname=None, lname=None):
-        self.personId = personId
-        self.fname = fname
-        self.lname = lname
+    def __init__(self, inner01=None, inner02=None):
+        self.original_tagname_ = None
+        self.inner01 = inner01
+        self.inner02 = inner02
     def factory(*args_, **kwargs_):
-        if PersonType.subclass:
-            return PersonType.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, oneperType00_1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if oneperType00_1.subclass:
+            return oneperType00_1.subclass(*args_, **kwargs_)
         else:
-            return PersonType(*args_, **kwargs_)
+            return oneperType00_1(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_personId(self): return self.personId
-    def set_personId(self, personId): self.personId = personId
-    def get_fname(self): return self.fname
-    def set_fname(self, fname): self.fname = fname
-    def get_lname(self): return self.lname
-    def set_lname(self, lname): self.lname = lname
+    def get_inner01(self): return self.inner01
+    def set_inner01(self, inner01): self.inner01 = inner01
+    def get_inner02(self): return self.inner02
+    def set_inner02(self, inner02): self.inner02 = inner02
     def hasContent_(self):
         if (
-            self.personId is not None or
-            self.fname is not None or
-            self.lname is not None
+            self.inner01 is not None or
+            self.inner02 is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='PersonType', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='oneperType00_1', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='PersonType')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType00_1')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType00_1', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PersonType'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType00_1'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='PersonType', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType00_1', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.personId is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%spersonId>%s</%spersonId>%s' % (namespace_, self.gds_format_integer(self.personId, input_name='personId'), namespace_, eol_))
-        if self.fname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfname>%s</%sfname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fname).encode(ExternalEncoding), input_name='fname'), namespace_, eol_))
-        if self.lname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%slname>%s</%slname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lname).encode(ExternalEncoding), input_name='lname'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='PersonType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.personId is not None:
-            showIndent(outfile, level)
-            outfile.write('personId=%d,\n' % self.personId)
-        if self.fname is not None:
-            showIndent(outfile, level)
-            outfile.write('fname=%s,\n' % quote_python(self.fname).encode(ExternalEncoding))
-        if self.lname is not None:
-            showIndent(outfile, level)
-            outfile.write('lname=%s,\n' % quote_python(self.lname).encode(ExternalEncoding))
+        if self.inner01 is not None:
+            self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print)
+        if self.inner02 is not None:
+            self.inner02.export(outfile, level, namespace_, name_='inner02', pretty_print=pretty_print)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'personId':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'personId')
-            self.personId = ival_
-        elif nodeName_ == 'fname':
-            fname_ = child_.text
-            fname_ = self.gds_validate_string(fname_, node, 'fname')
-            self.fname = fname_
-        elif nodeName_ == 'lname':
-            lname_ = child_.text
-            lname_ = self.gds_validate_string(lname_, node, 'lname')
-            self.lname = lname_
-# end class PersonType
+        if nodeName_ == 'inner01':
+            obj_ = oneperType01_1.factory()
+            obj_.build(child_)
+            self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
+        elif nodeName_ == 'inner02':
+            obj_ = oneperType01_2.factory()
+            obj_.build(child_)
+            self.inner02 = obj_
+            obj_.original_tagname_ = 'inner02'
+# end class oneperType00_1
 
 
 GDSClassesMapping = {
-    'person': PersonType,
+    'root00': oneperType00_1,
 }
 
 
@@ -730,7 +758,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -743,12 +771,13 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
-        rootClass = PersonType
+        rootTag = 'oneperType00_1'
+        rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -763,12 +792,13 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
-        rootClass = PersonType
+        rootTag = 'oneperType00_1'
+        rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -786,13 +816,17 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = PersonType
+        rootTag = 'oneperType00_1'
+        rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -800,26 +834,27 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="person",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
-        rootClass = PersonType
+        rootTag = 'oneperType00_1'
+        rootClass = oneperType00_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
 ##     if not silence:
-##         sys.stdout.write('#from recursive_simpletype2_sup import *\n\n')
-##         sys.stdout.write('import recursive_simpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('#from oneperType00_1One import *\n\n')
+##         sys.stdout.write('import oneperType00_1One as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
@@ -839,5 +874,5 @@ if __name__ == '__main__':
 
 
 __all__ = [
-    "PersonType"
+    "oneperType00_1"
 ]
diff --git a/tests/annotations2_sup.py b/tests/OnePer/oneperType01_2One.py
similarity index 62%
rename from tests/annotations2_sup.py
rename to tests/OnePer/oneperType01_2One.py
index 0c99662..652b9e6 100644
--- a/tests/annotations2_sup.py
+++ b/tests/OnePer/oneperType01_2One.py
@@ -4,66 +4,55 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('--one-file-per-xsd', '')
+#   ('--output-directory', 'tests/OnePer')
+#   ('--module-suffix', 'One')
+#   ('--super', 'oneper2_sup')
+#
+# Command line arguments:
+#   tests/oneper00.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f --one-file-per-xsd --output-directory="tests/OnePer" --module-suffix="One" --super="oneper2_sup" tests/oneper00.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +64,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +80,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +149,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +204,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +215,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +238,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +262,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +294,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +364,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +412,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +430,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +515,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +556,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -608,320 +661,169 @@ def _cast(typ, value):
 #
 
 
-class document1Type(GeneratedsSuper):
-    """This is a element of Type 1. It has some very nice documentation for
-    test purposes. It should make a somewhat uninteresting
-    docstring."""
+class oneperType01_1(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('comments', 'xs:string', 0),
-        MemberSpec_('otherdoc', 'document2Type', 0),
+        MemberSpec_('username', 'xs:string', 0),
+        MemberSpec_('inner01', 'oneperType01_2', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, comments=None, otherdoc=None):
-        self.comments = comments
-        self.otherdoc = otherdoc
+    def __init__(self, username=None, inner01=None):
+        self.original_tagname_ = None
+        self.username = username
+        self.inner01 = inner01
     def factory(*args_, **kwargs_):
-        if document1Type.subclass:
-            return document1Type.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, oneperType01_1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if oneperType01_1.subclass:
+            return oneperType01_1.subclass(*args_, **kwargs_)
         else:
-            return document1Type(*args_, **kwargs_)
+            return oneperType01_1(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_comments(self): return self.comments
-    def set_comments(self, comments): self.comments = comments
-    def get_otherdoc(self): return self.otherdoc
-    def set_otherdoc(self, otherdoc): self.otherdoc = otherdoc
+    def get_username(self): return self.username
+    def set_username(self, username): self.username = username
+    def get_inner01(self): return self.inner01
+    def set_inner01(self, inner01): self.inner01 = inner01
     def hasContent_(self):
         if (
-            self.comments is not None or
-            self.otherdoc is not None
+            self.username is not None or
+            self.inner01 is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='document1Type', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='oneperType01_1', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='document1Type')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType01_1')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType01_1', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='document1Type'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType01_1'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='document1Type', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType01_1', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.comments is not None:
+        if self.username is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_))
-        if self.otherdoc is not None:
-            self.otherdoc.export(outfile, level, namespace_, name_='otherdoc', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='document1Type'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.comments is not None:
-            showIndent(outfile, level)
-            outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding))
-        if self.otherdoc is not None:
-            showIndent(outfile, level)
-            outfile.write('otherdoc=model_.document2Type(\n')
-            self.otherdoc.exportLiteral(outfile, level, name_='otherdoc')
-            showIndent(outfile, level)
-            outfile.write('),\n')
+            outfile.write('<%susername>%s</%susername>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.username), input_name='username')), namespace_, eol_))
+        if self.inner01 is not None:
+            self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'comments':
-            comments_ = child_.text
-            comments_ = self.gds_validate_string(comments_, node, 'comments')
-            self.comments = comments_
-        elif nodeName_ == 'otherdoc':
-            obj_ = document2Type.factory()
+        if nodeName_ == 'username':
+            username_ = child_.text
+            username_ = self.gds_validate_string(username_, node, 'username')
+            self.username = username_
+        elif nodeName_ == 'inner01':
+            obj_ = oneperType01_2.factory()
             obj_.build(child_)
-            self.otherdoc = obj_
-# end class document1Type
+            self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
+# end class oneperType01_1
 
 
-class document2Type(GeneratedsSuper):
-    """This is a element of Type 2. It has some very nice documentation for
-    test purposes. It should make a somewhat uninteresting
-    docstring."""
+class oneperType01_2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('comments', 'xs:string', 0),
-        MemberSpec_('rating', 'xs:integer', 0),
-        MemberSpec_('anotherdoc', 'document3Type', 0),
+        MemberSpec_('userdescription', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, comments=None, rating=None, anotherdoc=None):
-        self.comments = comments
-        self.rating = rating
-        self.anotherdoc = anotherdoc
+    def __init__(self, userdescription=None):
+        self.original_tagname_ = None
+        self.userdescription = userdescription
     def factory(*args_, **kwargs_):
-        if document2Type.subclass:
-            return document2Type.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, oneperType01_2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if oneperType01_2.subclass:
+            return oneperType01_2.subclass(*args_, **kwargs_)
         else:
-            return document2Type(*args_, **kwargs_)
+            return oneperType01_2(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_comments(self): return self.comments
-    def set_comments(self, comments): self.comments = comments
-    def get_rating(self): return self.rating
-    def set_rating(self, rating): self.rating = rating
-    def get_anotherdoc(self): return self.anotherdoc
-    def set_anotherdoc(self, anotherdoc): self.anotherdoc = anotherdoc
+    def get_userdescription(self): return self.userdescription
+    def set_userdescription(self, userdescription): self.userdescription = userdescription
     def hasContent_(self):
         if (
-            self.comments is not None or
-            self.rating is not None or
-            self.anotherdoc is not None
+            self.userdescription is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='document2Type', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='oneperType01_2', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='document2Type')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType01_2')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType01_2', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='document2Type'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType01_2'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='document2Type', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType01_2', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.comments is not None:
+        if self.userdescription is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_))
-        if self.rating is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%srating>%s</%srating>%s' % (namespace_, self.gds_format_integer(self.rating, input_name='rating'), namespace_, eol_))
-        if self.anotherdoc is not None:
-            self.anotherdoc.export(outfile, level, namespace_, name_='anotherdoc', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='document2Type'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.comments is not None:
-            showIndent(outfile, level)
-            outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding))
-        if self.rating is not None:
-            showIndent(outfile, level)
-            outfile.write('rating=%d,\n' % self.rating)
-        if self.anotherdoc is not None:
-            showIndent(outfile, level)
-            outfile.write('anotherdoc=model_.document3Type(\n')
-            self.anotherdoc.exportLiteral(outfile, level, name_='anotherdoc')
-            showIndent(outfile, level)
-            outfile.write('),\n')
+            outfile.write('<%suserdescription>%s</%suserdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.userdescription), input_name='userdescription')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'comments':
-            comments_ = child_.text
-            comments_ = self.gds_validate_string(comments_, node, 'comments')
-            self.comments = comments_
-        elif nodeName_ == 'rating':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'rating')
-            self.rating = ival_
-        elif nodeName_ == 'anotherdoc':
-            obj_ = document3Type.factory()
-            obj_.build(child_)
-            self.anotherdoc = obj_
-# end class document2Type
-
-
-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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, comments=None, rating=None):
-        self.comments = comments
-        self.rating = rating
-    def factory(*args_, **kwargs_):
-        if document3Type.subclass:
-            return document3Type.subclass(*args_, **kwargs_)
-        else:
-            return document3Type(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_comments(self): return self.comments
-    def set_comments(self, comments): self.comments = comments
-    def get_rating(self): return self.rating
-    def set_rating(self, rating): self.rating = rating
-    def hasContent_(self):
-        if (
-            self.comments is not None or
-            self.rating is not None
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='document3Type', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='document3Type')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='document3Type'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='document3Type', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.comments is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_))
-        if self.rating is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%srating>%s</%srating>%s' % (namespace_, self.gds_format_integer(self.rating, input_name='rating'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='document3Type'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.comments is not None:
-            showIndent(outfile, level)
-            outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding))
-        if self.rating is not None:
-            showIndent(outfile, level)
-            outfile.write('rating=%d,\n' % self.rating)
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'comments':
-            comments_ = child_.text
-            comments_ = self.gds_validate_string(comments_, node, 'comments')
-            self.comments = comments_
-        elif nodeName_ == 'rating':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'rating')
-            self.rating = ival_
-# end class document3Type
+        if nodeName_ == 'userdescription':
+            userdescription_ = child_.text
+            userdescription_ = self.gds_validate_string(userdescription_, node, 'userdescription')
+            self.userdescription = userdescription_
+# end class oneperType01_2
 
 
 GDSClassesMapping = {
-    'document1': document1Type,
-    'otherdoc': document2Type,
-    'anotherdoc': document3Type,
+    'inner01': oneperType01_2,
+    'root01': oneperType01_1,
 }
 
 
@@ -931,7 +833,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -944,12 +846,13 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
-        rootClass = document1Type
+        rootTag = 'oneperType01_1'
+        rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -964,12 +867,13 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
-        rootClass = document1Type
+        rootTag = 'oneperType01_1'
+        rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -987,13 +891,17 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = document1Type
+        rootTag = 'oneperType01_1'
+        rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -1001,26 +909,27 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="document1",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
-        rootClass = document1Type
+        rootTag = 'oneperType01_1'
+        rootClass = oneperType01_1
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
 ##     if not silence:
-##         sys.stdout.write('#from annotations2_sup import *\n\n')
-##         sys.stdout.write('import annotations2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('#from oneperType01_1One import *\n\n')
+##         sys.stdout.write('import oneperType01_1One as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
@@ -1040,7 +949,6 @@ if __name__ == '__main__':
 
 
 __all__ = [
-    "document1Type",
-    "document2Type",
-    "document3Type"
+    "oneperType01_1",
+    "oneperType01_2"
 ]
diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py
new file mode 100644
index 0000000..06578e2
--- /dev/null
+++ b/tests/OnePer/oneperType02_2One.py
@@ -0,0 +1,954 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('--one-file-per-xsd', '')
+#   ('--output-directory', 'tests/OnePer')
+#   ('--module-suffix', 'One')
+#   ('--super', 'oneper2_sup')
+#
+# Command line arguments:
+#   tests/oneper00.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f --one-file-per-xsd --output-directory="tests/OnePer" --module-suffix="One" --super="oneper2_sup" tests/oneper00.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class oneperType02_1(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('clientname', 'xs:string', 0),
+        MemberSpec_('inner01', 'oneperType02_2', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, clientname=None, inner01=None):
+        self.original_tagname_ = None
+        self.clientname = clientname
+        self.inner01 = inner01
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, oneperType02_1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if oneperType02_1.subclass:
+            return oneperType02_1.subclass(*args_, **kwargs_)
+        else:
+            return oneperType02_1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_clientname(self): return self.clientname
+    def set_clientname(self, clientname): self.clientname = clientname
+    def get_inner01(self): return self.inner01
+    def set_inner01(self, inner01): self.inner01 = inner01
+    def hasContent_(self):
+        if (
+            self.clientname is not None or
+            self.inner01 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='oneperType02_1', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType02_1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType02_1', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType02_1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType02_1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.clientname is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sclientname>%s</%sclientname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.clientname), input_name='clientname')), namespace_, eol_))
+        if self.inner01 is not None:
+            self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'clientname':
+            clientname_ = child_.text
+            clientname_ = self.gds_validate_string(clientname_, node, 'clientname')
+            self.clientname = clientname_
+        elif nodeName_ == 'inner01':
+            obj_ = oneperType02_2.factory()
+            obj_.build(child_)
+            self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
+# end class oneperType02_1
+
+
+class oneperType02_2(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('clientdescription', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, clientdescription=None):
+        self.original_tagname_ = None
+        self.clientdescription = clientdescription
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, oneperType02_2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if oneperType02_2.subclass:
+            return oneperType02_2.subclass(*args_, **kwargs_)
+        else:
+            return oneperType02_2(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_clientdescription(self): return self.clientdescription
+    def set_clientdescription(self, clientdescription): self.clientdescription = clientdescription
+    def hasContent_(self):
+        if (
+            self.clientdescription is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='oneperType02_2', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType02_2')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType02_2', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType02_2'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType02_2', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.clientdescription is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sclientdescription>%s</%sclientdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.clientdescription), input_name='clientdescription')), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'clientdescription':
+            clientdescription_ = child_.text
+            clientdescription_ = self.gds_validate_string(clientdescription_, node, 'clientdescription')
+            self.clientdescription = clientdescription_
+# end class oneperType02_2
+
+
+GDSClassesMapping = {
+    'inner01': oneperType02_2,
+    'root02': oneperType02_1,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'oneperType02_1'
+        rootClass = oneperType02_1
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'oneperType02_1'
+        rootClass = oneperType02_1
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'oneperType02_1'
+        rootClass = oneperType02_1
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'oneperType02_1'
+        rootClass = oneperType02_1
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from oneperType02_1One import *\n\n')
+##         sys.stdout.write('import oneperType02_1One as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "oneperType02_1",
+    "oneperType02_2"
+]
diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py
new file mode 100644
index 0000000..6bea073
--- /dev/null
+++ b/tests/OnePer/oneperType03_2One.py
@@ -0,0 +1,953 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('--one-file-per-xsd', '')
+#   ('--output-directory', 'tests/OnePer')
+#   ('--module-suffix', 'One')
+#   ('--super', 'oneper2_sup')
+#
+# Command line arguments:
+#   tests/oneper00.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f --one-file-per-xsd --output-directory="tests/OnePer" --module-suffix="One" --super="oneper2_sup" tests/oneper00.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class oneperType03_1(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('helpername', 'xs:string', 0),
+        MemberSpec_('inner01', 'oneperType02_2', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, helpername=None, inner01=None):
+        self.original_tagname_ = None
+        self.helpername = helpername
+        self.inner01 = inner01
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, oneperType03_1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if oneperType03_1.subclass:
+            return oneperType03_1.subclass(*args_, **kwargs_)
+        else:
+            return oneperType03_1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_helpername(self): return self.helpername
+    def set_helpername(self, helpername): self.helpername = helpername
+    def get_inner01(self): return self.inner01
+    def set_inner01(self, inner01): self.inner01 = inner01
+    def hasContent_(self):
+        if (
+            self.helpername is not None or
+            self.inner01 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='oneperType03_1', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType03_1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType03_1', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType03_1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType03_1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.helpername is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%shelpername>%s</%shelpername>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.helpername), input_name='helpername')), namespace_, eol_))
+        if self.inner01 is not None:
+            self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'helpername':
+            helpername_ = child_.text
+            helpername_ = self.gds_validate_string(helpername_, node, 'helpername')
+            self.helpername = helpername_
+        elif nodeName_ == 'inner01':
+            obj_ = oneperType02_2.factory()
+            obj_.build(child_)
+            self.inner01 = obj_
+            obj_.original_tagname_ = 'inner01'
+# end class oneperType03_1
+
+
+class oneperType03_2(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('helperdescription', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, helperdescription=None):
+        self.original_tagname_ = None
+        self.helperdescription = helperdescription
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, oneperType03_2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if oneperType03_2.subclass:
+            return oneperType03_2.subclass(*args_, **kwargs_)
+        else:
+            return oneperType03_2(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_helperdescription(self): return self.helperdescription
+    def set_helperdescription(self, helperdescription): self.helperdescription = helperdescription
+    def hasContent_(self):
+        if (
+            self.helperdescription is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='oneperType03_2', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType03_2')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType03_2', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType03_2'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='oneperType03_2', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.helperdescription is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%shelperdescription>%s</%shelperdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.helperdescription), input_name='helperdescription')), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'helperdescription':
+            helperdescription_ = child_.text
+            helperdescription_ = self.gds_validate_string(helperdescription_, node, 'helperdescription')
+            self.helperdescription = helperdescription_
+# end class oneperType03_2
+
+
+GDSClassesMapping = {
+    'root03': oneperType03_1,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'oneperType03_1'
+        rootClass = oneperType03_1
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'oneperType03_1'
+        rootClass = oneperType03_1
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'oneperType03_1'
+        rootClass = oneperType03_1
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'oneperType03_1'
+        rootClass = oneperType03_1
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from oneperType03_1One import *\n\n')
+##         sys.stdout.write('import oneperType03_1One as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "oneperType03_1",
+    "oneperType03_2"
+]
diff --git a/tests/abstract_type1_sub.py b/tests/abstract_type1_sub.py
index c8c5af4..b7e815b 100644
--- a/tests/abstract_type1_sub.py
+++ b/tests/abstract_type1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/abstract_type2_sup.py')
+#   ('-s', 'tests/abstract_type2_sub.py')
+#   ('--super', 'abstract_type2_sup')
+#
+# Command line arguments:
+#   tests/abstract_type.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/abstract_type2_sup.py" -s "tests/abstract_type2_sub.py" --super="abstract_type2_sup" tests/abstract_type.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import abstract_type2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -112,11 +85,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -132,11 +106,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -156,11 +131,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -175,11 +151,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'carrierType'
         rootClass = supermod.carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -188,8 +165,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from abstract_type2_sup import *\n\n')
 ##         sys.stdout.write('import abstract_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.carrier(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="carrier")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -200,7 +177,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py
index 41f17dd..08422d5 100644
--- a/tests/abstract_type1_sup.py
+++ b/tests/abstract_type1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/abstract_type2_sup.py')
+#   ('-s', 'tests/abstract_type2_sub.py')
+#   ('--super', 'abstract_type2_sup')
+#
+# Command line arguments:
+#   tests/abstract_type.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/abstract_type2_sup.py" -s "tests/abstract_type2_sub.py" --super="abstract_type2_sup" tests/abstract_type.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -615,11 +667,17 @@ class carrierType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fleet=None):
+        self.original_tagname_ = None
         if fleet is None:
             self.fleet = []
         else:
             self.fleet = fleet
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, carrierType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if carrierType.subclass:
             return carrierType.subclass(*args_, **kwargs_)
         else:
@@ -628,7 +686,8 @@ class carrierType(GeneratedsSuper):
     def get_fleet(self): return self.fleet
     def set_fleet(self, fleet): self.fleet = fleet
     def add_fleet(self, value): self.fleet.append(value)
-    def insert_fleet(self, index, value): self.fleet[index] = value
+    def insert_fleet_at(self, index, value): self.fleet.insert(index, value)
+    def replace_fleet_at(self, index, value): self.fleet[index] = value
     def hasContent_(self):
         if (
             self.fleet
@@ -636,18 +695,20 @@ class carrierType(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='target:', name_='carrierType', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='target:', name_='carrierType', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='carrierType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='target:', name_='carrierType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -661,33 +722,13 @@ class carrierType(GeneratedsSuper):
             eol_ = ''
         for fleet_ in self.fleet:
             fleet_.export(outfile, level, namespace_, name_='fleet', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='carrierType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('fleet=[\n')
-        level += 1
-        for fleet_ in self.fleet:
-            showIndent(outfile, level)
-            outfile.write('model_.Vehicle(\n')
-            fleet_.exportLiteral(outfile, level, name_='Vehicle')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -709,6 +750,7 @@ class carrierType(GeneratedsSuper):
                 raise NotImplementedError(
                     'Class not implemented for <fleet> element')
             self.fleet.append(obj_)
+            obj_.original_tagname_ = 'fleet'
 # end class carrierType
 
 
@@ -718,8 +760,14 @@ class Vehicle(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, extensiontype_=None):
+        self.original_tagname_ = None
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, Vehicle)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if Vehicle.subclass:
             return Vehicle.subclass(*args_, **kwargs_)
         else:
@@ -734,18 +782,20 @@ class Vehicle(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='target:', name_='Vehicle', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='target:', name_='Vehicle', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='Vehicle')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='target:', name_='Vehicle', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
@@ -757,22 +807,13 @@ class Vehicle(GeneratedsSuper):
         pass
     def exportChildren(self, outfile, level, namespace_='target:', name_='Vehicle', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='Vehicle'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
@@ -789,9 +830,14 @@ class Car(Vehicle):
     subclass = None
     superclass = Vehicle
     def __init__(self):
+        self.original_tagname_ = None
         super(Car, self).__init__()
-        pass
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, Car)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if Car.subclass:
             return Car.subclass(*args_, **kwargs_)
         else:
@@ -804,18 +850,20 @@ class Car(Vehicle):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='target:', name_='Car', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='target:', name_='Car', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='Car')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='target:', name_='Car', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
@@ -824,23 +872,13 @@ class Car(Vehicle):
     def exportChildren(self, outfile, level, namespace_='target:', name_='Car', fromsubclass_=False, pretty_print=True):
         super(Car, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         pass
-    def exportLiteral(self, outfile, level, name_='Car'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(Car, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(Car, self).exportLiteralChildren(outfile, level, name_)
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(Car, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -855,9 +893,14 @@ class Plane(Vehicle):
     subclass = None
     superclass = Vehicle
     def __init__(self):
+        self.original_tagname_ = None
         super(Plane, self).__init__()
-        pass
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, Plane)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if Plane.subclass:
             return Plane.subclass(*args_, **kwargs_)
         else:
@@ -870,18 +913,20 @@ class Plane(Vehicle):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='target:', name_='Plane', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='target:', name_='Plane', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='Plane')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='target:', name_='Plane', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
@@ -890,23 +935,13 @@ class Plane(Vehicle):
     def exportChildren(self, outfile, level, namespace_='target:', name_='Plane', fromsubclass_=False, pretty_print=True):
         super(Plane, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         pass
-    def exportLiteral(self, outfile, level, name_='Plane'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(Plane, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(Plane, self).exportLiteralChildren(outfile, level, name_)
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(Plane, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -916,8 +951,8 @@ class Plane(Vehicle):
 
 
 GDSClassesMapping = {
-    'fleet': Vehicle,
     'carrier': carrierType,
+    'fleet': Vehicle,
 }
 
 
@@ -927,7 +962,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -940,11 +975,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -960,11 +996,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -983,12 +1020,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -997,17 +1038,18 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="carrier",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='xmlns:target="http://cars.example.com/schema"')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
+        rootTag = 'carrierType'
         rootClass = carrierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1016,7 +1058,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from abstract_type2_sup import *\n\n')
 ##         sys.stdout.write('import abstract_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/abstract_type2_sub.py b/tests/abstract_type2_sub.py
deleted file mode 100644
index c8c5af4..0000000
--- a/tests/abstract_type2_sub.py
+++ /dev/null
@@ -1,217 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Generated  by generateDS.py.
-#
-
-import sys
-
-import abstract_type2_sup as supermod
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-
-#
-# Data representation classes
-#
-
-
-class carrierTypeSub(supermod.carrierType):
-    def __init__(self, fleet=None):
-        super(carrierTypeSub, self).__init__(fleet, )
-supermod.carrierType.subclass = carrierTypeSub
-# end class carrierTypeSub
-
-
-class VehicleSub(supermod.Vehicle):
-    def __init__(self, extensiontype_=None):
-        super(VehicleSub, self).__init__(extensiontype_, )
-supermod.Vehicle.subclass = VehicleSub
-# end class VehicleSub
-
-
-class CarSub(supermod.Car):
-    def __init__(self):
-        super(CarSub, self).__init__()
-supermod.Car.subclass = CarSub
-# end class CarSub
-
-
-class PlaneSub(supermod.Plane):
-    def __init__(self):
-        super(PlaneSub, self).__init__()
-supermod.Plane.subclass = PlaneSub
-# end class PlaneSub
-
-
-def get_root_tag(node):
-    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = None
-    rootClass = supermod.GDSClassesMapping.get(tag)
-    if rootClass is None and hasattr(supermod, tag):
-        rootClass = getattr(supermod, tag)
-    return tag, rootClass
-
-
-def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'carrier'
-        rootClass = supermod.carrierType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='xmlns:target="http://cars.example.com/schema"',
-##             pretty_print=True)
-    return rootObj
-
-
-def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'carrier'
-        rootClass = supermod.carrierType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    mapping = {}
-    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
-    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
-##     if not silence:
-##         content = etree_.tostring(
-##             rootElement, pretty_print=True,
-##             xml_declaration=True, encoding="utf-8")
-##         sys.stdout.write(content)
-##         sys.stdout.write('\n')
-    return rootObj, rootElement, mapping, reverse_mapping
-
-
-def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'carrier'
-        rootClass = supermod.carrierType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='xmlns:target="http://cars.example.com/schema"')
-    return rootObj
-
-
-def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
-    if rootClass is None:
-        rootClass = supermod.carrierType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('#from abstract_type2_sup import *\n\n')
-##         sys.stdout.write('import abstract_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.carrier(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="carrier")
-##         sys.stdout.write(')\n')
-    return rootObj
-
-
-USAGE_TEXT = """
-Usage: python ???.py <infilename>
-"""
-
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) != 1:
-        usage()
-    infilename = args[0]
-    parse(infilename)
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
diff --git a/tests/address.xsd b/tests/address.xsd
new file mode 100644
index 0000000..1793e80
--- /dev/null
+++ b/tests/address.xsd
@@ -0,0 +1,56 @@
+<schema targetNamespace="http://www.example.com/IPO"
+        xmlns="http://www.w3.org/2001/XMLSchema"
+        xmlns:ipo="http://www.example.com/IPO">
+
+  <annotation>
+    <documentation xml:lang="en">
+      Addresses for International Purchase order schema
+      Copyright 2000 Example.com. All rights reserved.
+    </documentation>
+  </annotation>
+
+  <complexType name="Address">
+    <sequence>
+      <element name="name"   type="string"/>
+      <element name="street" type="string"/>
+      <element name="city"   type="string"/>
+    </sequence>
+  </complexType>
+
+  <complexType name="USAddress">
+    <complexContent>
+      <extension base="ipo:Address">
+        <sequence>
+          <element name="state" type="ipo:USState"/>
+          <element name="zip"   type="positiveInteger"/>
+        </sequence>
+      </extension>
+    </complexContent>
+  </complexType>
+
+  <complexType name="UKAddress">
+    <complexContent>
+      <extension base="ipo:Address">
+        <sequence>
+          <element name="postcode" type="ipo:UKPostcode"/>
+        </sequence>
+        <attribute name="exportCode" type="positiveInteger" fixed="1"/>
+      </extension>
+    </complexContent>
+  </complexType>
+
+  <!-- other Address derivations for more countries -->
+
+  <simpleType name="USState">
+    <restriction base="string">
+      <enumeration value="AK"/>
+      <enumeration value="AL"/>
+      <enumeration value="AR"/>
+      <enumeration value="PA"/>
+      <!-- and so on ... -->
+    </restriction>
+  </simpleType>
+
+  <!-- simple type definition for UKPostcode -->
+
+</schema>
diff --git a/tests/annotations1_sub.py b/tests/annotations1_sub.py
index 63d361b..ee65ce6 100644
--- a/tests/annotations1_sub.py
+++ b/tests/annotations1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/annotations2_sup.py')
+#   ('-s', 'tests/annotations2_sub.py')
+#   ('--super', 'annotations2_sup')
+#
+# Command line arguments:
+#   tests/annotations.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/annotations2_sup.py" -s "tests/annotations2_sub.py" --super="annotations2_sup" tests/annotations.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import annotations2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -105,11 +78,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -125,11 +99,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -149,11 +124,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -168,11 +144,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'document1Type'
         rootClass = supermod.document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -181,8 +158,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from annotations2_sup import *\n\n')
 ##         sys.stdout.write('import annotations2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.document1(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="document1")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -193,7 +170,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py
index 0c99662..87aa8d7 100644
--- a/tests/annotations1_sup.py
+++ b/tests/annotations1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/annotations2_sup.py')
+#   ('-s', 'tests/annotations2_sub.py')
+#   ('--super', 'annotations2_sup')
+#
+# Command line arguments:
+#   tests/annotations.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/annotations2_sup.py" -s "tests/annotations2_sub.py" --super="annotations2_sup" tests/annotations.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -619,9 +671,15 @@ class document1Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, otherdoc=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.otherdoc = otherdoc
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, document1Type)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if document1Type.subclass:
             return document1Type.subclass(*args_, **kwargs_)
         else:
@@ -644,13 +702,15 @@ class document1Type(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='document1Type')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='document1Type', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -664,33 +724,16 @@ class document1Type(GeneratedsSuper):
             eol_ = ''
         if self.comments is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_))
+            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comments), input_name='comments')), namespace_, eol_))
         if self.otherdoc is not None:
             self.otherdoc.export(outfile, level, namespace_, name_='otherdoc', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='document1Type'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.comments is not None:
-            showIndent(outfile, level)
-            outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding))
-        if self.otherdoc is not None:
-            showIndent(outfile, level)
-            outfile.write('otherdoc=model_.document2Type(\n')
-            self.otherdoc.exportLiteral(outfile, level, name_='otherdoc')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -702,6 +745,7 @@ class document1Type(GeneratedsSuper):
             obj_ = document2Type.factory()
             obj_.build(child_)
             self.otherdoc = obj_
+            obj_.original_tagname_ = 'otherdoc'
 # end class document1Type
 
 
@@ -717,10 +761,16 @@ class document2Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, rating=None, anotherdoc=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.rating = rating
         self.anotherdoc = anotherdoc
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, document2Type)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if document2Type.subclass:
             return document2Type.subclass(*args_, **kwargs_)
         else:
@@ -746,13 +796,15 @@ class document2Type(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='document2Type')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='document2Type', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -766,39 +818,19 @@ class document2Type(GeneratedsSuper):
             eol_ = ''
         if self.comments is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_))
+            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comments), input_name='comments')), namespace_, eol_))
         if self.rating is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%srating>%s</%srating>%s' % (namespace_, self.gds_format_integer(self.rating, input_name='rating'), namespace_, eol_))
         if self.anotherdoc is not None:
             self.anotherdoc.export(outfile, level, namespace_, name_='anotherdoc', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='document2Type'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.comments is not None:
-            showIndent(outfile, level)
-            outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding))
-        if self.rating is not None:
-            showIndent(outfile, level)
-            outfile.write('rating=%d,\n' % self.rating)
-        if self.anotherdoc is not None:
-            showIndent(outfile, level)
-            outfile.write('anotherdoc=model_.document3Type(\n')
-            self.anotherdoc.exportLiteral(outfile, level, name_='anotherdoc')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -810,7 +842,7 @@ class document2Type(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'rating')
             self.rating = ival_
@@ -818,6 +850,7 @@ class document2Type(GeneratedsSuper):
             obj_ = document3Type.factory()
             obj_.build(child_)
             self.anotherdoc = obj_
+            obj_.original_tagname_ = 'anotherdoc'
 # end class document2Type
 
 
@@ -830,9 +863,15 @@ class document3Type(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, rating=None):
+        self.original_tagname_ = None
         self.comments = comments
         self.rating = rating
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, document3Type)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if document3Type.subclass:
             return document3Type.subclass(*args_, **kwargs_)
         else:
@@ -855,13 +894,15 @@ class document3Type(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='document3Type')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='document3Type', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -875,31 +916,17 @@ class document3Type(GeneratedsSuper):
             eol_ = ''
         if self.comments is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_))
+            outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comments), input_name='comments')), namespace_, eol_))
         if self.rating is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%srating>%s</%srating>%s' % (namespace_, self.gds_format_integer(self.rating, input_name='rating'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='document3Type'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.comments is not None:
-            showIndent(outfile, level)
-            outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding))
-        if self.rating is not None:
-            showIndent(outfile, level)
-            outfile.write('rating=%d,\n' % self.rating)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -911,7 +938,7 @@ class document3Type(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'rating')
             self.rating = ival_
@@ -919,9 +946,9 @@ class document3Type(GeneratedsSuper):
 
 
 GDSClassesMapping = {
+    'anotherdoc': document3Type,
     'document1': document1Type,
     'otherdoc': document2Type,
-    'anotherdoc': document3Type,
 }
 
 
@@ -931,7 +958,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -944,11 +971,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -964,11 +992,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -987,12 +1016,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1001,17 +1034,18 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="document1",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'document1'
+        rootTag = 'document1Type'
         rootClass = document1Type
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1020,7 +1054,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from annotations2_sup import *\n\n')
 ##         sys.stdout.write('import annotations2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/annotations2_sub.py b/tests/annotations2_sub.py
deleted file mode 100644
index 63d361b..0000000
--- a/tests/annotations2_sub.py
+++ /dev/null
@@ -1,210 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Generated  by generateDS.py.
-#
-
-import sys
-
-import annotations2_sup as supermod
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-
-#
-# Data representation classes
-#
-
-
-class document1TypeSub(supermod.document1Type):
-    def __init__(self, comments=None, otherdoc=None):
-        super(document1TypeSub, self).__init__(comments, otherdoc, )
-supermod.document1Type.subclass = document1TypeSub
-# end class document1TypeSub
-
-
-class document2TypeSub(supermod.document2Type):
-    def __init__(self, comments=None, rating=None, anotherdoc=None):
-        super(document2TypeSub, self).__init__(comments, rating, anotherdoc, )
-supermod.document2Type.subclass = document2TypeSub
-# end class document2TypeSub
-
-
-class document3TypeSub(supermod.document3Type):
-    def __init__(self, comments=None, rating=None):
-        super(document3TypeSub, self).__init__(comments, rating, )
-supermod.document3Type.subclass = document3TypeSub
-# end class document3TypeSub
-
-
-def get_root_tag(node):
-    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = None
-    rootClass = supermod.GDSClassesMapping.get(tag)
-    if rootClass is None and hasattr(supermod, tag):
-        rootClass = getattr(supermod, tag)
-    return tag, rootClass
-
-
-def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'document1'
-        rootClass = supermod.document1Type
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='',
-##             pretty_print=True)
-    return rootObj
-
-
-def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'document1'
-        rootClass = supermod.document1Type
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    mapping = {}
-    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
-    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
-##     if not silence:
-##         content = etree_.tostring(
-##             rootElement, pretty_print=True,
-##             xml_declaration=True, encoding="utf-8")
-##         sys.stdout.write(content)
-##         sys.stdout.write('\n')
-    return rootObj, rootElement, mapping, reverse_mapping
-
-
-def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'document1'
-        rootClass = supermod.document1Type
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='')
-    return rootObj
-
-
-def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
-    if rootClass is None:
-        rootClass = supermod.document1Type
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('#from annotations2_sup import *\n\n')
-##         sys.stdout.write('import annotations2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.document1(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="document1")
-##         sys.stdout.write(')\n')
-    return rootObj
-
-
-USAGE_TEXT = """
-Usage: python ???.py <infilename>
-"""
-
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) != 1:
-        usage()
-    infilename = args[0]
-    parse(infilename)
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
diff --git a/tests/anonymous_type.xsd b/tests/anonymous_type.xsd
index 271664f..a9bb07f 100644
--- a/tests/anonymous_type.xsd
+++ b/tests/anonymous_type.xsd
@@ -14,6 +14,8 @@
               <xs:element name="FooType">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
+                      <xs:minLength value="10"/>
+                      <xs:maxLength value="19"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
@@ -26,6 +28,8 @@
               <xs:element name="BarType">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
+                      <xs:minLength value="20"/>
+                      <xs:maxLength value="29"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
@@ -38,6 +42,8 @@
               <xs:element name="BazType">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
+                      <xs:minLength value="30"/>
+                      <xs:maxLength value="39"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
diff --git a/tests/anonymous_type1_sub.py b/tests/anonymous_type1_sub.py
index f608777..e6d3696 100644
--- a/tests/anonymous_type1_sub.py
+++ b/tests/anonymous_type1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/anonymous_type2_sup.py')
+#   ('-s', 'tests/anonymous_type2_sub.py')
+#   ('--super', 'anonymous_type2_sup')
+#
+# Command line arguments:
+#   tests/anonymous_type.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anonymous_type2_sup.py" -s "tests/anonymous_type2_sub.py" --super="anonymous_type2_sup" tests/anonymous_type.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import anonymous_type2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -112,7 +85,8 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -132,7 +106,8 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -156,7 +131,8 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -175,11 +151,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'FooList'
         rootClass = supermod.FooList
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -188,8 +165,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anonymous_type2_sup import *\n\n')
 ##         sys.stdout.write('import anonymous_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.FooList(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="FooList")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -200,7 +177,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py
index 692916a..e373bf8 100644
--- a/tests/anonymous_type1_sup.py
+++ b/tests/anonymous_type1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/anonymous_type2_sup.py')
+#   ('-s', 'tests/anonymous_type2_sub.py')
+#   ('--super', 'anonymous_type2_sup')
+#
+# Command line arguments:
+#   tests/anonymous_type.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anonymous_type2_sup.py" -s "tests/anonymous_type2_sub.py" --super="anonymous_type2_sup" tests/anonymous_type.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -617,10 +669,16 @@ class FooList(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, Foo=None, Bar=None, Baz=None):
+        self.original_tagname_ = None
         self.Foo = Foo
         self.Bar = Bar
         self.Baz = Baz
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, FooList)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if FooList.subclass:
             return FooList.subclass(*args_, **kwargs_)
         else:
@@ -646,13 +704,15 @@ class FooList(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='FooList')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='FooList', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -670,39 +730,13 @@ class FooList(GeneratedsSuper):
             self.Bar.export(outfile, level, namespace_, name_='Bar', pretty_print=pretty_print)
         if self.Baz is not None:
             self.Baz.export(outfile, level, namespace_, name_='Baz', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='FooList'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.Foo is not None:
-            showIndent(outfile, level)
-            outfile.write('Foo=model_.FooType1(\n')
-            self.Foo.exportLiteral(outfile, level, name_='Foo')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.Bar is not None:
-            showIndent(outfile, level)
-            outfile.write('Bar=model_.BarType2(\n')
-            self.Bar.exportLiteral(outfile, level, name_='Bar')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.Baz is not None:
-            showIndent(outfile, level)
-            outfile.write('Baz=model_.BazType3(\n')
-            self.Baz.exportLiteral(outfile, level, name_='Baz')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -710,14 +744,17 @@ class FooList(GeneratedsSuper):
             obj_ = FooType1.factory()
             obj_.build(child_)
             self.Foo = obj_
+            obj_.original_tagname_ = 'Foo'
         elif nodeName_ == 'Bar':
             obj_ = BarType2.factory()
             obj_.build(child_)
             self.Bar = obj_
+            obj_.original_tagname_ = 'Bar'
         elif nodeName_ == 'Baz':
             obj_ = BazType3.factory()
             obj_.build(child_)
             self.Baz = obj_
+            obj_.original_tagname_ = 'Baz'
 # end class FooList
 
 
@@ -728,8 +765,15 @@ class FooType1(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, FooType=None):
+        self.original_tagname_ = None
         self.FooType = FooType
+        self.validate_FooTypeType(self.FooType)
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, FooType1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if FooType1.subclass:
             return FooType1.subclass(*args_, **kwargs_)
         else:
@@ -739,7 +783,11 @@ class FooType1(GeneratedsSuper):
     def set_FooType(self, FooType): self.FooType = FooType
     def validate_FooTypeType(self, value):
         # Validate type FooTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+            if len(value) > 19:
+                warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
+            if len(value) < 10:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.FooType is not None
@@ -752,13 +800,15 @@ class FooType1(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='FooType1')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='FooType1', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -772,25 +822,14 @@ class FooType1(GeneratedsSuper):
             eol_ = ''
         if self.FooType is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sFooType>%s</%sFooType>%s' % (namespace_, self.gds_format_string(quote_xml(self.FooType).encode(ExternalEncoding), input_name='FooType'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='FooType1'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.FooType is not None:
-            showIndent(outfile, level)
-            outfile.write('FooType=%s,\n' % quote_python(self.FooType).encode(ExternalEncoding))
+            outfile.write('<%sFooType>%s</%sFooType>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.FooType), input_name='FooType')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -798,7 +837,8 @@ class FooType1(GeneratedsSuper):
             FooType_ = child_.text
             FooType_ = self.gds_validate_string(FooType_, node, 'FooType')
             self.FooType = FooType_
-            self.validate_FooTypeType(self.FooType)    # validate type FooTypeType
+            # validate type FooTypeType
+            self.validate_FooTypeType(self.FooType)
 # end class FooType1
 
 
@@ -809,8 +849,15 @@ class BarType2(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BarType=None):
+        self.original_tagname_ = None
         self.BarType = BarType
+        self.validate_BarTypeType(self.BarType)
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, BarType2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if BarType2.subclass:
             return BarType2.subclass(*args_, **kwargs_)
         else:
@@ -820,7 +867,11 @@ class BarType2(GeneratedsSuper):
     def set_BarType(self, BarType): self.BarType = BarType
     def validate_BarTypeType(self, value):
         # Validate type BarTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+            if len(value) > 29:
+                warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} )
+            if len(value) < 20:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.BarType is not None
@@ -833,13 +884,15 @@ class BarType2(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BarType2')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='BarType2', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -853,25 +906,14 @@ class BarType2(GeneratedsSuper):
             eol_ = ''
         if self.BarType is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sBarType>%s</%sBarType>%s' % (namespace_, self.gds_format_string(quote_xml(self.BarType).encode(ExternalEncoding), input_name='BarType'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='BarType2'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.BarType is not None:
-            showIndent(outfile, level)
-            outfile.write('BarType=%s,\n' % quote_python(self.BarType).encode(ExternalEncoding))
+            outfile.write('<%sBarType>%s</%sBarType>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.BarType), input_name='BarType')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -879,7 +921,8 @@ class BarType2(GeneratedsSuper):
             BarType_ = child_.text
             BarType_ = self.gds_validate_string(BarType_, node, 'BarType')
             self.BarType = BarType_
-            self.validate_BarTypeType(self.BarType)    # validate type BarTypeType
+            # validate type BarTypeType
+            self.validate_BarTypeType(self.BarType)
 # end class BarType2
 
 
@@ -890,8 +933,15 @@ class BazType3(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BazType=None):
+        self.original_tagname_ = None
         self.BazType = BazType
+        self.validate_BazTypeType(self.BazType)
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, BazType3)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if BazType3.subclass:
             return BazType3.subclass(*args_, **kwargs_)
         else:
@@ -901,7 +951,11 @@ class BazType3(GeneratedsSuper):
     def set_BazType(self, BazType): self.BazType = BazType
     def validate_BazTypeType(self, value):
         # Validate type BazTypeType, a restriction on xs:string.
-        pass
+        if value is not None and Validate_simpletypes_:
+            if len(value) > 39:
+                warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} )
+            if len(value) < 30:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.BazType is not None
@@ -914,13 +968,15 @@ class BazType3(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BazType3')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='BazType3', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -934,25 +990,14 @@ class BazType3(GeneratedsSuper):
             eol_ = ''
         if self.BazType is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sBazType>%s</%sBazType>%s' % (namespace_, self.gds_format_string(quote_xml(self.BazType).encode(ExternalEncoding), input_name='BazType'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='BazType3'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.BazType is not None:
-            showIndent(outfile, level)
-            outfile.write('BazType=%s,\n' % quote_python(self.BazType).encode(ExternalEncoding))
+            outfile.write('<%sBazType>%s</%sBazType>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.BazType), input_name='BazType')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -960,14 +1005,15 @@ class BazType3(GeneratedsSuper):
             BazType_ = child_.text
             BazType_ = self.gds_validate_string(BazType_, node, 'BazType')
             self.BazType = BazType_
-            self.validate_BazTypeType(self.BazType)    # validate type BazTypeType
+            # validate type BazTypeType
+            self.validate_BazTypeType(self.BazType)
 # end class BazType3
 
 
 GDSClassesMapping = {
+    'Bar': BarType2,
     'Baz': BazType3,
     'Foo': FooType1,
-    'Bar': BarType2,
 }
 
 
@@ -977,7 +1023,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -990,7 +1036,8 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -1010,7 +1057,8 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -1033,12 +1081,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'FooList'
         rootClass = FooList
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1047,13 +1099,14 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="FooList",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -1066,7 +1119,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anonymous_type2_sup import *\n\n')
 ##         sys.stdout.write('import anonymous_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anysimpletype1_sub.py b/tests/anysimpletype1_sub.py
index e79e857..a8d0cc3 100644
--- a/tests/anysimpletype1_sub.py
+++ b/tests/anysimpletype1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/anysimpletype2_sup.py')
+#   ('-s', 'tests/anysimpletype2_sub.py')
+#   ('--super', 'anysimpletype2_sup')
+#
+# Command line arguments:
+#   tests/anysimpletype.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anysimpletype2_sup.py" -s "tests/anysimpletype2_sub.py" --super="anysimpletype2_sup" tests/anysimpletype.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import anysimpletype2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -98,7 +71,8 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -118,7 +92,8 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -142,7 +117,8 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -161,11 +137,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'test1element'
         rootClass = supermod.test1element
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +151,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anysimpletype2_sup import *\n\n')
 ##         sys.stdout.write('import anysimpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.test1element(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="test1element")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -186,7 +163,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py
index ff144ef..28a1450 100644
--- a/tests/anysimpletype1_sup.py
+++ b/tests/anysimpletype1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/anysimpletype2_sup.py')
+#   ('-s', 'tests/anysimpletype2_sub.py')
+#   ('--super', 'anysimpletype2_sup')
+#
+# Command line arguments:
+#   tests/anysimpletype.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anysimpletype2_sup.py" -s "tests/anysimpletype2_sub.py" --super="anysimpletype2_sup" tests/anysimpletype.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -616,9 +668,15 @@ class test1element(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, test1attribute=None, test1member=None):
+        self.original_tagname_ = None
         self.test1attribute = _cast(None, test1attribute)
         self.test1member = test1member
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, test1element)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if test1element.subclass:
             return test1element.subclass(*args_, **kwargs_)
         else:
@@ -640,13 +698,15 @@ class test1element(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='test1element')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='test1element', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -662,30 +722,13 @@ class test1element(GeneratedsSuper):
             eol_ = ''
         if self.test1member is not None:
             self.test1member.export(outfile, level, namespace_, name_='test1member', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='test1element'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.test1attribute is not None and 'test1attribute' not in already_processed:
-            already_processed.add('test1attribute')
-            showIndent(outfile, level)
-            outfile.write('test1attribute=%s,\n' % (self.test1attribute,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.test1member is not None:
-            showIndent(outfile, level)
-            outfile.write('test1member=model_.cimAnySimpleType(\n')
-            self.test1member.exportLiteral(outfile, level, name_='test1member')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('test1attribute', node)
         if value is not None and 'test1attribute' not in already_processed:
@@ -696,6 +739,7 @@ class test1element(GeneratedsSuper):
             obj_ = cimAnySimpleType.factory()
             obj_.build(child_)
             self.test1member = obj_
+            obj_.original_tagname_ = 'test1member'
 # end class test1element
 
 
@@ -706,9 +750,15 @@ class cimAnySimpleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, valueOf_=None):
+        self.original_tagname_ = None
         self.valueOf_ = valueOf_
         self.anyAttributes_ = {}
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, cimAnySimpleType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if cimAnySimpleType.subclass:
             return cimAnySimpleType.subclass(*args_, **kwargs_)
         else:
@@ -720,7 +770,7 @@ class cimAnySimpleType(GeneratedsSuper):
     def set_anyAttributes_(self, anyAttributes_): self.anyAttributes_ = anyAttributes_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -730,14 +780,16 @@ class cimAnySimpleType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='cimAnySimpleType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='cimAnySimpleType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
@@ -764,9 +816,9 @@ class cimAnySimpleType(GeneratedsSuper):
                                 name, quote_attrib(value), ))
                         else:
                             unique_counter += 1
-                            outfile.write(' xmlns:yyy%d="%s"' % (
+                            outfile.write(' xmlns:%d="%s"' % (
                                 unique_counter, namespace, ))
-                            outfile.write(' yyy%d:%s=%s' % (
+                            outfile.write(' %d:%s=%s' % (
                                 unique_counter, name, quote_attrib(value), ))
                 else:
                     if name not in already_processed:
@@ -776,20 +828,6 @@ class cimAnySimpleType(GeneratedsSuper):
         pass
     def exportChildren(self, outfile, level, namespace_='', name_='cimAnySimpleType', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='cimAnySimpleType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        for name, value in self.anyAttributes_.items():
-            showIndent(outfile, level)
-            outfile.write('%s="%s",\n' % (name, value,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -797,6 +835,7 @@ class cimAnySimpleType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         self.anyAttributes_ = {}
         for name, value in attrs.items():
@@ -818,7 +857,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -831,7 +870,8 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -851,7 +891,8 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -874,12 +915,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'test1element'
         rootClass = test1element
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -888,13 +933,14 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="test1element",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -907,7 +953,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anysimpletype2_sup import *\n\n')
 ##         sys.stdout.write('import anysimpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anywildcard.xsd b/tests/anywildcard.xsd
index 2db93a3..9931e20 100644
--- a/tests/anywildcard.xsd
+++ b/tests/anywildcard.xsd
@@ -48,6 +48,7 @@
             <xs:any minOccurs="1" maxOccurs="unbounded"/>
 		</xs:sequence>
 	</xs:complexType>
+    <!--
 	<xs:complexType name="DescriptionType">
 		<xs:annotation>
 			<xs:documentation>A standard complexType.</xs:documentation>
@@ -66,4 +67,5 @@
             <xs:element name="catagory" type="xs:integer"/>
 		</xs:sequence>
 	</xs:complexType>
+    -->
 </xs:schema>
diff --git a/tests/anywildcard1_sub.py b/tests/anywildcard1_sub.py
index cc4939c..7e40b28 100644
--- a/tests/anywildcard1_sub.py
+++ b/tests/anywildcard1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/anywildcard2_sup.py')
+#   ('-s', 'tests/anywildcard2_sub.py')
+#   ('--super', 'anywildcard2_sup')
+#
+# Command line arguments:
+#   tests/anywildcard.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anywildcard2_sup.py" -s "tests/anywildcard2_sub.py" --super="anywildcard2_sup" tests/anywildcard.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import anywildcard2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -126,7 +99,8 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -146,7 +120,8 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -170,7 +145,8 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -189,11 +165,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PlantType_single'
         rootClass = supermod.PlantType_single
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -202,8 +179,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anywildcard2_sup import *\n\n')
 ##         sys.stdout.write('import anywildcard2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.PlantType_single(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="PlantType_single")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -214,7 +191,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py
index 3f3e914..2d7a08c 100644
--- a/tests/anywildcard1_sup.py
+++ b/tests/anywildcard1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/anywildcard2_sup.py')
+#   ('-s', 'tests/anywildcard2_sub.py')
+#   ('--super', 'anywildcard2_sup')
+#
+# Command line arguments:
+#   tests/anywildcard.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anywildcard2_sup.py" -s "tests/anywildcard2_sub.py" --super="anywildcard2_sup" tests/anywildcard.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -617,10 +669,16 @@ class PlantType_single(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, anytypeobjs_=None, description=None):
+        self.original_tagname_ = None
         self.name = name
         self.anytypeobjs_ = anytypeobjs_
         self.description = description
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, PlantType_single)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if PlantType_single.subclass:
             return PlantType_single.subclass(*args_, **kwargs_)
         else:
@@ -646,13 +704,15 @@ class PlantType_single(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_single')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='PlantType_single', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -666,41 +726,18 @@ class PlantType_single(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         if self.description is not None:
             self.description.export(outfile, level, namespace_, name_='description', pretty_print=pretty_print)
         if self.anytypeobjs_ is not None:
             self.anytypeobjs_.export(outfile, level, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PlantType_single'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        if self.anytypeobjs_ is not None:
-            showIndent(outfile, level)
-            outfile.write('anytypeobjs_=model_.anytypeobjs_(\n')
-            self.anytypeobjs_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.description is not None:
-            showIndent(outfile, level)
-            outfile.write('description=model_.DescriptionType(\n')
-            self.description.exportLiteral(outfile, level, name_='description')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -712,6 +749,7 @@ class PlantType_single(GeneratedsSuper):
             obj_ = DescriptionType.factory()
             obj_.build(child_)
             self.description = obj_
+            obj_.original_tagname_ = 'description'
         else:
             obj_ = self.gds_build_any(child_, 'PlantType_single')
             if obj_ is not None:
@@ -728,6 +766,7 @@ class PlantType_multiple(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, anytypeobjs_=None, description=None):
+        self.original_tagname_ = None
         self.name = name
         if anytypeobjs_ is None:
             self.anytypeobjs_ = []
@@ -735,6 +774,11 @@ class PlantType_multiple(GeneratedsSuper):
             self.anytypeobjs_ = anytypeobjs_
         self.description = description
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, PlantType_multiple)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if PlantType_multiple.subclass:
             return PlantType_multiple.subclass(*args_, **kwargs_)
         else:
@@ -762,13 +806,15 @@ class PlantType_multiple(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_multiple')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='PlantType_multiple', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -782,43 +828,18 @@ class PlantType_multiple(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         if self.description is not None:
             self.description.export(outfile, level, namespace_, name_='description', pretty_print=pretty_print)
         for obj_ in self.anytypeobjs_:
             obj_.export(outfile, level, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PlantType_multiple'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        showIndent(outfile, level)
-        outfile.write('anytypeobjs_=[\n')
-        level += 1
-        for anytypeobjs_ in self.anytypeobjs_:
-            anytypeobjs_.exportLiteral(outfile, level)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.description is not None:
-            showIndent(outfile, level)
-            outfile.write('description=model_.DescriptionType(\n')
-            self.description.exportLiteral(outfile, level, name_='description')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -830,6 +851,7 @@ class PlantType_multiple(GeneratedsSuper):
             obj_ = DescriptionType.factory()
             obj_.build(child_)
             self.description = obj_
+            obj_.original_tagname_ = 'description'
         else:
             obj_ = self.gds_build_any(child_, 'PlantType_multiple')
             if obj_ is not None:
@@ -846,9 +868,15 @@ class DescriptionType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, size=None):
+        self.original_tagname_ = None
         self.name = name
         self.size = size
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, DescriptionType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if DescriptionType.subclass:
             return DescriptionType.subclass(*args_, **kwargs_)
         else:
@@ -871,13 +899,15 @@ class DescriptionType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='DescriptionType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='DescriptionType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -891,31 +921,17 @@ class DescriptionType(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         if self.size is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%ssize>%s</%ssize>%s' % (namespace_, self.gds_format_string(quote_xml(self.size).encode(ExternalEncoding), input_name='size'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='DescriptionType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        if self.size is not None:
-            showIndent(outfile, level)
-            outfile.write('size=%s,\n' % quote_python(self.size).encode(ExternalEncoding))
+            outfile.write('<%ssize>%s</%ssize>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.size), input_name='size')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -939,9 +955,15 @@ class CatalogType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, catagory=None):
+        self.original_tagname_ = None
         self.name = name
         self.catagory = catagory
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, CatalogType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if CatalogType.subclass:
             return CatalogType.subclass(*args_, **kwargs_)
         else:
@@ -964,13 +986,15 @@ class CatalogType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='CatalogType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='CatalogType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -984,31 +1008,17 @@ class CatalogType(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         if self.catagory is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%scatagory>%s</%scatagory>%s' % (namespace_, self.gds_format_integer(self.catagory, input_name='catagory'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='CatalogType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        if self.catagory is not None:
-            showIndent(outfile, level)
-            outfile.write('catagory=%d,\n' % self.catagory)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1020,7 +1030,7 @@ class CatalogType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'catagory')
             self.catagory = ival_
@@ -1034,8 +1044,14 @@ class PlantType_single_nochild(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, anytypeobjs_=None):
+        self.original_tagname_ = None
         self.anytypeobjs_ = anytypeobjs_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, PlantType_single_nochild)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if PlantType_single_nochild.subclass:
             return PlantType_single_nochild.subclass(*args_, **kwargs_)
         else:
@@ -1055,13 +1071,15 @@ class PlantType_single_nochild(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_single_nochild')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='PlantType_single_nochild', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1075,27 +1093,13 @@ class PlantType_single_nochild(GeneratedsSuper):
             eol_ = ''
         if self.anytypeobjs_ is not None:
             self.anytypeobjs_.export(outfile, level, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PlantType_single_nochild'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.anytypeobjs_ is not None:
-            showIndent(outfile, level)
-            outfile.write('anytypeobjs_=model_.anytypeobjs_(\n')
-            self.anytypeobjs_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1112,11 +1116,17 @@ class PlantType_multiple_nochild(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, anytypeobjs_=None):
+        self.original_tagname_ = None
         if anytypeobjs_ is None:
             self.anytypeobjs_ = []
         else:
             self.anytypeobjs_ = anytypeobjs_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, PlantType_multiple_nochild)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if PlantType_multiple_nochild.subclass:
             return PlantType_multiple_nochild.subclass(*args_, **kwargs_)
         else:
@@ -1138,13 +1148,15 @@ class PlantType_multiple_nochild(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_multiple_nochild')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='PlantType_multiple_nochild', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1158,29 +1170,13 @@ class PlantType_multiple_nochild(GeneratedsSuper):
             eol_ = ''
         for obj_ in self.anytypeobjs_:
             obj_.export(outfile, level, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PlantType_multiple_nochild'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('anytypeobjs_=[\n')
-        level += 1
-        for anytypeobjs_ in self.anytypeobjs_:
-            anytypeobjs_.exportLiteral(outfile, level)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1201,7 +1197,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -1214,7 +1210,8 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -1234,7 +1231,8 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -1257,12 +1255,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PlantType_single'
         rootClass = PlantType_single
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1271,13 +1273,14 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="PlantType_single",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -1290,7 +1293,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from anywildcard2_sup import *\n\n')
 ##         sys.stdout.write('import anywildcard2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/anywildcard2_sub.py b/tests/anywildcard2_sub.py
deleted file mode 100644
index cc4939c..0000000
--- a/tests/anywildcard2_sub.py
+++ /dev/null
@@ -1,231 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Generated  by generateDS.py.
-#
-
-import sys
-
-import anywildcard2_sup as supermod
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-
-#
-# Data representation classes
-#
-
-
-class PlantType_singleSub(supermod.PlantType_single):
-    def __init__(self, name=None, anytypeobjs_=None, description=None):
-        super(PlantType_singleSub, self).__init__(name, anytypeobjs_, description, )
-supermod.PlantType_single.subclass = PlantType_singleSub
-# end class PlantType_singleSub
-
-
-class PlantType_multipleSub(supermod.PlantType_multiple):
-    def __init__(self, name=None, anytypeobjs_=None, description=None):
-        super(PlantType_multipleSub, self).__init__(name, anytypeobjs_, description, )
-supermod.PlantType_multiple.subclass = PlantType_multipleSub
-# end class PlantType_multipleSub
-
-
-class DescriptionTypeSub(supermod.DescriptionType):
-    def __init__(self, name=None, size=None):
-        super(DescriptionTypeSub, self).__init__(name, size, )
-supermod.DescriptionType.subclass = DescriptionTypeSub
-# end class DescriptionTypeSub
-
-
-class CatalogTypeSub(supermod.CatalogType):
-    def __init__(self, name=None, catagory=None):
-        super(CatalogTypeSub, self).__init__(name, catagory, )
-supermod.CatalogType.subclass = CatalogTypeSub
-# end class CatalogTypeSub
-
-
-class PlantType_single_nochildSub(supermod.PlantType_single_nochild):
-    def __init__(self, anytypeobjs_=None):
-        super(PlantType_single_nochildSub, self).__init__(anytypeobjs_, )
-supermod.PlantType_single_nochild.subclass = PlantType_single_nochildSub
-# end class PlantType_single_nochildSub
-
-
-class PlantType_multiple_nochildSub(supermod.PlantType_multiple_nochild):
-    def __init__(self, anytypeobjs_=None):
-        super(PlantType_multiple_nochildSub, self).__init__(anytypeobjs_, )
-supermod.PlantType_multiple_nochild.subclass = PlantType_multiple_nochildSub
-# end class PlantType_multiple_nochildSub
-
-
-def get_root_tag(node):
-    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = None
-    rootClass = supermod.GDSClassesMapping.get(tag)
-    if rootClass is None and hasattr(supermod, tag):
-        rootClass = getattr(supermod, tag)
-    return tag, rootClass
-
-
-def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'PlantType_single'
-        rootClass = supermod.PlantType_single
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='',
-##             pretty_print=True)
-    return rootObj
-
-
-def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'PlantType_single'
-        rootClass = supermod.PlantType_single
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    mapping = {}
-    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
-    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
-##     if not silence:
-##         content = etree_.tostring(
-##             rootElement, pretty_print=True,
-##             xml_declaration=True, encoding="utf-8")
-##         sys.stdout.write(content)
-##         sys.stdout.write('\n')
-    return rootObj, rootElement, mapping, reverse_mapping
-
-
-def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'PlantType_single'
-        rootClass = supermod.PlantType_single
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='')
-    return rootObj
-
-
-def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
-    if rootClass is None:
-        rootClass = supermod.PlantType_single
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('#from anywildcard2_sup import *\n\n')
-##         sys.stdout.write('import anywildcard2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.PlantType_single(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="PlantType_single")
-##         sys.stdout.write(')\n')
-    return rootObj
-
-
-USAGE_TEXT = """
-Usage: python ???.py <infilename>
-"""
-
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) != 1:
-        usage()
-    infilename = args[0]
-    parse(infilename)
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
diff --git a/tests/attr_groups.xsd b/tests/attr_groups.xsd
index 98a2afd..1678548 100644
--- a/tests/attr_groups.xsd
+++ b/tests/attr_groups.xsd
@@ -27,6 +27,13 @@
         <xsd:attribute name="value05" type="xsd:string"/>
         <xsd:attribute name="value06" type="xsd:integer"/>
         <xsd:attribute name="value07" type="xsd:integer"/>
+        <xsd:attributeGroup ref="value08"/>
+    </xsd:attributeGroup>
+
+    <!-- Check for avoidance of infinite recursion.
+    -->
+    <xsd:attributeGroup name="value08">
+        <xsd:attribute name="value08" type="xsd:string"/>
     </xsd:attributeGroup>
 
 </xsd:schema>
diff --git a/tests/attr_groups1_sub.py b/tests/attr_groups1_sub.py
index bc8d0a6..446338a 100644
--- a/tests/attr_groups1_sub.py
+++ b/tests/attr_groups1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/attr_groups2_sup.py')
+#   ('-s', 'tests/attr_groups2_sub.py')
+#   ('--super', 'attr_groups2_sup')
+#
+# Command line arguments:
+#   tests/attr_groups.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/attr_groups2_sup.py" -s "tests/attr_groups2_sub.py" --super="attr_groups2_sup" tests/attr_groups.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import attr_groups2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,8 +48,8 @@ ExternalEncoding = 'ascii'
 
 
 class GetUserReqSub(supermod.GetUserReq):
-    def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None):
-        super(GetUserReqSub, self).__init__(value04, value05, value06, value07, value01, value02, value03, sequence, returnedTags, )
+    def __init__(self, sequence=None, value01=None, value02=None, value03=None, value04=None, value05=None, value06=None, value07=None, value08=None, returnedTags=None):
+        super(GetUserReqSub, self).__init__(sequence, value01, value02, value03, value04, value05, value06, value07, value08, returnedTags, )
 supermod.GetUserReq.subclass = GetUserReqSub
 # end class GetUserReqSub
 
@@ -91,11 +64,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -111,11 +85,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -135,11 +110,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -154,11 +130,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'GetUserReq'
         rootClass = supermod.GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -167,8 +144,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from attr_groups2_sup import *\n\n')
 ##         sys.stdout.write('import attr_groups2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.getUser(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="getUser")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -179,7 +156,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py
index d1db370..c9f62ff 100644
--- a/tests/attr_groups1_sup.py
+++ b/tests/attr_groups1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/attr_groups2_sup.py')
+#   ('-s', 'tests/attr_groups2_sub.py')
+#   ('--super', 'attr_groups2_sup')
+#
+# Command line arguments:
+#   tests/attr_groups.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/attr_groups2_sup.py" -s "tests/attr_groups2_sub.py" --super="attr_groups2_sup" tests/attr_groups.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -610,29 +662,37 @@ 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_('value01', 'xsd:string', 0),
-        MemberSpec_('value02', 'xsd:integer', 0),
-        MemberSpec_('value03', 'xsd:string', 0),
-        MemberSpec_('sequence', 'xsd:unsignedLong', 0),
+        MemberSpec_('value08', 'xsd:string', 0),
         MemberSpec_('returnedTags', 'xsd:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None):
+    def __init__(self, sequence=None, value01=None, value02=None, value03=None, value04=None, value05=None, value06=None, value07=None, value08=None, returnedTags=None):
+        self.original_tagname_ = None
+        self.sequence = _cast(int, sequence)
+        self.value01 = _cast(None, value01)
+        self.value02 = _cast(int, value02)
+        self.value03 = _cast(None, value03)
         self.value04 = _cast(int, value04)
         self.value05 = _cast(None, value05)
         self.value06 = _cast(int, value06)
         self.value07 = _cast(int, value07)
-        self.value01 = _cast(None, value01)
-        self.value02 = _cast(int, value02)
-        self.value03 = _cast(None, value03)
-        self.sequence = _cast(int, sequence)
+        self.value08 = _cast(None, value08)
         self.returnedTags = returnedTags
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, GetUserReq)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if GetUserReq.subclass:
             return GetUserReq.subclass(*args_, **kwargs_)
         else:
@@ -640,6 +700,14 @@ class GetUserReq(GeneratedsSuper):
     factory = staticmethod(factory)
     def get_returnedTags(self): return self.returnedTags
     def set_returnedTags(self, returnedTags): self.returnedTags = returnedTags
+    def get_sequence(self): return self.sequence
+    def set_sequence(self, sequence): self.sequence = sequence
+    def get_value01(self): return self.value01
+    def set_value01(self, value01): self.value01 = value01
+    def get_value02(self): return self.value02
+    def set_value02(self, value02): self.value02 = value02
+    def get_value03(self): return self.value03
+    def set_value03(self, value03): self.value03 = value03
     def get_value04(self): return self.value04
     def set_value04(self, value04): self.value04 = value04
     def get_value05(self): return self.value05
@@ -648,14 +716,8 @@ class GetUserReq(GeneratedsSuper):
     def set_value06(self, value06): self.value06 = value06
     def get_value07(self): return self.value07
     def set_value07(self, value07): self.value07 = value07
-    def get_value01(self): return self.value01
-    def set_value01(self, value01): self.value01 = value01
-    def get_value02(self): return self.value02
-    def set_value02(self, value02): self.value02 = value02
-    def get_value03(self): return self.value03
-    def set_value03(self, value03): self.value03 = value03
-    def get_sequence(self): return self.sequence
-    def set_sequence(self, sequence): self.sequence = sequence
+    def get_value08(self): return self.value08
+    def set_value08(self, value08): self.value08 = value08
     def hasContent_(self):
         if (
             self.returnedTags is not None
@@ -668,42 +730,47 @@ class GetUserReq(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='GetUserReq')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='GetUserReq', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='GetUserReq'):
+        if self.sequence is not None and 'sequence' not in already_processed:
+            already_processed.add('sequence')
+            outfile.write(' sequence="%s"' % self.gds_format_integer(self.sequence, input_name='sequence'))
+        if self.value01 is not None and 'value01' not in already_processed:
+            already_processed.add('value01')
+            outfile.write(' value01=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value01), input_name='value01')), ))
+        if self.value02 is not None and 'value02' not in already_processed:
+            already_processed.add('value02')
+            outfile.write(' value02="%s"' % self.gds_format_integer(self.value02, input_name='value02'))
+        if self.value03 is not None and 'value03' not in already_processed:
+            already_processed.add('value03')
+            outfile.write(' value03=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value03), input_name='value03')), ))
         if self.value04 is not None and 'value04' not in already_processed:
             already_processed.add('value04')
             outfile.write(' value04="%s"' % self.gds_format_integer(self.value04, input_name='value04'))
         if self.value05 is not None and 'value05' not in already_processed:
             already_processed.add('value05')
-            outfile.write(' value05=%s' % (self.gds_format_string(quote_attrib(self.value05).encode(ExternalEncoding), input_name='value05'), ))
+            outfile.write(' value05=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value05), input_name='value05')), ))
         if self.value06 is not None and 'value06' not in already_processed:
             already_processed.add('value06')
             outfile.write(' value06="%s"' % self.gds_format_integer(self.value06, input_name='value06'))
         if self.value07 is not None and 'value07' not in already_processed:
             already_processed.add('value07')
             outfile.write(' value07="%s"' % self.gds_format_integer(self.value07, input_name='value07'))
-        if self.value01 is not None and 'value01' not in already_processed:
-            already_processed.add('value01')
-            outfile.write(' value01=%s' % (self.gds_format_string(quote_attrib(self.value01).encode(ExternalEncoding), input_name='value01'), ))
-        if self.value02 is not None and 'value02' not in already_processed:
-            already_processed.add('value02')
-            outfile.write(' value02="%s"' % self.gds_format_integer(self.value02, input_name='value02'))
-        if self.value03 is not None and 'value03' not in already_processed:
-            already_processed.add('value03')
-            outfile.write(' value03=%s' % (self.gds_format_string(quote_attrib(self.value03).encode(ExternalEncoding), input_name='value03'), ))
-        if self.sequence is not None and 'sequence' not in already_processed:
-            already_processed.add('sequence')
-            outfile.write(' sequence="%s"' % self.gds_format_integer(self.sequence, input_name='sequence'))
+        if self.value08 is not None and 'value08' not in already_processed:
+            already_processed.add('value08')
+            outfile.write(' value08=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value08), input_name='value08')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='GetUserReq', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
@@ -711,63 +778,43 @@ class GetUserReq(GeneratedsSuper):
             eol_ = ''
         if self.returnedTags is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sreturnedTags>%s</%sreturnedTags>%s' % (namespace_, self.gds_format_string(quote_xml(self.returnedTags).encode(ExternalEncoding), input_name='returnedTags'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='GetUserReq'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.value04 is not None and 'value04' not in already_processed:
-            already_processed.add('value04')
-            showIndent(outfile, level)
-            outfile.write('value04=%d,\n' % (self.value04,))
-        if self.value05 is not None and 'value05' not in already_processed:
-            already_processed.add('value05')
-            showIndent(outfile, level)
-            outfile.write('value05="%s",\n' % (self.value05,))
-        if self.value06 is not None and 'value06' not in already_processed:
-            already_processed.add('value06')
-            showIndent(outfile, level)
-            outfile.write('value06=%d,\n' % (self.value06,))
-        if self.value07 is not None and 'value07' not in already_processed:
-            already_processed.add('value07')
-            showIndent(outfile, level)
-            outfile.write('value07=%d,\n' % (self.value07,))
-        if self.value01 is not None and 'value01' not in already_processed:
-            already_processed.add('value01')
-            showIndent(outfile, level)
-            outfile.write('value01="%s",\n' % (self.value01,))
-        if self.value02 is not None and 'value02' not in already_processed:
-            already_processed.add('value02')
-            showIndent(outfile, level)
-            outfile.write('value02=%d,\n' % (self.value02,))
-        if self.value03 is not None and 'value03' not in already_processed:
-            already_processed.add('value03')
-            showIndent(outfile, level)
-            outfile.write('value03="%s",\n' % (self.value03,))
-        if self.sequence is not None and 'sequence' not in already_processed:
-            already_processed.add('sequence')
-            showIndent(outfile, level)
-            outfile.write('sequence=%d,\n' % (self.sequence,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.returnedTags is not None:
-            showIndent(outfile, level)
-            outfile.write('returnedTags=%s,\n' % quote_python(self.returnedTags).encode(ExternalEncoding))
+            outfile.write('<%sreturnedTags>%s</%sreturnedTags>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.returnedTags), input_name='returnedTags')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('sequence', node)
+        if value is not None and 'sequence' not in already_processed:
+            already_processed.add('sequence')
+            try:
+                self.sequence = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('value01', node)
+        if value is not None and 'value01' not in already_processed:
+            already_processed.add('value01')
+            self.value01 = value
+        value = find_attr_value_('value02', node)
+        if value is not None and 'value02' not in already_processed:
+            already_processed.add('value02')
+            try:
+                self.value02 = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('value03', node)
+        if value is not None and 'value03' not in already_processed:
+            already_processed.add('value03')
+            self.value03 = value
         value = find_attr_value_('value04', node)
         if value is not None and 'value04' not in already_processed:
             already_processed.add('value04')
             try:
                 self.value04 = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
         value = find_attr_value_('value05', node)
         if value is not None and 'value05' not in already_processed:
@@ -778,37 +825,19 @@ class GetUserReq(GeneratedsSuper):
             already_processed.add('value06')
             try:
                 self.value06 = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
         value = find_attr_value_('value07', node)
         if value is not None and 'value07' not in already_processed:
             already_processed.add('value07')
             try:
                 self.value07 = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value01', node)
-        if value is not None and 'value01' not in already_processed:
-            already_processed.add('value01')
-            self.value01 = value
-        value = find_attr_value_('value02', node)
-        if value is not None and 'value02' not in already_processed:
-            already_processed.add('value02')
-            try:
-                self.value02 = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value03', node)
-        if value is not None and 'value03' not in already_processed:
-            already_processed.add('value03')
-            self.value03 = value
-        value = find_attr_value_('sequence', node)
-        if value is not None and 'sequence' not in already_processed:
-            already_processed.add('sequence')
-            try:
-                self.sequence = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('value08', node)
+        if value is not None and 'value08' not in already_processed:
+            already_processed.add('value08')
+            self.value08 = value
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'returnedTags':
             returnedTags_ = child_.text
@@ -828,7 +857,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -841,11 +870,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -861,11 +891,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -884,12 +915,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -898,17 +933,18 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="getUser",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
+        rootTag = 'GetUserReq'
         rootClass = GetUserReq
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -917,7 +953,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from attr_groups2_sup import *\n\n')
 ##         sys.stdout.write('import attr_groups2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/attr_groups2_sub.py b/tests/attr_groups2_sub.py
deleted file mode 100644
index bc8d0a6..0000000
--- a/tests/attr_groups2_sub.py
+++ /dev/null
@@ -1,196 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Generated  by generateDS.py.
-#
-
-import sys
-
-import attr_groups2_sup as supermod
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-
-#
-# Data representation classes
-#
-
-
-class GetUserReqSub(supermod.GetUserReq):
-    def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None):
-        super(GetUserReqSub, self).__init__(value04, value05, value06, value07, value01, value02, value03, sequence, returnedTags, )
-supermod.GetUserReq.subclass = GetUserReqSub
-# end class GetUserReqSub
-
-
-def get_root_tag(node):
-    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = None
-    rootClass = supermod.GDSClassesMapping.get(tag)
-    if rootClass is None and hasattr(supermod, tag):
-        rootClass = getattr(supermod, tag)
-    return tag, rootClass
-
-
-def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'getUser'
-        rootClass = supermod.GetUserReq
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='',
-##             pretty_print=True)
-    return rootObj
-
-
-def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'getUser'
-        rootClass = supermod.GetUserReq
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    mapping = {}
-    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
-    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
-##     if not silence:
-##         content = etree_.tostring(
-##             rootElement, pretty_print=True,
-##             xml_declaration=True, encoding="utf-8")
-##         sys.stdout.write(content)
-##         sys.stdout.write('\n')
-    return rootObj, rootElement, mapping, reverse_mapping
-
-
-def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'getUser'
-        rootClass = supermod.GetUserReq
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='')
-    return rootObj
-
-
-def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
-    if rootClass is None:
-        rootClass = supermod.GetUserReq
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('#from attr_groups2_sup import *\n\n')
-##         sys.stdout.write('import attr_groups2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.getUser(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="getUser")
-##         sys.stdout.write(')\n')
-    return rootObj
-
-
-USAGE_TEXT = """
-Usage: python ???.py <infilename>
-"""
-
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) != 1:
-        usage()
-    infilename = args[0]
-    parse(infilename)
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
diff --git a/tests/catalog.xml b/tests/catalog.xml
new file mode 100644
index 0000000..e4d0c61
--- /dev/null
+++ b/tests/catalog.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+
+</catalog>
diff --git a/tests/catalogtest.xsd b/tests/catalogtest.xsd
new file mode 100644
index 0000000..aaa3f57
--- /dev/null
+++ b/tests/catalogtest.xsd
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <!--
+    <xs:include namespace="http://www.generateds.com/catalog-part1"/>
+    -->
+
+</xs:schema>
diff --git a/tests/catalogtest1_sub.py b/tests/catalogtest1_sub.py
new file mode 100644
index 0000000..ba9ea61
--- /dev/null
+++ b/tests/catalogtest1_sub.py
@@ -0,0 +1,167 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/catalogtest2_sup.py')
+#   ('-s', 'tests/catalogtest2_sub.py')
+#   ('--super', 'catalogtest2_sup')
+#   ('-c', 'tests/catalog.xml')
+#
+# Command line arguments:
+#   tests/catalogtest.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/catalogtest2_sup.py" -s "tests/catalogtest2_sub.py" --super="catalogtest2_sup" -c "tests/catalog.xml" tests/catalogtest.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import catalogtest2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = ''
+        rootClass = supermod.
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = ''
+        rootClass = supermod.
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = ''
+        rootClass = supermod.
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = ''
+        rootClass = supermod.
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from catalogtest2_sup import *\n\n')
+##         sys.stdout.write('import catalogtest2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py
new file mode 100644
index 0000000..6fa48d3
--- /dev/null
+++ b/tests/catalogtest1_sup.py
@@ -0,0 +1,791 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/catalogtest2_sup.py')
+#   ('-s', 'tests/catalogtest2_sub.py')
+#   ('--super', 'catalogtest2_sup')
+#   ('-c', 'tests/catalog.xml')
+#
+# Command line arguments:
+#   tests/catalogtest.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/catalogtest2_sup.py" -s "tests/catalogtest2_sub.py" --super="catalogtest2_sup" -c "tests/catalog.xml" tests/catalogtest.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+GDSClassesMapping = {
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = ''
+        rootClass = 
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = ''
+        rootClass = 
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = ''
+        rootClass = 
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = ''
+        rootClass = 
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from catalogtest2_sup import *\n\n')
+##         sys.stdout.write('import catalogtest2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    
+]
diff --git a/tests/cdata.xsd b/tests/cdata.xsd
new file mode 100644
index 0000000..9f652aa
--- /dev/null
+++ b/tests/cdata.xsd
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+    <xs:element name="cdata" type="cdataListType"/>
+
+    <xs:complexType name="cdataListType">
+        <xs:sequence>
+            <xs:element name="cdatalist" type="cdataType"
+                minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="cdataType">
+        <xs:sequence>
+            <xs:element name="script" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+</xs:schema>
diff --git a/tests/cdata1.xml b/tests/cdata1.xml
new file mode 100644
index 0000000..b9dd591
--- /dev/null
+++ b/tests/cdata1.xml
@@ -0,0 +1,8 @@
+<cdataListType>
+    <cdatalist>
+        <script><![CDATA[ccc < ddd & eee]]></script>
+    </cdatalist>
+    <cdatalist>
+        <script>aaa &lt; bbb <![CDATA[ccc < ddd]]> eee &lt; &amp; fff&lt;<![CDATA[ggg < & hhh]]>&amp; iii &lt; jjj</script>
+    </cdatalist>
+</cdataListType>
diff --git a/tests/cdata1_sub.py b/tests/cdata1_sub.py
new file mode 100644
index 0000000..137519f
--- /dev/null
+++ b/tests/cdata1_sub.py
@@ -0,0 +1,181 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/cdata2_sup.py')
+#   ('-s', 'tests/cdata2_sub.py')
+#   ('--silence', '')
+#   ('--super', 'cdata2_sup')
+#
+# Command line arguments:
+#   tests/cdata.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/cdata2_sup.py" -s "tests/cdata2_sub.py" --silence --super="cdata2_sup" tests/cdata.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import cdata2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class cdataListTypeSub(supermod.cdataListType):
+    def __init__(self, cdatalist=None):
+        super(cdataListTypeSub, self).__init__(cdatalist, )
+supermod.cdataListType.subclass = cdataListTypeSub
+# end class cdataListTypeSub
+
+
+class cdataTypeSub(supermod.cdataType):
+    def __init__(self, script=None):
+        super(cdataTypeSub, self).__init__(script, )
+supermod.cdataType.subclass = cdataTypeSub
+# end class cdataTypeSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'cdataListType'
+        rootClass = supermod.cdataListType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'cdataListType'
+        rootClass = supermod.cdataListType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'cdataListType'
+        rootClass = supermod.cdataListType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'cdataListType'
+        rootClass = supermod.cdataListType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from cdata2_sup import *\n\n')
+##         sys.stdout.write('import cdata2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/abstract_type2_sup.py b/tests/cdata1_sup.py
similarity index 62%
rename from tests/abstract_type2_sup.py
rename to tests/cdata1_sup.py
index 41f17dd..af309dd 100644
--- a/tests/abstract_type2_sup.py
+++ b/tests/cdata1_sup.py
@@ -4,66 +4,55 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/cdata2_sup.py')
+#   ('-s', 'tests/cdata2_sub.py')
+#   ('--silence', '')
+#   ('--super', 'cdata2_sup')
+#
+# Command line arguments:
+#   tests/cdata.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/cdata2_sup.py" -s "tests/cdata2_sub.py" --silence --super="cdata2_sup" tests/cdata.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +64,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +80,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +149,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +204,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +215,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +238,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +262,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +294,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +364,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +412,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +430,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +515,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +556,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -608,316 +661,163 @@ def _cast(typ, value):
 #
 
 
-class carrierType(GeneratedsSuper):
+class cdataListType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('fleet', 'Vehicle', 1),
+        MemberSpec_('cdatalist', 'cdataType', 1),
     ]
     subclass = None
     superclass = None
-    def __init__(self, fleet=None):
-        if fleet is None:
-            self.fleet = []
+    def __init__(self, cdatalist=None):
+        self.original_tagname_ = None
+        if cdatalist is None:
+            self.cdatalist = []
         else:
-            self.fleet = fleet
+            self.cdatalist = cdatalist
     def factory(*args_, **kwargs_):
-        if carrierType.subclass:
-            return carrierType.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, cdataListType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if cdataListType.subclass:
+            return cdataListType.subclass(*args_, **kwargs_)
         else:
-            return carrierType(*args_, **kwargs_)
+            return cdataListType(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_fleet(self): return self.fleet
-    def set_fleet(self, fleet): self.fleet = fleet
-    def add_fleet(self, value): self.fleet.append(value)
-    def insert_fleet(self, index, value): self.fleet[index] = value
+    def get_cdatalist(self): return self.cdatalist
+    def set_cdatalist(self, cdatalist): self.cdatalist = cdatalist
+    def add_cdatalist(self, value): self.cdatalist.append(value)
+    def insert_cdatalist_at(self, index, value): self.cdatalist.insert(index, value)
+    def replace_cdatalist_at(self, index, value): self.cdatalist[index] = value
     def hasContent_(self):
         if (
-            self.fleet
+            self.cdatalist
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='target:', name_='carrierType', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='cdataListType', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='carrierType')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='cdataListType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='cdataListType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='target:', name_='carrierType'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='cdataListType'):
         pass
-    def exportChildren(self, outfile, level, namespace_='target:', name_='carrierType', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='cdataListType', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        for fleet_ in self.fleet:
-            fleet_.export(outfile, level, namespace_, name_='fleet', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='carrierType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('fleet=[\n')
-        level += 1
-        for fleet_ in self.fleet:
-            showIndent(outfile, level)
-            outfile.write('model_.Vehicle(\n')
-            fleet_.exportLiteral(outfile, level, name_='Vehicle')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
+        for cdatalist_ in self.cdatalist:
+            cdatalist_.export(outfile, level, namespace_, name_='cdatalist', pretty_print=pretty_print)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'fleet':
-            type_name_ = child_.attrib.get(
-                '{http://www.w3.org/2001/XMLSchema-instance}type')
-            if type_name_ is None:
-                type_name_ = child_.attrib.get('type')
-            if type_name_ is not None:
-                type_names_ = type_name_.split(':')
-                if len(type_names_) == 1:
-                    type_name_ = type_names_[0]
-                else:
-                    type_name_ = type_names_[1]
-                class_ = globals()[type_name_]
-                obj_ = class_.factory()
-                obj_.build(child_)
-            else:
-                raise NotImplementedError(
-                    'Class not implemented for <fleet> element')
-            self.fleet.append(obj_)
-# end class carrierType
+        if nodeName_ == 'cdatalist':
+            obj_ = cdataType.factory()
+            obj_.build(child_)
+            self.cdatalist.append(obj_)
+            obj_.original_tagname_ = 'cdatalist'
+# end class cdataListType
 
 
-class Vehicle(GeneratedsSuper):
+class cdataType(GeneratedsSuper):
     member_data_items_ = [
+        MemberSpec_('script', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, extensiontype_=None):
-        self.extensiontype_ = extensiontype_
+    def __init__(self, script=None):
+        self.original_tagname_ = None
+        self.script = script
     def factory(*args_, **kwargs_):
-        if Vehicle.subclass:
-            return Vehicle.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, cdataType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if cdataType.subclass:
+            return cdataType.subclass(*args_, **kwargs_)
         else:
-            return Vehicle(*args_, **kwargs_)
+            return cdataType(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_extensiontype_(self): return self.extensiontype_
-    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def get_script(self): return self.script
+    def set_script(self, script): self.script = script
     def hasContent_(self):
         if (
-
+            self.script is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='target:', name_='Vehicle', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='cdataType', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='Vehicle')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='cdataType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='cdataType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='target:', name_='Vehicle'):
-        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
-            already_processed.add('xsi:type')
-            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-            outfile.write(' xsi:type="%s"' % self.extensiontype_)
-        pass
-    def exportChildren(self, outfile, level, namespace_='target:', name_='Vehicle', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='Vehicle'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('xsi:type', node)
-        if value is not None and 'xsi:type' not in already_processed:
-            already_processed.add('xsi:type')
-            self.extensiontype_ = value
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='cdataType'):
         pass
-# end class Vehicle
-
-
-class Car(Vehicle):
-    member_data_items_ = [
-    ]
-    subclass = None
-    superclass = Vehicle
-    def __init__(self):
-        super(Car, self).__init__()
-        pass
-    def factory(*args_, **kwargs_):
-        if Car.subclass:
-            return Car.subclass(*args_, **kwargs_)
-        else:
-            return Car(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def hasContent_(self):
-        if (
-            super(Car, self).hasContent_()
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='target:', name_='Car', namespacedef_='', pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='cdataType', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='Car')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='target:', name_='Car'):
-        super(Car, self).exportAttributes(outfile, level, already_processed, namespace_, name_='Car')
-    def exportChildren(self, outfile, level, namespace_='target:', name_='Car', fromsubclass_=False, pretty_print=True):
-        super(Car, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-        pass
-    def exportLiteral(self, outfile, level, name_='Car'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(Car, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(Car, self).exportLiteralChildren(outfile, level, name_)
-        pass
+        if self.script is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sscript>%s</%sscript>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.script), input_name='script')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        super(Car, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        super(Car, self).buildChildren(child_, node, nodeName_, True)
         pass
-# end class Car
-
-
-class Plane(Vehicle):
-    member_data_items_ = [
-    ]
-    subclass = None
-    superclass = Vehicle
-    def __init__(self):
-        super(Plane, self).__init__()
-        pass
-    def factory(*args_, **kwargs_):
-        if Plane.subclass:
-            return Plane.subclass(*args_, **kwargs_)
-        else:
-            return Plane(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def hasContent_(self):
-        if (
-            super(Plane, self).hasContent_()
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='target:', name_='Plane', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='Plane')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='target:', name_='Plane'):
-        super(Plane, self).exportAttributes(outfile, level, already_processed, namespace_, name_='Plane')
-    def exportChildren(self, outfile, level, namespace_='target:', name_='Plane', fromsubclass_=False, pretty_print=True):
-        super(Plane, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-        pass
-    def exportLiteral(self, outfile, level, name_='Plane'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(Plane, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(Plane, self).exportLiteralChildren(outfile, level, name_)
-        pass
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        super(Plane, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        super(Plane, self).buildChildren(child_, node, nodeName_, True)
-        pass
-# end class Plane
+        if nodeName_ == 'script':
+            script_ = child_.text
+            script_ = self.gds_validate_string(script_, node, 'script')
+            self.script = script_
+# end class cdataType
 
 
 GDSClassesMapping = {
-    'fleet': Vehicle,
-    'carrier': carrierType,
+    'cdata': cdataListType,
+    'cdatalist': cdataType,
 }
 
 
@@ -927,7 +827,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -940,12 +840,13 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
-        rootClass = carrierType
+        rootTag = 'cdataListType'
+        rootClass = cdataListType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -954,18 +855,19 @@ def parse(inFileName, silence=False):
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
 ##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='xmlns:target="http://cars.example.com/schema"',
+##             namespacedef_='',
 ##             pretty_print=True)
     return rootObj
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
-        rootClass = carrierType
+        rootTag = 'cdataListType'
+        rootClass = cdataListType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -983,13 +885,17 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = carrierType
+        rootTag = 'cdataListType'
+        rootClass = cdataListType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -997,26 +903,27 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="carrier",
-##             namespacedef_='xmlns:target="http://cars.example.com/schema"')
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'carrier'
-        rootClass = carrierType
+        rootTag = 'cdataListType'
+        rootClass = cdataListType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
 ##     if not silence:
-##         sys.stdout.write('#from abstract_type2_sup import *\n\n')
-##         sys.stdout.write('import abstract_type2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('#from cdata2_sup import *\n\n')
+##         sys.stdout.write('import cdata2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
@@ -1036,8 +943,6 @@ if __name__ == '__main__':
 
 
 __all__ = [
-    "Car",
-    "Plane",
-    "Vehicle",
-    "carrierType"
+    "cdataListType",
+    "cdataType"
 ]
diff --git a/tests/check_results.rb b/tests/check_results.rb
new file mode 100755
index 0000000..bdbec1e
--- /dev/null
+++ b/tests/check_results.rb
@@ -0,0 +1,95 @@
+#!/usr/bin/env ruby
+
+#
+# Unit tests -- 
+# Step 1: Run the unit tests: ``./test.py``
+# Step 2: If there are errors, run this script to view the differences.
+#
+# When adding a new unit test, also add lines to the list $commands.
+#
+
+$divider = "-" * 70
+
+$commands = [
+  "diff -u out1_sub.py out2_sub.py",
+  "diff -u out1_sup.py out2_sup.py",
+  "diff -u anysimpletype1_sub.py anysimpletype2_sub.py",
+  "diff -u anysimpletype1_sup.py anysimpletype2_sup.py",
+  "diff -u simpletype_memberspecs1_sub.py simpletype_memberspecs2_sub.py",
+  "diff -u simpletype_memberspecs1_sup.py simpletype_memberspecs2_sup.py",
+  "diff -u extensions1_sub.py extensions2_sub.py",
+  "diff -u extensions1_sup.py extensions2_sup.py",
+  "diff -u simplecontent_restriction1_sub.py simplecontent_restriction2_sub.py",
+  "diff -u simplecontent_restriction1_sup.py simplecontent_restriction2_sup.py",
+  "diff -u annotations1_sub.py annotations2_sub.py",
+  "diff -u annotations1_sup.py annotations2_sup.py",
+  "diff -u abstract_type1_sub.py abstract_type2_sub.py",
+  "diff -u abstract_type1_sup.py abstract_type2_sup.py",
+  "diff -u people_procincl1_sub.py people_procincl2_sub.py",
+  "diff -u people_procincl1_sup.py people_procincl2_sup.py",
+  "diff -u ipo1_sub.py ipo2_sub.py",
+  "diff -u ipo1_sup.py ipo2_sup.py",
+  "diff -u recursive_simpletype1_sub.py recursive_simpletype2_sub.py",
+  "diff -u recursive_simpletype1_sup.py recursive_simpletype2_sup.py",
+  "diff -u anywildcard1_sub.py anywildcard2_sub.py",
+  "diff -u anywildcard1_sup.py anywildcard2_sup.py",
+  "diff -u attr_groups1_sub.py attr_groups2_sub.py",
+  "diff -u attr_groups1_sup.py attr_groups2_sup.py",
+  "diff -u simpletypes_other1_sub.py simpletypes_other2_sub.py",
+  "diff -u simpletypes_other1_sup.py simpletypes_other2_sup.py",
+  "diff -u to_etree1_sub.py to_etree2_sub.py",
+  "diff -u to_etree1_sup.py to_etree2_sup.py",
+  "diff -u anonymous_type1_sub.py anonymous_type2_sub.py",
+  "diff -u anonymous_type1_sup.py anonymous_type2_sup.py",
+  "diff -u mapcleanname1_sub.py mapcleanname2_sub.py",
+  "diff -u mapcleanname1_sup.py mapcleanname2_sup.py",
+  "diff -u prefix_classname1_sub.py prefix_classname2_sub.py",
+  "diff -u prefix_classname1_sup.py prefix_classname2_sup.py",
+  "diff -u validate_simpletypes1_sub.py validate_simpletypes2_sub.py",
+  "diff -u validate_simpletypes1_sup.py validate_simpletypes2_sup.py",
+  "diff -u validate_simpletypes1_warnings.txt validate_simpletypes2_warnings.txt",
+  "diff -u reference_simpletype1_sub.py reference_simpletype2_sub.py",
+  "diff -u reference_simpletype1_sup.py reference_simpletype2_sup.py",
+  "diff -u OnePer/oneperType00_2One.py OnePer/oneperType00_1One.py",
+  "diff -u OnePer/oneperType01_2One.py OnePer/oneperType01_1One.py",
+  "diff -u OnePer/oneperType02_2One.py OnePer/oneperType02_1One.py",
+  "diff -u OnePer/oneperType03_2One.py OnePer/oneperType03_1One.py",
+  "diff -u cdata1_sub.py cdata2_sub.py",
+  "diff -u cdata1_sup.py cdata2_sup.py",
+  "diff -u cdata1.xml cdata2.xml",
+  "diff -u defaults_coverage1_sub.py defaults_coverage2_sub.py",
+  "diff -u defaults_coverage1_sup.py defaults_coverage2_sup.py",
+  "diff -u defaults_cases1_sub.py defaults_cases2_sub.py",
+  "diff -u defaults_cases1_sup.py defaults_cases2_sup.py",
+  "diff -u cleanupname1_sub.py cleanupname2_sub.py",
+  "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",
+]
+
+def check
+  #puts $divider
+  error_count = 0
+  $commands.each do |command|
+    infile = IO.popen command
+    has_content = false
+    infile.each_line do |line|
+      puts line
+      has_content = true
+    end
+    infile.close
+    if has_content
+      puts $divider
+      error_count += 1
+    end
+  end
+  puts "Error count: #{error_count}"
+end
+
+def main
+  check
+end
+
+if __FILE__ == $0                                                                   
+  main()                                                                            
+end                                                                                 
diff --git a/tests/cleanupname.xsd b/tests/cleanupname.xsd
new file mode 100644
index 0000000..0674221
--- /dev/null
+++ b/tests/cleanupname.xsd
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+    <xs:element name="data" type="dataType"/>
+
+    <xs:complexType name="dataType">
+        <xs:sequence>
+            <xs:element name="data1" type="data1Type"/>
+            <xs:element name="data2" type="TypeData2"/>
+            <xs:element name="data3" type="RealTypeData3"/>
+            <xs:element name="data4" type="AABBCCdataType"/>
+            <xs:element name="data5" type="dataTypeXYZAXYZ"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="data1Type">
+        <xs:sequence>
+            <xs:element name="content1" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="TypeData2">
+        <xs:sequence>
+            <xs:element name="content1" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="RealTypeData3">
+        <xs:sequence>
+            <xs:element name="content1" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="AABBCCdataType">
+        <xs:sequence>
+            <xs:element name="content1" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="dataTypeXYZAXYZ">
+        <xs:sequence>
+            <xs:element name="content1" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
diff --git a/tests/cleanupname1_sub.py b/tests/cleanupname1_sub.py
new file mode 100644
index 0000000..c00f3e0
--- /dev/null
+++ b/tests/cleanupname1_sub.py
@@ -0,0 +1,209 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/cleanupname2_sup.py')
+#   ('-s', 'tests/cleanupname2_sub.py')
+#   ('--super', 'cleanupname2_sup')
+#   ('--cleanup-name-list', "[('[-:.]', '_'), ('^Type', 'Class'), ('Type$', 'Kind'), ('[ABC]', 'M'), ('[XYZ]', 'N'), ]")
+#
+# Command line arguments:
+#   tests/cleanupname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/cleanupname2_sup.py" -s "tests/cleanupname2_sub.py" --super="cleanupname2_sup" --cleanup-name-list="[('[-:.]', '_'), ('^Type', 'Class'), ('Type$', 'Kind'), ('[ABC]', 'M'), ('[XYZ]', 'N'), ]" tests/cleanupname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import cleanupname2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class dataKindSub(supermod.dataKind):
+    def __init__(self, data1=None, data2=None, data3=None, data4=None, data5=None):
+        super(dataKindSub, self).__init__(data1, data2, data3, data4, data5, )
+supermod.dataKind.subclass = dataKindSub
+# end class dataKindSub
+
+
+class data1KindSub(supermod.data1Kind):
+    def __init__(self, content1=None):
+        super(data1KindSub, self).__init__(content1, )
+supermod.data1Kind.subclass = data1KindSub
+# end class data1KindSub
+
+
+class MlassData2Sub(supermod.MlassData2):
+    def __init__(self, content1=None):
+        super(MlassData2Sub, self).__init__(content1, )
+supermod.MlassData2.subclass = MlassData2Sub
+# end class MlassData2Sub
+
+
+class RealTypeData3Sub(supermod.RealTypeData3):
+    def __init__(self, content1=None):
+        super(RealTypeData3Sub, self).__init__(content1, )
+supermod.RealTypeData3.subclass = RealTypeData3Sub
+# end class RealTypeData3Sub
+
+
+class MMMMMMdataKindSub(supermod.MMMMMMdataKind):
+    def __init__(self, content1=None):
+        super(MMMMMMdataKindSub, self).__init__(content1, )
+supermod.MMMMMMdataKind.subclass = MMMMMMdataKindSub
+# end class MMMMMMdataKindSub
+
+
+class dataTypeNNNMNNNSub(supermod.dataTypeNNNMNNN):
+    def __init__(self, content1=None):
+        super(dataTypeNNNMNNNSub, self).__init__(content1, )
+supermod.dataTypeNNNMNNN.subclass = dataTypeNNNMNNNSub
+# end class dataTypeNNNMNNNSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'dataKind'
+        rootClass = supermod.dataKind
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'dataKind'
+        rootClass = supermod.dataKind
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'dataKind'
+        rootClass = supermod.dataKind
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'dataKind'
+        rootClass = supermod.dataKind
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from cleanupname2_sup import *\n\n')
+##         sys.stdout.write('import cleanupname2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/anywildcard2_sup.py b/tests/cleanupname1_sup.py
similarity index 60%
rename from tests/anywildcard2_sup.py
rename to tests/cleanupname1_sup.py
index 3f3e914..59f05e9 100644
--- a/tests/anywildcard2_sup.py
+++ b/tests/cleanupname1_sup.py
@@ -4,66 +4,55 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/cleanupname2_sup.py')
+#   ('-s', 'tests/cleanupname2_sub.py')
+#   ('--super', 'cleanupname2_sup')
+#   ('--cleanup-name-list', "[('[-:.]', '_'), ('^Type', 'Class'), ('Type$', 'Kind'), ('[ABC]', 'M'), ('[XYZ]', 'N'), ]")
+#
+# Command line arguments:
+#   tests/cleanupname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/cleanupname2_sup.py" -s "tests/cleanupname2_sub.py" --super="cleanupname2_sup" --cleanup-name-list="[('[-:.]', '_'), ('^Type', 'Class'), ('Type$', 'Kind'), ('[ABC]', 'M'), ('[XYZ]', 'N'), ]" tests/cleanupname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +64,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +80,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +149,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +204,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +215,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +238,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +262,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +294,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +364,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +412,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +430,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +515,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +556,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -608,590 +661,505 @@ def _cast(typ, value):
 #
 
 
-class PlantType_single(GeneratedsSuper):
+class dataKind(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('', 'xs:string', 0),
-        MemberSpec_('description', 'DescriptionType', 0),
+        MemberSpec_('data1', 'data1Type', 0),
+        MemberSpec_('data2', 'TypeData2', 0),
+        MemberSpec_('data3', 'RealTypeData3', 0),
+        MemberSpec_('data4', 'AABBCCdataType', 0),
+        MemberSpec_('data5', 'dataTypeXYZAXYZ', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, name=None, anytypeobjs_=None, description=None):
-        self.name = name
-        self.anytypeobjs_ = anytypeobjs_
-        self.description = description
+    def __init__(self, data1=None, data2=None, data3=None, data4=None, data5=None):
+        self.original_tagname_ = None
+        self.data1 = data1
+        self.data2 = data2
+        self.data3 = data3
+        self.data4 = data4
+        self.data5 = data5
     def factory(*args_, **kwargs_):
-        if PlantType_single.subclass:
-            return PlantType_single.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, dataKind)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if dataKind.subclass:
+            return dataKind.subclass(*args_, **kwargs_)
         else:
-            return PlantType_single(*args_, **kwargs_)
+            return dataKind(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def get_anytypeobjs_(self): return self.anytypeobjs_
-    def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ = anytypeobjs_
-    def get_description(self): return self.description
-    def set_description(self, description): self.description = description
+    def get_data1(self): return self.data1
+    def set_data1(self, data1): self.data1 = data1
+    def get_data2(self): return self.data2
+    def set_data2(self, data2): self.data2 = data2
+    def get_data3(self): return self.data3
+    def set_data3(self, data3): self.data3 = data3
+    def get_data4(self): return self.data4
+    def set_data4(self, data4): self.data4 = data4
+    def get_data5(self): return self.data5
+    def set_data5(self, data5): self.data5 = data5
     def hasContent_(self):
         if (
-            self.name is not None or
-            self.anytypeobjs_ is not None or
-            self.description is not None
+            self.data1 is not None or
+            self.data2 is not None or
+            self.data3 is not None or
+            self.data4 is not None or
+            self.data5 is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='PlantType_single', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='dataType', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_single')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='dataType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='dataType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PlantType_single'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='dataType'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='PlantType_single', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='dataType', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.name is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
-        if self.description is not None:
-            self.description.export(outfile, level, namespace_, name_='description', pretty_print=pretty_print)
-        if self.anytypeobjs_ is not None:
-            self.anytypeobjs_.export(outfile, level, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PlantType_single'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        if self.anytypeobjs_ is not None:
-            showIndent(outfile, level)
-            outfile.write('anytypeobjs_=model_.anytypeobjs_(\n')
-            self.anytypeobjs_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.description is not None:
-            showIndent(outfile, level)
-            outfile.write('description=model_.DescriptionType(\n')
-            self.description.exportLiteral(outfile, level, name_='description')
-            showIndent(outfile, level)
-            outfile.write('),\n')
+        if self.data1 is not None:
+            self.data1.export(outfile, level, namespace_, name_='data1', pretty_print=pretty_print)
+        if self.data2 is not None:
+            self.data2.export(outfile, level, namespace_, name_='data2', pretty_print=pretty_print)
+        if self.data3 is not None:
+            self.data3.export(outfile, level, namespace_, name_='data3', pretty_print=pretty_print)
+        if self.data4 is not None:
+            self.data4.export(outfile, level, namespace_, name_='data4', pretty_print=pretty_print)
+        if self.data5 is not None:
+            self.data5.export(outfile, level, namespace_, name_='data5', pretty_print=pretty_print)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'name':
-            name_ = child_.text
-            name_ = self.gds_validate_string(name_, node, 'name')
-            self.name = name_
-        elif nodeName_ == 'description':
-            obj_ = DescriptionType.factory()
+        if nodeName_ == 'data1':
+            obj_ = data1Kind.factory()
             obj_.build(child_)
-            self.description = obj_
-        else:
-            obj_ = self.gds_build_any(child_, 'PlantType_single')
-            if obj_ is not None:
-                self.set_anytypeobjs_(obj_)
-# end class PlantType_single
+            self.data1 = obj_
+            obj_.original_tagname_ = 'data1'
+        elif nodeName_ == 'data2':
+            obj_ = MlassData2.factory()
+            obj_.build(child_)
+            self.data2 = obj_
+            obj_.original_tagname_ = 'data2'
+        elif nodeName_ == 'data3':
+            obj_ = RealTypeData3.factory()
+            obj_.build(child_)
+            self.data3 = obj_
+            obj_.original_tagname_ = 'data3'
+        elif nodeName_ == 'data4':
+            obj_ = MMMMMMdataKind.factory()
+            obj_.build(child_)
+            self.data4 = obj_
+            obj_.original_tagname_ = 'data4'
+        elif nodeName_ == 'data5':
+            obj_ = dataTypeNNNMNNN.factory()
+            obj_.build(child_)
+            self.data5 = obj_
+            obj_.original_tagname_ = 'data5'
+# end class dataKind
 
 
-class PlantType_multiple(GeneratedsSuper):
+class data1Kind(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('', 'xs:string', 1),
-        MemberSpec_('description', 'DescriptionType', 0),
+        MemberSpec_('content1', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, name=None, anytypeobjs_=None, description=None):
-        self.name = name
-        if anytypeobjs_ is None:
-            self.anytypeobjs_ = []
-        else:
-            self.anytypeobjs_ = anytypeobjs_
-        self.description = description
+    def __init__(self, content1=None):
+        self.original_tagname_ = None
+        self.content1 = content1
     def factory(*args_, **kwargs_):
-        if PlantType_multiple.subclass:
-            return PlantType_multiple.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, data1Kind)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if data1Kind.subclass:
+            return data1Kind.subclass(*args_, **kwargs_)
         else:
-            return PlantType_multiple(*args_, **kwargs_)
+            return data1Kind(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def get_anytypeobjs_(self): return self.anytypeobjs_
-    def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ = anytypeobjs_
-    def add_anytypeobjs_(self, value): self.anytypeobjs_.append(value)
-    def insert_anytypeobjs_(self, index, value): self._anytypeobjs_[index] = value
-    def get_description(self): return self.description
-    def set_description(self, description): self.description = description
+    def get_content1(self): return self.content1
+    def set_content1(self, content1): self.content1 = content1
     def hasContent_(self):
         if (
-            self.name is not None or
-            self.anytypeobjs_ or
-            self.description is not None
+            self.content1 is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='PlantType_multiple', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='data1Type', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_multiple')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='data1Type')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='data1Type', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PlantType_multiple'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='data1Type'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='PlantType_multiple', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='data1Type', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.name is not None:
+        if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
-        if self.description is not None:
-            self.description.export(outfile, level, namespace_, name_='description', pretty_print=pretty_print)
-        for obj_ in self.anytypeobjs_:
-            obj_.export(outfile, level, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PlantType_multiple'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        showIndent(outfile, level)
-        outfile.write('anytypeobjs_=[\n')
-        level += 1
-        for anytypeobjs_ in self.anytypeobjs_:
-            anytypeobjs_.exportLiteral(outfile, level)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.description is not None:
-            showIndent(outfile, level)
-            outfile.write('description=model_.DescriptionType(\n')
-            self.description.exportLiteral(outfile, level, name_='description')
-            showIndent(outfile, level)
-            outfile.write('),\n')
+            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'name':
-            name_ = child_.text
-            name_ = self.gds_validate_string(name_, node, 'name')
-            self.name = name_
-        elif nodeName_ == 'description':
-            obj_ = DescriptionType.factory()
-            obj_.build(child_)
-            self.description = obj_
-        else:
-            obj_ = self.gds_build_any(child_, 'PlantType_multiple')
-            if obj_ is not None:
-                self.add_anytypeobjs_(obj_)
-# end class PlantType_multiple
+        if nodeName_ == 'content1':
+            content1_ = child_.text
+            content1_ = self.gds_validate_string(content1_, node, 'content1')
+            self.content1 = content1_
+# end class data1Kind
 
 
-class DescriptionType(GeneratedsSuper):
-    """A standard complexType."""
+class MlassData2(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('size', 'xs:string', 0),
+        MemberSpec_('content1', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, name=None, size=None):
-        self.name = name
-        self.size = size
+    def __init__(self, content1=None):
+        self.original_tagname_ = None
+        self.content1 = content1
     def factory(*args_, **kwargs_):
-        if DescriptionType.subclass:
-            return DescriptionType.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, MlassData2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if MlassData2.subclass:
+            return MlassData2.subclass(*args_, **kwargs_)
         else:
-            return DescriptionType(*args_, **kwargs_)
+            return MlassData2(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def get_size(self): return self.size
-    def set_size(self, size): self.size = size
+    def get_content1(self): return self.content1
+    def set_content1(self, content1): self.content1 = content1
     def hasContent_(self):
         if (
-            self.name is not None or
-            self.size is not None
+            self.content1 is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='DescriptionType', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='TypeData2', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='DescriptionType')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='TypeData2')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='TypeData2', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DescriptionType'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='TypeData2'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='DescriptionType', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='TypeData2', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.name is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
-        if self.size is not None:
+        if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%ssize>%s</%ssize>%s' % (namespace_, self.gds_format_string(quote_xml(self.size).encode(ExternalEncoding), input_name='size'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='DescriptionType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        if self.size is not None:
-            showIndent(outfile, level)
-            outfile.write('size=%s,\n' % quote_python(self.size).encode(ExternalEncoding))
+            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'name':
-            name_ = child_.text
-            name_ = self.gds_validate_string(name_, node, 'name')
-            self.name = name_
-        elif nodeName_ == 'size':
-            size_ = child_.text
-            size_ = self.gds_validate_string(size_, node, 'size')
-            self.size = size_
-# end class DescriptionType
-
-
-class CatalogType(GeneratedsSuper):
-    """A standard complexType."""
+        if nodeName_ == 'content1':
+            content1_ = child_.text
+            content1_ = self.gds_validate_string(content1_, node, 'content1')
+            self.content1 = content1_
+# end class MlassData2
+
+
+class RealTypeData3(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('name', 'xs:string', 0),
-        MemberSpec_('catagory', 'xs:integer', 0),
+        MemberSpec_('content1', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, name=None, catagory=None):
-        self.name = name
-        self.catagory = catagory
+    def __init__(self, content1=None):
+        self.original_tagname_ = None
+        self.content1 = content1
     def factory(*args_, **kwargs_):
-        if CatalogType.subclass:
-            return CatalogType.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, RealTypeData3)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if RealTypeData3.subclass:
+            return RealTypeData3.subclass(*args_, **kwargs_)
         else:
-            return CatalogType(*args_, **kwargs_)
+            return RealTypeData3(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def get_catagory(self): return self.catagory
-    def set_catagory(self, catagory): self.catagory = catagory
+    def get_content1(self): return self.content1
+    def set_content1(self, content1): self.content1 = content1
     def hasContent_(self):
         if (
-            self.name is not None or
-            self.catagory is not None
+            self.content1 is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='CatalogType', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='RealTypeData3', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='CatalogType')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='RealTypeData3')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='RealTypeData3', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='CatalogType'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='RealTypeData3'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='CatalogType', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='RealTypeData3', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.name is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
-        if self.catagory is not None:
+        if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scatagory>%s</%scatagory>%s' % (namespace_, self.gds_format_integer(self.catagory, input_name='catagory'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='CatalogType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        if self.catagory is not None:
-            showIndent(outfile, level)
-            outfile.write('catagory=%d,\n' % self.catagory)
+            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'name':
-            name_ = child_.text
-            name_ = self.gds_validate_string(name_, node, 'name')
-            self.name = name_
-        elif nodeName_ == 'catagory':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'catagory')
-            self.catagory = ival_
-# end class CatalogType
+        if nodeName_ == 'content1':
+            content1_ = child_.text
+            content1_ = self.gds_validate_string(content1_, node, 'content1')
+            self.content1 = content1_
+# end class RealTypeData3
 
 
-class PlantType_single_nochild(GeneratedsSuper):
+class MMMMMMdataKind(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('', 'xs:string', 0),
+        MemberSpec_('content1', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, anytypeobjs_=None):
-        self.anytypeobjs_ = anytypeobjs_
+    def __init__(self, content1=None):
+        self.original_tagname_ = None
+        self.content1 = content1
     def factory(*args_, **kwargs_):
-        if PlantType_single_nochild.subclass:
-            return PlantType_single_nochild.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, MMMMMMdataKind)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if MMMMMMdataKind.subclass:
+            return MMMMMMdataKind.subclass(*args_, **kwargs_)
         else:
-            return PlantType_single_nochild(*args_, **kwargs_)
+            return MMMMMMdataKind(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_anytypeobjs_(self): return self.anytypeobjs_
-    def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ = anytypeobjs_
+    def get_content1(self): return self.content1
+    def set_content1(self, content1): self.content1 = content1
     def hasContent_(self):
         if (
-            self.anytypeobjs_ is not None
+            self.content1 is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='PlantType_single_nochild', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='AABBCCdataType', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_single_nochild')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='AABBCCdataType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='AABBCCdataType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PlantType_single_nochild'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='AABBCCdataType'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='PlantType_single_nochild', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='AABBCCdataType', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.anytypeobjs_ is not None:
-            self.anytypeobjs_.export(outfile, level, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PlantType_single_nochild'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.anytypeobjs_ is not None:
-            showIndent(outfile, level)
-            outfile.write('anytypeobjs_=model_.anytypeobjs_(\n')
-            self.anytypeobjs_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
+        if self.content1 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        obj_ = self.gds_build_any(child_, 'PlantType_single_nochild')
-        if obj_ is not None:
-            self.set_anytypeobjs_(obj_)
-# end class PlantType_single_nochild
+        if nodeName_ == 'content1':
+            content1_ = child_.text
+            content1_ = self.gds_validate_string(content1_, node, 'content1')
+            self.content1 = content1_
+# end class MMMMMMdataKind
 
 
-class PlantType_multiple_nochild(GeneratedsSuper):
+class dataTypeNNNMNNN(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('', 'xs:string', 1),
+        MemberSpec_('content1', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, anytypeobjs_=None):
-        if anytypeobjs_ is None:
-            self.anytypeobjs_ = []
-        else:
-            self.anytypeobjs_ = anytypeobjs_
+    def __init__(self, content1=None):
+        self.original_tagname_ = None
+        self.content1 = content1
     def factory(*args_, **kwargs_):
-        if PlantType_multiple_nochild.subclass:
-            return PlantType_multiple_nochild.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, dataTypeNNNMNNN)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if dataTypeNNNMNNN.subclass:
+            return dataTypeNNNMNNN.subclass(*args_, **kwargs_)
         else:
-            return PlantType_multiple_nochild(*args_, **kwargs_)
+            return dataTypeNNNMNNN(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_anytypeobjs_(self): return self.anytypeobjs_
-    def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ = anytypeobjs_
-    def add_anytypeobjs_(self, value): self.anytypeobjs_.append(value)
-    def insert_anytypeobjs_(self, index, value): self._anytypeobjs_[index] = value
+    def get_content1(self): return self.content1
+    def set_content1(self, content1): self.content1 = content1
     def hasContent_(self):
         if (
-            self.anytypeobjs_
+            self.content1 is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='PlantType_multiple_nochild', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='dataTypeXYZAXYZ', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_multiple_nochild')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='dataTypeXYZAXYZ')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='dataTypeXYZAXYZ', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PlantType_multiple_nochild'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='dataTypeXYZAXYZ'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='PlantType_multiple_nochild', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='dataTypeXYZAXYZ', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        for obj_ in self.anytypeobjs_:
-            obj_.export(outfile, level, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PlantType_multiple_nochild'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('anytypeobjs_=[\n')
-        level += 1
-        for anytypeobjs_ in self.anytypeobjs_:
-            anytypeobjs_.exportLiteral(outfile, level)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
+        if self.content1 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        obj_ = self.gds_build_any(child_, 'PlantType_multiple_nochild')
-        if obj_ is not None:
-            self.add_anytypeobjs_(obj_)
-# end class PlantType_multiple_nochild
+        if nodeName_ == 'content1':
+            content1_ = child_.text
+            content1_ = self.gds_validate_string(content1_, node, 'content1')
+            self.content1 = content1_
+# end class dataTypeNNNMNNN
 
 
 GDSClassesMapping = {
-    'description': DescriptionType,
+    'data': dataKind,
+    'data1': data1Kind,
+    'data2': MlassData2,
+    'data3': RealTypeData3,
+    'data4': MMMMMMdataKind,
+    'data5': dataTypeNNNMNNN,
 }
 
 
@@ -1201,7 +1169,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -1214,12 +1182,13 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'PlantType_single'
-        rootClass = PlantType_single
+        rootTag = 'dataKind'
+        rootClass = dataKind
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -1234,12 +1203,13 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'PlantType_single'
-        rootClass = PlantType_single
+        rootTag = 'dataKind'
+        rootClass = dataKind
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -1257,13 +1227,17 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = PlantType_single
+        rootTag = 'dataKind'
+        rootClass = dataKind
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -1271,26 +1245,27 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="PlantType_single",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'PlantType_single'
-        rootClass = PlantType_single
+        rootTag = 'dataKind'
+        rootClass = dataKind
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
 ##     if not silence:
-##         sys.stdout.write('#from anywildcard2_sup import *\n\n')
-##         sys.stdout.write('import anywildcard2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('#from cleanupname2_sup import *\n\n')
+##         sys.stdout.write('import cleanupname2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
@@ -1310,10 +1285,10 @@ if __name__ == '__main__':
 
 
 __all__ = [
-    "CatalogType",
-    "DescriptionType",
-    "PlantType_multiple",
-    "PlantType_multiple_nochild",
-    "PlantType_single",
-    "PlantType_single_nochild"
+    "MMMMMMdataKind",
+    "MlassData2",
+    "RealTypeData3",
+    "data1Kind",
+    "dataKind",
+    "dataTypeNNNMNNN"
 ]
diff --git a/tests/compare_sub b/tests/compare_sub
new file mode 100755
index 0000000..df57aba
--- /dev/null
+++ b/tests/compare_sub
@@ -0,0 +1,3 @@
+#!/bin/bash -x
+diff -u ${1}1_sub.py ${1}2_sub.py | vim -R -
+
diff --git a/tests/compare_sup b/tests/compare_sup
new file mode 100755
index 0000000..552d6ac
--- /dev/null
+++ b/tests/compare_sup
@@ -0,0 +1,3 @@
+#!/bin/bash -x
+diff -u ${1}1_sup.py ${1}2_sup.py | vim -R -
+
diff --git a/tests/copy_all b/tests/copy_all
new file mode 100755
index 0000000..b89ea43
--- /dev/null
+++ b/tests/copy_all
@@ -0,0 +1,59 @@
+#!/bin/bash -x
+cp out2_sub.py out1_sub.py
+cp out2_sup.py out1_sup.py
+cp anysimpletype2_sub.py anysimpletype1_sub.py
+cp anysimpletype2_sup.py anysimpletype1_sup.py
+cp simpletype_memberspecs2_sub.py simpletype_memberspecs1_sub.py
+cp simpletype_memberspecs2_sup.py simpletype_memberspecs1_sup.py
+cp extensions2_sub.py extensions1_sub.py
+cp extensions2_sup.py extensions1_sup.py
+cp simplecontent_restriction2_sub.py simplecontent_restriction1_sub.py
+cp simplecontent_restriction2_sup.py simplecontent_restriction1_sup.py
+cp annotations2_sub.py annotations1_sub.py
+cp annotations2_sup.py annotations1_sup.py
+cp abstract_type2_sub.py abstract_type1_sub.py
+cp abstract_type2_sup.py abstract_type1_sup.py
+cp people_procincl2_sub.py people_procincl1_sub.py
+cp people_procincl2_sup.py people_procincl1_sup.py
+cp ipo2_sub.py ipo1_sub.py
+cp ipo2_sup.py ipo1_sup.py
+cp recursive_simpletype2_sub.py recursive_simpletype1_sub.py
+cp recursive_simpletype2_sup.py recursive_simpletype1_sup.py
+cp anywildcard2_sub.py anywildcard1_sub.py
+cp anywildcard2_sup.py anywildcard1_sup.py
+cp attr_groups2_sub.py attr_groups1_sub.py
+cp attr_groups2_sup.py attr_groups1_sup.py
+cp simpletypes_other2_sub.py simpletypes_other1_sub.py
+cp simpletypes_other2_sup.py simpletypes_other1_sup.py
+cp to_etree2_sub.py to_etree1_sub.py
+cp to_etree2_sup.py to_etree1_sup.py
+cp anonymous_type2_sub.py anonymous_type1_sub.py
+cp anonymous_type2_sup.py anonymous_type1_sup.py
+cp mapcleanname2_sub.py mapcleanname1_sub.py
+cp mapcleanname2_sup.py mapcleanname1_sup.py
+cp prefix_classname2_sub.py prefix_classname1_sub.py
+cp prefix_classname2_sup.py prefix_classname1_sup.py
+cp validate_simpletypes2_sub.py validate_simpletypes1_sub.py
+cp validate_simpletypes2_sup.py validate_simpletypes1_sup.py
+cp validate_simpletypes2_warnings.txt validate_simpletypes1_warnings.txt
+cp reference_simpletype2_sub.py reference_simpletype1_sub.py
+cp reference_simpletype2_sup.py reference_simpletype1_sup.py
+cp OnePer/oneperType00_1One.py OnePer/oneperType00_2One.py
+cp OnePer/oneperType01_1One.py OnePer/oneperType01_2One.py
+cp OnePer/oneperType02_1One.py OnePer/oneperType02_2One.py
+cp OnePer/oneperType03_1One.py OnePer/oneperType03_2One.py
+cp cdata2_sup.py cdata1_sup.py
+cp cdata2_sub.py cdata1_sub.py
+cp cdata2.xml cdata1.xml
+cp defaults_coverage2_sup.py defaults_coverage1_sup.py
+cp defaults_coverage2_sub.py defaults_coverage1_sub.py
+cp defaults_cases2_sup.py defaults_cases1_sup.py
+cp defaults_cases2_sub.py defaults_cases1_sub.py
+cp nested_def2_sup.py nested_def1_sup.py
+cp nested_def2_sub.py nested_def1_sub.py
+cp cleanupname2_sup.py cleanupname1_sup.py
+cp cleanupname2_sub.py cleanupname1_sub.py
+cp catalogtest2_sup.py catalogtest1_sup.py
+cp catalogtest2_sub.py catalogtest1_sub.py
+cp rem_dup_elems2_sup.py rem_dup_elems1_sup.py
+cp rem_dup_elems2_sub.py rem_dup_elems1_sub.py
diff --git a/tests/copy_both b/tests/copy_both
new file mode 100755
index 0000000..ded86d8
--- /dev/null
+++ b/tests/copy_both
@@ -0,0 +1,3 @@
+#!/bin/bash -x
+cp ${1}2_sup.py ${1}1_sup.py
+cp ${1}2_sub.py ${1}1_sub.py
diff --git a/tests/defaults_cases.xml b/tests/defaults_cases.xml
new file mode 100644
index 0000000..5862ed4
--- /dev/null
+++ b/tests/defaults_cases.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<defaults>
+    <default1>
+        <!-- case 1 -->
+        <!-- case 2 -->
+        <normal02>a new value 1</normal02>
+        <!-- case 3 -->
+        <!-- case 4 -->
+        <default02>a new value 2</default02>
+        <!-- case 5 -->
+        <!--
+        -->
+        <normal03>55.66</normal03>
+        <!-- case 6 -->
+        <normal04>66.77</normal04>
+        <!-- case 7 -->
+        <!--
+        -->
+        <default03>77.88</default03>
+        <!-- case 8 -->
+        <default04>88.99</default04>
+    </default1>
+
+    <default2 attrdefault01="xyz"/>
+    <default2 attrdefault02="14"/>
+    <default2 />
+    <default2 attrnormal01="wxy"/>
+    <default2 attrnormal02="89"/>
+
+</defaults>
+
diff --git a/tests/defaults_cases.xsd b/tests/defaults_cases.xsd
new file mode 100644
index 0000000..32cafe4
--- /dev/null
+++ b/tests/defaults_cases.xsd
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+    <xs:element name="defaults" type="DefaultTypes"/>
+
+    <xs:complexType name="DefaultTypes">
+        <xs:sequence>
+            <xs:element name="default1" type="DefaultType1"
+                maxOccurs="unbounded"/>
+            <xs:element name="default2" type="DefaultType2"
+                maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="DefaultType1">
+        <xs:sequence>
+            <!--
+                *case 1:*
+                xsd: element optional, no default value given
+                xml: element missing
+                output: element missing
+            -->
+            <xs:element name="normal01" type="xs:integer"
+                minOccurs="0"/>
+            <!--
+                *case 2:*
+                xsd: element optional, no default value given
+                xml: element exists
+                output: element is unchanged
+            -->
+            <xs:element name="normal02" type="xs:string"
+                minOccurs="0"/>
+            <!--
+                *case 3:*
+                xsd: element optional, default value given
+                xml: element missing
+                expected output: element missing
+                current output: missing element is added with default value
+            -->
+            <xs:element name="default01" type="xs:integer" default="23"
+                minOccurs="0"/>
+            <!--
+                *case 4:*
+                xsd: element optional, default value given
+                xml: element exists
+                output: element is unchanged
+            -->
+            <xs:element name="default02" type="xs:string" default="Peach"
+                minOccurs="0"/>
+            <!--
+                *case 5:*
+                xsd: element mandatory, no default value given
+                xml: element missing
+                error on reading xml
+            -->
+            <xs:element name="normal03" type="xs:float"
+                minOccurs="1"/>
+            <!--
+                *case 6:*
+                xsd: element mandatory, no default value given
+                xml: element exists
+                output: element is unchanged
+            -->
+            <xs:element name="normal04" type="xs:double"
+                minOccurs="1"/>
+            <!--
+                *case 7:*
+                xsd: element mandatory, default value given
+                xml: element missing
+                error on reading xml
+                output: missing element is generated with default value
+            -->
+            <xs:element name="default03" type="xs:float" default="23.45"
+                minOccurs="1"/>
+            <!--
+                *case 8:*
+                xsd: element mandatory, default value given
+                xml: element exists
+                output: element is unchanged
+            -->
+            <xs:element name="default04" type="xs:double" default="54.32"
+                minOccurs="1"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="DefaultType2">
+        <xs:sequence>
+        </xs:sequence>
+        <xs:attribute name="attrdefault01" type="xs:string" default="abcd"/>
+        <xs:attribute name="attrdefault02" type="xs:integer" default="14"/>
+        <xs:attribute name="attrnormal01" type="xs:string"/>
+        <xs:attribute name="attrnormal02" type="xs:integer"/>
+    </xs:complexType>
+
+</xs:schema>
diff --git a/tests/defaults_cases1_out.xml b/tests/defaults_cases1_out.xml
new file mode 100644
index 0000000..58064fb
--- /dev/null
+++ b/tests/defaults_cases1_out.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" ?>
+<defaults>
+    <default1>
+        <normal02>a new value 1</normal02>
+        <default02>a new value 2</default02>
+        <normal03>55.659999999999997</normal03>
+        <normal04>6.677000e+01</normal04>
+        <default03>77.879999999999995</default03>
+        <default04>8.899000e+01</default04>
+    </default1>
+    <default2 attrdefault01="xyz"/>
+    <default2/>
+    <default2/>
+    <default2 attrnormal01="wxy"/>
+    <default2 attrnormal02="89"/>
+</defaults>
diff --git a/tests/defaults_cases1_sub.py b/tests/defaults_cases1_sub.py
new file mode 100644
index 0000000..3e60267
--- /dev/null
+++ b/tests/defaults_cases1_sub.py
@@ -0,0 +1,186 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/defaults_cases2_sup.py')
+#   ('-s', 'tests/defaults_cases2_sub.py')
+#   ('--super', 'defaults_cases2_sup')
+#
+# Command line arguments:
+#   tests/defaults_cases.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/defaults_cases2_sup.py" -s "tests/defaults_cases2_sub.py" --super="defaults_cases2_sup" tests/defaults_cases.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import defaults_cases2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class DefaultTypesSub(supermod.DefaultTypes):
+    def __init__(self, default1=None, default2=None):
+        super(DefaultTypesSub, self).__init__(default1, default2, )
+supermod.DefaultTypes.subclass = DefaultTypesSub
+# end class DefaultTypesSub
+
+
+class DefaultType1Sub(supermod.DefaultType1):
+    def __init__(self, normal01=None, normal02=None, default01=23, default02='Peach', normal03=None, normal04=None, default03=23.45, default04=54.32):
+        super(DefaultType1Sub, self).__init__(normal01, normal02, default01, default02, normal03, normal04, default03, default04, )
+supermod.DefaultType1.subclass = DefaultType1Sub
+# end class DefaultType1Sub
+
+
+class DefaultType2Sub(supermod.DefaultType2):
+    def __init__(self, attrdefault01='abcd', attrdefault02=14, attrnormal01=None, attrnormal02=None):
+        super(DefaultType2Sub, self).__init__(attrdefault01, attrdefault02, attrnormal01, attrnormal02, )
+supermod.DefaultType2.subclass = DefaultType2Sub
+# end class DefaultType2Sub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = supermod.DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = supermod.DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = supermod.DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = supermod.DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from defaults_cases2_sup import *\n\n')
+        sys.stdout.write('import defaults_cases2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py
new file mode 100644
index 0000000..7eb901a
--- /dev/null
+++ b/tests/defaults_cases1_sup.py
@@ -0,0 +1,1182 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/defaults_cases2_sup.py')
+#   ('-s', 'tests/defaults_cases2_sub.py')
+#   ('--super', 'defaults_cases2_sup')
+#
+# Command line arguments:
+#   tests/defaults_cases.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/defaults_cases2_sup.py" -s "tests/defaults_cases2_sub.py" --super="defaults_cases2_sup" tests/defaults_cases.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class DefaultTypes(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('default1', 'DefaultType1', 1),
+        MemberSpec_('default2', 'DefaultType2', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, default1=None, default2=None):
+        self.original_tagname_ = None
+        if default1 is None:
+            self.default1 = []
+        else:
+            self.default1 = default1
+        if default2 is None:
+            self.default2 = []
+        else:
+            self.default2 = default2
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, DefaultTypes)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if DefaultTypes.subclass:
+            return DefaultTypes.subclass(*args_, **kwargs_)
+        else:
+            return DefaultTypes(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_default1(self): return self.default1
+    def set_default1(self, default1): self.default1 = default1
+    def add_default1(self, value): self.default1.append(value)
+    def insert_default1_at(self, index, value): self.default1.insert(index, value)
+    def replace_default1_at(self, index, value): self.default1[index] = value
+    def get_default2(self): return self.default2
+    def set_default2(self, default2): self.default2 = default2
+    def add_default2(self, value): self.default2.append(value)
+    def insert_default2_at(self, index, value): self.default2.insert(index, value)
+    def replace_default2_at(self, index, value): self.default2[index] = value
+    def hasContent_(self):
+        if (
+            self.default1 or
+            self.default2
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='DefaultTypes', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultTypes')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultTypes', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultTypes'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='DefaultTypes', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for default1_ in self.default1:
+            default1_.export(outfile, level, namespace_, name_='default1', pretty_print=pretty_print)
+        for default2_ in self.default2:
+            default2_.export(outfile, level, namespace_, name_='default2', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'default1':
+            obj_ = DefaultType1.factory()
+            obj_.build(child_)
+            self.default1.append(obj_)
+            obj_.original_tagname_ = 'default1'
+        elif nodeName_ == 'default2':
+            obj_ = DefaultType2.factory()
+            obj_.build(child_)
+            self.default2.append(obj_)
+            obj_.original_tagname_ = 'default2'
+# end class DefaultTypes
+
+
+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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, normal01=None, normal02=None, default01=23, default02='Peach', normal03=None, normal04=None, default03=23.45, default04=54.32):
+        self.original_tagname_ = None
+        self.normal01 = normal01
+        self.normal02 = normal02
+        self.default01 = default01
+        self.default02 = default02
+        self.normal03 = normal03
+        self.normal04 = normal04
+        self.default03 = default03
+        self.default04 = default04
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, DefaultType1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if DefaultType1.subclass:
+            return DefaultType1.subclass(*args_, **kwargs_)
+        else:
+            return DefaultType1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_normal01(self): return self.normal01
+    def set_normal01(self, normal01): self.normal01 = normal01
+    def get_normal02(self): return self.normal02
+    def set_normal02(self, normal02): self.normal02 = normal02
+    def get_default01(self): return self.default01
+    def set_default01(self, default01): self.default01 = default01
+    def get_default02(self): return self.default02
+    def set_default02(self, default02): self.default02 = default02
+    def get_normal03(self): return self.normal03
+    def set_normal03(self, normal03): self.normal03 = normal03
+    def get_normal04(self): return self.normal04
+    def set_normal04(self, normal04): self.normal04 = normal04
+    def get_default03(self): return self.default03
+    def set_default03(self, default03): self.default03 = default03
+    def get_default04(self): return self.default04
+    def set_default04(self, default04): self.default04 = default04
+    def hasContent_(self):
+        if (
+            self.normal01 is not None or
+            self.normal02 is not None or
+            self.default01 != 23 or
+            self.default02 != "Peach" or
+            self.normal03 is not None or
+            self.normal04 is not None or
+            self.default03 != 23.45 or
+            self.default04 != 54.32
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='DefaultType1', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultType1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultType1', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultType1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='DefaultType1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.normal01 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal01>%s</%snormal01>%s' % (namespace_, self.gds_format_integer(self.normal01, input_name='normal01'), namespace_, eol_))
+        if self.normal02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal02>%s</%snormal02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.normal02), input_name='normal02')), namespace_, eol_))
+        if self.default01 != 23:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault01>%s</%sdefault01>%s' % (namespace_, self.gds_format_integer(self.default01, input_name='default01'), namespace_, eol_))
+        if self.default02 != "Peach":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault02>%s</%sdefault02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.default02), input_name='default02')), namespace_, eol_))
+        if self.normal03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal03>%s</%snormal03>%s' % (namespace_, self.gds_format_float(self.normal03, input_name='normal03'), namespace_, eol_))
+        if self.normal04 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal04>%s</%snormal04>%s' % (namespace_, self.gds_format_double(self.normal04, input_name='normal04'), namespace_, eol_))
+        if self.default03 != 23.45:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault03>%s</%sdefault03>%s' % (namespace_, self.gds_format_float(self.default03, input_name='default03'), namespace_, eol_))
+        if self.default04 != 54.32:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault04>%s</%sdefault04>%s' % (namespace_, self.gds_format_double(self.default04, input_name='default04'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'normal01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'normal01')
+            self.normal01 = ival_
+        elif nodeName_ == 'normal02':
+            normal02_ = child_.text
+            normal02_ = self.gds_validate_string(normal02_, node, 'normal02')
+            self.normal02 = normal02_
+        elif nodeName_ == 'default01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'default01')
+            self.default01 = ival_
+        elif nodeName_ == 'default02':
+            default02_ = child_.text
+            default02_ = self.gds_validate_string(default02_, node, 'default02')
+            self.default02 = default02_
+        elif nodeName_ == 'normal03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'normal03')
+            self.normal03 = fval_
+        elif nodeName_ == 'normal04':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'normal04')
+            self.normal04 = fval_
+        elif nodeName_ == 'default03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'default03')
+            self.default03 = fval_
+        elif nodeName_ == 'default04':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'default04')
+            self.default04 = fval_
+# end class DefaultType1
+
+
+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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, attrdefault01='abcd', attrdefault02=14, attrnormal01=None, attrnormal02=None):
+        self.original_tagname_ = None
+        self.attrdefault01 = _cast(None, attrdefault01)
+        self.attrdefault02 = _cast(int, attrdefault02)
+        self.attrnormal01 = _cast(None, attrnormal01)
+        self.attrnormal02 = _cast(int, attrnormal02)
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, DefaultType2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if DefaultType2.subclass:
+            return DefaultType2.subclass(*args_, **kwargs_)
+        else:
+            return DefaultType2(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_attrdefault01(self): return self.attrdefault01
+    def set_attrdefault01(self, attrdefault01): self.attrdefault01 = attrdefault01
+    def get_attrdefault02(self): return self.attrdefault02
+    def set_attrdefault02(self, attrdefault02): self.attrdefault02 = attrdefault02
+    def get_attrnormal01(self): return self.attrnormal01
+    def set_attrnormal01(self, attrnormal01): self.attrnormal01 = attrnormal01
+    def get_attrnormal02(self): return self.attrnormal02
+    def set_attrnormal02(self, attrnormal02): self.attrnormal02 = attrnormal02
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='DefaultType2', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultType2')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultType2', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultType2'):
+        if self.attrdefault01 != "abcd" and 'attrdefault01' not in already_processed:
+            already_processed.add('attrdefault01')
+            outfile.write(' attrdefault01=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrdefault01), input_name='attrdefault01')), ))
+        if self.attrdefault02 != 14 and 'attrdefault02' not in already_processed:
+            already_processed.add('attrdefault02')
+            outfile.write(' attrdefault02="%s"' % self.gds_format_integer(self.attrdefault02, input_name='attrdefault02'))
+        if self.attrnormal01 is not None and 'attrnormal01' not in already_processed:
+            already_processed.add('attrnormal01')
+            outfile.write(' attrnormal01=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrnormal01), input_name='attrnormal01')), ))
+        if self.attrnormal02 is not None and 'attrnormal02' not in already_processed:
+            already_processed.add('attrnormal02')
+            outfile.write(' attrnormal02="%s"' % self.gds_format_integer(self.attrnormal02, input_name='attrnormal02'))
+    def exportChildren(self, outfile, level, namespace_='', name_='DefaultType2', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('attrdefault01', node)
+        if value is not None and 'attrdefault01' not in already_processed:
+            already_processed.add('attrdefault01')
+            self.attrdefault01 = value
+        value = find_attr_value_('attrdefault02', node)
+        if value is not None and 'attrdefault02' not in already_processed:
+            already_processed.add('attrdefault02')
+            try:
+                self.attrdefault02 = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('attrnormal01', node)
+        if value is not None and 'attrnormal01' not in already_processed:
+            already_processed.add('attrnormal01')
+            self.attrnormal01 = value
+        value = find_attr_value_('attrnormal02', node)
+        if value is not None and 'attrnormal02' not in already_processed:
+            already_processed.add('attrnormal02')
+            try:
+                self.attrnormal02 = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class DefaultType2
+
+
+GDSClassesMapping = {
+    'default1': DefaultType1,
+    'default2': DefaultType2,
+    'defaults': DefaultTypes,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from defaults_cases2_sup import *\n\n')
+        sys.stdout.write('import defaults_cases2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "DefaultType1",
+    "DefaultType2",
+    "DefaultTypes"
+]
diff --git a/tests/defaults_coverage.xsd b/tests/defaults_coverage.xsd
new file mode 100644
index 0000000..a519503
--- /dev/null
+++ b/tests/defaults_coverage.xsd
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+    <xs:element name="defaults" type="DefaultTypes"/>
+
+    <xs:complexType name="DefaultTypes">
+        <xs:sequence>
+            <xs:element name="default1" type="DefaultType1"/>
+            <xs:element name="default2" type="DefaultType2"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="DefaultType1">
+        <xs:sequence>
+            <xs:element name="default01" type="xs:integer" default="23"
+                minOccurs="0"/>
+            <xs:element name="normal01" type="xs:integer"
+                minOccurs="0"/>
+            <xs:element name="default02" type="xs:string" default="Peach"
+                minOccurs="0"/>
+            <xs:element name="normal02" type="xs:string"
+                minOccurs="0"/>
+            <xs:element name="default03" type="xs:float" default="23.45"
+                minOccurs="0"/>
+            <xs:element name="normal03" type="xs:float"
+                minOccurs="0"/>
+            <xs:element name="default04" type="xs:double" default="54.32"
+                minOccurs="0"/>
+            <xs:element name="normal04" type="xs:double"
+                minOccurs="0"/>
+            <xs:element name="default05a" type="xs:boolean" default="true"
+                minOccurs="0"/>
+            <xs:element name="default05b" type="xs:boolean" default="false"
+                minOccurs="0"/>
+            <xs:element name="normal05" type="xs:boolean"
+                minOccurs="0"/>
+            <xs:element name="default06" type="xs:date" default="2015-06-21"
+                minOccurs="0"/>
+            <xs:element name="normal06" type="xs:date"
+                minOccurs="0"/>
+            <xs:element name="default07" type="xs:time" default="11:10:09"
+                minOccurs="0"/>
+            <xs:element name="normal07" type="xs:date"
+                minOccurs="0"/>
+            <xs:element name="default08" type="xs:dateTime"
+                default="2015-06-21T14:13:12"
+                minOccurs="0"/>
+            <xs:element name="normal08" type="xs:dateTime"
+                minOccurs="0"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="DefaultType2">
+        <xs:sequence>
+            <xs:element name="default01" type="xs:integer" default="23"/>
+            <xs:element name="normal01" type="xs:integer"/>
+            <xs:element name="default02" type="xs:string" default="Peach"/>
+            <xs:element name="normal02" type="xs:string"/>
+            <xs:element name="default03" type="xs:float" default="23.45"/>
+            <xs:element name="normal03" type="xs:float"/>
+            <xs:element name="default04" type="xs:double" default="54.32"/>
+            <xs:element name="normal04" type="xs:double"/>
+            <xs:element name="default05a" type="xs:boolean" default="true"/>
+            <xs:element name="default05b" type="xs:boolean" default="false"/>
+            <xs:element name="normal05" type="xs:boolean"/>
+            <xs:element name="default06" type="xs:date" default="2015-06-21"/>
+            <xs:element name="normal06" type="xs:date"/>
+            <xs:element name="default07" type="xs:time" default="11:10:09"/>
+            <xs:element name="normal07" type="xs:date"/>
+            <xs:element name="default08" type="xs:dateTime"
+                default="2015-06-21T14:13:12"/>
+            <xs:element name="normal08" type="xs:dateTime"/>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
diff --git a/tests/defaults_coverage1_sub.py b/tests/defaults_coverage1_sub.py
new file mode 100644
index 0000000..3452d18
--- /dev/null
+++ b/tests/defaults_coverage1_sub.py
@@ -0,0 +1,187 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/defaults_coverage2_sup.py')
+#   ('-s', 'tests/defaults_coverage2_sub.py')
+#   ('--super', 'defaults_coverage2_sup')
+#
+# Command line arguments:
+#   tests/defaults_coverage.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/defaults_coverage2_sup.py" -s "tests/defaults_coverage2_sub.py" --super="defaults_coverage2_sup" tests/defaults_coverage.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import defaults_coverage2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class DefaultTypesSub(supermod.DefaultTypes):
+    def __init__(self, default1=None, default2=None):
+        super(DefaultTypesSub, self).__init__(default1, default2, )
+supermod.DefaultTypes.subclass = DefaultTypesSub
+# end class DefaultTypesSub
+
+
+class DefaultType1Sub(supermod.DefaultType1):
+    def __init__(self, default01=23, normal01=None, default02='Peach', normal02=None, default03=23.45, normal03=None, default04=54.32, normal04=None, default05a=True, default05b=False, normal05=None, default06='2015-06-21', normal06=None, default07='11:10:09', normal07=None, default08='2015-06-21T14:13:12', normal08=None):
+        super(DefaultType1Sub, self).__init__(default01, normal01, default02, normal02, default03, normal03, default04, normal04, default05a, default05b, normal05, default06, normal06, default07, normal07, default08, normal08, )
+supermod.DefaultType1.subclass = DefaultType1Sub
+# end class DefaultType1Sub
+
+
+class DefaultType2Sub(supermod.DefaultType2):
+    def __init__(self, default01=23, normal01=None, default02='Peach', normal02=None, default03=23.45, normal03=None, default04=54.32, normal04=None, default05a=True, default05b=False, normal05=None, default06='2015-06-21', normal06=None, default07='11:10:09', normal07=None, default08='2015-06-21T14:13:12', normal08=None):
+        super(DefaultType2Sub, self).__init__(default01, normal01, default02, normal02, default03, normal03, default04, normal04, default05a, default05b, normal05, default06, normal06, default07, normal07, default08, normal08, )
+supermod.DefaultType2.subclass = DefaultType2Sub
+# end class DefaultType2Sub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = supermod.DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = supermod.DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = supermod.DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = supermod.DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from defaults_coverage2_sup import *\n\n')
+##         sys.stdout.write('import defaults_coverage2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py
new file mode 100644
index 0000000..702722d
--- /dev/null
+++ b/tests/defaults_coverage1_sup.py
@@ -0,0 +1,1545 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/defaults_coverage2_sup.py')
+#   ('-s', 'tests/defaults_coverage2_sub.py')
+#   ('--super', 'defaults_coverage2_sup')
+#
+# Command line arguments:
+#   tests/defaults_coverage.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/defaults_coverage2_sup.py" -s "tests/defaults_coverage2_sub.py" --super="defaults_coverage2_sup" tests/defaults_coverage.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class DefaultTypes(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('default1', 'DefaultType1', 0),
+        MemberSpec_('default2', 'DefaultType2', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, default1=None, default2=None):
+        self.original_tagname_ = None
+        self.default1 = default1
+        self.default2 = default2
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, DefaultTypes)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if DefaultTypes.subclass:
+            return DefaultTypes.subclass(*args_, **kwargs_)
+        else:
+            return DefaultTypes(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_default1(self): return self.default1
+    def set_default1(self, default1): self.default1 = default1
+    def get_default2(self): return self.default2
+    def set_default2(self, default2): self.default2 = default2
+    def hasContent_(self):
+        if (
+            self.default1 is not None or
+            self.default2 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='DefaultTypes', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultTypes')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultTypes', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultTypes'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='DefaultTypes', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.default1 is not None:
+            self.default1.export(outfile, level, namespace_, name_='default1', pretty_print=pretty_print)
+        if self.default2 is not None:
+            self.default2.export(outfile, level, namespace_, name_='default2', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'default1':
+            obj_ = DefaultType1.factory()
+            obj_.build(child_)
+            self.default1 = obj_
+            obj_.original_tagname_ = 'default1'
+        elif nodeName_ == 'default2':
+            obj_ = DefaultType2.factory()
+            obj_.build(child_)
+            self.default2 = obj_
+            obj_.original_tagname_ = 'default2'
+# end class DefaultTypes
+
+
+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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, default01=23, normal01=None, default02='Peach', normal02=None, default03=23.45, normal03=None, default04=54.32, normal04=None, default05a=True, default05b=False, normal05=None, default06='2015-06-21', normal06=None, default07='11:10:09', normal07=None, default08='2015-06-21T14:13:12', normal08=None):
+        self.original_tagname_ = None
+        self.default01 = default01
+        self.normal01 = normal01
+        self.default02 = default02
+        self.normal02 = normal02
+        self.default03 = default03
+        self.normal03 = normal03
+        self.default04 = default04
+        self.normal04 = normal04
+        self.default05a = default05a
+        self.default05b = default05b
+        self.normal05 = normal05
+        if isinstance(default06, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(default06, '%Y-%m-%d').date()
+        else:
+            initvalue_ = default06
+        self.default06 = initvalue_
+        if isinstance(normal06, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(normal06, '%Y-%m-%d').date()
+        else:
+            initvalue_ = normal06
+        self.normal06 = initvalue_
+        if isinstance(default07, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(default07, '%H:%M:%S').time()
+        else:
+            initvalue_ = default07
+        self.default07 = initvalue_
+        if isinstance(normal07, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(normal07, '%Y-%m-%d').date()
+        else:
+            initvalue_ = normal07
+        self.normal07 = initvalue_
+        if isinstance(default08, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(default08, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = default08
+        self.default08 = initvalue_
+        if isinstance(normal08, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(normal08, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = normal08
+        self.normal08 = initvalue_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, DefaultType1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if DefaultType1.subclass:
+            return DefaultType1.subclass(*args_, **kwargs_)
+        else:
+            return DefaultType1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_default01(self): return self.default01
+    def set_default01(self, default01): self.default01 = default01
+    def get_normal01(self): return self.normal01
+    def set_normal01(self, normal01): self.normal01 = normal01
+    def get_default02(self): return self.default02
+    def set_default02(self, default02): self.default02 = default02
+    def get_normal02(self): return self.normal02
+    def set_normal02(self, normal02): self.normal02 = normal02
+    def get_default03(self): return self.default03
+    def set_default03(self, default03): self.default03 = default03
+    def get_normal03(self): return self.normal03
+    def set_normal03(self, normal03): self.normal03 = normal03
+    def get_default04(self): return self.default04
+    def set_default04(self, default04): self.default04 = default04
+    def get_normal04(self): return self.normal04
+    def set_normal04(self, normal04): self.normal04 = normal04
+    def get_default05a(self): return self.default05a
+    def set_default05a(self, default05a): self.default05a = default05a
+    def get_default05b(self): return self.default05b
+    def set_default05b(self, default05b): self.default05b = default05b
+    def get_normal05(self): return self.normal05
+    def set_normal05(self, normal05): self.normal05 = normal05
+    def get_default06(self): return self.default06
+    def set_default06(self, default06): self.default06 = default06
+    def get_normal06(self): return self.normal06
+    def set_normal06(self, normal06): self.normal06 = normal06
+    def get_default07(self): return self.default07
+    def set_default07(self, default07): self.default07 = default07
+    def get_normal07(self): return self.normal07
+    def set_normal07(self, normal07): self.normal07 = normal07
+    def get_default08(self): return self.default08
+    def set_default08(self, default08): self.default08 = default08
+    def get_normal08(self): return self.normal08
+    def set_normal08(self, normal08): self.normal08 = normal08
+    def hasContent_(self):
+        if (
+            self.default01 != 23 or
+            self.normal01 is not None or
+            self.default02 != "Peach" or
+            self.normal02 is not None or
+            self.default03 != 23.45 or
+            self.normal03 is not None or
+            self.default04 != 54.32 or
+            self.normal04 is not None or
+            not self.default05a or
+            self.default05b or
+            self.normal05 is not None or
+            self.default06 != "2015-06-21" or
+            self.normal06 is not None or
+            self.default07 != "11:10:09" or
+            self.normal07 is not None or
+            self.default08 != "2015-06-21T14:13:12" or
+            self.normal08 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='DefaultType1', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultType1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultType1', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultType1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='DefaultType1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.default01 != 23:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault01>%s</%sdefault01>%s' % (namespace_, self.gds_format_integer(self.default01, input_name='default01'), namespace_, eol_))
+        if self.normal01 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal01>%s</%snormal01>%s' % (namespace_, self.gds_format_integer(self.normal01, input_name='normal01'), namespace_, eol_))
+        if self.default02 != "Peach":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault02>%s</%sdefault02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.default02), input_name='default02')), namespace_, eol_))
+        if self.normal02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal02>%s</%snormal02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.normal02), input_name='normal02')), namespace_, eol_))
+        if self.default03 != 23.45:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault03>%s</%sdefault03>%s' % (namespace_, self.gds_format_float(self.default03, input_name='default03'), namespace_, eol_))
+        if self.normal03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal03>%s</%snormal03>%s' % (namespace_, self.gds_format_float(self.normal03, input_name='normal03'), namespace_, eol_))
+        if self.default04 != 54.32:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault04>%s</%sdefault04>%s' % (namespace_, self.gds_format_double(self.default04, input_name='default04'), namespace_, eol_))
+        if self.normal04 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal04>%s</%snormal04>%s' % (namespace_, self.gds_format_double(self.normal04, input_name='normal04'), namespace_, eol_))
+        if not self.default05a:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault05a>%s</%sdefault05a>%s' % (namespace_, self.gds_format_boolean(self.default05a, input_name='default05a'), namespace_, eol_))
+        if self.default05b:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault05b>%s</%sdefault05b>%s' % (namespace_, self.gds_format_boolean(self.default05b, input_name='default05b'), namespace_, eol_))
+        if self.normal05 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal05>%s</%snormal05>%s' % (namespace_, self.gds_format_boolean(self.normal05, input_name='normal05'), namespace_, eol_))
+        if self.default06 != "2015-06-21":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault06>%s</%sdefault06>%s' % (namespace_, self.gds_format_date(self.default06, input_name='default06'), namespace_, eol_))
+        if self.normal06 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal06>%s</%snormal06>%s' % (namespace_, self.gds_format_date(self.normal06, input_name='normal06'), namespace_, eol_))
+        if self.default07 != "11:10:09":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault07>%s</%sdefault07>%s' % (namespace_, self.gds_format_time(self.default07, input_name='default07'), namespace_, eol_))
+        if self.normal07 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal07>%s</%snormal07>%s' % (namespace_, self.gds_format_date(self.normal07, input_name='normal07'), namespace_, eol_))
+        if self.default08 != "2015-06-21T14:13:12":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault08>%s</%sdefault08>%s' % (namespace_, self.gds_format_datetime(self.default08, input_name='default08'), namespace_, eol_))
+        if self.normal08 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal08>%s</%snormal08>%s' % (namespace_, self.gds_format_datetime(self.normal08, input_name='normal08'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'default01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'default01')
+            self.default01 = ival_
+        elif nodeName_ == 'normal01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'normal01')
+            self.normal01 = ival_
+        elif nodeName_ == 'default02':
+            default02_ = child_.text
+            default02_ = self.gds_validate_string(default02_, node, 'default02')
+            self.default02 = default02_
+        elif nodeName_ == 'normal02':
+            normal02_ = child_.text
+            normal02_ = self.gds_validate_string(normal02_, node, 'normal02')
+            self.normal02 = normal02_
+        elif nodeName_ == 'default03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'default03')
+            self.default03 = fval_
+        elif nodeName_ == 'normal03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'normal03')
+            self.normal03 = fval_
+        elif nodeName_ == 'default04':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'default04')
+            self.default04 = fval_
+        elif nodeName_ == 'normal04':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'normal04')
+            self.normal04 = fval_
+        elif nodeName_ == 'default05a':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'default05a')
+            self.default05a = ival_
+        elif nodeName_ == 'default05b':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'default05b')
+            self.default05b = ival_
+        elif nodeName_ == 'normal05':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'normal05')
+            self.normal05 = ival_
+        elif nodeName_ == 'default06':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.default06 = dval_
+        elif nodeName_ == 'normal06':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.normal06 = dval_
+        elif nodeName_ == 'default07':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.default07 = dval_
+        elif nodeName_ == 'normal07':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.normal07 = dval_
+        elif nodeName_ == 'default08':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.default08 = dval_
+        elif nodeName_ == 'normal08':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.normal08 = dval_
+# end class DefaultType1
+
+
+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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, default01=23, normal01=None, default02='Peach', normal02=None, default03=23.45, normal03=None, default04=54.32, normal04=None, default05a=True, default05b=False, normal05=None, default06='2015-06-21', normal06=None, default07='11:10:09', normal07=None, default08='2015-06-21T14:13:12', normal08=None):
+        self.original_tagname_ = None
+        self.default01 = default01
+        self.normal01 = normal01
+        self.default02 = default02
+        self.normal02 = normal02
+        self.default03 = default03
+        self.normal03 = normal03
+        self.default04 = default04
+        self.normal04 = normal04
+        self.default05a = default05a
+        self.default05b = default05b
+        self.normal05 = normal05
+        if isinstance(default06, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(default06, '%Y-%m-%d').date()
+        else:
+            initvalue_ = default06
+        self.default06 = initvalue_
+        if isinstance(normal06, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(normal06, '%Y-%m-%d').date()
+        else:
+            initvalue_ = normal06
+        self.normal06 = initvalue_
+        if isinstance(default07, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(default07, '%H:%M:%S').time()
+        else:
+            initvalue_ = default07
+        self.default07 = initvalue_
+        if isinstance(normal07, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(normal07, '%Y-%m-%d').date()
+        else:
+            initvalue_ = normal07
+        self.normal07 = initvalue_
+        if isinstance(default08, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(default08, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = default08
+        self.default08 = initvalue_
+        if isinstance(normal08, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(normal08, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = normal08
+        self.normal08 = initvalue_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, DefaultType2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if DefaultType2.subclass:
+            return DefaultType2.subclass(*args_, **kwargs_)
+        else:
+            return DefaultType2(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_default01(self): return self.default01
+    def set_default01(self, default01): self.default01 = default01
+    def get_normal01(self): return self.normal01
+    def set_normal01(self, normal01): self.normal01 = normal01
+    def get_default02(self): return self.default02
+    def set_default02(self, default02): self.default02 = default02
+    def get_normal02(self): return self.normal02
+    def set_normal02(self, normal02): self.normal02 = normal02
+    def get_default03(self): return self.default03
+    def set_default03(self, default03): self.default03 = default03
+    def get_normal03(self): return self.normal03
+    def set_normal03(self, normal03): self.normal03 = normal03
+    def get_default04(self): return self.default04
+    def set_default04(self, default04): self.default04 = default04
+    def get_normal04(self): return self.normal04
+    def set_normal04(self, normal04): self.normal04 = normal04
+    def get_default05a(self): return self.default05a
+    def set_default05a(self, default05a): self.default05a = default05a
+    def get_default05b(self): return self.default05b
+    def set_default05b(self, default05b): self.default05b = default05b
+    def get_normal05(self): return self.normal05
+    def set_normal05(self, normal05): self.normal05 = normal05
+    def get_default06(self): return self.default06
+    def set_default06(self, default06): self.default06 = default06
+    def get_normal06(self): return self.normal06
+    def set_normal06(self, normal06): self.normal06 = normal06
+    def get_default07(self): return self.default07
+    def set_default07(self, default07): self.default07 = default07
+    def get_normal07(self): return self.normal07
+    def set_normal07(self, normal07): self.normal07 = normal07
+    def get_default08(self): return self.default08
+    def set_default08(self, default08): self.default08 = default08
+    def get_normal08(self): return self.normal08
+    def set_normal08(self, normal08): self.normal08 = normal08
+    def hasContent_(self):
+        if (
+            self.default01 != 23 or
+            self.normal01 is not None or
+            self.default02 != "Peach" or
+            self.normal02 is not None or
+            self.default03 != 23.45 or
+            self.normal03 is not None or
+            self.default04 != 54.32 or
+            self.normal04 is not None or
+            not self.default05a or
+            self.default05b or
+            self.normal05 is not None or
+            self.default06 != "2015-06-21" or
+            self.normal06 is not None or
+            self.default07 != "11:10:09" or
+            self.normal07 is not None or
+            self.default08 != "2015-06-21T14:13:12" or
+            self.normal08 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='DefaultType2', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultType2')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultType2', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultType2'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='DefaultType2', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.default01 != 23:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault01>%s</%sdefault01>%s' % (namespace_, self.gds_format_integer(self.default01, input_name='default01'), namespace_, eol_))
+        if self.normal01 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal01>%s</%snormal01>%s' % (namespace_, self.gds_format_integer(self.normal01, input_name='normal01'), namespace_, eol_))
+        if self.default02 != "Peach":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault02>%s</%sdefault02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.default02), input_name='default02')), namespace_, eol_))
+        if self.normal02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal02>%s</%snormal02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.normal02), input_name='normal02')), namespace_, eol_))
+        if self.default03 != 23.45:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault03>%s</%sdefault03>%s' % (namespace_, self.gds_format_float(self.default03, input_name='default03'), namespace_, eol_))
+        if self.normal03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal03>%s</%snormal03>%s' % (namespace_, self.gds_format_float(self.normal03, input_name='normal03'), namespace_, eol_))
+        if self.default04 != 54.32:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault04>%s</%sdefault04>%s' % (namespace_, self.gds_format_double(self.default04, input_name='default04'), namespace_, eol_))
+        if self.normal04 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal04>%s</%snormal04>%s' % (namespace_, self.gds_format_double(self.normal04, input_name='normal04'), namespace_, eol_))
+        if not self.default05a:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault05a>%s</%sdefault05a>%s' % (namespace_, self.gds_format_boolean(self.default05a, input_name='default05a'), namespace_, eol_))
+        if self.default05b:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault05b>%s</%sdefault05b>%s' % (namespace_, self.gds_format_boolean(self.default05b, input_name='default05b'), namespace_, eol_))
+        if self.normal05 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal05>%s</%snormal05>%s' % (namespace_, self.gds_format_boolean(self.normal05, input_name='normal05'), namespace_, eol_))
+        if self.default06 != "2015-06-21":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault06>%s</%sdefault06>%s' % (namespace_, self.gds_format_date(self.default06, input_name='default06'), namespace_, eol_))
+        if self.normal06 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal06>%s</%snormal06>%s' % (namespace_, self.gds_format_date(self.normal06, input_name='normal06'), namespace_, eol_))
+        if self.default07 != "11:10:09":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault07>%s</%sdefault07>%s' % (namespace_, self.gds_format_time(self.default07, input_name='default07'), namespace_, eol_))
+        if self.normal07 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal07>%s</%snormal07>%s' % (namespace_, self.gds_format_date(self.normal07, input_name='normal07'), namespace_, eol_))
+        if self.default08 != "2015-06-21T14:13:12":
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdefault08>%s</%sdefault08>%s' % (namespace_, self.gds_format_datetime(self.default08, input_name='default08'), namespace_, eol_))
+        if self.normal08 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%snormal08>%s</%snormal08>%s' % (namespace_, self.gds_format_datetime(self.normal08, input_name='normal08'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'default01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'default01')
+            self.default01 = ival_
+        elif nodeName_ == 'normal01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'normal01')
+            self.normal01 = ival_
+        elif nodeName_ == 'default02':
+            default02_ = child_.text
+            default02_ = self.gds_validate_string(default02_, node, 'default02')
+            self.default02 = default02_
+        elif nodeName_ == 'normal02':
+            normal02_ = child_.text
+            normal02_ = self.gds_validate_string(normal02_, node, 'normal02')
+            self.normal02 = normal02_
+        elif nodeName_ == 'default03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'default03')
+            self.default03 = fval_
+        elif nodeName_ == 'normal03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'normal03')
+            self.normal03 = fval_
+        elif nodeName_ == 'default04':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'default04')
+            self.default04 = fval_
+        elif nodeName_ == 'normal04':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'normal04')
+            self.normal04 = fval_
+        elif nodeName_ == 'default05a':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'default05a')
+            self.default05a = ival_
+        elif nodeName_ == 'default05b':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'default05b')
+            self.default05b = ival_
+        elif nodeName_ == 'normal05':
+            sval_ = child_.text
+            if sval_ in ('true', '1'):
+                ival_ = True
+            elif sval_ in ('false', '0'):
+                ival_ = False
+            else:
+                raise_parse_error(child_, 'requires boolean')
+            ival_ = self.gds_validate_boolean(ival_, node, 'normal05')
+            self.normal05 = ival_
+        elif nodeName_ == 'default06':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.default06 = dval_
+        elif nodeName_ == 'normal06':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.normal06 = dval_
+        elif nodeName_ == 'default07':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.default07 = dval_
+        elif nodeName_ == 'normal07':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.normal07 = dval_
+        elif nodeName_ == 'default08':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.default08 = dval_
+        elif nodeName_ == 'normal08':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.normal08 = dval_
+# end class DefaultType2
+
+
+GDSClassesMapping = {
+    'default1': DefaultType1,
+    'default2': DefaultType2,
+    'defaults': DefaultTypes,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'DefaultTypes'
+        rootClass = DefaultTypes
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from defaults_coverage2_sup import *\n\n')
+##         sys.stdout.write('import defaults_coverage2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "DefaultType1",
+    "DefaultType2",
+    "DefaultTypes"
+]
diff --git a/tests/extensions.xsd b/tests/extensions.xsd
index b56e28b..3f24329 100644
--- a/tests/extensions.xsd
+++ b/tests/extensions.xsd
@@ -22,14 +22,14 @@
 			</xs:documentation>
 		</xs:annotation>
 		<xs:restriction base="xs:string">
-			<xs:enumeration value="down">
+			<xs:enumeration value="right">
 				<xs:annotation>
 					<xs:documentation xml:lang="en">
 						An item in this container.
 					</xs:documentation>
 				</xs:annotation>
 			</xs:enumeration>
-			<xs:enumeration value="add">
+			<xs:enumeration value="divide">
 				<xs:annotation>
 					<xs:documentation xml:lang="en">
 						Add something to this container.
@@ -47,14 +47,14 @@
 			</xs:documentation>
 		</xs:annotation>
 		<xs:restriction base="RelationType3">
-			<xs:enumeration value="down">
+			<xs:enumeration value="up">
 				<xs:annotation>
 					<xs:documentation xml:lang="en">
 						An item in this container.
 					</xs:documentation>
 				</xs:annotation>
 			</xs:enumeration>
-			<xs:enumeration value="add">
+			<xs:enumeration value="subtract">
 				<xs:annotation>
 					<xs:documentation xml:lang="en">
 						Add something to this container.
diff --git a/tests/extensions1_sub.py b/tests/extensions1_sub.py
index 46cfd20..27b9cc6 100644
--- a/tests/extensions1_sub.py
+++ b/tests/extensions1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/extensions2_sup.py')
+#   ('-s', 'tests/extensions2_sub.py')
+#   ('--super', 'extensions2_sup')
+#
+# Command line arguments:
+#   tests/extensions.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/extensions2_sup.py" -s "tests/extensions2_sub.py" --super="extensions2_sup" tests/extensions.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import extensions2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -168,11 +141,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -188,11 +162,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -212,11 +187,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -231,11 +207,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'containerType'
         rootClass = supermod.containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -244,8 +221,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from extensions2_sup import *\n\n')
 ##         sys.stdout.write('import extensions2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.container(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="container")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -256,7 +233,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index fc86ba7..5f3cb9a 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/extensions2_sup.py')
+#   ('-s', 'tests/extensions2_sub.py')
+#   ('--super', 'extensions2_sup')
+#
+# Command line arguments:
+#   tests/extensions.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/extensions2_sup.py" -s "tests/extensions2_sub.py" --super="extensions2_sup" tests/extensions.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -616,9 +668,15 @@ class SpecialDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, SpecialProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.SpecialProperty = _cast(None, SpecialProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, SpecialDate)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if SpecialDate.subclass:
             return SpecialDate.subclass(*args_, **kwargs_)
         else:
@@ -630,7 +688,7 @@ class SpecialDate(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -640,38 +698,25 @@ class SpecialDate(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='SpecialDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='SpecialDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='SpecialDate'):
         if self.SpecialProperty is not None and 'SpecialProperty' not in already_processed:
             already_processed.add('SpecialProperty')
-            outfile.write(' SpecialProperty=%s' % (self.gds_format_string(quote_attrib(self.SpecialProperty).encode(ExternalEncoding), input_name='SpecialProperty'), ))
+            outfile.write(' SpecialProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.SpecialProperty), input_name='SpecialProperty')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='SpecialDate', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='SpecialDate'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.SpecialProperty is not None and 'SpecialProperty' not in already_processed:
-            already_processed.add('SpecialProperty')
-            showIndent(outfile, level)
-            outfile.write('SpecialProperty="%s",\n' % (self.SpecialProperty,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -679,6 +724,7 @@ class SpecialDate(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('SpecialProperty', node)
         if value is not None and 'SpecialProperty' not in already_processed:
@@ -697,9 +743,15 @@ class ExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, ExtremeDate)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if ExtremeDate.subclass:
             return ExtremeDate.subclass(*args_, **kwargs_)
         else:
@@ -711,7 +763,7 @@ class ExtremeDate(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -721,38 +773,25 @@ class ExtremeDate(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='ExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='ExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='ExtremeDate'):
         if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed:
             already_processed.add('ExtremeProperty')
-            outfile.write(' ExtremeProperty=%s' % (self.gds_format_string(quote_attrib(self.ExtremeProperty).encode(ExternalEncoding), input_name='ExtremeProperty'), ))
+            outfile.write(' ExtremeProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.ExtremeProperty), input_name='ExtremeProperty')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='ExtremeDate', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='ExtremeDate'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed:
-            already_processed.add('ExtremeProperty')
-            showIndent(outfile, level)
-            outfile.write('ExtremeProperty="%s",\n' % (self.ExtremeProperty,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -760,6 +799,7 @@ class ExtremeDate(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('ExtremeProperty', node)
         if value is not None and 'ExtremeProperty' not in already_processed:
@@ -778,9 +818,15 @@ class singleExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, singleExtremeDate)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if singleExtremeDate.subclass:
             return singleExtremeDate.subclass(*args_, **kwargs_)
         else:
@@ -792,7 +838,7 @@ class singleExtremeDate(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -802,38 +848,25 @@ class singleExtremeDate(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='singleExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='singleExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='singleExtremeDate'):
         if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed:
             already_processed.add('ExtremeProperty')
-            outfile.write(' ExtremeProperty=%s' % (self.gds_format_string(quote_attrib(self.ExtremeProperty).encode(ExternalEncoding), input_name='ExtremeProperty'), ))
+            outfile.write(' ExtremeProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.ExtremeProperty), input_name='ExtremeProperty')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='singleExtremeDate', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='singleExtremeDate'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed:
-            already_processed.add('ExtremeProperty')
-            showIndent(outfile, level)
-            outfile.write('ExtremeProperty="%s",\n' % (self.ExtremeProperty,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -841,6 +874,7 @@ class singleExtremeDate(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('ExtremeProperty', node)
         if value is not None and 'ExtremeProperty' not in already_processed:
@@ -859,12 +893,18 @@ class containerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, simplefactoid=None, mixedfactoid=None):
+        self.original_tagname_ = None
         if simplefactoid is None:
             self.simplefactoid = []
         else:
             self.simplefactoid = simplefactoid
         self.mixedfactoid = mixedfactoid
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, containerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if containerType.subclass:
             return containerType.subclass(*args_, **kwargs_)
         else:
@@ -873,7 +913,8 @@ class containerType(GeneratedsSuper):
     def get_simplefactoid(self): return self.simplefactoid
     def set_simplefactoid(self, simplefactoid): self.simplefactoid = simplefactoid
     def add_simplefactoid(self, value): self.simplefactoid.append(value)
-    def insert_simplefactoid(self, index, value): self.simplefactoid[index] = value
+    def insert_simplefactoid_at(self, index, value): self.simplefactoid.insert(index, value)
+    def replace_simplefactoid_at(self, index, value): self.simplefactoid[index] = value
     def get_mixedfactoid(self): return self.mixedfactoid
     def set_mixedfactoid(self, mixedfactoid): self.mixedfactoid = mixedfactoid
     def hasContent_(self):
@@ -889,13 +930,15 @@ class containerType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -911,39 +954,13 @@ class containerType(GeneratedsSuper):
             simplefactoid_.export(outfile, level, namespace_, name_='simplefactoid', pretty_print=pretty_print)
         if self.mixedfactoid is not None:
             self.mixedfactoid.export(outfile, level, namespace_, name_='mixedfactoid', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='containerType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('simplefactoid=[\n')
-        level += 1
-        for simplefactoid_ in self.simplefactoid:
-            showIndent(outfile, level)
-            outfile.write('model_.simpleFactoidType(\n')
-            simplefactoid_.exportLiteral(outfile, level, name_='simpleFactoidType')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.mixedfactoid is not None:
-            showIndent(outfile, level)
-            outfile.write('mixedfactoid=model_.mixedFactoidType(\n')
-            self.mixedfactoid.exportLiteral(outfile, level, name_='mixedfactoid')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -951,10 +968,12 @@ class containerType(GeneratedsSuper):
             obj_ = simpleFactoidType.factory()
             obj_.build(child_)
             self.simplefactoid.append(obj_)
+            obj_.original_tagname_ = 'simplefactoid'
         elif nodeName_ == 'mixedfactoid':
             obj_ = mixedFactoidType.factory()
             obj_.build(child_)
             self.mixedfactoid = obj_
+            obj_.original_tagname_ = 'mixedfactoid'
 # end class containerType
 
 
@@ -965,8 +984,15 @@ class simpleFactoidType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, relation=None):
+        self.original_tagname_ = None
         self.relation = relation
+        self.validate_RelationType(self.relation)
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleFactoidType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if simpleFactoidType.subclass:
             return simpleFactoidType.subclass(*args_, **kwargs_)
         else:
@@ -976,7 +1002,34 @@ class simpleFactoidType(GeneratedsSuper):
     def set_relation(self, relation): self.relation = relation
     def validate_RelationType(self, value):
         # Validate type RelationType, a restriction on RelationType2.
-        pass
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['down', 'add']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
+            value = str(value)
+            enumerations = ['up', 'subtract']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
+            value = str(value)
+            enumerations = ['right', 'divide']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.relation is not None
@@ -989,13 +1042,15 @@ class simpleFactoidType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleFactoidType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleFactoidType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1009,25 +1064,14 @@ class simpleFactoidType(GeneratedsSuper):
             eol_ = ''
         if self.relation is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%srelation>%s</%srelation>%s' % (namespace_, self.gds_format_string(quote_xml(self.relation).encode(ExternalEncoding), input_name='relation'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='simpleFactoidType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.relation is not None:
-            showIndent(outfile, level)
-            outfile.write('relation=%s,\n' % quote_python(self.relation).encode(ExternalEncoding))
+            outfile.write('<%srelation>%s</%srelation>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.relation), input_name='relation')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1035,7 +1079,8 @@ class simpleFactoidType(GeneratedsSuper):
             relation_ = child_.text
             relation_ = self.gds_validate_string(relation_, node, 'relation')
             self.relation = relation_
-            self.validate_RelationType(self.relation)    # validate type RelationType
+            # validate type RelationType
+            self.validate_RelationType(self.relation)
 # end class simpleFactoidType
 
 
@@ -1047,7 +1092,9 @@ class mixedFactoidType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, relation=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         self.relation = relation
+        self.validate_RelationType(self.relation)
         self.valueOf_ = valueOf_
         if mixedclass_ is None:
             self.mixedclass_ = MixedContainer
@@ -1059,6 +1106,11 @@ class mixedFactoidType(GeneratedsSuper):
             self.content_ = content_
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, mixedFactoidType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if mixedFactoidType.subclass:
             return mixedFactoidType.subclass(*args_, **kwargs_)
         else:
@@ -1070,11 +1122,38 @@ class mixedFactoidType(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def validate_RelationType(self, value):
         # Validate type RelationType, a restriction on RelationType2.
-        pass
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['down', 'add']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
+            value = str(value)
+            enumerations = ['up', 'subtract']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
+            value = str(value)
+            enumerations = ['right', 'divide']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.relation is not None or
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1084,13 +1163,15 @@ class mixedFactoidType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='mixedFactoidType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='mixedFactoidType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1101,24 +1182,6 @@ class mixedFactoidType(GeneratedsSuper):
         if not fromsubclass_:
             for item_ in self.content_:
                 item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='mixedFactoidType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('content_ = [\n')
-        for item_ in self.content_:
-            item_.exportLiteral(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1130,6 +1193,7 @@ class mixedFactoidType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1154,11 +1218,17 @@ class BaseType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, BaseProperty1=None, BaseProperty2=None, valueOf_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.BaseProperty1 = _cast(None, BaseProperty1)
         self.BaseProperty2 = _cast(None, BaseProperty2)
         self.valueOf_ = valueOf_
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, BaseType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if BaseType.subclass:
             return BaseType.subclass(*args_, **kwargs_)
         else:
@@ -1174,7 +1244,7 @@ class BaseType(GeneratedsSuper):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1184,49 +1254,32 @@ class BaseType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BaseType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='BaseType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='BaseType'):
         if self.BaseProperty1 is not None and 'BaseProperty1' not in already_processed:
             already_processed.add('BaseProperty1')
-            outfile.write(' BaseProperty1=%s' % (self.gds_format_string(quote_attrib(self.BaseProperty1).encode(ExternalEncoding), input_name='BaseProperty1'), ))
+            outfile.write(' BaseProperty1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.BaseProperty1), input_name='BaseProperty1')), ))
         if self.BaseProperty2 is not None and 'BaseProperty2' not in already_processed:
             already_processed.add('BaseProperty2')
-            outfile.write(' BaseProperty2=%s' % (self.gds_format_string(quote_attrib(self.BaseProperty2).encode(ExternalEncoding), input_name='BaseProperty2'), ))
+            outfile.write(' BaseProperty2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.BaseProperty2), input_name='BaseProperty2')), ))
         if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
             outfile.write(' xsi:type="%s"' % self.extensiontype_)
     def exportChildren(self, outfile, level, namespace_='', name_='BaseType', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='BaseType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.BaseProperty1 is not None and 'BaseProperty1' not in already_processed:
-            already_processed.add('BaseProperty1')
-            showIndent(outfile, level)
-            outfile.write('BaseProperty1="%s",\n' % (self.BaseProperty1,))
-        if self.BaseProperty2 is not None and 'BaseProperty2' not in already_processed:
-            already_processed.add('BaseProperty2')
-            showIndent(outfile, level)
-            outfile.write('BaseProperty2="%s",\n' % (self.BaseProperty2,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1234,6 +1287,7 @@ class BaseType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('BaseProperty1', node)
         if value is not None and 'BaseProperty1' not in already_processed:
@@ -1261,11 +1315,17 @@ class DerivedType(BaseType):
     subclass = None
     superclass = BaseType
     def __init__(self, BaseProperty1=None, BaseProperty2=None, DerivedProperty1=None, DerivedProperty2=None, valueOf_=None):
+        self.original_tagname_ = None
         super(DerivedType, self).__init__(BaseProperty1, BaseProperty2, valueOf_, )
         self.DerivedProperty1 = _cast(None, DerivedProperty1)
         self.DerivedProperty2 = _cast(None, DerivedProperty2)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, DerivedType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if DerivedType.subclass:
             return DerivedType.subclass(*args_, **kwargs_)
         else:
@@ -1279,7 +1339,7 @@ class DerivedType(BaseType):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_ or
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_ or
             super(DerivedType, self).hasContent_()
         ):
             return True
@@ -1290,14 +1350,16 @@ class DerivedType(BaseType):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='DerivedType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='DerivedType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
@@ -1305,34 +1367,13 @@ class DerivedType(BaseType):
         super(DerivedType, self).exportAttributes(outfile, level, already_processed, namespace_, name_='DerivedType')
         if self.DerivedProperty1 is not None and 'DerivedProperty1' not in already_processed:
             already_processed.add('DerivedProperty1')
-            outfile.write(' DerivedProperty1=%s' % (self.gds_format_string(quote_attrib(self.DerivedProperty1).encode(ExternalEncoding), input_name='DerivedProperty1'), ))
+            outfile.write(' DerivedProperty1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.DerivedProperty1), input_name='DerivedProperty1')), ))
         if self.DerivedProperty2 is not None and 'DerivedProperty2' not in already_processed:
             already_processed.add('DerivedProperty2')
-            outfile.write(' DerivedProperty2=%s' % (self.gds_format_string(quote_attrib(self.DerivedProperty2).encode(ExternalEncoding), input_name='DerivedProperty2'), ))
+            outfile.write(' DerivedProperty2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.DerivedProperty2), input_name='DerivedProperty2')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='DerivedType', fromsubclass_=False, pretty_print=True):
         super(DerivedType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         pass
-    def exportLiteral(self, outfile, level, name_='DerivedType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.DerivedProperty1 is not None and 'DerivedProperty1' not in already_processed:
-            already_processed.add('DerivedProperty1')
-            showIndent(outfile, level)
-            outfile.write('DerivedProperty1="%s",\n' % (self.DerivedProperty1,))
-        if self.DerivedProperty2 is not None and 'DerivedProperty2' not in already_processed:
-            already_processed.add('DerivedProperty2')
-            showIndent(outfile, level)
-            outfile.write('DerivedProperty2="%s",\n' % (self.DerivedProperty2,))
-        super(DerivedType, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(DerivedType, self).exportLiteralChildren(outfile, level, name_)
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1340,6 +1381,7 @@ class DerivedType(BaseType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('DerivedProperty1', node)
         if value is not None and 'DerivedProperty1' not in already_processed:
@@ -1363,9 +1405,15 @@ class MyInteger(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, MyInteger)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if MyInteger.subclass:
             return MyInteger.subclass(*args_, **kwargs_)
         else:
@@ -1377,7 +1425,7 @@ class MyInteger(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1387,38 +1435,25 @@ class MyInteger(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyInteger')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='MyInteger', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='MyInteger'):
         if self.MyAttr is not None and 'MyAttr' not in already_processed:
             already_processed.add('MyAttr')
-            outfile.write(' MyAttr=%s' % (self.gds_format_string(quote_attrib(self.MyAttr).encode(ExternalEncoding), input_name='MyAttr'), ))
+            outfile.write(' MyAttr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.MyAttr), input_name='MyAttr')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='MyInteger', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='MyInteger'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.MyAttr is not None and 'MyAttr' not in already_processed:
-            already_processed.add('MyAttr')
-            showIndent(outfile, level)
-            outfile.write('MyAttr="%s",\n' % (self.MyAttr,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1426,6 +1461,7 @@ class MyInteger(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('MyAttr', node)
         if value is not None and 'MyAttr' not in already_processed:
@@ -1444,9 +1480,15 @@ class MyBoolean(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, MyBoolean)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if MyBoolean.subclass:
             return MyBoolean.subclass(*args_, **kwargs_)
         else:
@@ -1458,7 +1500,7 @@ class MyBoolean(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1468,38 +1510,25 @@ class MyBoolean(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyBoolean')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='MyBoolean', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='MyBoolean'):
         if self.MyAttr is not None and 'MyAttr' not in already_processed:
             already_processed.add('MyAttr')
-            outfile.write(' MyAttr=%s' % (self.gds_format_string(quote_attrib(self.MyAttr).encode(ExternalEncoding), input_name='MyAttr'), ))
+            outfile.write(' MyAttr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.MyAttr), input_name='MyAttr')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='MyBoolean', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='MyBoolean'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.MyAttr is not None and 'MyAttr' not in already_processed:
-            already_processed.add('MyAttr')
-            showIndent(outfile, level)
-            outfile.write('MyAttr="%s",\n' % (self.MyAttr,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1507,6 +1536,7 @@ class MyBoolean(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('MyAttr', node)
         if value is not None and 'MyAttr' not in already_processed:
@@ -1525,9 +1555,15 @@ class MyFloat(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, MyFloat)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if MyFloat.subclass:
             return MyFloat.subclass(*args_, **kwargs_)
         else:
@@ -1539,7 +1575,7 @@ class MyFloat(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1549,38 +1585,25 @@ class MyFloat(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyFloat')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='MyFloat', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='MyFloat'):
         if self.MyAttr is not None and 'MyAttr' not in already_processed:
             already_processed.add('MyAttr')
-            outfile.write(' MyAttr=%s' % (self.gds_format_string(quote_attrib(self.MyAttr).encode(ExternalEncoding), input_name='MyAttr'), ))
+            outfile.write(' MyAttr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.MyAttr), input_name='MyAttr')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='MyFloat', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='MyFloat'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.MyAttr is not None and 'MyAttr' not in already_processed:
-            already_processed.add('MyAttr')
-            showIndent(outfile, level)
-            outfile.write('MyAttr="%s",\n' % (self.MyAttr,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1588,6 +1611,7 @@ class MyFloat(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('MyAttr', node)
         if value is not None and 'MyAttr' not in already_processed:
@@ -1606,9 +1630,15 @@ class MyDouble(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, MyAttr=None, valueOf_=None):
+        self.original_tagname_ = None
         self.MyAttr = _cast(None, MyAttr)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, MyDouble)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if MyDouble.subclass:
             return MyDouble.subclass(*args_, **kwargs_)
         else:
@@ -1620,7 +1650,7 @@ class MyDouble(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1630,38 +1660,25 @@ class MyDouble(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyDouble')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='MyDouble', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='MyDouble'):
         if self.MyAttr is not None and 'MyAttr' not in already_processed:
             already_processed.add('MyAttr')
-            outfile.write(' MyAttr=%s' % (self.gds_format_string(quote_attrib(self.MyAttr).encode(ExternalEncoding), input_name='MyAttr'), ))
+            outfile.write(' MyAttr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.MyAttr), input_name='MyAttr')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='MyDouble', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='MyDouble'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.MyAttr is not None and 'MyAttr' not in already_processed:
-            already_processed.add('MyAttr')
-            showIndent(outfile, level)
-            outfile.write('MyAttr="%s",\n' % (self.MyAttr,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1669,6 +1686,7 @@ class MyDouble(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('MyAttr', node)
         if value is not None and 'MyAttr' not in already_processed:
@@ -1680,8 +1698,8 @@ class MyDouble(GeneratedsSuper):
 
 
 GDSClassesMapping = {
-    'mixedfactoid': mixedFactoidType,
     'container': containerType,
+    'mixedfactoid': mixedFactoidType,
     'simplefactoid': simpleFactoidType,
 }
 
@@ -1692,7 +1710,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -1705,11 +1723,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1725,11 +1744,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1748,12 +1768,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1762,17 +1786,18 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="container",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'container'
+        rootTag = 'containerType'
         rootClass = containerType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1781,7 +1806,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from extensions2_sup import *\n\n')
 ##         sys.stdout.write('import extensions2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/gds_inner_name_map.py b/tests/gds_inner_name_map.py
new file mode 100644
index 0000000..a883760
--- /dev/null
+++ b/tests/gds_inner_name_map.py
@@ -0,0 +1,7 @@
+
+Inner_name_map = {
+    ("classAType", "inner"): "inner_001",
+    ("classBType", "inner"): "inner_002",
+    #("classAType", "inner"): "class_a_inner",
+    #("classBType", "inner"): "class_b_inner",
+}
diff --git a/tests/ipo1_out.xml b/tests/ipo1_out.xml
index 3456bed..44ae582 100644
--- a/tests/ipo1_out.xml
+++ b/tests/ipo1_out.xml
@@ -1,21 +1,20 @@
 <?xml version="1.0" ?>
 <ipo:purchaseOrder xmlns:ipo="http://www.example.com/IPO" orderDate="1999-12-01">
-    <ipo:shipTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" category="1-a" exportCode="1">
+    <ipo:shipTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" exportCode="1">
         <ipo:name>Helen Zoe</ipo:name>
         <ipo:street>47 Eden Street</ipo:street>
         <ipo:city>Cambridge</ipo:city>
         <ipo:postcode>CB1 1JR</ipo:postcode>
-        <ipo:category>oneA</ipo:category>
     </ipo:shipTo>
-    <ipo:billTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:USAddress">
+    <ipo:billTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:USAddress">
         <ipo:name>Robert Smith</ipo:name>
         <ipo:street>8 Oak Avenue</ipo:street>
         <ipo:city>Old Town</ipo:city>
         <ipo:state>PA</ipo:state>
         <ipo:zip>95819</ipo:zip>
     </ipo:billTo>
-    <ipo:items>
-        <ipo:item partNum="833-AA">
+    <ipo:items xmlns:ipo="http://www.example.com/IPO">
+        <ipo:item xmlns:ipo="http://www.example.com/IPO" partNum="833-AA">
             <ipo:productName>Lapis necklace</ipo:productName>
             <ipo:quantity>1</ipo:quantity>
             <ipo:USPrice>99.950000000000003</ipo:USPrice>
diff --git a/tests/ipo1_sub.py b/tests/ipo1_sub.py
index 5665691..01e5965 100644
--- a/tests/ipo1_sub.py
+++ b/tests/ipo1_sub.py
@@ -3,64 +3,36 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/ipo2_sup.py')
+#   ('-s', 'tests/ipo2_sub.py')
+#   ('--super', 'ipo2_sup')
+#
+# Command line arguments:
+#   tests/ipo.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/ipo2_sup.py" -s "tests/ipo2_sub.py" --super="ipo2_sup" tests/ipo.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import ipo2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -88,6 +60,13 @@ supermod.Items.subclass = ItemsSub
 # end class ItemsSub
 
 
+class itemSub(supermod.item):
+    def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
+        super(itemSub, self).__init__(partNum, productName, quantity, USPrice, comment, shipDate, )
+supermod.item.subclass = itemSub
+# end class itemSub
+
+
 class AddressSub(supermod.Address):
     def __init__(self, name=None, street=None, city=None, extensiontype_=None):
         super(AddressSub, self).__init__(name, street, city, extensiontype_, )
@@ -103,19 +82,12 @@ supermod.USAddress.subclass = USAddressSub
 
 
 class UKAddressSub(supermod.UKAddress):
-    def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None):
-        super(UKAddressSub, self).__init__(name, street, city, category_attr, exportCode, postcode, category, )
+    def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None):
+        super(UKAddressSub, self).__init__(name, street, city, exportCode, postcode, )
 supermod.UKAddress.subclass = UKAddressSub
 # end class UKAddressSub
 
 
-class itemTypeSub(supermod.itemType):
-    def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
-        super(itemTypeSub, self).__init__(partNum, productName, quantity, USPrice, comment, shipDate, )
-supermod.itemType.subclass = itemTypeSub
-# end class itemTypeSub
-
-
 def get_root_tag(node):
     tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
     rootClass = None
@@ -126,11 +98,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -146,11 +119,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -170,11 +144,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -189,11 +164,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -202,8 +178,8 @@ def parseLiteral(inFilename, silence=False):
     if not silence:
         sys.stdout.write('#from ipo2_sup import *\n\n')
         sys.stdout.write('import ipo2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.purchaseOrder(\n')
-        rootObj.exportLiteral(sys.stdout, 0, name_="purchaseOrder")
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
 
@@ -214,7 +190,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py
index 2e452f2..5a27592 100644
--- a/tests/ipo1_sup.py
+++ b/tests/ipo1_sup.py
@@ -4,66 +4,53 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/ipo2_sup.py')
+#   ('-s', 'tests/ipo2_sub.py')
+#   ('--super', 'ipo2_sup')
+#
+# Command line arguments:
+#   tests/ipo.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/ipo2_sup.py" -s "tests/ipo2_sub.py" --super="ipo2_sup" tests/ipo.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +62,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +78,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +147,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +202,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +213,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +236,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +260,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +292,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +362,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +410,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +428,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +513,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +554,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -619,7 +670,8 @@ class PurchaseOrderType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, orderDate=None, shipTo=None, billTo=None, comment=None, items=None):
-        if isinstance(orderDate, basestring):
+        self.original_tagname_ = None
+        if isinstance(orderDate, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(orderDate, '%Y-%m-%d').date()
         else:
             initvalue_ = orderDate
@@ -629,6 +681,11 @@ class PurchaseOrderType(GeneratedsSuper):
         self.comment = comment
         self.items = items
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, PurchaseOrderType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if PurchaseOrderType.subclass:
             return PurchaseOrderType.subclass(*args_, **kwargs_)
         else:
@@ -654,18 +711,20 @@ class PurchaseOrderType(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='PurchaseOrderType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='PurchaseOrderType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -685,55 +744,23 @@ class PurchaseOrderType(GeneratedsSuper):
             self.billTo.export(outfile, level, namespace_, name_='billTo', pretty_print=pretty_print)
         if self.comment is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_))
+            outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_))
         if self.items is not None:
             self.items.export(outfile, level, namespace_, name_='items', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PurchaseOrderType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.orderDate is not None and 'orderDate' not in already_processed:
-            already_processed.add('orderDate')
-            showIndent(outfile, level)
-            outfile.write('orderDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.orderDate, input_name='orderDate'))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.shipTo is not None:
-            showIndent(outfile, level)
-            outfile.write('shipTo=model_.Address(\n')
-            self.shipTo.exportLiteral(outfile, level, name_='shipTo')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.billTo is not None:
-            showIndent(outfile, level)
-            outfile.write('billTo=model_.Address(\n')
-            self.billTo.exportLiteral(outfile, level, name_='billTo')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.comment is not None:
-            showIndent(outfile, level)
-            outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding))
-        if self.items is not None:
-            showIndent(outfile, level)
-            outfile.write('items=model_.Items(\n')
-            self.items.exportLiteral(outfile, level, name_='items')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('orderDate', node)
         if value is not None and 'orderDate' not in already_processed:
             already_processed.add('orderDate')
             try:
                 self.orderDate = self.gds_parse_date(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise ValueError('Bad date attribute (orderDate): %s' % exp)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'shipTo':
@@ -741,11 +768,13 @@ class PurchaseOrderType(GeneratedsSuper):
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.shipTo = obj_
+            obj_.original_tagname_ = 'shipTo'
         elif nodeName_ == 'billTo':
             class_obj_ = self.get_class_obj_(child_, Address)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.billTo = obj_
+            obj_.original_tagname_ = 'billTo'
         elif nodeName_ == 'comment':
             comment_ = child_.text
             comment_ = self.gds_validate_string(comment_, node, 'comment')
@@ -754,21 +783,28 @@ class PurchaseOrderType(GeneratedsSuper):
             obj_ = Items.factory()
             obj_.build(child_)
             self.items = obj_
+            obj_.original_tagname_ = 'items'
 # end class PurchaseOrderType
 
 
 class Items(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('item', 'itemType', 1),
+        MemberSpec_('item', 'item', 1),
     ]
     subclass = None
     superclass = None
     def __init__(self, item=None):
+        self.original_tagname_ = None
         if item is None:
             self.item = []
         else:
             self.item = item
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, Items)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if Items.subclass:
             return Items.subclass(*args_, **kwargs_)
         else:
@@ -777,7 +813,8 @@ class Items(GeneratedsSuper):
     def get_item(self): return self.item
     def set_item(self, item): self.item = item
     def add_item(self, value): self.item.append(value)
-    def insert_item(self, index, value): self.item[index] = value
+    def insert_item_at(self, index, value): self.item.insert(index, value)
+    def replace_item_at(self, index, value): self.item[index] = value
     def hasContent_(self):
         if (
             self.item
@@ -785,18 +822,20 @@ class Items(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='Items')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='Items', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -810,43 +849,230 @@ class Items(GeneratedsSuper):
             eol_ = ''
         for item_ in self.item:
             item_.export(outfile, level, namespace_, name_='item', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='Items'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('item=[\n')
-        level += 1
-        for item_ in self.item:
-            showIndent(outfile, level)
-            outfile.write('model_.itemType(\n')
-            item_.exportLiteral(outfile, level, name_='itemType')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'item':
-            obj_ = itemType.factory()
+            obj_ = item.factory()
             obj_.build(child_)
             self.item.append(obj_)
+            obj_.original_tagname_ = 'item'
 # end class Items
 
 
+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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
+        self.original_tagname_ = None
+        self.partNum = _cast(None, partNum)
+        self.productName = productName
+        self.quantity = quantity
+        self.USPrice = USPrice
+        self.comment = comment
+        if isinstance(shipDate, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date()
+        else:
+            initvalue_ = shipDate
+        self.shipDate = initvalue_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, item)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if item.subclass:
+            return item.subclass(*args_, **kwargs_)
+        else:
+            return item(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_productName(self): return self.productName
+    def set_productName(self, productName): self.productName = productName
+    def get_quantity(self): return self.quantity
+    def set_quantity(self, quantity): self.quantity = quantity
+    def get_USPrice(self): return self.USPrice
+    def set_USPrice(self, USPrice): self.USPrice = USPrice
+    def get_comment(self): return self.comment
+    def set_comment(self, comment): self.comment = comment
+    def get_shipDate(self): return self.shipDate
+    def set_shipDate(self, shipDate): self.shipDate = shipDate
+    def get_partNum(self): return self.partNum
+    def set_partNum(self, partNum): self.partNum = partNum
+    def hasContent_(self):
+        if (
+            self.productName is not None or
+            self.quantity is not None or
+            self.USPrice is not None or
+            self.comment is not None or
+            self.shipDate is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='ipo:', name_='item', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='item')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='item', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='item'):
+        if self.partNum is not None and 'partNum' not in already_processed:
+            already_processed.add('partNum')
+            outfile.write(' partNum=%s' % (quote_attrib(self.partNum), ))
+    def exportChildren(self, outfile, level, namespace_='ipo:', name_='item', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.productName is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.productName), input_name='productName')), namespace_, eol_))
+        if self.quantity is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_))
+        if self.USPrice is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_))
+        if self.comment is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_))
+        if self.shipDate is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('partNum', node)
+        if value is not None and 'partNum' not in already_processed:
+            already_processed.add('partNum')
+            self.partNum = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'productName':
+            productName_ = child_.text
+            productName_ = self.gds_validate_string(productName_, node, 'productName')
+            self.productName = productName_
+        elif nodeName_ == 'quantity':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ <= 0:
+                raise_parse_error(child_, 'requires positiveInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'quantity')
+            self.quantity = ival_
+        elif nodeName_ == 'USPrice':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'USPrice')
+            self.USPrice = fval_
+        elif nodeName_ == 'comment':
+            comment_ = child_.text
+            comment_ = self.gds_validate_string(comment_, node, 'comment')
+            self.comment = comment_
+        elif nodeName_ == 'shipDate':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.shipDate = dval_
+# end class item
+
+
+class quantity(GeneratedsSuper):
+    member_data_items_ = [
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, valueOf_=None):
+        self.original_tagname_ = None
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, quantity)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if quantity.subclass:
+            return quantity.subclass(*args_, **kwargs_)
+        else:
+            return quantity(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='quantity')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='quantity', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='quantity'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class quantity
+
+
 class Address(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('name', 'string', 0),
@@ -856,11 +1082,17 @@ class Address(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, street=None, city=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.name = name
         self.street = street
         self.city = city
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, Address)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if Address.subclass:
             return Address.subclass(*args_, **kwargs_)
         else:
@@ -883,18 +1115,20 @@ class Address(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='Address')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='Address', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -912,37 +1146,20 @@ class Address(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         if self.street is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_format_string(quote_xml(self.street).encode(ExternalEncoding), input_name='street'), namespace_, eol_))
+            outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.street), input_name='street')), namespace_, eol_))
         if self.city is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_format_string(quote_xml(self.city).encode(ExternalEncoding), input_name='city'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='Address'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        if self.street is not None:
-            showIndent(outfile, level)
-            outfile.write('street=%s,\n' % quote_python(self.street).encode(ExternalEncoding))
-        if self.city is not None:
-            showIndent(outfile, level)
-            outfile.write('city=%s,\n' % quote_python(self.city).encode(ExternalEncoding))
+            outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.city), input_name='city')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
@@ -972,10 +1189,17 @@ class USAddress(Address):
     subclass = None
     superclass = Address
     def __init__(self, name=None, street=None, city=None, state=None, zip=None):
+        self.original_tagname_ = None
         super(USAddress, self).__init__(name, street, city, )
         self.state = state
+        self.validate_USState(self.state)
         self.zip = zip
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, USAddress)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if USAddress.subclass:
             return USAddress.subclass(*args_, **kwargs_)
         else:
@@ -987,7 +1211,16 @@ class USAddress(Address):
     def set_zip(self, zip): self.zip = zip
     def validate_USState(self, value):
         # Validate type USState, a restriction on string.
-        pass
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['AK', 'AL', 'AR', 'PA']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on USState' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.state is not None or
@@ -997,18 +1230,20 @@ class USAddress(Address):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='USAddress')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='USAddress', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1023,32 +1258,17 @@ class USAddress(Address):
             eol_ = ''
         if self.state is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_format_string(quote_xml(self.state).encode(ExternalEncoding), input_name='state'), namespace_, eol_))
+            outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.state), input_name='state')), namespace_, eol_))
         if self.zip is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%szip>%s</%szip>%s' % (namespace_, self.gds_format_integer(self.zip, input_name='zip'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='USAddress'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(USAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(USAddress, self).exportLiteralChildren(outfile, level, name_)
-        if self.state is not None:
-            showIndent(outfile, level)
-            outfile.write('state=%s,\n' % quote_python(self.state).encode(ExternalEncoding))
-        if self.zip is not None:
-            showIndent(outfile, level)
-            outfile.write('zip=%d,\n' % self.zip)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(USAddress, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1056,12 +1276,13 @@ class USAddress(Address):
             state_ = child_.text
             state_ = self.gds_validate_string(state_, node, 'state')
             self.state = state_
-            self.validate_USState(self.state)    # validate type USState
+            # validate type USState
+            self.validate_USState(self.state)
         elif nodeName_ == 'zip':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ <= 0:
                 raise_parse_error(child_, 'requires positiveInteger')
@@ -1073,20 +1294,22 @@ class USAddress(Address):
 
 class UKAddress(Address):
     member_data_items_ = [
-        MemberSpec_('category_attr', 'xs:string', 0),
         MemberSpec_('exportCode', 'positiveInteger', 0),
-        MemberSpec_('postcode', ['UKPostcode', 'string'], 0),
-        MemberSpec_('category', 'string', 0),
+        MemberSpec_('postcode', 'string', 0),
     ]
     subclass = None
     superclass = Address
-    def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None):
+    def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None):
+        self.original_tagname_ = None
         super(UKAddress, self).__init__(name, street, city, )
-        self.category_attr = _cast(None, category_attr)
         self.exportCode = _cast(int, exportCode)
         self.postcode = postcode
-        self.category = category
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, UKAddress)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if UKAddress.subclass:
             return UKAddress.subclass(*args_, **kwargs_)
         else:
@@ -1094,45 +1317,36 @@ class UKAddress(Address):
     factory = staticmethod(factory)
     def get_postcode(self): return self.postcode
     def set_postcode(self, postcode): self.postcode = postcode
-    def get_category(self): return self.category
-    def set_category(self, category): self.category = category
-    def get_category_attr(self): return self.category_attr
-    def set_category_attr(self, category_attr): self.category_attr = category_attr
     def get_exportCode(self): return self.exportCode
     def set_exportCode(self, exportCode): self.exportCode = exportCode
-    def validate_UKPostcode(self, value):
-        # Validate type UKPostcode, a restriction on string.
-        pass
     def hasContent_(self):
         if (
             self.postcode is not None or
-            self.category is not None or
             super(UKAddress, self).hasContent_()
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='UKAddress', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='UKAddress'):
         super(UKAddress, self).exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress')
-        if self.category_attr is not None and 'category_attr' not in already_processed:
-            already_processed.add('category_attr')
-            outfile.write(' category=%s' % (quote_attrib(self.category_attr), ))
         if self.exportCode is not None and 'exportCode' not in already_processed:
             already_processed.add('exportCode')
             outfile.write(' exportCode="%s"' % self.gds_format_integer(self.exportCode, input_name='exportCode'))
@@ -1144,51 +1358,21 @@ class UKAddress(Address):
             eol_ = ''
         if self.postcode is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_format_string(quote_xml(self.postcode).encode(ExternalEncoding), input_name='postcode'), namespace_, eol_))
-        if self.category is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_string(quote_xml(self.category).encode(ExternalEncoding), input_name='category'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='UKAddress'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.category_attr is not None and 'category_attr' not in already_processed:
-            already_processed.add('category_attr')
-            showIndent(outfile, level)
-            outfile.write('category_attr=%s,\n' % (self.category_attr,))
-        if self.exportCode is not None and 'exportCode' not in already_processed:
-            already_processed.add('exportCode')
-            showIndent(outfile, level)
-            outfile.write('exportCode=%d,\n' % (self.exportCode,))
-        super(UKAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(UKAddress, self).exportLiteralChildren(outfile, level, name_)
-        if self.postcode is not None:
-            showIndent(outfile, level)
-            outfile.write('postcode=%s,\n' % quote_python(self.postcode).encode(ExternalEncoding))
-        if self.category is not None:
-            showIndent(outfile, level)
-            outfile.write('category=%s,\n' % quote_python(self.category).encode(ExternalEncoding))
+            outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.postcode), input_name='postcode')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('category', node)
-        if value is not None and 'category_attr' not in already_processed:
-            already_processed.add('category_attr')
-            self.category_attr = value
         value = find_attr_value_('exportCode', node)
         if value is not None and 'exportCode' not in already_processed:
             already_processed.add('exportCode')
             try:
                 self.exportCode = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.exportCode <= 0:
                 raise_parse_error(node, 'Invalid PositiveInteger')
@@ -1198,246 +1382,15 @@ class UKAddress(Address):
             postcode_ = child_.text
             postcode_ = self.gds_validate_string(postcode_, node, 'postcode')
             self.postcode = postcode_
-            self.validate_UKPostcode(self.postcode)    # validate type UKPostcode
-        elif nodeName_ == 'category':
-            category_ = child_.text
-            category_ = self.gds_validate_string(category_, node, 'category')
-            self.category = category_
         super(UKAddress, self).buildChildren(child_, node, nodeName_, True)
 # end class UKAddress
 
 
-class itemType(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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
-        self.partNum = _cast(None, partNum)
-        self.productName = productName
-        self.quantity = quantity
-        self.USPrice = USPrice
-        self.comment = comment
-        if isinstance(shipDate, basestring):
-            initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date()
-        else:
-            initvalue_ = shipDate
-        self.shipDate = initvalue_
-    def factory(*args_, **kwargs_):
-        if itemType.subclass:
-            return itemType.subclass(*args_, **kwargs_)
-        else:
-            return itemType(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_productName(self): return self.productName
-    def set_productName(self, productName): self.productName = productName
-    def get_quantity(self): return self.quantity
-    def set_quantity(self, quantity): self.quantity = quantity
-    def get_USPrice(self): return self.USPrice
-    def set_USPrice(self, USPrice): self.USPrice = USPrice
-    def get_comment(self): return self.comment
-    def set_comment(self, comment): self.comment = comment
-    def get_shipDate(self): return self.shipDate
-    def set_shipDate(self, shipDate): self.shipDate = shipDate
-    def get_partNum(self): return self.partNum
-    def set_partNum(self, partNum): self.partNum = partNum
-    def hasContent_(self):
-        if (
-            self.productName is not None or
-            self.quantity is not None or
-            self.USPrice is not None or
-            self.comment is not None or
-            self.shipDate is not None
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='ipo:', name_='itemType', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='itemType')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='itemType'):
-        if self.partNum is not None and 'partNum' not in already_processed:
-            already_processed.add('partNum')
-            outfile.write(' partNum=%s' % (quote_attrib(self.partNum), ))
-    def exportChildren(self, outfile, level, namespace_='ipo:', name_='itemType', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.productName is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_format_string(quote_xml(self.productName).encode(ExternalEncoding), input_name='productName'), namespace_, eol_))
-        if self.quantity is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_))
-        if self.USPrice is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_))
-        if self.comment is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_))
-        if self.shipDate is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='itemType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.partNum is not None and 'partNum' not in already_processed:
-            already_processed.add('partNum')
-            showIndent(outfile, level)
-            outfile.write('partNum=%s,\n' % (self.partNum,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.productName is not None:
-            showIndent(outfile, level)
-            outfile.write('productName=%s,\n' % quote_python(self.productName).encode(ExternalEncoding))
-        if self.quantity is not None:
-            showIndent(outfile, level)
-            outfile.write('quantity=%d,\n' % self.quantity)
-        if self.USPrice is not None:
-            showIndent(outfile, level)
-            outfile.write('USPrice=%f,\n' % self.USPrice)
-        if self.comment is not None:
-            showIndent(outfile, level)
-            outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding))
-        if self.shipDate is not None:
-            showIndent(outfile, level)
-            outfile.write('shipDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.shipDate, input_name='shipDate'))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('partNum', node)
-        if value is not None and 'partNum' not in already_processed:
-            already_processed.add('partNum')
-            self.partNum = value
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'productName':
-            productName_ = child_.text
-            productName_ = self.gds_validate_string(productName_, node, 'productName')
-            self.productName = productName_
-        elif nodeName_ == 'quantity':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            if ival_ <= 0:
-                raise_parse_error(child_, 'requires positiveInteger')
-            ival_ = self.gds_validate_integer(ival_, node, 'quantity')
-            self.quantity = ival_
-        elif nodeName_ == 'USPrice':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'USPrice')
-            self.USPrice = fval_
-        elif nodeName_ == 'comment':
-            comment_ = child_.text
-            comment_ = self.gds_validate_string(comment_, node, 'comment')
-            self.comment = comment_
-        elif nodeName_ == 'shipDate':
-            sval_ = child_.text
-            dval_ = self.gds_parse_date(sval_)
-            self.shipDate = dval_
-# end class itemType
-
-
-class quantity(GeneratedsSuper):
-    member_data_items_ = [
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, valueOf_=None):
-        self.valueOf_ = valueOf_
-    def factory(*args_, **kwargs_):
-        if quantity.subclass:
-            return quantity.subclass(*args_, **kwargs_)
-        else:
-            return quantity(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def hasContent_(self):
-        if (
-
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='quantity')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='quantity'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='quantity'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        pass
-# end class quantity
-
-
 GDSClassesMapping = {
+    'billTo': Address,
     'items': Items,
     'purchaseOrder': PurchaseOrderType,
     'shipTo': Address,
-    'billTo': Address,
-    'item': itemType,
 }
 
 
@@ -1447,7 +1400,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -1460,11 +1413,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1480,11 +1434,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1503,12 +1458,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1517,17 +1476,18 @@ def parseString(inString, silence=False):
     if not silence:
         sys.stdout.write('<?xml version="1.0" ?>\n')
         rootObj.export(
-            sys.stdout, 0, name_="purchaseOrder",
+            sys.stdout, 0, name_=rootTag,
             namespacedef_='xmlns:ipo="http://www.example.com/IPO"')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1536,7 +1496,7 @@ def parseLiteral(inFileName, silence=False):
     if not silence:
         sys.stdout.write('#from ipo2_sup import *\n\n')
         sys.stdout.write('import ipo2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.rootTag(\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
@@ -1561,6 +1521,6 @@ __all__ = [
     "PurchaseOrderType",
     "UKAddress",
     "USAddress",
-    "itemType",
+    "item",
     "quantity"
 ]
diff --git a/tests/ipo2_out.xml b/tests/ipo2_out.xml
deleted file mode 100644
index 3456bed..0000000
--- a/tests/ipo2_out.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" ?>
-<ipo:purchaseOrder xmlns:ipo="http://www.example.com/IPO" orderDate="1999-12-01">
-    <ipo:shipTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" category="1-a" exportCode="1">
-        <ipo:name>Helen Zoe</ipo:name>
-        <ipo:street>47 Eden Street</ipo:street>
-        <ipo:city>Cambridge</ipo:city>
-        <ipo:postcode>CB1 1JR</ipo:postcode>
-        <ipo:category>oneA</ipo:category>
-    </ipo:shipTo>
-    <ipo:billTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:USAddress">
-        <ipo:name>Robert Smith</ipo:name>
-        <ipo:street>8 Oak Avenue</ipo:street>
-        <ipo:city>Old Town</ipo:city>
-        <ipo:state>PA</ipo:state>
-        <ipo:zip>95819</ipo:zip>
-    </ipo:billTo>
-    <ipo:items>
-        <ipo:item partNum="833-AA">
-            <ipo:productName>Lapis necklace</ipo:productName>
-            <ipo:quantity>1</ipo:quantity>
-            <ipo:USPrice>99.950000000000003</ipo:USPrice>
-            <ipo:comment>Want this for the holidays</ipo:comment>
-            <ipo:shipDate>1999-12-05</ipo:shipDate>
-        </ipo:item>
-    </ipo:items>
-</ipo:purchaseOrder>
diff --git a/tests/ipo2_sub.py b/tests/ipo2_sub.py
index 5665691..01e5965 100644
--- a/tests/ipo2_sub.py
+++ b/tests/ipo2_sub.py
@@ -3,64 +3,36 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/ipo2_sup.py')
+#   ('-s', 'tests/ipo2_sub.py')
+#   ('--super', 'ipo2_sup')
+#
+# Command line arguments:
+#   tests/ipo.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/ipo2_sup.py" -s "tests/ipo2_sub.py" --super="ipo2_sup" tests/ipo.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import ipo2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -88,6 +60,13 @@ supermod.Items.subclass = ItemsSub
 # end class ItemsSub
 
 
+class itemSub(supermod.item):
+    def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
+        super(itemSub, self).__init__(partNum, productName, quantity, USPrice, comment, shipDate, )
+supermod.item.subclass = itemSub
+# end class itemSub
+
+
 class AddressSub(supermod.Address):
     def __init__(self, name=None, street=None, city=None, extensiontype_=None):
         super(AddressSub, self).__init__(name, street, city, extensiontype_, )
@@ -103,19 +82,12 @@ supermod.USAddress.subclass = USAddressSub
 
 
 class UKAddressSub(supermod.UKAddress):
-    def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None):
-        super(UKAddressSub, self).__init__(name, street, city, category_attr, exportCode, postcode, category, )
+    def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None):
+        super(UKAddressSub, self).__init__(name, street, city, exportCode, postcode, )
 supermod.UKAddress.subclass = UKAddressSub
 # end class UKAddressSub
 
 
-class itemTypeSub(supermod.itemType):
-    def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
-        super(itemTypeSub, self).__init__(partNum, productName, quantity, USPrice, comment, shipDate, )
-supermod.itemType.subclass = itemTypeSub
-# end class itemTypeSub
-
-
 def get_root_tag(node):
     tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
     rootClass = None
@@ -126,11 +98,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -146,11 +119,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -170,11 +144,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -189,11 +164,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PurchaseOrderType'
         rootClass = supermod.PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -202,8 +178,8 @@ def parseLiteral(inFilename, silence=False):
     if not silence:
         sys.stdout.write('#from ipo2_sup import *\n\n')
         sys.stdout.write('import ipo2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.purchaseOrder(\n')
-        rootObj.exportLiteral(sys.stdout, 0, name_="purchaseOrder")
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
 
@@ -214,7 +190,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py
index 2e452f2..5a27592 100644
--- a/tests/ipo2_sup.py
+++ b/tests/ipo2_sup.py
@@ -4,66 +4,53 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/ipo2_sup.py')
+#   ('-s', 'tests/ipo2_sub.py')
+#   ('--super', 'ipo2_sup')
+#
+# Command line arguments:
+#   tests/ipo.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/ipo2_sup.py" -s "tests/ipo2_sub.py" --super="ipo2_sup" tests/ipo.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +62,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +78,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +147,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +202,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +213,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +236,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +260,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +292,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +362,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +410,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +428,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +513,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +554,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -619,7 +670,8 @@ class PurchaseOrderType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, orderDate=None, shipTo=None, billTo=None, comment=None, items=None):
-        if isinstance(orderDate, basestring):
+        self.original_tagname_ = None
+        if isinstance(orderDate, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(orderDate, '%Y-%m-%d').date()
         else:
             initvalue_ = orderDate
@@ -629,6 +681,11 @@ class PurchaseOrderType(GeneratedsSuper):
         self.comment = comment
         self.items = items
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, PurchaseOrderType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if PurchaseOrderType.subclass:
             return PurchaseOrderType.subclass(*args_, **kwargs_)
         else:
@@ -654,18 +711,20 @@ class PurchaseOrderType(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='PurchaseOrderType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='PurchaseOrderType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -685,55 +744,23 @@ class PurchaseOrderType(GeneratedsSuper):
             self.billTo.export(outfile, level, namespace_, name_='billTo', pretty_print=pretty_print)
         if self.comment is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_))
+            outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_))
         if self.items is not None:
             self.items.export(outfile, level, namespace_, name_='items', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='PurchaseOrderType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.orderDate is not None and 'orderDate' not in already_processed:
-            already_processed.add('orderDate')
-            showIndent(outfile, level)
-            outfile.write('orderDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.orderDate, input_name='orderDate'))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.shipTo is not None:
-            showIndent(outfile, level)
-            outfile.write('shipTo=model_.Address(\n')
-            self.shipTo.exportLiteral(outfile, level, name_='shipTo')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.billTo is not None:
-            showIndent(outfile, level)
-            outfile.write('billTo=model_.Address(\n')
-            self.billTo.exportLiteral(outfile, level, name_='billTo')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.comment is not None:
-            showIndent(outfile, level)
-            outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding))
-        if self.items is not None:
-            showIndent(outfile, level)
-            outfile.write('items=model_.Items(\n')
-            self.items.exportLiteral(outfile, level, name_='items')
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('orderDate', node)
         if value is not None and 'orderDate' not in already_processed:
             already_processed.add('orderDate')
             try:
                 self.orderDate = self.gds_parse_date(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise ValueError('Bad date attribute (orderDate): %s' % exp)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'shipTo':
@@ -741,11 +768,13 @@ class PurchaseOrderType(GeneratedsSuper):
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.shipTo = obj_
+            obj_.original_tagname_ = 'shipTo'
         elif nodeName_ == 'billTo':
             class_obj_ = self.get_class_obj_(child_, Address)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.billTo = obj_
+            obj_.original_tagname_ = 'billTo'
         elif nodeName_ == 'comment':
             comment_ = child_.text
             comment_ = self.gds_validate_string(comment_, node, 'comment')
@@ -754,21 +783,28 @@ class PurchaseOrderType(GeneratedsSuper):
             obj_ = Items.factory()
             obj_.build(child_)
             self.items = obj_
+            obj_.original_tagname_ = 'items'
 # end class PurchaseOrderType
 
 
 class Items(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('item', 'itemType', 1),
+        MemberSpec_('item', 'item', 1),
     ]
     subclass = None
     superclass = None
     def __init__(self, item=None):
+        self.original_tagname_ = None
         if item is None:
             self.item = []
         else:
             self.item = item
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, Items)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if Items.subclass:
             return Items.subclass(*args_, **kwargs_)
         else:
@@ -777,7 +813,8 @@ class Items(GeneratedsSuper):
     def get_item(self): return self.item
     def set_item(self, item): self.item = item
     def add_item(self, value): self.item.append(value)
-    def insert_item(self, index, value): self.item[index] = value
+    def insert_item_at(self, index, value): self.item.insert(index, value)
+    def replace_item_at(self, index, value): self.item[index] = value
     def hasContent_(self):
         if (
             self.item
@@ -785,18 +822,20 @@ class Items(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='Items')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='Items', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -810,43 +849,230 @@ class Items(GeneratedsSuper):
             eol_ = ''
         for item_ in self.item:
             item_.export(outfile, level, namespace_, name_='item', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='Items'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('item=[\n')
-        level += 1
-        for item_ in self.item:
-            showIndent(outfile, level)
-            outfile.write('model_.itemType(\n')
-            item_.exportLiteral(outfile, level, name_='itemType')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'item':
-            obj_ = itemType.factory()
+            obj_ = item.factory()
             obj_.build(child_)
             self.item.append(obj_)
+            obj_.original_tagname_ = 'item'
 # end class Items
 
 
+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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
+        self.original_tagname_ = None
+        self.partNum = _cast(None, partNum)
+        self.productName = productName
+        self.quantity = quantity
+        self.USPrice = USPrice
+        self.comment = comment
+        if isinstance(shipDate, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date()
+        else:
+            initvalue_ = shipDate
+        self.shipDate = initvalue_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, item)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if item.subclass:
+            return item.subclass(*args_, **kwargs_)
+        else:
+            return item(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_productName(self): return self.productName
+    def set_productName(self, productName): self.productName = productName
+    def get_quantity(self): return self.quantity
+    def set_quantity(self, quantity): self.quantity = quantity
+    def get_USPrice(self): return self.USPrice
+    def set_USPrice(self, USPrice): self.USPrice = USPrice
+    def get_comment(self): return self.comment
+    def set_comment(self, comment): self.comment = comment
+    def get_shipDate(self): return self.shipDate
+    def set_shipDate(self, shipDate): self.shipDate = shipDate
+    def get_partNum(self): return self.partNum
+    def set_partNum(self, partNum): self.partNum = partNum
+    def hasContent_(self):
+        if (
+            self.productName is not None or
+            self.quantity is not None or
+            self.USPrice is not None or
+            self.comment is not None or
+            self.shipDate is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='ipo:', name_='item', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='item')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='item', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='item'):
+        if self.partNum is not None and 'partNum' not in already_processed:
+            already_processed.add('partNum')
+            outfile.write(' partNum=%s' % (quote_attrib(self.partNum), ))
+    def exportChildren(self, outfile, level, namespace_='ipo:', name_='item', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.productName is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.productName), input_name='productName')), namespace_, eol_))
+        if self.quantity is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_))
+        if self.USPrice is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_))
+        if self.comment is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_))
+        if self.shipDate is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('partNum', node)
+        if value is not None and 'partNum' not in already_processed:
+            already_processed.add('partNum')
+            self.partNum = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'productName':
+            productName_ = child_.text
+            productName_ = self.gds_validate_string(productName_, node, 'productName')
+            self.productName = productName_
+        elif nodeName_ == 'quantity':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            if ival_ <= 0:
+                raise_parse_error(child_, 'requires positiveInteger')
+            ival_ = self.gds_validate_integer(ival_, node, 'quantity')
+            self.quantity = ival_
+        elif nodeName_ == 'USPrice':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'USPrice')
+            self.USPrice = fval_
+        elif nodeName_ == 'comment':
+            comment_ = child_.text
+            comment_ = self.gds_validate_string(comment_, node, 'comment')
+            self.comment = comment_
+        elif nodeName_ == 'shipDate':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.shipDate = dval_
+# end class item
+
+
+class quantity(GeneratedsSuper):
+    member_data_items_ = [
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, valueOf_=None):
+        self.original_tagname_ = None
+        self.valueOf_ = valueOf_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, quantity)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if quantity.subclass:
+            return quantity.subclass(*args_, **kwargs_)
+        else:
+            return quantity(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='quantity')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='quantity', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='quantity'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class quantity
+
+
 class Address(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('name', 'string', 0),
@@ -856,11 +1082,17 @@ class Address(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, name=None, street=None, city=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.name = name
         self.street = street
         self.city = city
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, Address)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if Address.subclass:
             return Address.subclass(*args_, **kwargs_)
         else:
@@ -883,18 +1115,20 @@ class Address(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='Address')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='Address', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -912,37 +1146,20 @@ class Address(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         if self.street is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_format_string(quote_xml(self.street).encode(ExternalEncoding), input_name='street'), namespace_, eol_))
+            outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.street), input_name='street')), namespace_, eol_))
         if self.city is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_format_string(quote_xml(self.city).encode(ExternalEncoding), input_name='city'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='Address'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        if self.street is not None:
-            showIndent(outfile, level)
-            outfile.write('street=%s,\n' % quote_python(self.street).encode(ExternalEncoding))
-        if self.city is not None:
-            showIndent(outfile, level)
-            outfile.write('city=%s,\n' % quote_python(self.city).encode(ExternalEncoding))
+            outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.city), input_name='city')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
@@ -972,10 +1189,17 @@ class USAddress(Address):
     subclass = None
     superclass = Address
     def __init__(self, name=None, street=None, city=None, state=None, zip=None):
+        self.original_tagname_ = None
         super(USAddress, self).__init__(name, street, city, )
         self.state = state
+        self.validate_USState(self.state)
         self.zip = zip
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, USAddress)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if USAddress.subclass:
             return USAddress.subclass(*args_, **kwargs_)
         else:
@@ -987,7 +1211,16 @@ class USAddress(Address):
     def set_zip(self, zip): self.zip = zip
     def validate_USState(self, value):
         # Validate type USState, a restriction on string.
-        pass
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['AK', 'AL', 'AR', 'PA']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on USState' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.state is not None or
@@ -997,18 +1230,20 @@ class USAddress(Address):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='USAddress')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='USAddress', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1023,32 +1258,17 @@ class USAddress(Address):
             eol_ = ''
         if self.state is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_format_string(quote_xml(self.state).encode(ExternalEncoding), input_name='state'), namespace_, eol_))
+            outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.state), input_name='state')), namespace_, eol_))
         if self.zip is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%szip>%s</%szip>%s' % (namespace_, self.gds_format_integer(self.zip, input_name='zip'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='USAddress'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(USAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(USAddress, self).exportLiteralChildren(outfile, level, name_)
-        if self.state is not None:
-            showIndent(outfile, level)
-            outfile.write('state=%s,\n' % quote_python(self.state).encode(ExternalEncoding))
-        if self.zip is not None:
-            showIndent(outfile, level)
-            outfile.write('zip=%d,\n' % self.zip)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(USAddress, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1056,12 +1276,13 @@ class USAddress(Address):
             state_ = child_.text
             state_ = self.gds_validate_string(state_, node, 'state')
             self.state = state_
-            self.validate_USState(self.state)    # validate type USState
+            # validate type USState
+            self.validate_USState(self.state)
         elif nodeName_ == 'zip':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ <= 0:
                 raise_parse_error(child_, 'requires positiveInteger')
@@ -1073,20 +1294,22 @@ class USAddress(Address):
 
 class UKAddress(Address):
     member_data_items_ = [
-        MemberSpec_('category_attr', 'xs:string', 0),
         MemberSpec_('exportCode', 'positiveInteger', 0),
-        MemberSpec_('postcode', ['UKPostcode', 'string'], 0),
-        MemberSpec_('category', 'string', 0),
+        MemberSpec_('postcode', 'string', 0),
     ]
     subclass = None
     superclass = Address
-    def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None):
+    def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None):
+        self.original_tagname_ = None
         super(UKAddress, self).__init__(name, street, city, )
-        self.category_attr = _cast(None, category_attr)
         self.exportCode = _cast(int, exportCode)
         self.postcode = postcode
-        self.category = category
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, UKAddress)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if UKAddress.subclass:
             return UKAddress.subclass(*args_, **kwargs_)
         else:
@@ -1094,45 +1317,36 @@ class UKAddress(Address):
     factory = staticmethod(factory)
     def get_postcode(self): return self.postcode
     def set_postcode(self, postcode): self.postcode = postcode
-    def get_category(self): return self.category
-    def set_category(self, category): self.category = category
-    def get_category_attr(self): return self.category_attr
-    def set_category_attr(self, category_attr): self.category_attr = category_attr
     def get_exportCode(self): return self.exportCode
     def set_exportCode(self, exportCode): self.exportCode = exportCode
-    def validate_UKPostcode(self, value):
-        # Validate type UKPostcode, a restriction on string.
-        pass
     def hasContent_(self):
         if (
             self.postcode is not None or
-            self.category is not None or
             super(UKAddress, self).hasContent_()
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='UKAddress', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='UKAddress'):
         super(UKAddress, self).exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress')
-        if self.category_attr is not None and 'category_attr' not in already_processed:
-            already_processed.add('category_attr')
-            outfile.write(' category=%s' % (quote_attrib(self.category_attr), ))
         if self.exportCode is not None and 'exportCode' not in already_processed:
             already_processed.add('exportCode')
             outfile.write(' exportCode="%s"' % self.gds_format_integer(self.exportCode, input_name='exportCode'))
@@ -1144,51 +1358,21 @@ class UKAddress(Address):
             eol_ = ''
         if self.postcode is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_format_string(quote_xml(self.postcode).encode(ExternalEncoding), input_name='postcode'), namespace_, eol_))
-        if self.category is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_string(quote_xml(self.category).encode(ExternalEncoding), input_name='category'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='UKAddress'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.category_attr is not None and 'category_attr' not in already_processed:
-            already_processed.add('category_attr')
-            showIndent(outfile, level)
-            outfile.write('category_attr=%s,\n' % (self.category_attr,))
-        if self.exportCode is not None and 'exportCode' not in already_processed:
-            already_processed.add('exportCode')
-            showIndent(outfile, level)
-            outfile.write('exportCode=%d,\n' % (self.exportCode,))
-        super(UKAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(UKAddress, self).exportLiteralChildren(outfile, level, name_)
-        if self.postcode is not None:
-            showIndent(outfile, level)
-            outfile.write('postcode=%s,\n' % quote_python(self.postcode).encode(ExternalEncoding))
-        if self.category is not None:
-            showIndent(outfile, level)
-            outfile.write('category=%s,\n' % quote_python(self.category).encode(ExternalEncoding))
+            outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.postcode), input_name='postcode')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('category', node)
-        if value is not None and 'category_attr' not in already_processed:
-            already_processed.add('category_attr')
-            self.category_attr = value
         value = find_attr_value_('exportCode', node)
         if value is not None and 'exportCode' not in already_processed:
             already_processed.add('exportCode')
             try:
                 self.exportCode = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.exportCode <= 0:
                 raise_parse_error(node, 'Invalid PositiveInteger')
@@ -1198,246 +1382,15 @@ class UKAddress(Address):
             postcode_ = child_.text
             postcode_ = self.gds_validate_string(postcode_, node, 'postcode')
             self.postcode = postcode_
-            self.validate_UKPostcode(self.postcode)    # validate type UKPostcode
-        elif nodeName_ == 'category':
-            category_ = child_.text
-            category_ = self.gds_validate_string(category_, node, 'category')
-            self.category = category_
         super(UKAddress, self).buildChildren(child_, node, nodeName_, True)
 # end class UKAddress
 
 
-class itemType(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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None):
-        self.partNum = _cast(None, partNum)
-        self.productName = productName
-        self.quantity = quantity
-        self.USPrice = USPrice
-        self.comment = comment
-        if isinstance(shipDate, basestring):
-            initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date()
-        else:
-            initvalue_ = shipDate
-        self.shipDate = initvalue_
-    def factory(*args_, **kwargs_):
-        if itemType.subclass:
-            return itemType.subclass(*args_, **kwargs_)
-        else:
-            return itemType(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_productName(self): return self.productName
-    def set_productName(self, productName): self.productName = productName
-    def get_quantity(self): return self.quantity
-    def set_quantity(self, quantity): self.quantity = quantity
-    def get_USPrice(self): return self.USPrice
-    def set_USPrice(self, USPrice): self.USPrice = USPrice
-    def get_comment(self): return self.comment
-    def set_comment(self, comment): self.comment = comment
-    def get_shipDate(self): return self.shipDate
-    def set_shipDate(self, shipDate): self.shipDate = shipDate
-    def get_partNum(self): return self.partNum
-    def set_partNum(self, partNum): self.partNum = partNum
-    def hasContent_(self):
-        if (
-            self.productName is not None or
-            self.quantity is not None or
-            self.USPrice is not None or
-            self.comment is not None or
-            self.shipDate is not None
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='ipo:', name_='itemType', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='itemType')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='itemType'):
-        if self.partNum is not None and 'partNum' not in already_processed:
-            already_processed.add('partNum')
-            outfile.write(' partNum=%s' % (quote_attrib(self.partNum), ))
-    def exportChildren(self, outfile, level, namespace_='ipo:', name_='itemType', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.productName is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_format_string(quote_xml(self.productName).encode(ExternalEncoding), input_name='productName'), namespace_, eol_))
-        if self.quantity is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_))
-        if self.USPrice is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_))
-        if self.comment is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_))
-        if self.shipDate is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='itemType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.partNum is not None and 'partNum' not in already_processed:
-            already_processed.add('partNum')
-            showIndent(outfile, level)
-            outfile.write('partNum=%s,\n' % (self.partNum,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.productName is not None:
-            showIndent(outfile, level)
-            outfile.write('productName=%s,\n' % quote_python(self.productName).encode(ExternalEncoding))
-        if self.quantity is not None:
-            showIndent(outfile, level)
-            outfile.write('quantity=%d,\n' % self.quantity)
-        if self.USPrice is not None:
-            showIndent(outfile, level)
-            outfile.write('USPrice=%f,\n' % self.USPrice)
-        if self.comment is not None:
-            showIndent(outfile, level)
-            outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding))
-        if self.shipDate is not None:
-            showIndent(outfile, level)
-            outfile.write('shipDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.shipDate, input_name='shipDate'))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('partNum', node)
-        if value is not None and 'partNum' not in already_processed:
-            already_processed.add('partNum')
-            self.partNum = value
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'productName':
-            productName_ = child_.text
-            productName_ = self.gds_validate_string(productName_, node, 'productName')
-            self.productName = productName_
-        elif nodeName_ == 'quantity':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            if ival_ <= 0:
-                raise_parse_error(child_, 'requires positiveInteger')
-            ival_ = self.gds_validate_integer(ival_, node, 'quantity')
-            self.quantity = ival_
-        elif nodeName_ == 'USPrice':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'USPrice')
-            self.USPrice = fval_
-        elif nodeName_ == 'comment':
-            comment_ = child_.text
-            comment_ = self.gds_validate_string(comment_, node, 'comment')
-            self.comment = comment_
-        elif nodeName_ == 'shipDate':
-            sval_ = child_.text
-            dval_ = self.gds_parse_date(sval_)
-            self.shipDate = dval_
-# end class itemType
-
-
-class quantity(GeneratedsSuper):
-    member_data_items_ = [
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, valueOf_=None):
-        self.valueOf_ = valueOf_
-    def factory(*args_, **kwargs_):
-        if quantity.subclass:
-            return quantity.subclass(*args_, **kwargs_)
-        else:
-            return quantity(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def hasContent_(self):
-        if (
-
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='quantity')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='quantity'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='quantity'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        pass
-# end class quantity
-
-
 GDSClassesMapping = {
+    'billTo': Address,
     'items': Items,
     'purchaseOrder': PurchaseOrderType,
     'shipTo': Address,
-    'billTo': Address,
-    'item': itemType,
 }
 
 
@@ -1447,7 +1400,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -1460,11 +1413,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1480,11 +1434,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1503,12 +1458,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1517,17 +1476,18 @@ def parseString(inString, silence=False):
     if not silence:
         sys.stdout.write('<?xml version="1.0" ?>\n')
         rootObj.export(
-            sys.stdout, 0, name_="purchaseOrder",
+            sys.stdout, 0, name_=rootTag,
             namespacedef_='xmlns:ipo="http://www.example.com/IPO"')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'purchaseOrder'
+        rootTag = 'PurchaseOrderType'
         rootClass = PurchaseOrderType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1536,7 +1496,7 @@ def parseLiteral(inFileName, silence=False):
     if not silence:
         sys.stdout.write('#from ipo2_sup import *\n\n')
         sys.stdout.write('import ipo2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.rootTag(\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
@@ -1561,6 +1521,6 @@ __all__ = [
     "PurchaseOrderType",
     "UKAddress",
     "USAddress",
-    "itemType",
+    "item",
     "quantity"
 ]
diff --git a/tests/literal1.py b/tests/literal1.py
index 6e24702..9a0fb87 100644
--- a/tests/literal1.py
+++ b/tests/literal1.py
@@ -2,7 +2,7 @@
 
 import out2_sup as model_
 
-rootObj = model_.rootTag(
+rootObj = model_.rootClass(
     comments=[
         model_.comments(
             content_ = [
@@ -27,9 +27,9 @@ rootObj = model_.rootTag(
     ],
     person=[
         model_.person(
-            ratio=3.200000,
-            id=1,
             value="abcd",
+            id=1,
+            ratio=3.200000,
             name='Alberta',
             interest=[
                 'gardening',
@@ -54,9 +54,9 @@ rootObj = model_.rootTag(
                     lastname='Diddly',
                     priority=4.500000,
                     info=model_.info(
-                        rating=5.330000,
-                        type_=321,
                         name="Albert Abasinian",
+                        type_=321,
+                        rating=5.330000,
                     ),
                 ),
             ],
@@ -117,9 +117,9 @@ rootObj = model_.rootTag(
                     lastname='Echo',
                     priority=3.800000,
                     info=model_.info(
-                        rating=5.330000,
-                        type_=321,
                         name="George Gregory",
+                        type_=321,
+                        rating=5.330000,
                     ),
                 ),
             ],
@@ -137,9 +137,9 @@ rootObj = model_.rootTag(
             elshort=123,
             ellong=13241234123412341234,
             elparam=model_.param(
-                semantic="a big semantic",
-                name="Davy",
                 id="id001",
+                name="Davy",
+                semantic="a big semantic",
                 valueOf_ = """""",
             ),
         ),
@@ -149,11 +149,11 @@ rootObj = model_.rootTag(
             nick_name="davy",
             language="python",
             area="xml",
-            vegetable="tomato",
-            fruit="peach",
-            ratio=8.700000,
-            id=232,
             value="abcd",
+            id=232,
+            ratio=8.700000,
+            fruit="peach",
+            vegetable="tomato",
             name='Darrel Dawson',
             interest=[
                 'hang gliding',
@@ -165,9 +165,9 @@ rootObj = model_.rootTag(
                     lastname='Hippolite',
                     priority=5.200000,
                     info=model_.info(
-                        rating=6.550000,
-                        type_=543,
                         name="Harvey Hippolite",
+                        type_=543,
+                        rating=6.550000,
                     ),
                 ),
             ],
@@ -183,11 +183,11 @@ rootObj = model_.rootTag(
             nick_name="davy",
             language="python",
             area="xml",
-            vegetable="tomato",
-            fruit="peach",
-            ratio=8.700000,
-            id=232,
             value="abcd",
+            id=232,
+            ratio=8.700000,
+            fruit="peach",
+            vegetable="tomato",
             name='Darrel Dawson',
             interest=[
                 'hang gliding',
@@ -199,9 +199,9 @@ rootObj = model_.rootTag(
                     lastname='Hippolite',
                     priority=5.200000,
                     info=model_.info(
-                        rating=6.550000,
-                        type_=543,
                         name="Harvey Hippolite",
+                        type_=543,
+                        rating=6.550000,
                     ),
                 ),
             ],
diff --git a/tests/mapcleanname.xsd b/tests/mapcleanname.xsd
new file mode 100644
index 0000000..7e63969
--- /dev/null
+++ b/tests/mapcleanname.xsd
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:complexType name="complex-type01">
+        <xs:sequence>
+            <xs:element name="string_value01" type="xs:string"/>
+            <xs:element name="integer_value01" type="xs:integer"
+                minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="float_value01" type="xs:float"/>
+            <xs:element name="field01" type="complex-type02"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="complex-type02">
+        <xs:sequence>
+            <xs:element name="string_value02" type="xs:string"/>
+            <xs:element name="integer_value02" type="xs:integer"
+                minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="float_value02" type="xs:float"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="complex-type03">
+        <xs:extension base="complex-type02">
+            <xs:sequence>
+                <xs:element name="string_value03" type="xs:string"/>
+                <xs:element name="integer_value03" type="xs:integer"
+                    minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element name="float_value03" type="xs:float"/>
+            </xs:sequence>
+        </xs:extension>
+    </xs:complexType>
+
+    <xs:complexType name="type">
+        <xs:sequence>
+            <xs:element name="string_value02" type="xs:string"/>
+            <xs:element name="integer_value02" type="xs:integer"
+                minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="float_value02" type="xs:float"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="complex-type04">
+        <xs:extension base="type">
+            <xs:sequence>
+                <xs:element name="string_value03" type="xs:string"/>
+                <xs:element name="integer_value03" type="xs:integer"
+                    minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element name="float_value03" type="xs:float"/>
+            </xs:sequence>
+        </xs:extension>
+    </xs:complexType>
+
+    <xs:complexType name="build">
+        <xs:sequence>
+            <xs:element name="string_value02" type="xs:string"/>
+            <xs:element name="integer_value02" type="xs:integer"
+                minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="float_value02" type="xs:float"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="complex-type05">
+        <xs:extension base="build">
+            <xs:sequence>
+                <xs:element name="string_value03" type="xs:string"/>
+                <xs:element name="integer_value03" type="xs:integer"
+                    minOccurs="0" maxOccurs="unbounded"/>
+                <xs:element name="float_value03" type="xs:float"/>
+            </xs:sequence>
+        </xs:extension>
+    </xs:complexType>
+
+</xs:schema>
diff --git a/tests/mapcleanname1_sub.py b/tests/mapcleanname1_sub.py
new file mode 100644
index 0000000..fc4dbd2
--- /dev/null
+++ b/tests/mapcleanname1_sub.py
@@ -0,0 +1,215 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/mapcleanname2_sup.py')
+#   ('-s', 'tests/mapcleanname2_sub.py')
+#   ('--super', 'mapcleanname2_sup')
+#
+# Command line arguments:
+#   tests/mapcleanname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/mapcleanname2_sup.py" -s "tests/mapcleanname2_sub.py" --super="mapcleanname2_sup" tests/mapcleanname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import mapcleanname2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class complex_type01Sub(supermod.complex_type01):
+    def __init__(self, string_value01=None, integer_value01=None, float_value01=None, field01=None):
+        super(complex_type01Sub, self).__init__(string_value01, integer_value01, float_value01, field01, )
+supermod.complex_type01.subclass = complex_type01Sub
+# end class complex_type01Sub
+
+
+class complex_type02Sub(supermod.complex_type02):
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None):
+        super(complex_type02Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, )
+supermod.complex_type02.subclass = complex_type02Sub
+# end class complex_type02Sub
+
+
+class complex_type03Sub(supermod.complex_type03):
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None):
+        super(complex_type03Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, )
+supermod.complex_type03.subclass = complex_type03Sub
+# end class complex_type03Sub
+
+
+class type_Sub(supermod.type_):
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None):
+        super(type_Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, )
+supermod.type_.subclass = type_Sub
+# end class type_Sub
+
+
+class complex_type04Sub(supermod.complex_type04):
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None):
+        super(complex_type04Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, )
+supermod.complex_type04.subclass = complex_type04Sub
+# end class complex_type04Sub
+
+
+class build_Sub(supermod.build_):
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None):
+        super(build_Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, )
+supermod.build_.subclass = build_Sub
+# end class build_Sub
+
+
+class complex_type05Sub(supermod.complex_type05):
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None):
+        super(complex_type05Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, )
+supermod.complex_type05.subclass = complex_type05Sub
+# end class complex_type05Sub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'complex_type01'
+        rootClass = supermod.complex_type01
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'complex_type01'
+        rootClass = supermod.complex_type01
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'complex_type01'
+        rootClass = supermod.complex_type01
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'complex_type01'
+        rootClass = supermod.complex_type01
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from mapcleanname2_sup import *\n\n')
+##         sys.stdout.write('import mapcleanname2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py
new file mode 100644
index 0000000..02e1136
--- /dev/null
+++ b/tests/mapcleanname1_sup.py
@@ -0,0 +1,1635 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/mapcleanname2_sup.py')
+#   ('-s', 'tests/mapcleanname2_sub.py')
+#   ('--super', 'mapcleanname2_sup')
+#
+# Command line arguments:
+#   tests/mapcleanname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/mapcleanname2_sup.py" -s "tests/mapcleanname2_sub.py" --super="mapcleanname2_sup" tests/mapcleanname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class 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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, string_value01=None, integer_value01=None, float_value01=None, field01=None):
+        self.original_tagname_ = None
+        self.string_value01 = string_value01
+        if integer_value01 is None:
+            self.integer_value01 = []
+        else:
+            self.integer_value01 = integer_value01
+        self.float_value01 = float_value01
+        self.field01 = field01
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, complex_type01)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if complex_type01.subclass:
+            return complex_type01.subclass(*args_, **kwargs_)
+        else:
+            return complex_type01(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_string_value01(self): return self.string_value01
+    def set_string_value01(self, string_value01): self.string_value01 = string_value01
+    def get_integer_value01(self): return self.integer_value01
+    def set_integer_value01(self, integer_value01): self.integer_value01 = integer_value01
+    def add_integer_value01(self, value): self.integer_value01.append(value)
+    def insert_integer_value01_at(self, index, value): self.integer_value01.insert(index, value)
+    def replace_integer_value01_at(self, index, value): self.integer_value01[index] = value
+    def get_float_value01(self): return self.float_value01
+    def set_float_value01(self, float_value01): self.float_value01 = float_value01
+    def get_field01(self): return self.field01
+    def set_field01(self, field01): self.field01 = field01
+    def hasContent_(self):
+        if (
+            self.string_value01 is not None or
+            self.integer_value01 or
+            self.float_value01 is not None or
+            self.field01 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='complex-type01', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type01')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type01', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type01'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='complex-type01', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.string_value01 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sstring_value01>%s</%sstring_value01>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value01), input_name='string_value01')), namespace_, eol_))
+        for integer_value01_ in self.integer_value01:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_value01>%s</%sinteger_value01>%s' % (namespace_, self.gds_format_integer(integer_value01_, input_name='integer_value01'), namespace_, eol_))
+        if self.float_value01 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfloat_value01>%s</%sfloat_value01>%s' % (namespace_, self.gds_format_float(self.float_value01, input_name='float_value01'), namespace_, eol_))
+        if self.field01 is not None:
+            self.field01.export(outfile, level, namespace_, name_='field01', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'string_value01':
+            string_value01_ = child_.text
+            string_value01_ = self.gds_validate_string(string_value01_, node, 'string_value01')
+            self.string_value01 = string_value01_
+        elif nodeName_ == 'integer_value01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_value01')
+            self.integer_value01.append(ival_)
+        elif nodeName_ == 'float_value01':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'float_value01')
+            self.float_value01 = fval_
+        elif nodeName_ == 'field01':
+            obj_ = complex_type02.factory()
+            obj_.build(child_)
+            self.field01 = obj_
+            obj_.original_tagname_ = 'field01'
+# end class complex_type01
+
+
+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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None):
+        self.original_tagname_ = None
+        self.string_value02 = string_value02
+        if integer_value02 is None:
+            self.integer_value02 = []
+        else:
+            self.integer_value02 = integer_value02
+        self.float_value02 = float_value02
+        self.extensiontype_ = extensiontype_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, complex_type02)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if complex_type02.subclass:
+            return complex_type02.subclass(*args_, **kwargs_)
+        else:
+            return complex_type02(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_string_value02(self): return self.string_value02
+    def set_string_value02(self, string_value02): self.string_value02 = string_value02
+    def get_integer_value02(self): return self.integer_value02
+    def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02
+    def add_integer_value02(self, value): self.integer_value02.append(value)
+    def insert_integer_value02_at(self, index, value): self.integer_value02.insert(index, value)
+    def replace_integer_value02_at(self, index, value): self.integer_value02[index] = value
+    def get_float_value02(self): return self.float_value02
+    def set_float_value02(self, float_value02): self.float_value02 = float_value02
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def hasContent_(self):
+        if (
+            self.string_value02 is not None or
+            self.integer_value02 or
+            self.float_value02 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='complex-type02', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type02')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type02', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type02'):
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='complex-type02', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.string_value02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value02), input_name='string_value02')), namespace_, eol_))
+        for integer_value02_ in self.integer_value02:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_))
+        if self.float_value02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'string_value02':
+            string_value02_ = child_.text
+            string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02')
+            self.string_value02 = string_value02_
+        elif nodeName_ == 'integer_value02':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_value02')
+            self.integer_value02.append(ival_)
+        elif nodeName_ == 'float_value02':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'float_value02')
+            self.float_value02 = fval_
+# end class complex_type02
+
+
+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),
+    ]
+    subclass = None
+    superclass = complex_type02
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None):
+        self.original_tagname_ = None
+        super(complex_type03, self).__init__(string_value02, integer_value02, float_value02, )
+        self.string_value03 = string_value03
+        if integer_value03 is None:
+            self.integer_value03 = []
+        else:
+            self.integer_value03 = integer_value03
+        self.float_value03 = float_value03
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, complex_type03)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if complex_type03.subclass:
+            return complex_type03.subclass(*args_, **kwargs_)
+        else:
+            return complex_type03(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_string_value03(self): return self.string_value03
+    def set_string_value03(self, string_value03): self.string_value03 = string_value03
+    def get_integer_value03(self): return self.integer_value03
+    def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03
+    def add_integer_value03(self, value): self.integer_value03.append(value)
+    def insert_integer_value03_at(self, index, value): self.integer_value03.insert(index, value)
+    def replace_integer_value03_at(self, index, value): self.integer_value03[index] = value
+    def get_float_value03(self): return self.float_value03
+    def set_float_value03(self, float_value03): self.float_value03 = float_value03
+    def hasContent_(self):
+        if (
+            self.string_value03 is not None or
+            self.integer_value03 or
+            self.float_value03 is not None or
+            super(complex_type03, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='complex-type03', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type03')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type03', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type03'):
+        super(complex_type03, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type03')
+    def exportChildren(self, outfile, level, namespace_='', name_='complex-type03', fromsubclass_=False, pretty_print=True):
+        super(complex_type03, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.string_value03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value03), input_name='string_value03')), namespace_, eol_))
+        for integer_value03_ in self.integer_value03:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_))
+        if self.float_value03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        super(complex_type03, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'string_value03':
+            string_value03_ = child_.text
+            string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03')
+            self.string_value03 = string_value03_
+        elif nodeName_ == 'integer_value03':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_value03')
+            self.integer_value03.append(ival_)
+        elif nodeName_ == 'float_value03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'float_value03')
+            self.float_value03 = fval_
+        super(complex_type03, self).buildChildren(child_, node, nodeName_, True)
+# end class complex_type03
+
+
+class type_(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('string_value02', 'xs:string', 0),
+        MemberSpec_('integer_value02', 'xs:integer', 1),
+        MemberSpec_('float_value02', 'xs:float', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None):
+        self.original_tagname_ = None
+        self.string_value02 = string_value02
+        if integer_value02 is None:
+            self.integer_value02 = []
+        else:
+            self.integer_value02 = integer_value02
+        self.float_value02 = float_value02
+        self.extensiontype_ = extensiontype_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, type_)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if type_.subclass:
+            return type_.subclass(*args_, **kwargs_)
+        else:
+            return type_(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_string_value02(self): return self.string_value02
+    def set_string_value02(self, string_value02): self.string_value02 = string_value02
+    def get_integer_value02(self): return self.integer_value02
+    def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02
+    def add_integer_value02(self, value): self.integer_value02.append(value)
+    def insert_integer_value02_at(self, index, value): self.integer_value02.insert(index, value)
+    def replace_integer_value02_at(self, index, value): self.integer_value02[index] = value
+    def get_float_value02(self): return self.float_value02
+    def set_float_value02(self, float_value02): self.float_value02 = float_value02
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def hasContent_(self):
+        if (
+            self.string_value02 is not None or
+            self.integer_value02 or
+            self.float_value02 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='type', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='type')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='type', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='type'):
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='type', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.string_value02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value02), input_name='string_value02')), namespace_, eol_))
+        for integer_value02_ in self.integer_value02:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_))
+        if self.float_value02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'string_value02':
+            string_value02_ = child_.text
+            string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02')
+            self.string_value02 = string_value02_
+        elif nodeName_ == 'integer_value02':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_value02')
+            self.integer_value02.append(ival_)
+        elif nodeName_ == 'float_value02':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'float_value02')
+            self.float_value02 = fval_
+# end class type_
+
+
+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),
+    ]
+    subclass = None
+    superclass = type_
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None):
+        self.original_tagname_ = None
+        super(complex_type04, self).__init__(string_value02, integer_value02, float_value02, )
+        self.string_value03 = string_value03
+        if integer_value03 is None:
+            self.integer_value03 = []
+        else:
+            self.integer_value03 = integer_value03
+        self.float_value03 = float_value03
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, complex_type04)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if complex_type04.subclass:
+            return complex_type04.subclass(*args_, **kwargs_)
+        else:
+            return complex_type04(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_string_value03(self): return self.string_value03
+    def set_string_value03(self, string_value03): self.string_value03 = string_value03
+    def get_integer_value03(self): return self.integer_value03
+    def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03
+    def add_integer_value03(self, value): self.integer_value03.append(value)
+    def insert_integer_value03_at(self, index, value): self.integer_value03.insert(index, value)
+    def replace_integer_value03_at(self, index, value): self.integer_value03[index] = value
+    def get_float_value03(self): return self.float_value03
+    def set_float_value03(self, float_value03): self.float_value03 = float_value03
+    def hasContent_(self):
+        if (
+            self.string_value03 is not None or
+            self.integer_value03 or
+            self.float_value03 is not None or
+            super(complex_type04, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='complex-type04', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type04')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type04', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type04'):
+        super(complex_type04, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type04')
+    def exportChildren(self, outfile, level, namespace_='', name_='complex-type04', fromsubclass_=False, pretty_print=True):
+        super(complex_type04, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.string_value03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value03), input_name='string_value03')), namespace_, eol_))
+        for integer_value03_ in self.integer_value03:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_))
+        if self.float_value03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        super(complex_type04, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'string_value03':
+            string_value03_ = child_.text
+            string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03')
+            self.string_value03 = string_value03_
+        elif nodeName_ == 'integer_value03':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_value03')
+            self.integer_value03.append(ival_)
+        elif nodeName_ == 'float_value03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'float_value03')
+            self.float_value03 = fval_
+        super(complex_type04, self).buildChildren(child_, node, nodeName_, True)
+# end class complex_type04
+
+
+class build_(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('string_value02', 'xs:string', 0),
+        MemberSpec_('integer_value02', 'xs:integer', 1),
+        MemberSpec_('float_value02', 'xs:float', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None):
+        self.original_tagname_ = None
+        self.string_value02 = string_value02
+        if integer_value02 is None:
+            self.integer_value02 = []
+        else:
+            self.integer_value02 = integer_value02
+        self.float_value02 = float_value02
+        self.extensiontype_ = extensiontype_
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, build_)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if build_.subclass:
+            return build_.subclass(*args_, **kwargs_)
+        else:
+            return build_(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_string_value02(self): return self.string_value02
+    def set_string_value02(self, string_value02): self.string_value02 = string_value02
+    def get_integer_value02(self): return self.integer_value02
+    def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02
+    def add_integer_value02(self, value): self.integer_value02.append(value)
+    def insert_integer_value02_at(self, index, value): self.integer_value02.insert(index, value)
+    def replace_integer_value02_at(self, index, value): self.integer_value02[index] = value
+    def get_float_value02(self): return self.float_value02
+    def set_float_value02(self, float_value02): self.float_value02 = float_value02
+    def get_extensiontype_(self): return self.extensiontype_
+    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
+    def hasContent_(self):
+        if (
+            self.string_value02 is not None or
+            self.integer_value02 or
+            self.float_value02 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='build', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='build')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='build', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='build'):
+        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+            outfile.write(' xsi:type="%s"' % self.extensiontype_)
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='build', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.string_value02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value02), input_name='string_value02')), namespace_, eol_))
+        for integer_value02_ in self.integer_value02:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_))
+        if self.float_value02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('xsi:type', node)
+        if value is not None and 'xsi:type' not in already_processed:
+            already_processed.add('xsi:type')
+            self.extensiontype_ = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'string_value02':
+            string_value02_ = child_.text
+            string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02')
+            self.string_value02 = string_value02_
+        elif nodeName_ == 'integer_value02':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_value02')
+            self.integer_value02.append(ival_)
+        elif nodeName_ == 'float_value02':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'float_value02')
+            self.float_value02 = fval_
+# end class build_
+
+
+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),
+    ]
+    subclass = None
+    superclass = build_
+    def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None):
+        self.original_tagname_ = None
+        super(complex_type05, self).__init__(string_value02, integer_value02, float_value02, )
+        self.string_value03 = string_value03
+        if integer_value03 is None:
+            self.integer_value03 = []
+        else:
+            self.integer_value03 = integer_value03
+        self.float_value03 = float_value03
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, complex_type05)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if complex_type05.subclass:
+            return complex_type05.subclass(*args_, **kwargs_)
+        else:
+            return complex_type05(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_string_value03(self): return self.string_value03
+    def set_string_value03(self, string_value03): self.string_value03 = string_value03
+    def get_integer_value03(self): return self.integer_value03
+    def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03
+    def add_integer_value03(self, value): self.integer_value03.append(value)
+    def insert_integer_value03_at(self, index, value): self.integer_value03.insert(index, value)
+    def replace_integer_value03_at(self, index, value): self.integer_value03[index] = value
+    def get_float_value03(self): return self.float_value03
+    def set_float_value03(self, float_value03): self.float_value03 = float_value03
+    def hasContent_(self):
+        if (
+            self.string_value03 is not None or
+            self.integer_value03 or
+            self.float_value03 is not None or
+            super(complex_type05, self).hasContent_()
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='complex-type05', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type05')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type05', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type05'):
+        super(complex_type05, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type05')
+    def exportChildren(self, outfile, level, namespace_='', name_='complex-type05', fromsubclass_=False, pretty_print=True):
+        super(complex_type05, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.string_value03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value03), input_name='string_value03')), namespace_, eol_))
+        for integer_value03_ in self.integer_value03:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_))
+        if self.float_value03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        super(complex_type05, self).buildAttributes(node, attrs, already_processed)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'string_value03':
+            string_value03_ = child_.text
+            string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03')
+            self.string_value03 = string_value03_
+        elif nodeName_ == 'integer_value03':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_value03')
+            self.integer_value03.append(ival_)
+        elif nodeName_ == 'float_value03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'float_value03')
+            self.float_value03 = fval_
+        super(complex_type05, self).buildChildren(child_, node, nodeName_, True)
+# end class complex_type05
+
+
+GDSClassesMapping = {
+    'field01': complex_type02,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'complex_type01'
+        rootClass = complex_type01
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='',
+##             pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'complex_type01'
+        rootClass = complex_type01
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+##     if not silence:
+##         content = etree_.tostring(
+##             rootElement, pretty_print=True,
+##             xml_declaration=True, encoding="utf-8")
+##         sys.stdout.write(content)
+##         sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'complex_type01'
+        rootClass = complex_type01
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('<?xml version="1.0" ?>\n')
+##         rootObj.export(
+##             sys.stdout, 0, name_=rootTag,
+##             namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'complex_type01'
+        rootClass = complex_type01
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+##     if not silence:
+##         sys.stdout.write('#from mapcleanname2_sup import *\n\n')
+##         sys.stdout.write('import mapcleanname2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+##         sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "build_",
+    "complex_type01",
+    "complex_type02",
+    "complex_type03",
+    "complex_type04",
+    "complex_type05",
+    "type_"
+]
diff --git a/tests/nested_def.xml b/tests/nested_def.xml
new file mode 100644
index 0000000..3582540
--- /dev/null
+++ b/tests/nested_def.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container>
+    <item1>
+        <inner attrA1="attrA1value" attrA2="attrA2value"/>
+    </item1>
+    <item2>
+        <inner attrB1="attrB1value" attrB2="attrB2value"/>
+    </item2>
+</container>
diff --git a/tests/nested_def.xsd b/tests/nested_def.xsd
new file mode 100644
index 0000000..9ad3b50
--- /dev/null
+++ b/tests/nested_def.xsd
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+    <xs:element name="container" type="containerType" />
+
+    <xs:complexType name="containerType">
+        <xs:sequence>
+            <xs:element name="item1" type="classAType" />
+            <xs:element name="item2" type="classBType" />
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="classA" type="classAType" />
+    <xs:complexType name="classAType">
+        <xs:sequence>
+            <xs:element name="inner">
+                <xs:complexType>
+                    <xs:attribute name="attrA1" type="xs:string"/>
+                    <xs:attribute name="attrA2" type="xs:string"/>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:element name="classB" type="classBType" />
+    <xs:complexType name="classBType">
+        <xs:sequence>
+            <xs:element name="inner">
+                <xs:complexType>
+                    <xs:attribute name="attrB1" type="xs:string"/>
+                    <xs:attribute name="attrB2" type="xs:string"/>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+</xs:schema>
diff --git a/tests/nested_def1_out.xml b/tests/nested_def1_out.xml
new file mode 100644
index 0000000..692c598
--- /dev/null
+++ b/tests/nested_def1_out.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" ?>
+<container>
+    <item1>
+        <inner attrA1="attrA1value" attrA2="attrA2value"/>
+    </item1>
+    <item2>
+        <inner attrB1="attrB1value" attrB2="attrB2value"/>
+    </item2>
+</container>
diff --git a/tests/nested_def1_sub.py b/tests/nested_def1_sub.py
new file mode 100644
index 0000000..14bfb18
--- /dev/null
+++ b/tests/nested_def1_sub.py
@@ -0,0 +1,200 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/nested_def2_sup.py')
+#   ('-s', 'tests/nested_def2_sub.py')
+#   ('--super', 'nested_def2_sup')
+#
+# Command line arguments:
+#   tests/nested_def.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/nested_def2_sup.py" -s "tests/nested_def2_sub.py" --super="nested_def2_sup" tests/nested_def.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import nested_def2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class containerTypeSub(supermod.containerType):
+    def __init__(self, item1=None, item2=None):
+        super(containerTypeSub, self).__init__(item1, item2, )
+supermod.containerType.subclass = containerTypeSub
+# end class containerTypeSub
+
+
+class classATypeSub(supermod.classAType):
+    def __init__(self, inner=None):
+        super(classATypeSub, self).__init__(inner, )
+supermod.classAType.subclass = classATypeSub
+# end class classATypeSub
+
+
+class classBTypeSub(supermod.classBType):
+    def __init__(self, inner=None):
+        super(classBTypeSub, self).__init__(inner, )
+supermod.classBType.subclass = classBTypeSub
+# end class classBTypeSub
+
+
+class innerTypeSub(supermod.innerType):
+    def __init__(self, attrA1=None, attrA2=None):
+        super(innerTypeSub, self).__init__(attrA1, attrA2, )
+supermod.innerType.subclass = innerTypeSub
+# end class innerTypeSub
+
+
+class innerType1Sub(supermod.innerType1):
+    def __init__(self, attrB1=None, attrB2=None):
+        super(innerType1Sub, self).__init__(attrB1, attrB2, )
+supermod.innerType1.subclass = innerType1Sub
+# end class innerType1Sub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from nested_def2_sup import *\n\n')
+        sys.stdout.write('import nested_def2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py
new file mode 100644
index 0000000..a0ca03d
--- /dev/null
+++ b/tests/nested_def1_sup.py
@@ -0,0 +1,1193 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/nested_def2_sup.py')
+#   ('-s', 'tests/nested_def2_sub.py')
+#   ('--super', 'nested_def2_sup')
+#
+# Command line arguments:
+#   tests/nested_def.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/nested_def2_sup.py" -s "tests/nested_def2_sub.py" --super="nested_def2_sup" tests/nested_def.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class containerType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('item1', 'classAType', 0),
+        MemberSpec_('item2', 'classBType', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, item1=None, item2=None):
+        self.original_tagname_ = None
+        self.item1 = item1
+        self.item2 = item2
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, containerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if containerType.subclass:
+            return containerType.subclass(*args_, **kwargs_)
+        else:
+            return containerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_item1(self): return self.item1
+    def set_item1(self, item1): self.item1 = item1
+    def get_item2(self): return self.item2
+    def set_item2(self, item2): self.item2 = item2
+    def hasContent_(self):
+        if (
+            self.item1 is not None or
+            self.item2 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='containerType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.item1 is not None:
+            self.item1.export(outfile, level, namespace_, name_='item1', pretty_print=pretty_print)
+        if self.item2 is not None:
+            self.item2.export(outfile, level, namespace_, name_='item2', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'item1':
+            obj_ = classAType.factory()
+            obj_.build(child_)
+            self.item1 = obj_
+            obj_.original_tagname_ = 'item1'
+        elif nodeName_ == 'item2':
+            obj_ = classBType.factory()
+            obj_.build(child_)
+            self.item2 = obj_
+            obj_.original_tagname_ = 'item2'
+# end class containerType
+
+
+class classAType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('inner', 'innerType', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, inner=None):
+        self.original_tagname_ = None
+        self.inner = inner
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, classAType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if classAType.subclass:
+            return classAType.subclass(*args_, **kwargs_)
+        else:
+            return classAType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_inner(self): return self.inner
+    def set_inner(self, inner): self.inner = inner
+    def hasContent_(self):
+        if (
+            self.inner is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='classAType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='classAType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='classAType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='classAType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='classAType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.inner is not None:
+            self.inner.export(outfile, level, namespace_, name_='inner', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'inner':
+            obj_ = innerType.factory()
+            obj_.build(child_)
+            self.inner = obj_
+            obj_.original_tagname_ = 'inner'
+# end class classAType
+
+
+class classBType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('inner', 'innerType1', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, inner=None):
+        self.original_tagname_ = None
+        self.inner = inner
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, classBType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if classBType.subclass:
+            return classBType.subclass(*args_, **kwargs_)
+        else:
+            return classBType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_inner(self): return self.inner
+    def set_inner(self, inner): self.inner = inner
+    def hasContent_(self):
+        if (
+            self.inner is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='classBType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='classBType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='classBType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='classBType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='classBType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.inner is not None:
+            self.inner.export(outfile, level, namespace_, name_='inner', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'inner':
+            obj_ = innerType1.factory()
+            obj_.build(child_)
+            self.inner = obj_
+            obj_.original_tagname_ = 'inner'
+# end class classBType
+
+
+class innerType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('attrA1', 'xs:string', 0),
+        MemberSpec_('attrA2', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, attrA1=None, attrA2=None):
+        self.original_tagname_ = None
+        self.attrA1 = _cast(None, attrA1)
+        self.attrA2 = _cast(None, attrA2)
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, innerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if innerType.subclass:
+            return innerType.subclass(*args_, **kwargs_)
+        else:
+            return innerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_attrA1(self): return self.attrA1
+    def set_attrA1(self, attrA1): self.attrA1 = attrA1
+    def get_attrA2(self): return self.attrA2
+    def set_attrA2(self, attrA2): self.attrA2 = attrA2
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='innerType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='innerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='innerType', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='innerType'):
+        if self.attrA1 is not None and 'attrA1' not in already_processed:
+            already_processed.add('attrA1')
+            outfile.write(' attrA1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrA1), input_name='attrA1')), ))
+        if self.attrA2 is not None and 'attrA2' not in already_processed:
+            already_processed.add('attrA2')
+            outfile.write(' attrA2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrA2), input_name='attrA2')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='innerType', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('attrA1', node)
+        if value is not None and 'attrA1' not in already_processed:
+            already_processed.add('attrA1')
+            self.attrA1 = value
+        value = find_attr_value_('attrA2', node)
+        if value is not None and 'attrA2' not in already_processed:
+            already_processed.add('attrA2')
+            self.attrA2 = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class innerType
+
+
+class innerType1(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('attrB1', 'xs:string', 0),
+        MemberSpec_('attrB2', 'xs:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, attrB1=None, attrB2=None):
+        self.original_tagname_ = None
+        self.attrB1 = _cast(None, attrB1)
+        self.attrB2 = _cast(None, attrB2)
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, innerType1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if innerType1.subclass:
+            return innerType1.subclass(*args_, **kwargs_)
+        else:
+            return innerType1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_attrB1(self): return self.attrB1
+    def set_attrB1(self, attrB1): self.attrB1 = attrB1
+    def get_attrB2(self): return self.attrB2
+    def set_attrB2(self, attrB2): self.attrB2 = attrB2
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='innerType1', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='innerType1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='innerType1', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='innerType1'):
+        if self.attrB1 is not None and 'attrB1' not in already_processed:
+            already_processed.add('attrB1')
+            outfile.write(' attrB1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrB1), input_name='attrB1')), ))
+        if self.attrB2 is not None and 'attrB2' not in already_processed:
+            already_processed.add('attrB2')
+            outfile.write(' attrB2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrB2), input_name='attrB2')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='innerType1', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('attrB1', node)
+        if value is not None and 'attrB1' not in already_processed:
+            already_processed.add('attrB1')
+            self.attrB1 = value
+        value = find_attr_value_('attrB2', node)
+        if value is not None and 'attrB2' not in already_processed:
+            already_processed.add('attrB2')
+            self.attrB2 = value
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class innerType1
+
+
+GDSClassesMapping = {
+    'classA': classAType,
+    'classB': classBType,
+    'container': containerType,
+    'inner': innerType1,
+    'item1': classAType,
+    'item2': classBType,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from nested_def2_sup import *\n\n')
+        sys.stdout.write('import nested_def2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "classAType",
+    "classBType",
+    "containerType",
+    "innerType",
+    "innerType1"
+]
diff --git a/tests/oneper00.xsd b/tests/oneper00.xsd
new file mode 100644
index 0000000..7456aef
--- /dev/null
+++ b/tests/oneper00.xsd
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+    <xs:include schemaLocation="oneper01.xsd"/>
+    <xs:include schemaLocation="oneper02.xsd"/>
+    <xs:include schemaLocation="http://www.davekuhlman.org/oneper03.xsd"/>
+
+    <xs:element name="root00" type="oneperType00_1" />
+
+    <xs:complexType name="oneperType00_1">
+        <xs:sequence>
+            <xs:element name="inner01" type="oneperType01_1" />
+            <xs:element name="inner02" type="oneperType01_2" />
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
diff --git a/tests/oneper01.xsd b/tests/oneper01.xsd
new file mode 100644
index 0000000..4817268
--- /dev/null
+++ b/tests/oneper01.xsd
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+    <xs:element name="root01" type="oneperType01_1" />
+
+    <xs:complexType name="oneperType01_1">
+        <xs:sequence>
+            <xs:element name="username" type="xs:string"/>
+            <xs:element name="inner01" type="oneperType01_2" />
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="oneperType01_2">
+        <xs:sequence>
+            <xs:element name="userdescription" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
+
diff --git a/tests/oneper02.xsd b/tests/oneper02.xsd
new file mode 100644
index 0000000..8531e65
--- /dev/null
+++ b/tests/oneper02.xsd
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+    <xs:element name="root02" type="oneperType02_1" />
+
+    <xs:complexType name="oneperType02_1">
+        <xs:sequence>
+            <xs:element name="clientname" type="xs:string"/>
+            <xs:element name="inner01" type="oneperType02_2" />
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="oneperType02_2">
+        <xs:sequence>
+            <xs:element name="clientdescription" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
+
diff --git a/tests/oneper03.xsd b/tests/oneper03.xsd
new file mode 100644
index 0000000..dc4f1df
--- /dev/null
+++ b/tests/oneper03.xsd
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    >
+
+<!-- During unit tests, this schema file is actually read from
+     http://www.davekuhlman.org.
+     See xs:include element in oneper00.xsd.
+-->
+
+    <xs:element name="root03" type="oneperType03_1" />
+
+    <xs:complexType name="oneperType03_1">
+        <xs:sequence>
+            <xs:element name="helpername" type="xs:string"/>
+            <xs:element name="inner01" type="oneperType02_2" />
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="oneperType03_2">
+        <xs:sequence>
+            <xs:element name="helperdescription" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
+
diff --git a/tests/out1_sub.py b/tests/out1_sub.py
index ad7595f..abd3ce1 100644
--- a/tests/out1_sub.py
+++ b/tests/out1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('-f', '')
+#   ('-o', 'tests/out2_sup.py')
+#   ('-s', 'tests/out2_sub.py')
+#   ('--export', 'write literal')
+#   ('--super', 'out2_sup')
+#   ('-u', 'gends_user_methods')
+#
+# Command line arguments:
+#   tests/people.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions -f -o "tests/out2_sup.py" -s "tests/out2_sub.py" --export="write literal" --super="out2_sup" -u "gends_user_methods" tests/people.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import out2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -89,36 +62,36 @@ supermod.comments.subclass = commentsSub
 
 
 class personSub(supermod.person):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
-        super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        super(personSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, )
 supermod.person.subclass = personSub
 # end class personSub
 
 
 class programmerSub(supermod.programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        super(programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
 supermod.programmer.subclass = programmerSub
 # end class programmerSub
 
 
 class paramSub(supermod.param):
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, )
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        super(paramSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, )
 supermod.param.subclass = paramSub
 # end class paramSub
 
 
 class python_programmerSub(supermod.python_programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
-        super(python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        super(python_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
 supermod.python_programmer.subclass = python_programmerSub
 # end class python_programmerSub
 
 
 class java_programmerSub(supermod.java_programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
-        super(java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None):
+        super(java_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, )
 supermod.java_programmer.subclass = java_programmerSub
 # end class java_programmerSub
 
@@ -145,8 +118,8 @@ supermod.booster.subclass = boosterSub
 
 
 class infoSub(supermod.info):
-    def __init__(self, rating=None, type_=None, name=None):
-        super(infoSub, self).__init__(rating, type_, name, )
+    def __init__(self, name=None, type_=None, rating=None):
+        super(infoSub, self).__init__(name, type_, rating, )
 supermod.info.subclass = infoSub
 # end class infoSub
 
@@ -168,7 +141,8 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -188,7 +162,8 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -212,7 +187,8 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -231,11 +207,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = supermod.people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -244,8 +221,8 @@ def parseLiteral(inFilename, silence=False):
     if not silence:
         sys.stdout.write('#from out2_sup import *\n\n')
         sys.stdout.write('import out2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.people(\n')
-        rootObj.exportLiteral(sys.stdout, 0, name_="people")
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
 
@@ -256,7 +233,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index 250b7a4..7d3900a 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('-f', '')
+#   ('-o', 'tests/out2_sup.py')
+#   ('-s', 'tests/out2_sub.py')
+#   ('--export', 'write literal')
+#   ('--super', 'out2_sup')
+#   ('-u', 'gends_user_methods')
+#
+# Command line arguments:
+#   tests/people.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions -f -o "tests/out2_sup.py" -s "tests/out2_sub.py" --export="write literal" --super="out2_sup" -u "gends_user_methods" tests/people.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -619,6 +671,7 @@ class people(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -640,6 +693,11 @@ class people(GeneratedsSuper):
         else:
             self.java_programmer = java_programmer
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, people)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if people.subclass:
             return people.subclass(*args_, **kwargs_)
         else:
@@ -648,23 +706,28 @@ class people(GeneratedsSuper):
     def get_comments(self): return self.comments
     def set_comments(self, comments): self.comments = comments
     def add_comments(self, value): self.comments.append(value)
-    def insert_comments(self, index, value): self.comments[index] = value
+    def insert_comments_at(self, index, value): self.comments.insert(index, value)
+    def replace_comments_at(self, index, value): self.comments[index] = value
     def get_person(self): return self.person
     def set_person(self, person): self.person = person
     def add_person(self, value): self.person.append(value)
-    def insert_person(self, index, value): self.person[index] = value
+    def insert_person_at(self, index, value): self.person.insert(index, value)
+    def replace_person_at(self, index, value): self.person[index] = value
     def get_programmer(self): return self.programmer
     def set_programmer(self, programmer): self.programmer = programmer
     def add_programmer(self, value): self.programmer.append(value)
-    def insert_programmer(self, index, value): self.programmer[index] = value
+    def insert_programmer_at(self, index, value): self.programmer.insert(index, value)
+    def replace_programmer_at(self, index, value): self.programmer[index] = value
     def get_python_programmer(self): return self.python_programmer
     def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer
     def add_python_programmer(self, value): self.python_programmer.append(value)
-    def insert_python_programmer(self, index, value): self.python_programmer[index] = value
+    def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value)
+    def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value
     def get_java_programmer(self): return self.java_programmer
     def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer
     def add_java_programmer(self, value): self.java_programmer.append(value)
-    def insert_java_programmer(self, index, value): self.java_programmer[index] = value
+    def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value)
+    def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value
     def hasContent_(self):
         if (
             self.comments or
@@ -681,13 +744,15 @@ class people(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='people')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='people', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -784,6 +849,7 @@ class people(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -791,24 +857,29 @@ class people(GeneratedsSuper):
             obj_ = comments.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, person)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmer)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmer.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmer.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
     def walk_and_update(self):
         members = people._member_data_items
         for member in members:
@@ -871,6 +942,7 @@ class comments(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -886,6 +958,11 @@ class comments(GeneratedsSuper):
             self.content_ = content_
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, comments)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if comments.subclass:
             return comments.subclass(*args_, **kwargs_)
         else:
@@ -894,13 +971,14 @@ class comments(GeneratedsSuper):
     def get_emp(self): return self.emp
     def set_emp(self, emp): self.emp = emp
     def add_emp(self, value): self.emp.append(value)
-    def insert_emp(self, index, value): self.emp[index] = value
+    def insert_emp_at(self, index, value): self.emp.insert(index, value)
+    def replace_emp_at(self, index, value): self.emp[index] = value
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
             self.emp or
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -910,13 +988,15 @@ class comments(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='comments', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -956,6 +1036,7 @@ class comments(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1019,11 +1100,11 @@ class comments(GeneratedsSuper):
 
 class person(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('id', 'xs:integer', 0),
         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),
@@ -1033,12 +1114,13 @@ class person(GeneratedsSuper):
     ]
     subclass = None
     superclass = None
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
-        self.vegetable = _cast(None, vegetable)
-        self.fruit = _cast(None, fruit)
-        self.ratio = _cast(float, ratio)
-        self.id = _cast(int, id)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.value = _cast(None, value)
+        self.id = _cast(int, id)
+        self.ratio = _cast(float, ratio)
+        self.fruit = _cast(None, fruit)
+        self.vegetable = _cast(None, vegetable)
         self.name = name
         if interest is None:
             self.interest = []
@@ -1056,6 +1138,11 @@ class person(GeneratedsSuper):
         self.description = description
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, person)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if person.subclass:
             return person.subclass(*args_, **kwargs_)
         else:
@@ -1066,29 +1153,32 @@ class person(GeneratedsSuper):
     def get_interest(self): return self.interest
     def set_interest(self, interest): self.interest = interest
     def add_interest(self, value): self.interest.append(value)
-    def insert_interest(self, index, value): self.interest[index] = value
+    def insert_interest_at(self, index, value): self.interest.insert(index, value)
+    def replace_interest_at(self, index, value): self.interest[index] = value
     def get_category(self): return self.category
     def set_category(self, category): self.category = category
     def get_agent(self): return self.agent
     def set_agent(self, agent): self.agent = agent
     def add_agent(self, value): self.agent.append(value)
-    def insert_agent(self, index, value): self.agent[index] = value
+    def insert_agent_at(self, index, value): self.agent.insert(index, value)
+    def replace_agent_at(self, index, value): self.agent[index] = value
     def get_promoter(self): return self.promoter
     def set_promoter(self, promoter): self.promoter = promoter
     def add_promoter(self, value): self.promoter.append(value)
-    def insert_promoter(self, index, value): self.promoter[index] = value
+    def insert_promoter_at(self, index, value): self.promoter.insert(index, value)
+    def replace_promoter_at(self, index, value): self.promoter[index] = value
     def get_description(self): return self.description
     def set_description(self, description): self.description = description
-    def get_vegetable(self): return self.vegetable
-    def set_vegetable(self, vegetable): self.vegetable = vegetable
-    def get_fruit(self): return self.fruit
-    def set_fruit(self, fruit): self.fruit = fruit
-    def get_ratio(self): return self.ratio
-    def set_ratio(self, ratio): self.ratio = ratio
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
     def get_value(self): return self.value
     def set_value(self, value): self.value = value
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_ratio(self): return self.ratio
+    def set_ratio(self, ratio): self.ratio = ratio
+    def get_fruit(self): return self.fruit
+    def set_fruit(self, fruit): self.fruit = fruit
+    def get_vegetable(self): return self.vegetable
+    def set_vegetable(self, vegetable): self.vegetable = vegetable
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def hasContent_(self):
@@ -1108,33 +1198,35 @@ class person(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='person')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='person', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), ))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), ))
-        if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            outfile.write(' value=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value), input_name='value')), ))
         if self.id is not None and 'id' not in already_processed:
             already_processed.add('id')
             outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id'))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), ))
+        if self.ratio is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            outfile.write(' fruit=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.fruit), input_name='fruit')), ))
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            outfile.write(' vegetable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.vegetable), input_name='vegetable')), ))
         if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
@@ -1146,10 +1238,10 @@ class person(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         for interest_ in self.interest:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_))
+            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(interest_), input_name='interest')), namespace_, eol_))
         if self.category is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_))
@@ -1159,7 +1251,7 @@ class person(GeneratedsSuper):
             promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print)
         if self.description is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_))
+            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), namespace_, eol_))
     def exportLiteral(self, outfile, level, name_='person'):
         level += 1
         already_processed = set()
@@ -1167,36 +1259,36 @@ class person(GeneratedsSuper):
         if self.hasContent_():
             self.exportLiteralChildren(outfile, level, name_)
     def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
             showIndent(outfile, level)
-            outfile.write('vegetable="%s",\n' % (self.vegetable,))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
+            outfile.write('value="%s",\n' % (self.value,))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
             showIndent(outfile, level)
-            outfile.write('fruit="%s",\n' % (self.fruit,))
+            outfile.write('id=%d,\n' % (self.id,))
         if self.ratio is not None and 'ratio' not in already_processed:
             already_processed.add('ratio')
             showIndent(outfile, level)
             outfile.write('ratio=%f,\n' % (self.ratio,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
             showIndent(outfile, level)
-            outfile.write('id=%d,\n' % (self.id,))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.add('value')
+            outfile.write('fruit="%s",\n' % (self.fruit,))
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
             showIndent(outfile, level)
-            outfile.write('value="%s",\n' % (self.value,))
+            outfile.write('vegetable="%s",\n' % (self.vegetable,))
     def exportLiteralChildren(self, outfile, level, name_):
         if self.name is not None:
             showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
+            outfile.write('name=%s,\n' % self.gds_encode(quote_python(self.name)))
         showIndent(outfile, level)
         outfile.write('interest=[\n')
         level += 1
         for interest_ in self.interest:
             showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding))
+            outfile.write('%s,\n' % self.gds_encode(quote_python(interest_)))
         level -= 1
         showIndent(outfile, level)
         outfile.write('],\n')
@@ -1229,40 +1321,41 @@ class person(GeneratedsSuper):
         outfile.write('],\n')
         if self.description is not None:
             showIndent(outfile, level)
-            outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding))
+            outfile.write('description=%s,\n' % self.gds_encode(quote_python(self.description)))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('vegetable', node)
-        if value is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            self.vegetable = value
-        value = find_attr_value_('fruit', node)
-        if value is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            self.fruit = value
-        value = find_attr_value_('ratio', node)
-        if value is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            try:
-                self.ratio = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('value', node)
+        if value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            self.value = value
         value = find_attr_value_('id', node)
         if value is not None and 'id' not in already_processed:
             already_processed.add('id')
             try:
                 self.id = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value', node)
-        if value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            self.value = value
+        value = find_attr_value_('ratio', node)
+        if value is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            try:
+                self.ratio = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('fruit', node)
+        if value is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            self.fruit = value
+        value = find_attr_value_('vegetable', node)
+        if value is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            self.vegetable = value
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
@@ -1280,7 +1373,7 @@ class person(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'category')
             self.category = ival_
@@ -1288,10 +1381,12 @@ class person(GeneratedsSuper):
             obj_ = agent.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = booster.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1349,10 +1444,10 @@ class programmer(person):
     member_data_items_ = [
         MemberSpec_('language', 'xs:string', 0),
         MemberSpec_('area', 'xs:string', 0),
-        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
         MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 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),
@@ -1368,25 +1463,26 @@ class programmer(person):
     ]
     subclass = None
     superclass = person
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
+        super(programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
-        self.attrnegint = _cast(int, attrnegint)
         self.attrposint = _cast(int, attrposint)
-        self.attrnonnegint = _cast(int, attrnonnegint)
         self.attrnonposint = _cast(int, attrnonposint)
+        self.attrnegint = _cast(int, attrnegint)
+        self.attrnonnegint = _cast(int, attrnonnegint)
         self.email = email
         self.elposint = elposint
         self.elnonposint = elnonposint
         self.elnegint = elnegint
         self.elnonnegint = elnonnegint
-        if isinstance(eldate, basestring):
+        if isinstance(eldate, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date()
         else:
             initvalue_ = eldate
         self.eldate = initvalue_
-        if isinstance(eldatetime, basestring):
+        if isinstance(eldatetime, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = eldatetime
@@ -1396,8 +1492,14 @@ class programmer(person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if programmer.subclass:
             return programmer.subclass(*args_, **kwargs_)
         else:
@@ -1431,19 +1533,28 @@ class programmer(person):
     def set_language(self, language): self.language = language
     def get_area(self): return self.area
     def set_area(self, area): self.area = area
-    def get_attrnegint(self): return self.attrnegint
-    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
     def get_attrposint(self): return self.attrposint
     def set_attrposint(self, attrposint): self.attrposint = attrposint
-    def get_attrnonnegint(self): return self.attrnonnegint
-    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
     def get_attrnonposint(self): return self.attrnonposint
     def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint
+    def get_attrnegint(self): return self.attrnegint
+    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
+    def get_attrnonnegint(self): return self.attrnonnegint
+    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['float', 'int', 'Name', 'token']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
@@ -1468,13 +1579,15 @@ class programmer(person):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1483,22 +1596,22 @@ class programmer(person):
         super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
         if self.language is not None and 'language' not in already_processed:
             already_processed.add('language')
-            outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), ))
+            outfile.write(' language=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.language), input_name='language')), ))
         if self.area is not None and 'area' not in already_processed:
             already_processed.add('area')
-            outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), ))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+            outfile.write(' area=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.area), input_name='area')), ))
         if self.attrposint is not None and 'attrposint' not in already_processed:
             already_processed.add('attrposint')
             outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint'))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
         if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
             already_processed.add('attrnonposint')
             outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint'))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
         if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
@@ -1511,7 +1624,7 @@ class programmer(person):
             eol_ = ''
         if self.email is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_))
+            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.email), input_name='email')), namespace_, eol_))
         if self.elposint is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_))
@@ -1532,7 +1645,7 @@ class programmer(person):
             outfile.write('<%seldatetime>%s</%seldatetime>%s' % (namespace_, self.gds_format_datetime(self.eldatetime, input_name='eldatetime'), namespace_, eol_))
         if self.eltoken is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_))
+            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.eltoken), input_name='eltoken')), namespace_, eol_))
         if self.elshort is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_))
@@ -1543,7 +1656,7 @@ class programmer(person):
             self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print)
         if self.elarraytypes is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_))
+            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.elarraytypes), input_name='elarraytypes')), namespace_, eol_))
     def exportLiteral(self, outfile, level, name_='programmer'):
         level += 1
         already_processed = set()
@@ -1559,28 +1672,28 @@ class programmer(person):
             already_processed.add('area')
             showIndent(outfile, level)
             outfile.write('area="%s",\n' % (self.area,))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnegint=%d,\n' % (self.attrnegint,))
         if self.attrposint is not None and 'attrposint' not in already_processed:
             already_processed.add('attrposint')
             showIndent(outfile, level)
             outfile.write('attrposint=%d,\n' % (self.attrposint,))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,))
         if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
             already_processed.add('attrnonposint')
             showIndent(outfile, level)
             outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            showIndent(outfile, level)
+            outfile.write('attrnegint=%d,\n' % (self.attrnegint,))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            showIndent(outfile, level)
+            outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,))
         super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
     def exportLiteralChildren(self, outfile, level, name_):
         super(programmer, self).exportLiteralChildren(outfile, level, name_)
         if self.email is not None:
             showIndent(outfile, level)
-            outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding))
+            outfile.write('email=%s,\n' % self.gds_encode(quote_python(self.email)))
         if self.elposint is not None:
             showIndent(outfile, level)
             outfile.write('elposint=%d,\n' % self.elposint)
@@ -1601,7 +1714,7 @@ class programmer(person):
             outfile.write('eldatetime=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.eldatetime, input_name='eldatetime'))
         if self.eltoken is not None:
             showIndent(outfile, level)
-            outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding))
+            outfile.write('eltoken=%s,\n' % self.gds_encode(quote_python(self.eltoken)))
         if self.elshort is not None:
             showIndent(outfile, level)
             outfile.write('elshort=%d,\n' % self.elshort)
@@ -1616,13 +1729,14 @@ class programmer(person):
             outfile.write('),\n')
         if self.elarraytypes is not None:
             showIndent(outfile, level)
-            outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding))
+            outfile.write('elarraytypes=%s,\n' % self.gds_encode(quote_python(self.elarraytypes)))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('language', node)
         if value is not None and 'language' not in already_processed:
@@ -1632,42 +1746,42 @@ class programmer(person):
         if value is not None and 'area' not in already_processed:
             already_processed.add('area')
             self.area = value
-        value = find_attr_value_('attrnegint', node)
-        if value is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            try:
-                self.attrnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnegint >= 0:
-                raise_parse_error(node, 'Invalid NegativeInteger')
         value = find_attr_value_('attrposint', node)
         if value is not None and 'attrposint' not in already_processed:
             already_processed.add('attrposint')
             try:
                 self.attrposint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrposint <= 0:
                 raise_parse_error(node, 'Invalid PositiveInteger')
-        value = find_attr_value_('attrnonnegint', node)
-        if value is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            try:
-                self.attrnonnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnonnegint < 0:
-                raise_parse_error(node, 'Invalid NonNegativeInteger')
         value = find_attr_value_('attrnonposint', node)
         if value is not None and 'attrnonposint' not in already_processed:
             already_processed.add('attrnonposint')
             try:
                 self.attrnonposint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrnonposint > 0:
                 raise_parse_error(node, 'Invalid NonPositiveInteger')
+        value = find_attr_value_('attrnegint', node)
+        if value is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            try:
+                self.attrnegint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnegint >= 0:
+                raise_parse_error(node, 'Invalid NegativeInteger')
+        value = find_attr_value_('attrnonnegint', node)
+        if value is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            try:
+                self.attrnonnegint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonnegint < 0:
+                raise_parse_error(node, 'Invalid NonNegativeInteger')
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
@@ -1682,7 +1796,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ <= 0:
                 raise_parse_error(child_, 'requires positiveInteger')
@@ -1692,7 +1806,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ > 0:
                 raise_parse_error(child_, 'requires nonPositiveInteger')
@@ -1702,7 +1816,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ >= 0:
                 raise_parse_error(child_, 'requires negativeInteger')
@@ -1712,7 +1826,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ < 0:
                 raise_parse_error(child_, 'requires nonNegativeInteger')
@@ -1728,14 +1842,17 @@ class programmer(person):
             self.eldatetime = dval_
         elif nodeName_ == 'eltoken':
             eltoken_ = child_.text
-            eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            if eltoken_:
+                eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            else:
+                eltoken_ = ""
             eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken')
             self.eltoken = eltoken_
         elif nodeName_ == 'elshort':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'elshort')
             self.elshort = ival_
@@ -1743,7 +1860,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'ellong')
             self.ellong = ival_
@@ -1751,11 +1868,13 @@ class programmer(person):
             obj_ = param.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
             self.elarraytypes = elarraytypes_
-            self.validate_ArrayTypes(self.elarraytypes)    # validate type ArrayTypes
+            # validate type ArrayTypes
+            self.validate_ArrayTypes(self.elarraytypes)
         super(programmer, self).buildChildren(child_, node, nodeName_, True)
     def walk_and_update(self):
         members = programmer._member_data_items
@@ -1810,47 +1929,53 @@ class param(GeneratedsSuper):
     """Finding flow attribute unneccesary in practice. A unnamed parameter
     is unbound/skipped."""
     member_data_items_ = [
-        MemberSpec_('semantic', 'xs:token', 0),
+        MemberSpec_('id', 'xs:string', 0),
         MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 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),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        self.semantic = _cast(None, semantic)
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.id = _cast(None, id)
         self.name = _cast(None, name)
-        self.flow = _cast(None, flow)
         self.sid = _cast(None, sid)
+        self.flow = _cast(None, flow)
+        self.semantic = _cast(None, semantic)
         self.type_ = _cast(None, type_)
-        self.id = _cast(None, id)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, param)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if param.subclass:
             return param.subclass(*args_, **kwargs_)
         else:
             return param(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_semantic(self): return self.semantic
-    def set_semantic(self, semantic): self.semantic = semantic
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
-    def get_flow(self): return self.flow
-    def set_flow(self, flow): self.flow = flow
     def get_sid(self): return self.sid
     def set_sid(self, sid): self.sid = sid
+    def get_flow(self): return self.flow
+    def set_flow(self, flow): self.flow = flow
+    def get_semantic(self): return self.semantic
+    def set_semantic(self, semantic): self.semantic = semantic
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1860,36 +1985,38 @@ class param(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
         if self.name is not None and 'name' not in already_processed:
             already_processed.add('name')
             outfile.write(' name=%s' % (quote_attrib(self.name), ))
-        if self.flow is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
         if self.sid is not None and 'sid' not in already_processed:
             already_processed.add('sid')
             outfile.write(' sid=%s' % (quote_attrib(self.sid), ))
+        if self.flow is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            outfile.write(' semantic=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.semantic), input_name='semantic')), ))
         if self.type_ is not None and 'type_' not in already_processed:
             already_processed.add('type_')
-            outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), ))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), ))
+            outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True):
         pass
     def exportLiteral(self, outfile, level, name_='param'):
@@ -1901,30 +2028,30 @@ class param(GeneratedsSuper):
         showIndent(outfile, level)
         outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
     def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
             showIndent(outfile, level)
-            outfile.write('semantic="%s",\n' % (self.semantic,))
+            outfile.write('id="%s",\n' % (self.id,))
         if self.name is not None and 'name' not in already_processed:
             already_processed.add('name')
             showIndent(outfile, level)
             outfile.write('name="%s",\n' % (self.name,))
+        if self.sid is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            showIndent(outfile, level)
+            outfile.write('sid="%s",\n' % (self.sid,))
         if self.flow is not None and 'flow' not in already_processed:
             already_processed.add('flow')
             showIndent(outfile, level)
             outfile.write('flow=%s,\n' % (self.flow,))
-        if self.sid is not None and 'sid' not in already_processed:
-            already_processed.add('sid')
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
             showIndent(outfile, level)
-            outfile.write('sid="%s",\n' % (self.sid,))
+            outfile.write('semantic="%s",\n' % (self.semantic,))
         if self.type_ is not None and 'type_' not in already_processed:
             already_processed.add('type_')
             showIndent(outfile, level)
             outfile.write('type_="%s",\n' % (self.type_,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            showIndent(outfile, level)
-            outfile.write('id="%s",\n' % (self.id,))
     def exportLiteralChildren(self, outfile, level, name_):
         pass
     def build(self, node):
@@ -1934,32 +2061,33 @@ class param(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('semantic', node)
-        if value is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            self.semantic = value
-            self.semantic = ' '.join(self.semantic.split())
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
         value = find_attr_value_('name', node)
         if value is not None and 'name' not in already_processed:
             already_processed.add('name')
             self.name = value
-        value = find_attr_value_('flow', node)
-        if value is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            self.flow = value
         value = find_attr_value_('sid', node)
         if value is not None and 'sid' not in already_processed:
             already_processed.add('sid')
             self.sid = value
+        value = find_attr_value_('flow', node)
+        if value is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            self.flow = value
+        value = find_attr_value_('semantic', node)
+        if value is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            self.semantic = value
+            self.semantic = ' '.join(self.semantic.split())
         value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
             already_processed.add('type')
             self.type_ = value
-        value = find_attr_value_('id', node)
-        if value is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            self.id = value
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
     def walk_and_update(self):
@@ -2018,11 +2146,17 @@ class python_programmer(programmer):
     ]
     subclass = None
     superclass = programmer
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
-        super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(python_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
         self.favorite_editor = favorite_editor
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, python_programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if python_programmer.subclass:
             return python_programmer.subclass(*args_, **kwargs_)
         else:
@@ -2045,13 +2179,15 @@ class python_programmer(programmer):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2060,7 +2196,7 @@ class python_programmer(programmer):
         super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
         if self.nick_name is not None and 'nick_name' not in already_processed:
             already_processed.add('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+            outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True):
         super(python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
@@ -2069,7 +2205,7 @@ class python_programmer(programmer):
             eol_ = ''
         if self.favorite_editor is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_))
     def exportLiteral(self, outfile, level, name_='python-programmer'):
         level += 1
         already_processed = set()
@@ -2086,13 +2222,14 @@ class python_programmer(programmer):
         super(python_programmer, self).exportLiteralChildren(outfile, level, name_)
         if self.favorite_editor is not None:
             showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+            outfile.write('favorite_editor=%s,\n' % self.gds_encode(quote_python(self.favorite_editor)))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
@@ -2156,18 +2293,24 @@ class python_programmer(programmer):
 
 class java_programmer(programmer):
     member_data_items_ = [
-        MemberSpec_('status', 'xs:string', 0),
         MemberSpec_('nick-name', 'xs:string', 0),
+        MemberSpec_('status', 'xs:string', 0),
         MemberSpec_('favorite_editor', 'xs:string', 0),
     ]
     subclass = None
     superclass = programmer
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
-        super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
-        self.status = _cast(None, status)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(java_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
+        self.status = _cast(None, status)
         self.favorite_editor = favorite_editor
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, java_programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if java_programmer.subclass:
             return java_programmer.subclass(*args_, **kwargs_)
         else:
@@ -2175,10 +2318,10 @@ class java_programmer(programmer):
     factory = staticmethod(factory)
     def get_favorite_editor(self): return self.favorite_editor
     def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
-    def get_status(self): return self.status
-    def set_status(self, status): self.status = status
     def get_nick_name(self): return self.nick_name
     def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def get_status(self): return self.status
+    def set_status(self, status): self.status = status
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
@@ -2192,25 +2335,27 @@ class java_programmer(programmer):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'):
         super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), ))
         if self.nick_name is not None and 'nick_name' not in already_processed:
             already_processed.add('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+            outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), ))
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            outfile.write(' status=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.status), input_name='status')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True):
         super(java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
@@ -2219,7 +2364,7 @@ class java_programmer(programmer):
             eol_ = ''
         if self.favorite_editor is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_))
     def exportLiteral(self, outfile, level, name_='java-programmer'):
         level += 1
         already_processed = set()
@@ -2227,35 +2372,36 @@ class java_programmer(programmer):
         if self.hasContent_():
             self.exportLiteralChildren(outfile, level, name_)
     def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            showIndent(outfile, level)
-            outfile.write('status="%s",\n' % (self.status,))
         if self.nick_name is not None and 'nick_name' not in already_processed:
             already_processed.add('nick_name')
             showIndent(outfile, level)
             outfile.write('nick_name="%s",\n' % (self.nick_name,))
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            showIndent(outfile, level)
+            outfile.write('status="%s",\n' % (self.status,))
         super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
     def exportLiteralChildren(self, outfile, level, name_):
         super(java_programmer, self).exportLiteralChildren(outfile, level, name_)
         if self.favorite_editor is not None:
             showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+            outfile.write('favorite_editor=%s,\n' % self.gds_encode(quote_python(self.favorite_editor)))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('status', node)
-        if value is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            self.status = value
         value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
             already_processed.add('nick-name')
             self.nick_name = value
+        value = find_attr_value_('status', node)
+        if value is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            self.status = value
         super(java_programmer, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'favorite-editor':
@@ -2322,11 +2468,17 @@ class agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
         self.info = info
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, agent)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if agent.subclass:
             return agent.subclass(*args_, **kwargs_)
         else:
@@ -2355,13 +2507,15 @@ class agent(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='agent', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2375,10 +2529,10 @@ class agent(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.priority is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
@@ -2395,10 +2549,10 @@ class agent(GeneratedsSuper):
     def exportLiteralChildren(self, outfile, level, name_):
         if self.firstname is not None:
             showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+            outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname)))
         if self.lastname is not None:
             showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+            outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname)))
         if self.priority is not None:
             showIndent(outfile, level)
             outfile.write('priority=%f,\n' % self.priority)
@@ -2414,6 +2568,7 @@ class agent(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2429,7 +2584,7 @@ class agent(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
@@ -2437,6 +2592,7 @@ class agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
     def walk_and_update(self):
         members = agent._member_data_items
         for member in members:
@@ -2496,11 +2652,17 @@ class special_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
         self.info = info
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, special_agent)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if special_agent.subclass:
             return special_agent.subclass(*args_, **kwargs_)
         else:
@@ -2529,13 +2691,15 @@ class special_agent(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='special-agent', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2549,10 +2713,10 @@ class special_agent(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.priority is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
@@ -2569,10 +2733,10 @@ class special_agent(GeneratedsSuper):
     def exportLiteralChildren(self, outfile, level, name_):
         if self.firstname is not None:
             showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+            outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname)))
         if self.lastname is not None:
             showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+            outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname)))
         if self.priority is not None:
             showIndent(outfile, level)
             outfile.write('priority=%f,\n' % self.priority)
@@ -2588,6 +2752,7 @@ class special_agent(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2603,7 +2768,7 @@ class special_agent(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
@@ -2611,6 +2776,7 @@ class special_agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
     def walk_and_update(self):
         members = special_agent._member_data_items
         for member in members:
@@ -2673,6 +2839,7 @@ class booster(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.other_name = other_name
@@ -2690,6 +2857,11 @@ class booster(GeneratedsSuper):
         else:
             self.client_handler = client_handler
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, booster)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if booster.subclass:
             return booster.subclass(*args_, **kwargs_)
         else:
@@ -2706,15 +2878,18 @@ class booster(GeneratedsSuper):
     def get_other_value(self): return self.other_value
     def set_other_value(self, other_value): self.other_value = other_value
     def add_other_value(self, value): self.other_value.append(value)
-    def insert_other_value(self, index, value): self.other_value[index] = value
+    def insert_other_value_at(self, index, value): self.other_value.insert(index, value)
+    def replace_other_value_at(self, index, value): self.other_value[index] = value
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
     def add_type(self, value): self.type_.append(value)
-    def insert_type(self, index, value): self.type_[index] = value
+    def insert_type_at(self, index, value): self.type_.insert(index, value)
+    def replace_type_at(self, index, value): self.type_[index] = value
     def get_client_handler(self): return self.client_handler
     def set_client_handler(self, client_handler): self.client_handler = client_handler
     def add_client_handler(self, value): self.client_handler.append(value)
-    def insert_client_handler(self, index, value): self.client_handler[index] = value
+    def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value)
+    def replace_client_handler_at(self, index, value): self.client_handler[index] = value
     def hasContent_(self):
         if (
             self.firstname is not None or
@@ -2733,13 +2908,15 @@ class booster(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='booster', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2753,10 +2930,10 @@ class booster(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.other_name is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_))
@@ -2782,10 +2959,10 @@ class booster(GeneratedsSuper):
     def exportLiteralChildren(self, outfile, level, name_):
         if self.firstname is not None:
             showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
+            outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname)))
         if self.lastname is not None:
             showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
+            outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname)))
         if self.other_name is not None:
             showIndent(outfile, level)
             outfile.write('other_name=%f,\n' % self.other_name)
@@ -2828,6 +3005,7 @@ class booster(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2843,7 +3021,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'other_name')
             self.other_name = fval_
@@ -2851,7 +3029,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'class')
             self.class_ = fval_
@@ -2859,7 +3037,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'other_value')
             self.other_value.append(fval_)
@@ -2867,7 +3045,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'type')
             self.type_.append(fval_)
@@ -2875,6 +3053,7 @@ class booster(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
     def walk_and_update(self):
         members = booster._member_data_items
         for member in members:
@@ -2926,29 +3105,34 @@ class booster(GeneratedsSuper):
 
 class info(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('rating', 'xs:float', 0),
-        MemberSpec_('type', 'xs:integer', 0),
         MemberSpec_('name', 'xs:string', 0),
+        MemberSpec_('type', 'xs:integer', 0),
+        MemberSpec_('rating', 'xs:float', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, rating=None, type_=None, name=None):
-        self.rating = _cast(float, rating)
-        self.type_ = _cast(int, type_)
+    def __init__(self, name=None, type_=None, rating=None):
+        self.original_tagname_ = None
         self.name = _cast(None, name)
-        pass
+        self.type_ = _cast(int, type_)
+        self.rating = _cast(float, rating)
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, info)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if info.subclass:
             return info.subclass(*args_, **kwargs_)
         else:
             return info(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_rating(self): return self.rating
-    def set_rating(self, rating): self.rating = rating
-    def get_type(self): return self.type_
-    def set_type(self, type_): self.type_ = type_
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def get_rating(self): return self.rating
+    def set_rating(self, rating): self.rating = rating
     def hasContent_(self):
         if (
 
@@ -2961,26 +3145,28 @@ class info(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='info')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='info', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
-        if self.rating is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
         if self.type_ is not None and 'type_' not in already_processed:
             already_processed.add('type_')
             outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type'))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), ))
+        if self.rating is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
     def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True):
         pass
     def exportLiteral(self, outfile, level, name_='info'):
@@ -2990,18 +3176,18 @@ class info(GeneratedsSuper):
         if self.hasContent_():
             self.exportLiteralChildren(outfile, level, name_)
     def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.rating is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
             showIndent(outfile, level)
-            outfile.write('rating=%f,\n' % (self.rating,))
+            outfile.write('name="%s",\n' % (self.name,))
         if self.type_ is not None and 'type_' not in already_processed:
             already_processed.add('type_')
             showIndent(outfile, level)
             outfile.write('type_=%d,\n' % (self.type_,))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
+        if self.rating is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
             showIndent(outfile, level)
-            outfile.write('name="%s",\n' % (self.name,))
+            outfile.write('rating=%f,\n' % (self.rating,))
     def exportLiteralChildren(self, outfile, level, name_):
         pass
     def build(self, node):
@@ -3010,25 +3196,26 @@ class info(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('rating', node)
-        if value is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            try:
-                self.rating = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (rating): %s' % exp)
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
         value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
             already_processed.add('type')
             try:
                 self.type_ = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('name', node)
-        if value is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            self.name = value
+        value = find_attr_value_('rating', node)
+        if value is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            try:
+                self.rating = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (rating): %s' % exp)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
     def walk_and_update(self):
@@ -3088,9 +3275,15 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, client_handlerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if client_handlerType.subclass:
             return client_handlerType.subclass(*args_, **kwargs_)
         else:
@@ -3113,13 +3306,15 @@ class client_handlerType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -3133,7 +3328,7 @@ class client_handlerType(GeneratedsSuper):
             eol_ = ''
         if self.fullname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_))
+            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.fullname), input_name='fullname')), namespace_, eol_))
         if self.refid is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_))
@@ -3148,7 +3343,7 @@ class client_handlerType(GeneratedsSuper):
     def exportLiteralChildren(self, outfile, level, name_):
         if self.fullname is not None:
             showIndent(outfile, level)
-            outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding))
+            outfile.write('fullname=%s,\n' % self.gds_encode(quote_python(self.fullname)))
         if self.refid is not None:
             showIndent(outfile, level)
             outfile.write('refid=%d,\n' % self.refid)
@@ -3158,6 +3353,7 @@ class client_handlerType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -3169,7 +3365,7 @@ class client_handlerType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'refid')
             self.refid = ival_
@@ -3235,7 +3431,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -3248,7 +3444,8 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -3268,7 +3465,8 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -3291,12 +3489,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -3305,13 +3507,14 @@ def parseString(inString, silence=False):
     if not silence:
         sys.stdout.write('<?xml version="1.0" ?>\n')
         rootObj.export(
-            sys.stdout, 0, name_="people",
+            sys.stdout, 0, name_=rootTag,
             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -3324,7 +3527,7 @@ def parseLiteral(inFileName, silence=False):
     if not silence:
         sys.stdout.write('#from out2_sup import *\n\n')
         sys.stdout.write('import out2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.rootTag(\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/out2_sub.py b/tests/out2_sub.py
deleted file mode 100644
index ad7595f..0000000
--- a/tests/out2_sub.py
+++ /dev/null
@@ -1,273 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Generated  by generateDS.py.
-#
-
-import sys
-
-import out2_sup as supermod
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-
-#
-# Data representation classes
-#
-
-
-class peopleSub(supermod.people):
-    def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
-        super(peopleSub, self).__init__(comments, person, programmer, python_programmer, java_programmer, )
-supermod.people.subclass = peopleSub
-# end class peopleSub
-
-
-class commentsSub(supermod.comments):
-    def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
-        super(commentsSub, self).__init__(emp, valueOf_, mixedclass_, content_, )
-supermod.comments.subclass = commentsSub
-# end class commentsSub
-
-
-class personSub(supermod.person):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
-        super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
-supermod.person.subclass = personSub
-# end class personSub
-
-
-class programmerSub(supermod.programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
-supermod.programmer.subclass = programmerSub
-# end class programmerSub
-
-
-class paramSub(supermod.param):
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, )
-supermod.param.subclass = paramSub
-# end class paramSub
-
-
-class python_programmerSub(supermod.python_programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
-        super(python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
-supermod.python_programmer.subclass = python_programmerSub
-# end class python_programmerSub
-
-
-class java_programmerSub(supermod.java_programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
-        super(java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, )
-supermod.java_programmer.subclass = java_programmerSub
-# end class java_programmerSub
-
-
-class agentSub(supermod.agent):
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
-        super(agentSub, self).__init__(firstname, lastname, priority, info, )
-supermod.agent.subclass = agentSub
-# end class agentSub
-
-
-class special_agentSub(supermod.special_agent):
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
-        super(special_agentSub, self).__init__(firstname, lastname, priority, info, )
-supermod.special_agent.subclass = special_agentSub
-# end class special_agentSub
-
-
-class boosterSub(supermod.booster):
-    def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
-        super(boosterSub, self).__init__(firstname, lastname, other_name, class_, other_value, type_, client_handler, )
-supermod.booster.subclass = boosterSub
-# end class boosterSub
-
-
-class infoSub(supermod.info):
-    def __init__(self, rating=None, type_=None, name=None):
-        super(infoSub, self).__init__(rating, type_, name, )
-supermod.info.subclass = infoSub
-# end class infoSub
-
-
-class client_handlerTypeSub(supermod.client_handlerType):
-    def __init__(self, fullname=None, refid=None):
-        super(client_handlerTypeSub, self).__init__(fullname, refid, )
-supermod.client_handlerType.subclass = client_handlerTypeSub
-# end class client_handlerTypeSub
-
-
-def get_root_tag(node):
-    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = None
-    rootClass = supermod.GDSClassesMapping.get(tag)
-    if rootClass is None and hasattr(supermod, tag):
-        rootClass = getattr(supermod, tag)
-    return tag, rootClass
-
-
-def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    if not silence:
-        sys.stdout.write('<?xml version="1.0" ?>\n')
-        rootObj.export(
-            sys.stdout, 0, name_=rootTag,
-            namespacedef_='',
-            pretty_print=True)
-    return rootObj
-
-
-def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    mapping = {}
-    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
-    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
-    if not silence:
-        content = etree_.tostring(
-            rootElement, pretty_print=True,
-            xml_declaration=True, encoding="utf-8")
-        sys.stdout.write(content)
-        sys.stdout.write('\n')
-    return rootObj, rootElement, mapping, reverse_mapping
-
-
-def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    if not silence:
-        sys.stdout.write('<?xml version="1.0" ?>\n')
-        rootObj.export(
-            sys.stdout, 0, name_=rootTag,
-            namespacedef_='')
-    return rootObj
-
-
-def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
-    if rootClass is None:
-        rootClass = supermod.people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    if not silence:
-        sys.stdout.write('#from out2_sup import *\n\n')
-        sys.stdout.write('import out2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.people(\n')
-        rootObj.exportLiteral(sys.stdout, 0, name_="people")
-        sys.stdout.write(')\n')
-    return rootObj
-
-
-USAGE_TEXT = """
-Usage: python ???.py <infilename>
-"""
-
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) != 1:
-        usage()
-    infilename = args[0]
-    parse(infilename)
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
diff --git a/tests/people_procincl1_sub.py b/tests/people_procincl1_sub.py
index c3b5be6..8d3b5e7 100644
--- a/tests/people_procincl1_sub.py
+++ b/tests/people_procincl1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/people_procincl2_sup.py')
+#   ('-s', 'tests/people_procincl2_sub.py')
+#   ('--super', 'people_procincl2_sup')
+#
+# Command line arguments:
+#   tests/people_procincl.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/people_procincl2_sup.py" -s "tests/people_procincl2_sub.py" --super="people_procincl2_sup" tests/people_procincl.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import people_procincl2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -89,22 +62,22 @@ supermod.comments.subclass = commentsSub
 
 
 class personSub(supermod.person):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
-        super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        super(personSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, )
 supermod.person.subclass = personSub
 # end class personSub
 
 
 class specialpersonSub(supermod.specialperson):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None):
-        super(specialpersonSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None):
+        super(specialpersonSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, )
 supermod.specialperson.subclass = specialpersonSub
 # end class specialpersonSub
 
 
 class paramSub(supermod.param):
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, )
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        super(paramSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, )
 supermod.param.subclass = paramSub
 # end class paramSub
 
@@ -131,8 +104,8 @@ supermod.booster.subclass = boosterSub
 
 
 class infoSub(supermod.info):
-    def __init__(self, rating=None, type_=None, name=None):
-        super(infoSub, self).__init__(rating, type_, name, )
+    def __init__(self, name=None, type_=None, rating=None):
+        super(infoSub, self).__init__(name, type_, rating, )
 supermod.info.subclass = infoSub
 # end class infoSub
 
@@ -159,8 +132,8 @@ supermod.airplane.subclass = airplaneSub
 
 
 class programmerSub(supermod.programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        super(programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
 supermod.programmer.subclass = programmerSub
 # end class programmerSub
 
@@ -173,15 +146,15 @@ supermod.client_handlerType.subclass = client_handlerTypeSub
 
 
 class java_programmerSub(supermod.java_programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
-        super(java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None):
+        super(java_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, )
 supermod.java_programmer.subclass = java_programmerSub
 # end class java_programmerSub
 
 
 class python_programmerSub(supermod.python_programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
-        super(python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        super(python_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
 supermod.python_programmer.subclass = python_programmerSub
 # end class python_programmerSub
 
@@ -196,7 +169,8 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -216,7 +190,8 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -240,7 +215,8 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -259,11 +235,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = supermod.people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -272,8 +249,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from people_procincl2_sup import *\n\n')
 ##         sys.stdout.write('import people_procincl2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.people(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="people")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -284,7 +261,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index 397274a..dac3ff1 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/people_procincl2_sup.py')
+#   ('-s', 'tests/people_procincl2_sub.py')
+#   ('--super', 'people_procincl2_sup')
+#
+# Command line arguments:
+#   tests/people_procincl.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/people_procincl2_sup.py" -s "tests/people_procincl2_sub.py" --super="people_procincl2_sup" tests/people_procincl.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -621,6 +673,7 @@ class people(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -646,6 +699,11 @@ class people(GeneratedsSuper):
         else:
             self.java_programmer = java_programmer
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, people)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if people.subclass:
             return people.subclass(*args_, **kwargs_)
         else:
@@ -654,27 +712,33 @@ class people(GeneratedsSuper):
     def get_comments(self): return self.comments
     def set_comments(self, comments): self.comments = comments
     def add_comments(self, value): self.comments.append(value)
-    def insert_comments(self, index, value): self.comments[index] = value
+    def insert_comments_at(self, index, value): self.comments.insert(index, value)
+    def replace_comments_at(self, index, value): self.comments[index] = value
     def get_person(self): return self.person
     def set_person(self, person): self.person = person
     def add_person(self, value): self.person.append(value)
-    def insert_person(self, index, value): self.person[index] = value
+    def insert_person_at(self, index, value): self.person.insert(index, value)
+    def replace_person_at(self, index, value): self.person[index] = value
     def get_specialperson(self): return self.specialperson
     def set_specialperson(self, specialperson): self.specialperson = specialperson
     def add_specialperson(self, value): self.specialperson.append(value)
-    def insert_specialperson(self, index, value): self.specialperson[index] = value
+    def insert_specialperson_at(self, index, value): self.specialperson.insert(index, value)
+    def replace_specialperson_at(self, index, value): self.specialperson[index] = value
     def get_programmer(self): return self.programmer
     def set_programmer(self, programmer): self.programmer = programmer
     def add_programmer(self, value): self.programmer.append(value)
-    def insert_programmer(self, index, value): self.programmer[index] = value
+    def insert_programmer_at(self, index, value): self.programmer.insert(index, value)
+    def replace_programmer_at(self, index, value): self.programmer[index] = value
     def get_python_programmer(self): return self.python_programmer
     def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer
     def add_python_programmer(self, value): self.python_programmer.append(value)
-    def insert_python_programmer(self, index, value): self.python_programmer[index] = value
+    def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value)
+    def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value
     def get_java_programmer(self): return self.java_programmer
     def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer
     def add_java_programmer(self, value): self.java_programmer.append(value)
-    def insert_java_programmer(self, index, value): self.java_programmer[index] = value
+    def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value)
+    def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value
     def hasContent_(self):
         if (
             self.comments or
@@ -692,13 +756,15 @@ class people(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='people')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='people', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -722,93 +788,13 @@ class people(GeneratedsSuper):
             python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print)
         for java_programmer_ in self.java_programmer:
             java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='people'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('comments=[\n')
-        level += 1
-        for comments_ in self.comments:
-            showIndent(outfile, level)
-            outfile.write('model_.comments(\n')
-            comments_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('person=[\n')
-        level += 1
-        for person_ in self.person:
-            showIndent(outfile, level)
-            outfile.write('model_.person(\n')
-            person_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('specialperson=[\n')
-        level += 1
-        for specialperson_ in self.specialperson:
-            showIndent(outfile, level)
-            outfile.write('model_.specialperson(\n')
-            specialperson_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('programmer=[\n')
-        level += 1
-        for programmer_ in self.programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.programmer(\n')
-            programmer_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('python_programmer=[\n')
-        level += 1
-        for python_programmer_ in self.python_programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.python_programmer(\n')
-            python_programmer_.exportLiteral(outfile, level, name_='python-programmer')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('java_programmer=[\n')
-        level += 1
-        for java_programmer_ in self.java_programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.java_programmer(\n')
-            java_programmer_.exportLiteral(outfile, level, name_='java-programmer')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -816,28 +802,34 @@ class people(GeneratedsSuper):
             obj_ = comments.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, person)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'specialperson':
             obj_ = specialperson.factory()
             obj_.build(child_)
             self.specialperson.append(obj_)
+            obj_.original_tagname_ = 'specialperson'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmer)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmer.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmer.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
 # end class people
 
 
@@ -850,6 +842,7 @@ class comments(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -869,6 +862,11 @@ class comments(GeneratedsSuper):
             self.content_ = content_
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, comments)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if comments.subclass:
             return comments.subclass(*args_, **kwargs_)
         else:
@@ -877,18 +875,20 @@ class comments(GeneratedsSuper):
     def get_emp(self): return self.emp
     def set_emp(self, emp): self.emp = emp
     def add_emp(self, value): self.emp.append(value)
-    def insert_emp(self, index, value): self.emp[index] = value
+    def insert_emp_at(self, index, value): self.emp.insert(index, value)
+    def replace_emp_at(self, index, value): self.emp[index] = value
     def get_bold(self): return self.bold
     def set_bold(self, bold): self.bold = bold
     def add_bold(self, value): self.bold.append(value)
-    def insert_bold(self, index, value): self.bold[index] = value
+    def insert_bold_at(self, index, value): self.bold.insert(index, value)
+    def replace_bold_at(self, index, value): self.bold[index] = value
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
             self.emp or
             self.bold or
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -898,13 +898,15 @@ class comments(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='comments', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -915,30 +917,6 @@ class comments(GeneratedsSuper):
         if not fromsubclass_:
             for item_ in self.content_:
                 item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='comments'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('content_ = [\n')
-        for item_ in self.content_:
-            item_.exportLiteral(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('content_ = [\n')
-        for item_ in self.content_:
-            item_.exportLiteral(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -950,6 +928,7 @@ class comments(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -975,11 +954,11 @@ class person(GeneratedsSuper):
     of people. They are each an extension of this base type of
     person."""
     member_data_items_ = [
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('id', 'xs:integer', 0),
         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),
@@ -989,12 +968,13 @@ class person(GeneratedsSuper):
     ]
     subclass = None
     superclass = None
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
-        self.vegetable = _cast(None, vegetable)
-        self.fruit = _cast(None, fruit)
-        self.ratio = _cast(float, ratio)
-        self.id = _cast(int, id)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.value = _cast(None, value)
+        self.id = _cast(int, id)
+        self.ratio = _cast(float, ratio)
+        self.fruit = _cast(None, fruit)
+        self.vegetable = _cast(None, vegetable)
         self.name = name
         if interest is None:
             self.interest = []
@@ -1012,6 +992,11 @@ class person(GeneratedsSuper):
         self.description = description
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, person)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if person.subclass:
             return person.subclass(*args_, **kwargs_)
         else:
@@ -1022,29 +1007,32 @@ class person(GeneratedsSuper):
     def get_interest(self): return self.interest
     def set_interest(self, interest): self.interest = interest
     def add_interest(self, value): self.interest.append(value)
-    def insert_interest(self, index, value): self.interest[index] = value
+    def insert_interest_at(self, index, value): self.interest.insert(index, value)
+    def replace_interest_at(self, index, value): self.interest[index] = value
     def get_category(self): return self.category
     def set_category(self, category): self.category = category
     def get_agent(self): return self.agent
     def set_agent(self, agent): self.agent = agent
     def add_agent(self, value): self.agent.append(value)
-    def insert_agent(self, index, value): self.agent[index] = value
+    def insert_agent_at(self, index, value): self.agent.insert(index, value)
+    def replace_agent_at(self, index, value): self.agent[index] = value
     def get_promoter(self): return self.promoter
     def set_promoter(self, promoter): self.promoter = promoter
     def add_promoter(self, value): self.promoter.append(value)
-    def insert_promoter(self, index, value): self.promoter[index] = value
+    def insert_promoter_at(self, index, value): self.promoter.insert(index, value)
+    def replace_promoter_at(self, index, value): self.promoter[index] = value
     def get_description(self): return self.description
     def set_description(self, description): self.description = description
-    def get_vegetable(self): return self.vegetable
-    def set_vegetable(self, vegetable): self.vegetable = vegetable
-    def get_fruit(self): return self.fruit
-    def set_fruit(self, fruit): self.fruit = fruit
-    def get_ratio(self): return self.ratio
-    def set_ratio(self, ratio): self.ratio = ratio
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
     def get_value(self): return self.value
     def set_value(self, value): self.value = value
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_ratio(self): return self.ratio
+    def set_ratio(self, ratio): self.ratio = ratio
+    def get_fruit(self): return self.fruit
+    def set_fruit(self, fruit): self.fruit = fruit
+    def get_vegetable(self): return self.vegetable
+    def set_vegetable(self, vegetable): self.vegetable = vegetable
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def hasContent_(self):
@@ -1064,33 +1052,35 @@ class person(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='person')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='person', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), ))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), ))
-        if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            outfile.write(' value=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value), input_name='value')), ))
         if self.id is not None and 'id' not in already_processed:
             already_processed.add('id')
             outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id'))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), ))
+        if self.ratio is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            outfile.write(' fruit=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.fruit), input_name='fruit')), ))
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            outfile.write(' vegetable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.vegetable), input_name='vegetable')), ))
         if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
@@ -1102,10 +1092,10 @@ class person(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         for interest_ in self.interest:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_))
+            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(interest_), input_name='interest')), namespace_, eol_))
         if self.category is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_))
@@ -1115,110 +1105,41 @@ class person(GeneratedsSuper):
             promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print)
         if self.description is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='person'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            showIndent(outfile, level)
-            outfile.write('vegetable="%s",\n' % (self.vegetable,))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            showIndent(outfile, level)
-            outfile.write('fruit="%s",\n' % (self.fruit,))
-        if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            showIndent(outfile, level)
-            outfile.write('ratio=%f,\n' % (self.ratio,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            showIndent(outfile, level)
-            outfile.write('id=%d,\n' % (self.id,))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            showIndent(outfile, level)
-            outfile.write('value="%s",\n' % (self.value,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        showIndent(outfile, level)
-        outfile.write('interest=[\n')
-        level += 1
-        for interest_ in self.interest:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.category is not None:
-            showIndent(outfile, level)
-            outfile.write('category=%d,\n' % self.category)
-        showIndent(outfile, level)
-        outfile.write('agent=[\n')
-        level += 1
-        for agent_ in self.agent:
-            showIndent(outfile, level)
-            outfile.write('model_.agent(\n')
-            agent_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('promoter=[\n')
-        level += 1
-        for promoter_ in self.promoter:
-            showIndent(outfile, level)
-            outfile.write('model_.booster(\n')
-            promoter_.exportLiteral(outfile, level, name_='booster')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.description is not None:
-            showIndent(outfile, level)
-            outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding))
+            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('vegetable', node)
-        if value is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            self.vegetable = value
-        value = find_attr_value_('fruit', node)
-        if value is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            self.fruit = value
-        value = find_attr_value_('ratio', node)
-        if value is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            try:
-                self.ratio = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('value', node)
+        if value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            self.value = value
         value = find_attr_value_('id', node)
         if value is not None and 'id' not in already_processed:
             already_processed.add('id')
             try:
                 self.id = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value', node)
-        if value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            self.value = value
+        value = find_attr_value_('ratio', node)
+        if value is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            try:
+                self.ratio = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('fruit', node)
+        if value is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            self.fruit = value
+        value = find_attr_value_('vegetable', node)
+        if value is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            self.vegetable = value
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
@@ -1236,7 +1157,7 @@ class person(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'category')
             self.category = ival_
@@ -1244,10 +1165,12 @@ class person(GeneratedsSuper):
             obj_ = agent.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = booster.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1260,10 +1183,15 @@ class specialperson(person):
     ]
     subclass = None
     superclass = person
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None):
-        super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
-        pass
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None):
+        self.original_tagname_ = None
+        super(specialperson, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, )
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, specialperson)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if specialperson.subclass:
             return specialperson.subclass(*args_, **kwargs_)
         else:
@@ -1281,13 +1209,15 @@ class specialperson(person):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='specialperson', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1296,22 +1226,13 @@ class specialperson(person):
         super(specialperson, self).exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson')
     def exportChildren(self, outfile, level, namespace_='', name_='specialperson', fromsubclass_=False, pretty_print=True):
         super(specialperson, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='specialperson'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(specialperson, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(specialperson, self).exportLiteralChildren(outfile, level, name_)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(specialperson, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1324,47 +1245,53 @@ class param(GeneratedsSuper):
     """Finding flow attribute unneccesary in practice. A unnamed parameter
     is unbound/skipped."""
     member_data_items_ = [
-        MemberSpec_('semantic', 'xs:token', 0),
+        MemberSpec_('id', 'xs:string', 0),
         MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 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),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        self.semantic = _cast(None, semantic)
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.id = _cast(None, id)
         self.name = _cast(None, name)
-        self.flow = _cast(None, flow)
         self.sid = _cast(None, sid)
+        self.flow = _cast(None, flow)
+        self.semantic = _cast(None, semantic)
         self.type_ = _cast(None, type_)
-        self.id = _cast(None, id)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, param)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if param.subclass:
             return param.subclass(*args_, **kwargs_)
         else:
             return param(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_semantic(self): return self.semantic
-    def set_semantic(self, semantic): self.semantic = semantic
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
-    def get_flow(self): return self.flow
-    def set_flow(self, flow): self.flow = flow
     def get_sid(self): return self.sid
     def set_sid(self, sid): self.sid = sid
+    def get_flow(self): return self.flow
+    def set_flow(self, flow): self.flow = flow
+    def get_semantic(self): return self.semantic
+    def set_semantic(self, semantic): self.semantic = semantic
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1374,72 +1301,39 @@ class param(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
         if self.name is not None and 'name' not in already_processed:
             already_processed.add('name')
             outfile.write(' name=%s' % (quote_attrib(self.name), ))
-        if self.flow is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
         if self.sid is not None and 'sid' not in already_processed:
             already_processed.add('sid')
             outfile.write(' sid=%s' % (quote_attrib(self.sid), ))
-        if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.add('type_')
-            outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), ))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='param'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            showIndent(outfile, level)
-            outfile.write('semantic="%s",\n' % (self.semantic,))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            showIndent(outfile, level)
-            outfile.write('name="%s",\n' % (self.name,))
         if self.flow is not None and 'flow' not in already_processed:
             already_processed.add('flow')
-            showIndent(outfile, level)
-            outfile.write('flow=%s,\n' % (self.flow,))
-        if self.sid is not None and 'sid' not in already_processed:
-            already_processed.add('sid')
-            showIndent(outfile, level)
-            outfile.write('sid="%s",\n' % (self.sid,))
+            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            outfile.write(' semantic=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.semantic), input_name='semantic')), ))
         if self.type_ is not None and 'type_' not in already_processed:
             already_processed.add('type_')
-            showIndent(outfile, level)
-            outfile.write('type_="%s",\n' % (self.type_,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            showIndent(outfile, level)
-            outfile.write('id="%s",\n' % (self.id,))
-    def exportLiteralChildren(self, outfile, level, name_):
+            outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True):
         pass
     def build(self, node):
         already_processed = set()
@@ -1448,32 +1342,33 @@ class param(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('semantic', node)
-        if value is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            self.semantic = value
-            self.semantic = ' '.join(self.semantic.split())
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
         value = find_attr_value_('name', node)
         if value is not None and 'name' not in already_processed:
             already_processed.add('name')
             self.name = value
-        value = find_attr_value_('flow', node)
-        if value is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            self.flow = value
         value = find_attr_value_('sid', node)
         if value is not None and 'sid' not in already_processed:
             already_processed.add('sid')
             self.sid = value
+        value = find_attr_value_('flow', node)
+        if value is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            self.flow = value
+        value = find_attr_value_('semantic', node)
+        if value is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            self.semantic = value
+            self.semantic = ' '.join(self.semantic.split())
         value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
             already_processed.add('type')
             self.type_ = value
-        value = find_attr_value_('id', node)
-        if value is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            self.id = value
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
 # end class param
@@ -1490,6 +1385,7 @@ class agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -1499,6 +1395,11 @@ class agent(GeneratedsSuper):
         else:
             self.vehicle = vehicle
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, agent)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if agent.subclass:
             return agent.subclass(*args_, **kwargs_)
         else:
@@ -1515,7 +1416,8 @@ class agent(GeneratedsSuper):
     def get_vehicle(self): return self.vehicle
     def set_vehicle(self, vehicle): self.vehicle = vehicle
     def add_vehicle(self, value): self.vehicle.append(value)
-    def insert_vehicle(self, index, value): self.vehicle[index] = value
+    def insert_vehicle_at(self, index, value): self.vehicle.insert(index, value)
+    def replace_vehicle_at(self, index, value): self.vehicle[index] = value
     def hasContent_(self):
         if (
             self.firstname is not None or
@@ -1532,13 +1434,15 @@ class agent(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='agent', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1552,59 +1456,24 @@ class agent(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.priority is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
         if self.info is not None:
             self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
         for vehicle_ in self.vehicle:
-            vehicle_.export(outfile, level, namespace_, name_='vehicle', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='agent'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.priority is not None:
-            showIndent(outfile, level)
-            outfile.write('priority=%f,\n' % self.priority)
-        if self.info is not None:
-            showIndent(outfile, level)
-            outfile.write('info=model_.info(\n')
-            self.info.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        showIndent(outfile, level)
-        outfile.write('vehicle=[\n')
-        level += 1
-        for vehicle_ in self.vehicle:
-            showIndent(outfile, level)
-            outfile.write('model_.vehicle(\n')
-            vehicle_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
+            vehicle_.export(outfile, level, namespace_, name_='vehicle', pretty_print=pretty_print)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1620,7 +1489,7 @@ class agent(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
@@ -1628,6 +1497,7 @@ class agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         elif nodeName_ == 'vehicle':
             type_name_ = child_.attrib.get(
                 '{http://www.w3.org/2001/XMLSchema-instance}type')
@@ -1646,6 +1516,7 @@ class agent(GeneratedsSuper):
                 raise NotImplementedError(
                     'Class not implemented for <vehicle> element')
             self.vehicle.append(obj_)
+            obj_.original_tagname_ = 'vehicle'
 # end class agent
 
 
@@ -1661,11 +1532,17 @@ class special_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
         self.info = info
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, special_agent)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if special_agent.subclass:
             return special_agent.subclass(*args_, **kwargs_)
         else:
@@ -1694,13 +1571,15 @@ class special_agent(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='special-agent', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1714,45 +1593,22 @@ class special_agent(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.priority is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
         if self.info is not None:
             self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='special-agent'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.priority is not None:
-            showIndent(outfile, level)
-            outfile.write('priority=%f,\n' % self.priority)
-        if self.info is not None:
-            showIndent(outfile, level)
-            outfile.write('info=model_.info(\n')
-            self.info.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1768,7 +1624,7 @@ class special_agent(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
@@ -1776,6 +1632,7 @@ class special_agent(GeneratedsSuper):
             obj_ = info.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
 # end class special_agent
 
 
@@ -1793,6 +1650,7 @@ class booster(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.member_id = _cast(None, member_id)
         self.firstname = firstname
         self.lastname = lastname
@@ -1811,6 +1669,11 @@ class booster(GeneratedsSuper):
         else:
             self.client_handler = client_handler
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, booster)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if booster.subclass:
             return booster.subclass(*args_, **kwargs_)
         else:
@@ -1827,15 +1690,18 @@ class booster(GeneratedsSuper):
     def get_other_value(self): return self.other_value
     def set_other_value(self, other_value): self.other_value = other_value
     def add_other_value(self, value): self.other_value.append(value)
-    def insert_other_value(self, index, value): self.other_value[index] = value
+    def insert_other_value_at(self, index, value): self.other_value.insert(index, value)
+    def replace_other_value_at(self, index, value): self.other_value[index] = value
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
     def add_type(self, value): self.type_.append(value)
-    def insert_type(self, index, value): self.type_[index] = value
+    def insert_type_at(self, index, value): self.type_.insert(index, value)
+    def replace_type_at(self, index, value): self.type_[index] = value
     def get_client_handler(self): return self.client_handler
     def set_client_handler(self, client_handler): self.client_handler = client_handler
     def add_client_handler(self, value): self.client_handler.append(value)
-    def insert_client_handler(self, index, value): self.client_handler[index] = value
+    def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value)
+    def replace_client_handler_at(self, index, value): self.client_handler[index] = value
     def get_member_id(self): return self.member_id
     def set_member_id(self, member_id): self.member_id = member_id
     def hasContent_(self):
@@ -1856,13 +1722,15 @@ class booster(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='booster', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1870,7 +1738,7 @@ class booster(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='booster'):
         if self.member_id is not None and 'member_id' not in already_processed:
             already_processed.add('member_id')
-            outfile.write(' member-id=%s' % (self.gds_format_string(quote_attrib(self.member_id).encode(ExternalEncoding), input_name='member-id'), ))
+            outfile.write(' member-id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.member_id), input_name='member-id')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='booster', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
@@ -1878,10 +1746,10 @@ class booster(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.other_name is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_))
@@ -1896,66 +1764,13 @@ class booster(GeneratedsSuper):
             outfile.write('<%stype>%s</%stype>%s' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_, eol_))
         for client_handler_ in self.client_handler:
             client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='booster'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.member_id is not None and 'member_id' not in already_processed:
-            already_processed.add('member_id')
-            showIndent(outfile, level)
-            outfile.write('member_id="%s",\n' % (self.member_id,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.other_name is not None:
-            showIndent(outfile, level)
-            outfile.write('other_name=%f,\n' % self.other_name)
-        if self.class_ is not None:
-            showIndent(outfile, level)
-            outfile.write('class_=%f,\n' % self.class_)
-        showIndent(outfile, level)
-        outfile.write('other_value=[\n')
-        level += 1
-        for other_value_ in self.other_value:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % other_value_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('type_=[\n')
-        level += 1
-        for type_ in self.type_:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % type_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('client_handler=[\n')
-        level += 1
-        for client_handler_ in self.client_handler:
-            showIndent(outfile, level)
-            outfile.write('model_.client_handlerType(\n')
-            client_handler_.exportLiteral(outfile, level, name_='client-handlerType')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('member-id', node)
         if value is not None and 'member-id' not in already_processed:
@@ -1974,7 +1789,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'other_name')
             self.other_name = fval_
@@ -1982,7 +1797,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'class')
             self.class_ = fval_
@@ -1990,7 +1805,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'other_value')
             self.other_value.append(fval_)
@@ -1998,7 +1813,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'type')
             self.type_.append(fval_)
@@ -2006,34 +1821,40 @@ class booster(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
 # end class booster
 
 
 class info(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('rating', 'xs:float', 0),
-        MemberSpec_('type', 'xs:integer', 0),
         MemberSpec_('name', 'xs:string', 0),
+        MemberSpec_('type', 'xs:integer', 0),
+        MemberSpec_('rating', 'xs:float', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, rating=None, type_=None, name=None):
-        self.rating = _cast(float, rating)
-        self.type_ = _cast(int, type_)
+    def __init__(self, name=None, type_=None, rating=None):
+        self.original_tagname_ = None
         self.name = _cast(None, name)
-        pass
+        self.type_ = _cast(int, type_)
+        self.rating = _cast(float, rating)
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, info)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if info.subclass:
             return info.subclass(*args_, **kwargs_)
         else:
             return info(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_rating(self): return self.rating
-    def set_rating(self, rating): self.rating = rating
-    def get_type(self): return self.type_
-    def set_type(self, type_): self.type_ = type_
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def get_rating(self): return self.rating
+    def set_rating(self, rating): self.rating = rating
     def hasContent_(self):
         if (
 
@@ -2046,48 +1867,29 @@ class info(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='info')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='info', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
-        if self.rating is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
         if self.type_ is not None and 'type_' not in already_processed:
             already_processed.add('type_')
             outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type'))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='info'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
         if self.rating is not None and 'rating' not in already_processed:
             already_processed.add('rating')
-            showIndent(outfile, level)
-            outfile.write('rating=%f,\n' % (self.rating,))
-        if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.add('type_')
-            showIndent(outfile, level)
-            outfile.write('type_=%d,\n' % (self.type_,))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            showIndent(outfile, level)
-            outfile.write('name="%s",\n' % (self.name,))
-    def exportLiteralChildren(self, outfile, level, name_):
+            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+    def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True):
         pass
     def build(self, node):
         already_processed = set()
@@ -2095,25 +1897,26 @@ class info(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('rating', node)
-        if value is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            try:
-                self.rating = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (rating): %s' % exp)
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
         value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
             already_processed.add('type')
             try:
                 self.type_ = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('name', node)
-        if value is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            self.name = value
+        value = find_attr_value_('rating', node)
+        if value is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            try:
+                self.rating = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (rating): %s' % exp)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
 # end class info
@@ -2126,9 +1929,15 @@ class vehicle(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, wheelcount=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.wheelcount = wheelcount
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, vehicle)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if vehicle.subclass:
             return vehicle.subclass(*args_, **kwargs_)
         else:
@@ -2150,13 +1959,15 @@ class vehicle(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='vehicle')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='vehicle', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2175,24 +1986,13 @@ class vehicle(GeneratedsSuper):
         if self.wheelcount is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%swheelcount>%s</%swheelcount>%s' % (namespace_, self.gds_format_integer(self.wheelcount, input_name='wheelcount'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='vehicle'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.wheelcount is not None:
-            showIndent(outfile, level)
-            outfile.write('wheelcount=%d,\n' % self.wheelcount)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
@@ -2203,7 +2003,7 @@ class vehicle(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'wheelcount')
             self.wheelcount = ival_
@@ -2217,9 +2017,15 @@ class automobile(vehicle):
     subclass = None
     superclass = vehicle
     def __init__(self, wheelcount=None, drivername=None):
+        self.original_tagname_ = None
         super(automobile, self).__init__(wheelcount, )
         self.drivername = drivername
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, automobile)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if automobile.subclass:
             return automobile.subclass(*args_, **kwargs_)
         else:
@@ -2240,13 +2046,15 @@ class automobile(vehicle):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='automobile')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='automobile', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2261,26 +2069,14 @@ class automobile(vehicle):
             eol_ = ''
         if self.drivername is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdrivername>%s</%sdrivername>%s' % (namespace_, self.gds_format_string(quote_xml(self.drivername).encode(ExternalEncoding), input_name='drivername'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='automobile'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(automobile, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(automobile, self).exportLiteralChildren(outfile, level, name_)
-        if self.drivername is not None:
-            showIndent(outfile, level)
-            outfile.write('drivername=%s,\n' % quote_python(self.drivername).encode(ExternalEncoding))
+            outfile.write('<%sdrivername>%s</%sdrivername>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.drivername), input_name='drivername')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(automobile, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2299,9 +2095,15 @@ class airplane(vehicle):
     subclass = None
     superclass = vehicle
     def __init__(self, wheelcount=None, pilotname=None):
+        self.original_tagname_ = None
         super(airplane, self).__init__(wheelcount, )
         self.pilotname = pilotname
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, airplane)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if airplane.subclass:
             return airplane.subclass(*args_, **kwargs_)
         else:
@@ -2322,13 +2124,15 @@ class airplane(vehicle):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='airplane')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='airplane', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2343,26 +2147,14 @@ class airplane(vehicle):
             eol_ = ''
         if self.pilotname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%spilotname>%s</%spilotname>%s' % (namespace_, self.gds_format_string(quote_xml(self.pilotname).encode(ExternalEncoding), input_name='pilotname'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='airplane'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(airplane, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(airplane, self).exportLiteralChildren(outfile, level, name_)
-        if self.pilotname is not None:
-            showIndent(outfile, level)
-            outfile.write('pilotname=%s,\n' % quote_python(self.pilotname).encode(ExternalEncoding))
+            outfile.write('<%spilotname>%s</%spilotname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.pilotname), input_name='pilotname')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(airplane, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2380,10 +2172,10 @@ class programmer(person):
     member_data_items_ = [
         MemberSpec_('language', 'xs:string', 0),
         MemberSpec_('area', 'xs:string', 0),
-        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
         MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 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),
@@ -2398,20 +2190,21 @@ class programmer(person):
     ]
     subclass = None
     superclass = person
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
+        super(programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
-        self.attrnegint = _cast(int, attrnegint)
         self.attrposint = _cast(int, attrposint)
-        self.attrnonnegint = _cast(int, attrnonnegint)
         self.attrnonposint = _cast(int, attrnonposint)
+        self.attrnegint = _cast(int, attrnegint)
+        self.attrnonnegint = _cast(int, attrnonnegint)
         self.email = email
         self.elposint = elposint
         self.elnonposint = elnonposint
         self.elnegint = elnegint
         self.elnonnegint = elnonnegint
-        if isinstance(eldate, basestring):
+        if isinstance(eldate, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date()
         else:
             initvalue_ = eldate
@@ -2421,8 +2214,14 @@ class programmer(person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if programmer.subclass:
             return programmer.subclass(*args_, **kwargs_)
         else:
@@ -2454,19 +2253,28 @@ class programmer(person):
     def set_language(self, language): self.language = language
     def get_area(self): return self.area
     def set_area(self, area): self.area = area
-    def get_attrnegint(self): return self.attrnegint
-    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
     def get_attrposint(self): return self.attrposint
     def set_attrposint(self, attrposint): self.attrposint = attrposint
-    def get_attrnonnegint(self): return self.attrnonnegint
-    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
     def get_attrnonposint(self): return self.attrnonposint
     def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint
+    def get_attrnegint(self): return self.attrnegint
+    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
+    def get_attrnonnegint(self): return self.attrnonnegint
+    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['float', 'int', 'Name', 'token']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
@@ -2490,13 +2298,15 @@ class programmer(person):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2505,22 +2315,22 @@ class programmer(person):
         super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
         if self.language is not None and 'language' not in already_processed:
             already_processed.add('language')
-            outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), ))
+            outfile.write(' language=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.language), input_name='language')), ))
         if self.area is not None and 'area' not in already_processed:
             already_processed.add('area')
-            outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), ))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+            outfile.write(' area=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.area), input_name='area')), ))
         if self.attrposint is not None and 'attrposint' not in already_processed:
             already_processed.add('attrposint')
             outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint'))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
         if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
             already_processed.add('attrnonposint')
             outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint'))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
         if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
@@ -2533,7 +2343,7 @@ class programmer(person):
             eol_ = ''
         if self.email is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_))
+            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.email), input_name='email')), namespace_, eol_))
         if self.elposint is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_))
@@ -2551,7 +2361,7 @@ class programmer(person):
             outfile.write('<%seldate>%s</%seldate>%s' % (namespace_, self.gds_format_date(self.eldate, input_name='eldate'), namespace_, eol_))
         if self.eltoken is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_))
+            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.eltoken), input_name='eltoken')), namespace_, eol_))
         if self.elshort is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_))
@@ -2562,83 +2372,14 @@ class programmer(person):
             self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print)
         if self.elarraytypes is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='programmer'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.language is not None and 'language' not in already_processed:
-            already_processed.add('language')
-            showIndent(outfile, level)
-            outfile.write('language="%s",\n' % (self.language,))
-        if self.area is not None and 'area' not in already_processed:
-            already_processed.add('area')
-            showIndent(outfile, level)
-            outfile.write('area="%s",\n' % (self.area,))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnegint=%d,\n' % (self.attrnegint,))
-        if self.attrposint is not None and 'attrposint' not in already_processed:
-            already_processed.add('attrposint')
-            showIndent(outfile, level)
-            outfile.write('attrposint=%d,\n' % (self.attrposint,))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,))
-        if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
-            already_processed.add('attrnonposint')
-            showIndent(outfile, level)
-            outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,))
-        super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.email is not None:
-            showIndent(outfile, level)
-            outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding))
-        if self.elposint is not None:
-            showIndent(outfile, level)
-            outfile.write('elposint=%d,\n' % self.elposint)
-        if self.elnonposint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnonposint=%d,\n' % self.elnonposint)
-        if self.elnegint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnegint=%d,\n' % self.elnegint)
-        if self.elnonnegint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnonnegint=%d,\n' % self.elnonnegint)
-        if self.eldate is not None:
-            showIndent(outfile, level)
-            outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate'))
-        if self.eltoken is not None:
-            showIndent(outfile, level)
-            outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding))
-        if self.elshort is not None:
-            showIndent(outfile, level)
-            outfile.write('elshort=%d,\n' % self.elshort)
-        if self.ellong is not None:
-            showIndent(outfile, level)
-            outfile.write('ellong=%d,\n' % self.ellong)
-        if self.elparam is not None:
-            showIndent(outfile, level)
-            outfile.write('elparam=model_.param(\n')
-            self.elparam.exportLiteral(outfile, level, name_='elparam')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.elarraytypes is not None:
-            showIndent(outfile, level)
-            outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding))
+            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.elarraytypes), input_name='elarraytypes')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('language', node)
         if value is not None and 'language' not in already_processed:
@@ -2648,42 +2389,42 @@ class programmer(person):
         if value is not None and 'area' not in already_processed:
             already_processed.add('area')
             self.area = value
-        value = find_attr_value_('attrnegint', node)
-        if value is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            try:
-                self.attrnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnegint >= 0:
-                raise_parse_error(node, 'Invalid NegativeInteger')
         value = find_attr_value_('attrposint', node)
         if value is not None and 'attrposint' not in already_processed:
             already_processed.add('attrposint')
             try:
                 self.attrposint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrposint <= 0:
                 raise_parse_error(node, 'Invalid PositiveInteger')
-        value = find_attr_value_('attrnonnegint', node)
-        if value is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            try:
-                self.attrnonnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnonnegint < 0:
-                raise_parse_error(node, 'Invalid NonNegativeInteger')
         value = find_attr_value_('attrnonposint', node)
         if value is not None and 'attrnonposint' not in already_processed:
             already_processed.add('attrnonposint')
             try:
                 self.attrnonposint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrnonposint > 0:
                 raise_parse_error(node, 'Invalid NonPositiveInteger')
+        value = find_attr_value_('attrnegint', node)
+        if value is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            try:
+                self.attrnegint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnegint >= 0:
+                raise_parse_error(node, 'Invalid NegativeInteger')
+        value = find_attr_value_('attrnonnegint', node)
+        if value is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            try:
+                self.attrnonnegint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonnegint < 0:
+                raise_parse_error(node, 'Invalid NonNegativeInteger')
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
@@ -2698,7 +2439,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ <= 0:
                 raise_parse_error(child_, 'requires positiveInteger')
@@ -2708,7 +2449,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ > 0:
                 raise_parse_error(child_, 'requires nonPositiveInteger')
@@ -2718,7 +2459,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ >= 0:
                 raise_parse_error(child_, 'requires negativeInteger')
@@ -2728,7 +2469,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ < 0:
                 raise_parse_error(child_, 'requires nonNegativeInteger')
@@ -2740,14 +2481,17 @@ class programmer(person):
             self.eldate = dval_
         elif nodeName_ == 'eltoken':
             eltoken_ = child_.text
-            eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            if eltoken_:
+                eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            else:
+                eltoken_ = ""
             eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken')
             self.eltoken = eltoken_
         elif nodeName_ == 'elshort':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'elshort')
             self.elshort = ival_
@@ -2755,7 +2499,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'ellong')
             self.ellong = ival_
@@ -2763,11 +2507,13 @@ class programmer(person):
             obj_ = param.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
             self.elarraytypes = elarraytypes_
-            self.validate_ArrayTypes(self.elarraytypes)    # validate type ArrayTypes
+            # validate type ArrayTypes
+            self.validate_ArrayTypes(self.elarraytypes)
         super(programmer, self).buildChildren(child_, node, nodeName_, True)
 # end class programmer
 
@@ -2780,9 +2526,15 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, client_handlerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if client_handlerType.subclass:
             return client_handlerType.subclass(*args_, **kwargs_)
         else:
@@ -2805,13 +2557,15 @@ class client_handlerType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2825,31 +2579,17 @@ class client_handlerType(GeneratedsSuper):
             eol_ = ''
         if self.fullname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_))
+            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.fullname), input_name='fullname')), namespace_, eol_))
         if self.refid is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='client-handlerType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.fullname is not None:
-            showIndent(outfile, level)
-            outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding))
-        if self.refid is not None:
-            showIndent(outfile, level)
-            outfile.write('refid=%d,\n' % self.refid)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2861,7 +2601,7 @@ class client_handlerType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'refid')
             self.refid = ival_
@@ -2873,18 +2613,24 @@ class java_programmer(programmer):
     Java programmers are nice also, but not as especially wonderful
     as Python programmers, of course."""
     member_data_items_ = [
-        MemberSpec_('status', 'xs:string', 0),
         MemberSpec_('nick-name', 'xs:string', 0),
+        MemberSpec_('status', 'xs:string', 0),
         MemberSpec_('favorite_editor', 'xs:string', 0),
     ]
     subclass = None
     superclass = programmer
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
-        super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
-        self.status = _cast(None, status)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(java_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
+        self.status = _cast(None, status)
         self.favorite_editor = favorite_editor
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, java_programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if java_programmer.subclass:
             return java_programmer.subclass(*args_, **kwargs_)
         else:
@@ -2892,10 +2638,10 @@ class java_programmer(programmer):
     factory = staticmethod(factory)
     def get_favorite_editor(self): return self.favorite_editor
     def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
-    def get_status(self): return self.status
-    def set_status(self, status): self.status = status
     def get_nick_name(self): return self.nick_name
     def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def get_status(self): return self.status
+    def set_status(self, status): self.status = status
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
@@ -2909,25 +2655,27 @@ class java_programmer(programmer):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'):
         super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), ))
         if self.nick_name is not None and 'nick_name' not in already_processed:
             already_processed.add('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+            outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), ))
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            outfile.write(' status=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.status), input_name='status')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True):
         super(java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
@@ -2936,43 +2684,23 @@ class java_programmer(programmer):
             eol_ = ''
         if self.favorite_editor is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='java-programmer'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            showIndent(outfile, level)
-            outfile.write('status="%s",\n' % (self.status,))
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.add('nick_name')
-            showIndent(outfile, level)
-            outfile.write('nick_name="%s",\n' % (self.nick_name,))
-        super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(java_programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.favorite_editor is not None:
-            showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('status', node)
-        if value is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            self.status = value
         value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
             already_processed.add('nick-name')
             self.nick_name = value
+        value = find_attr_value_('status', node)
+        if value is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            self.status = value
         super(java_programmer, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'favorite-editor':
@@ -2992,11 +2720,17 @@ class python_programmer(programmer):
     ]
     subclass = None
     superclass = programmer
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
-        super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(python_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
         self.favorite_editor = favorite_editor
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, python_programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if python_programmer.subclass:
             return python_programmer.subclass(*args_, **kwargs_)
         else:
@@ -3019,13 +2753,15 @@ class python_programmer(programmer):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -3034,7 +2770,7 @@ class python_programmer(programmer):
         super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
         if self.nick_name is not None and 'nick_name' not in already_processed:
             already_processed.add('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+            outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True):
         super(python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
@@ -3043,30 +2779,14 @@ class python_programmer(programmer):
             eol_ = ''
         if self.favorite_editor is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='python-programmer'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.add('nick_name')
-            showIndent(outfile, level)
-            outfile.write('nick_name="%s",\n' % (self.nick_name,))
-        super(python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(python_programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.favorite_editor is not None:
-            showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
@@ -3095,7 +2815,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -3108,7 +2828,8 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -3128,7 +2849,8 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -3151,12 +2873,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'people'
         rootClass = people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -3165,13 +2891,14 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="people",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -3184,7 +2911,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from people_procincl2_sup import *\n\n')
 ##         sys.stdout.write('import people_procincl2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/people_procincl2_sub.py b/tests/people_procincl2_sub.py
deleted file mode 100644
index c3b5be6..0000000
--- a/tests/people_procincl2_sub.py
+++ /dev/null
@@ -1,301 +0,0 @@
-#!/usr/bin/env python
-
-#
-# Generated  by generateDS.py.
-#
-
-import sys
-
-import people_procincl2_sup as supermod
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-
-#
-# Data representation classes
-#
-
-
-class peopleSub(supermod.people):
-    def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
-        super(peopleSub, self).__init__(comments, person, specialperson, programmer, python_programmer, java_programmer, )
-supermod.people.subclass = peopleSub
-# end class peopleSub
-
-
-class commentsSub(supermod.comments):
-    def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
-        super(commentsSub, self).__init__(emp, bold, valueOf_, mixedclass_, content_, )
-supermod.comments.subclass = commentsSub
-# end class commentsSub
-
-
-class personSub(supermod.person):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
-        super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
-supermod.person.subclass = personSub
-# end class personSub
-
-
-class specialpersonSub(supermod.specialperson):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None):
-        super(specialpersonSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
-supermod.specialperson.subclass = specialpersonSub
-# end class specialpersonSub
-
-
-class paramSub(supermod.param):
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, )
-supermod.param.subclass = paramSub
-# end class paramSub
-
-
-class agentSub(supermod.agent):
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
-        super(agentSub, self).__init__(firstname, lastname, priority, info, vehicle, )
-supermod.agent.subclass = agentSub
-# end class agentSub
-
-
-class special_agentSub(supermod.special_agent):
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
-        super(special_agentSub, self).__init__(firstname, lastname, priority, info, )
-supermod.special_agent.subclass = special_agentSub
-# end class special_agentSub
-
-
-class boosterSub(supermod.booster):
-    def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
-        super(boosterSub, self).__init__(member_id, firstname, lastname, other_name, class_, other_value, type_, client_handler, )
-supermod.booster.subclass = boosterSub
-# end class boosterSub
-
-
-class infoSub(supermod.info):
-    def __init__(self, rating=None, type_=None, name=None):
-        super(infoSub, self).__init__(rating, type_, name, )
-supermod.info.subclass = infoSub
-# end class infoSub
-
-
-class vehicleSub(supermod.vehicle):
-    def __init__(self, wheelcount=None, extensiontype_=None):
-        super(vehicleSub, self).__init__(wheelcount, extensiontype_, )
-supermod.vehicle.subclass = vehicleSub
-# end class vehicleSub
-
-
-class automobileSub(supermod.automobile):
-    def __init__(self, wheelcount=None, drivername=None):
-        super(automobileSub, self).__init__(wheelcount, drivername, )
-supermod.automobile.subclass = automobileSub
-# end class automobileSub
-
-
-class airplaneSub(supermod.airplane):
-    def __init__(self, wheelcount=None, pilotname=None):
-        super(airplaneSub, self).__init__(wheelcount, pilotname, )
-supermod.airplane.subclass = airplaneSub
-# end class airplaneSub
-
-
-class programmerSub(supermod.programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
-supermod.programmer.subclass = programmerSub
-# end class programmerSub
-
-
-class client_handlerTypeSub(supermod.client_handlerType):
-    def __init__(self, fullname=None, refid=None):
-        super(client_handlerTypeSub, self).__init__(fullname, refid, )
-supermod.client_handlerType.subclass = client_handlerTypeSub
-# end class client_handlerTypeSub
-
-
-class java_programmerSub(supermod.java_programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
-        super(java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, )
-supermod.java_programmer.subclass = java_programmerSub
-# end class java_programmerSub
-
-
-class python_programmerSub(supermod.python_programmer):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
-        super(python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
-supermod.python_programmer.subclass = python_programmerSub
-# end class python_programmerSub
-
-
-def get_root_tag(node):
-    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = None
-    rootClass = supermod.GDSClassesMapping.get(tag)
-    if rootClass is None and hasattr(supermod, tag):
-        rootClass = getattr(supermod, tag)
-    return tag, rootClass
-
-
-def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='',
-##             pretty_print=True)
-    return rootObj
-
-
-def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    mapping = {}
-    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
-    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
-##     if not silence:
-##         content = etree_.tostring(
-##             rootElement, pretty_print=True,
-##             xml_declaration=True, encoding="utf-8")
-##         sys.stdout.write(content)
-##         sys.stdout.write('\n')
-    return rootObj, rootElement, mapping, reverse_mapping
-
-
-def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = supermod.people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='')
-    return rootObj
-
-
-def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
-    rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
-    if rootClass is None:
-        rootClass = supermod.people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('#from people_procincl2_sup import *\n\n')
-##         sys.stdout.write('import people_procincl2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.people(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="people")
-##         sys.stdout.write(')\n')
-    return rootObj
-
-
-USAGE_TEXT = """
-Usage: python ???.py <infilename>
-"""
-
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) != 1:
-        usage()
-    infilename = args[0]
-    parse(infilename)
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
diff --git a/tests/people_procincl2_sup.py b/tests/people_procincl2_sup.py
deleted file mode 100644
index 397274a..0000000
--- a/tests/people_procincl2_sup.py
+++ /dev/null
@@ -1,3223 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-#
-# Generated  by generateDS.py.
-#
-
-import sys
-import getopt
-import re as re_
-import base64
-import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# User methods
-#
-# Calls to the methods in these classes are generated by generateDS.py.
-# You can replace these methods by re-implementing the following class
-#   in a module named generatedssuper.py.
-
-try:
-    from generatedssuper import GeneratedsSuper
-except ImportError, exp:
-
-    class GeneratedsSuper(object):
-        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
-        class _FixedOffsetTZ(datetime_.tzinfo):
-            def __init__(self, offset, name):
-                self.__offset = datetime_.timedelta(minutes=offset)
-                self.__name = name
-            def utcoffset(self, dt):
-                return self.__offset
-            def tzname(self, dt):
-                return self.__name
-            def dst(self, dt):
-                return None
-        def gds_format_string(self, input_data, input_name=''):
-            return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_base64(self, input_data, input_name=''):
-            return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_integer(self, input_data, input_name=''):
-            return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
-        def gds_format_float(self, input_data, input_name=''):
-            return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
-        def gds_format_double(self, input_data, input_name=''):
-            return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
-        def gds_format_boolean(self, input_data, input_name=''):
-            return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                if value not in ('true', '1', 'false', '0', ):
-                    raise_parse_error(
-                        node,
-                        'Requires sequence of booleans '
-                        '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_datetime(self, input_data, input_name=''):
-            if input_data.microsecond == 0:
-                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
-                    input_data.year,
-                    input_data.month,
-                    input_data.day,
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                )
-            else:
-                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
-                    input_data.year,
-                    input_data.month,
-                    input_data.day,
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
-                )
-            if input_data.tzinfo is not None:
-                tzoff = input_data.tzinfo.utcoffset(input_data)
-                if tzoff is not None:
-                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                    if total_seconds == 0:
-                        _svalue += 'Z'
-                    else:
-                        if total_seconds < 0:
-                            _svalue += '-'
-                            total_seconds *= -1
-                        else:
-                            _svalue += '+'
-                        hours = total_seconds // 3600
-                        minutes = (total_seconds - (hours * 3600)) // 60
-                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            return _svalue
-        @classmethod
-        def gds_parse_datetime(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
-                dt = datetime_.datetime.strptime(
-                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
-            else:
-                dt = datetime_.datetime.strptime(
-                    input_data, '%Y-%m-%dT%H:%M:%S')
-            dt = dt.replace(tzinfo=tz)
-            return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_date(self, input_data, input_name=''):
-            _svalue = '%04d-%02d-%02d' % (
-                input_data.year,
-                input_data.month,
-                input_data.day,
-            )
-            try:
-                if input_data.tzinfo is not None:
-                    tzoff = input_data.tzinfo.utcoffset(input_data)
-                    if tzoff is not None:
-                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                        if total_seconds == 0:
-                            _svalue += 'Z'
-                        else:
-                            if total_seconds < 0:
-                                _svalue += '-'
-                                total_seconds *= -1
-                            else:
-                                _svalue += '+'
-                            hours = total_seconds // 3600
-                            minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            except AttributeError:
-                pass
-            return _svalue
-        @classmethod
-        def gds_parse_date(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
-            dt = dt.replace(tzinfo=tz)
-            return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_time(self, input_data, input_name=''):
-            if input_data.microsecond == 0:
-                _svalue = '%02d:%02d:%02d' % (
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                )
-            else:
-                _svalue = '%02d:%02d:%02d.%s' % (
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
-                )
-            if input_data.tzinfo is not None:
-                tzoff = input_data.tzinfo.utcoffset(input_data)
-                if tzoff is not None:
-                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                    if total_seconds == 0:
-                        _svalue += 'Z'
-                    else:
-                        if total_seconds < 0:
-                            _svalue += '-'
-                            total_seconds *= -1
-                        else:
-                            _svalue += '+'
-                        hours = total_seconds // 3600
-                        minutes = (total_seconds - (hours * 3600)) // 60
-                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            return _svalue
-        @classmethod
-        def gds_parse_time(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
-                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
-            else:
-                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
-            dt = dt.replace(tzinfo=tz)
-            return dt.time()
-        def gds_str_lower(self, instring):
-            return instring.lower()
-        def get_path_(self, node):
-            path_list = []
-            self.get_path_list_(node, path_list)
-            path_list.reverse()
-            path = '/'.join(path_list)
-            return path
-        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
-        def get_path_list_(self, node, path_list):
-            if node is None:
-                return
-            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
-            if tag:
-                path_list.append(tag)
-            self.get_path_list_(node.getparent(), path_list)
-        def get_class_obj_(self, node, default_class=None):
-            class_obj1 = default_class
-            if 'xsi' in node.nsmap:
-                classname = node.get('{%s}type' % node.nsmap['xsi'])
-                if classname is not None:
-                    names = classname.split(':')
-                    if len(names) == 2:
-                        classname = names[1]
-                    class_obj2 = globals().get(classname)
-                    if class_obj2 is not None:
-                        class_obj1 = class_obj2
-            return class_obj1
-        def gds_build_any(self, node, type_name=None):
-            return None
-        @classmethod
-        def gds_reverse_node_mapping(cls, mapping):
-            return dict(((v, k) for k, v in mapping.iteritems()))
-
-
-#
-# If you have installed IPython you can uncomment and use the following.
-# IPython is available from http://ipython.scipy.org/.
-#
-
-## from IPython.Shell import IPShellEmbed
-## args = ''
-## ipshell = IPShellEmbed(args,
-##     banner = 'Dropping into IPython',
-##     exit_msg = 'Leaving Interpreter, back to program.')
-
-# Then use the following line where and when you want to drop into the
-# IPython shell:
-#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-Tag_pattern_ = re_.compile(r'({.*})?(.*)')
-String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
-Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
-
-#
-# Support/utility functions.
-#
-
-
-def showIndent(outfile, level, pretty_print=True):
-    if pretty_print:
-        for idx in range(level):
-            outfile.write('    ')
-
-
-def quote_xml(inStr):
-    if not inStr:
-        return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
-    s1 = s1.replace('<', '&lt;')
-    s1 = s1.replace('>', '&gt;')
-    return s1
-
-
-def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
-    s1 = s1.replace('<', '&lt;')
-    s1 = s1.replace('>', '&gt;')
-    if '"' in s1:
-        if "'" in s1:
-            s1 = '"%s"' % s1.replace('"', "&quot;")
-        else:
-            s1 = "'%s'" % s1
-    else:
-        s1 = '"%s"' % s1
-    return s1
-
-
-def quote_python(inStr):
-    s1 = inStr
-    if s1.find("'") == -1:
-        if s1.find('\n') == -1:
-            return "'%s'" % s1
-        else:
-            return "'''%s'''" % s1
-    else:
-        if s1.find('"') != -1:
-            s1 = s1.replace('"', '\\"')
-        if s1.find('\n') == -1:
-            return '"%s"' % s1
-        else:
-            return '"""%s"""' % s1
-
-
-def get_all_text_(node):
-    if node.text is not None:
-        text = node.text
-    else:
-        text = ''
-    for child in node:
-        if child.tail is not None:
-            text += child.tail
-    return text
-
-
-def find_attr_value_(attr_name, node):
-    attrs = node.attrib
-    attr_parts = attr_name.split(':')
-    value = None
-    if len(attr_parts) == 1:
-        value = attrs.get(attr_name)
-    elif len(attr_parts) == 2:
-        prefix, name = attr_parts
-        namespace = node.nsmap.get(prefix)
-        if namespace is not None:
-            value = attrs.get('{%s}%s' % (namespace, name, ))
-    return value
-
-
-class GDSParseError(Exception):
-    pass
-
-
-def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
-    raise GDSParseError(msg)
-
-
-class MixedContainer:
-    # Constants for category:
-    CategoryNone = 0
-    CategoryText = 1
-    CategorySimple = 2
-    CategoryComplex = 3
-    # Constants for content_type:
-    TypeNone = 0
-    TypeText = 1
-    TypeString = 2
-    TypeInteger = 3
-    TypeFloat = 4
-    TypeDecimal = 5
-    TypeDouble = 6
-    TypeBoolean = 7
-    TypeBase64 = 8
-    def __init__(self, category, content_type, name, value):
-        self.category = category
-        self.content_type = content_type
-        self.name = name
-        self.value = value
-    def getCategory(self):
-        return self.category
-    def getContenttype(self, content_type):
-        return self.content_type
-    def getValue(self):
-        return self.value
-    def getName(self):
-        return self.name
-    def export(self, outfile, level, name, namespace, pretty_print=True):
-        if self.category == MixedContainer.CategoryText:
-            # Prevent exporting empty content as empty lines.
-            if self.value.strip():
-                outfile.write(self.value)
-        elif self.category == MixedContainer.CategorySimple:
-            self.exportSimple(outfile, level, name)
-        else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
-    def exportSimple(self, outfile, level, name):
-        if self.content_type == MixedContainer.TypeString:
-            outfile.write('<%s>%s</%s>' % (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeInteger or \
-                self.content_type == MixedContainer.TypeBoolean:
-            outfile.write('<%s>%d</%s>' % (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeFloat or \
-                self.content_type == MixedContainer.TypeDecimal:
-            outfile.write('<%s>%f</%s>' % (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeDouble:
-            outfile.write('<%s>%g</%s>' % (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeBase64:
-            outfile.write('<%s>%s</%s>' % (
-                self.name, base64.b64encode(self.value), self.name))
-    def to_etree(self, element):
-        if self.category == MixedContainer.CategoryText:
-            # Prevent exporting empty content as empty lines.
-            if self.value.strip():
-                if len(element) > 0:
-                    if element[-1].tail is None:
-                        element[-1].tail = self.value
-                    else:
-                        element[-1].tail += self.value
-                else:
-                    if element.text is None:
-                        element.text = self.value
-                    else:
-                        element.text += self.value
-        elif self.category == MixedContainer.CategorySimple:
-            subelement = etree_.SubElement(element, '%s' % self.name)
-            subelement.text = self.to_etree_simple()
-        else:    # category == MixedContainer.CategoryComplex
-            self.value.to_etree(element)
-    def to_etree_simple(self):
-        if self.content_type == MixedContainer.TypeString:
-            text = self.value
-        elif (self.content_type == MixedContainer.TypeInteger or
-                self.content_type == MixedContainer.TypeBoolean):
-            text = '%d' % self.value
-        elif (self.content_type == MixedContainer.TypeFloat or
-                self.content_type == MixedContainer.TypeDecimal):
-            text = '%f' % self.value
-        elif self.content_type == MixedContainer.TypeDouble:
-            text = '%g' % self.value
-        elif self.content_type == MixedContainer.TypeBase64:
-            text = '%s' % base64.b64encode(self.value)
-        return text
-    def exportLiteral(self, outfile, level, name):
-        if self.category == MixedContainer.CategoryText:
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
-                    self.category, self.content_type, self.name, self.value))
-        elif self.category == MixedContainer.CategorySimple:
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
-                    self.category, self.content_type, self.name, self.value))
-        else:    # category == MixedContainer.CategoryComplex
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%d, %d, "%s",\n' % (
-                    self.category, self.content_type, self.name,))
-            self.value.exportLiteral(outfile, level + 1)
-            showIndent(outfile, level)
-            outfile.write(')\n')
-
-
-class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
-        self.name = name
-        self.data_type = data_type
-        self.container = container
-    def set_name(self, name): self.name = name
-    def get_name(self): return self.name
-    def set_data_type(self, data_type): self.data_type = data_type
-    def get_data_type_chain(self): return self.data_type
-    def get_data_type(self):
-        if isinstance(self.data_type, list):
-            if len(self.data_type) > 0:
-                return self.data_type[-1]
-            else:
-                return 'xs:string'
-        else:
-            return self.data_type
-    def set_container(self, container): self.container = container
-    def get_container(self): return self.container
-
-
-def _cast(typ, value):
-    if typ is None or value is None:
-        return value
-    return typ(value)
-
-#
-# Data representation classes.
-#
-
-
-class 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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
-        if comments is None:
-            self.comments = []
-        else:
-            self.comments = comments
-        if person is None:
-            self.person = []
-        else:
-            self.person = person
-        if specialperson is None:
-            self.specialperson = []
-        else:
-            self.specialperson = specialperson
-        if programmer is None:
-            self.programmer = []
-        else:
-            self.programmer = programmer
-        if python_programmer is None:
-            self.python_programmer = []
-        else:
-            self.python_programmer = python_programmer
-        if java_programmer is None:
-            self.java_programmer = []
-        else:
-            self.java_programmer = java_programmer
-    def factory(*args_, **kwargs_):
-        if people.subclass:
-            return people.subclass(*args_, **kwargs_)
-        else:
-            return people(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_comments(self): return self.comments
-    def set_comments(self, comments): self.comments = comments
-    def add_comments(self, value): self.comments.append(value)
-    def insert_comments(self, index, value): self.comments[index] = value
-    def get_person(self): return self.person
-    def set_person(self, person): self.person = person
-    def add_person(self, value): self.person.append(value)
-    def insert_person(self, index, value): self.person[index] = value
-    def get_specialperson(self): return self.specialperson
-    def set_specialperson(self, specialperson): self.specialperson = specialperson
-    def add_specialperson(self, value): self.specialperson.append(value)
-    def insert_specialperson(self, index, value): self.specialperson[index] = value
-    def get_programmer(self): return self.programmer
-    def set_programmer(self, programmer): self.programmer = programmer
-    def add_programmer(self, value): self.programmer.append(value)
-    def insert_programmer(self, index, value): self.programmer[index] = value
-    def get_python_programmer(self): return self.python_programmer
-    def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer
-    def add_python_programmer(self, value): self.python_programmer.append(value)
-    def insert_python_programmer(self, index, value): self.python_programmer[index] = value
-    def get_java_programmer(self): return self.java_programmer
-    def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer
-    def add_java_programmer(self, value): self.java_programmer.append(value)
-    def insert_java_programmer(self, index, value): self.java_programmer[index] = value
-    def hasContent_(self):
-        if (
-            self.comments or
-            self.person or
-            self.specialperson or
-            self.programmer or
-            self.python_programmer or
-            self.java_programmer
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='people', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='people')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='people'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='people', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        for comments_ in self.comments:
-            comments_.export(outfile, level, namespace_, name_='comments', pretty_print=pretty_print)
-        for person_ in self.person:
-            person_.export(outfile, level, namespace_, name_='person', pretty_print=pretty_print)
-        for specialperson_ in self.specialperson:
-            specialperson_.export(outfile, level, namespace_, name_='specialperson', pretty_print=pretty_print)
-        for programmer_ in self.programmer:
-            programmer_.export(outfile, level, namespace_, name_='programmer', pretty_print=pretty_print)
-        for python_programmer_ in self.python_programmer:
-            python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print)
-        for java_programmer_ in self.java_programmer:
-            java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='people'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('comments=[\n')
-        level += 1
-        for comments_ in self.comments:
-            showIndent(outfile, level)
-            outfile.write('model_.comments(\n')
-            comments_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('person=[\n')
-        level += 1
-        for person_ in self.person:
-            showIndent(outfile, level)
-            outfile.write('model_.person(\n')
-            person_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('specialperson=[\n')
-        level += 1
-        for specialperson_ in self.specialperson:
-            showIndent(outfile, level)
-            outfile.write('model_.specialperson(\n')
-            specialperson_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('programmer=[\n')
-        level += 1
-        for programmer_ in self.programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.programmer(\n')
-            programmer_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('python_programmer=[\n')
-        level += 1
-        for python_programmer_ in self.python_programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.python_programmer(\n')
-            python_programmer_.exportLiteral(outfile, level, name_='python-programmer')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('java_programmer=[\n')
-        level += 1
-        for java_programmer_ in self.java_programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.java_programmer(\n')
-            java_programmer_.exportLiteral(outfile, level, name_='java-programmer')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'comments':
-            obj_ = comments.factory()
-            obj_.build(child_)
-            self.comments.append(obj_)
-        elif nodeName_ == 'person':
-            class_obj_ = self.get_class_obj_(child_, person)
-            obj_ = class_obj_.factory()
-            obj_.build(child_)
-            self.person.append(obj_)
-        elif nodeName_ == 'specialperson':
-            obj_ = specialperson.factory()
-            obj_.build(child_)
-            self.specialperson.append(obj_)
-        elif nodeName_ == 'programmer':
-            class_obj_ = self.get_class_obj_(child_, programmer)
-            obj_ = class_obj_.factory()
-            obj_.build(child_)
-            self.programmer.append(obj_)
-        elif nodeName_ == 'python-programmer':
-            obj_ = python_programmer.factory()
-            obj_.build(child_)
-            self.python_programmer.append(obj_)
-        elif nodeName_ == 'java-programmer':
-            obj_ = java_programmer.factory()
-            obj_.build(child_)
-            self.java_programmer.append(obj_)
-# end class people
-
-
-class comments(GeneratedsSuper):
-    member_data_items_ = [
-        MemberSpec_('emp', 'xs:string', 1),
-        MemberSpec_('bold', 'xs:string', 1),
-        MemberSpec_('valueOf_', [], 0),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
-        if emp is None:
-            self.emp = []
-        else:
-            self.emp = emp
-        if bold is None:
-            self.bold = []
-        else:
-            self.bold = bold
-        self.valueOf_ = valueOf_
-        if mixedclass_ is None:
-            self.mixedclass_ = MixedContainer
-        else:
-            self.mixedclass_ = mixedclass_
-        if content_ is None:
-            self.content_ = []
-        else:
-            self.content_ = content_
-        self.valueOf_ = valueOf_
-    def factory(*args_, **kwargs_):
-        if comments.subclass:
-            return comments.subclass(*args_, **kwargs_)
-        else:
-            return comments(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_emp(self): return self.emp
-    def set_emp(self, emp): self.emp = emp
-    def add_emp(self, value): self.emp.append(value)
-    def insert_emp(self, index, value): self.emp[index] = value
-    def get_bold(self): return self.bold
-    def set_bold(self, bold): self.bold = bold
-    def add_bold(self, value): self.bold.append(value)
-    def insert_bold(self, index, value): self.bold[index] = value
-    def get_valueOf_(self): return self.valueOf_
-    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
-    def hasContent_(self):
-        if (
-            self.emp or
-            self.bold or
-            self.valueOf_
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='comments', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='comments'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='comments', fromsubclass_=False, pretty_print=True):
-        if not fromsubclass_:
-            for item_ in self.content_:
-                item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='comments'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('content_ = [\n')
-        for item_ in self.content_:
-            item_.exportLiteral(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('content_ = [\n')
-        for item_ in self.content_:
-            item_.exportLiteral(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        pass
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        self.valueOf_ = get_all_text_(node)
-        if node.text is not None:
-            obj_ = self.mixedclass_(MixedContainer.CategoryText,
-                MixedContainer.TypeNone, '', node.text)
-            self.content_.append(obj_)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'emp' and child_.text is not None:
-            valuestr_ = child_.text
-            obj_ = self.mixedclass_(MixedContainer.CategorySimple,
-                MixedContainer.TypeString, 'emp', valuestr_)
-            self.content_.append(obj_)
-        elif nodeName_ == 'bold' and child_.text is not None:
-            valuestr_ = child_.text
-            obj_ = self.mixedclass_(MixedContainer.CategorySimple,
-                MixedContainer.TypeString, 'bold', valuestr_)
-            self.content_.append(obj_)
-        if not fromsubclass_ and child_.tail is not None:
-            obj_ = self.mixedclass_(MixedContainer.CategoryText,
-                MixedContainer.TypeNone, '', child_.tail)
-            self.content_.append(obj_)
-# end class comments
-
-
-class person(GeneratedsSuper):
-    """A generic person. This is the base for a number of different kinds
-    of people. They are each an extension of this base type of
-    person."""
-    member_data_items_ = [
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('id', 'xs:integer', 0),
-        MemberSpec_('value', '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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
-        self.vegetable = _cast(None, vegetable)
-        self.fruit = _cast(None, fruit)
-        self.ratio = _cast(float, ratio)
-        self.id = _cast(int, id)
-        self.value = _cast(None, value)
-        self.name = name
-        if interest is None:
-            self.interest = []
-        else:
-            self.interest = interest
-        self.category = category
-        if agent is None:
-            self.agent = []
-        else:
-            self.agent = agent
-        if promoter is None:
-            self.promoter = []
-        else:
-            self.promoter = promoter
-        self.description = description
-        self.extensiontype_ = extensiontype_
-    def factory(*args_, **kwargs_):
-        if person.subclass:
-            return person.subclass(*args_, **kwargs_)
-        else:
-            return person(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def get_interest(self): return self.interest
-    def set_interest(self, interest): self.interest = interest
-    def add_interest(self, value): self.interest.append(value)
-    def insert_interest(self, index, value): self.interest[index] = value
-    def get_category(self): return self.category
-    def set_category(self, category): self.category = category
-    def get_agent(self): return self.agent
-    def set_agent(self, agent): self.agent = agent
-    def add_agent(self, value): self.agent.append(value)
-    def insert_agent(self, index, value): self.agent[index] = value
-    def get_promoter(self): return self.promoter
-    def set_promoter(self, promoter): self.promoter = promoter
-    def add_promoter(self, value): self.promoter.append(value)
-    def insert_promoter(self, index, value): self.promoter[index] = value
-    def get_description(self): return self.description
-    def set_description(self, description): self.description = description
-    def get_vegetable(self): return self.vegetable
-    def set_vegetable(self, vegetable): self.vegetable = vegetable
-    def get_fruit(self): return self.fruit
-    def set_fruit(self, fruit): self.fruit = fruit
-    def get_ratio(self): return self.ratio
-    def set_ratio(self, ratio): self.ratio = ratio
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
-    def get_value(self): return self.value
-    def set_value(self, value): self.value = value
-    def get_extensiontype_(self): return self.extensiontype_
-    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
-    def hasContent_(self):
-        if (
-            self.name is not None or
-            self.interest or
-            self.category is not None or
-            self.agent or
-            self.promoter or
-            self.description is not None
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='person', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='person')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), ))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), ))
-        if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id'))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), ))
-        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
-            already_processed.add('xsi:type')
-            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-            outfile.write(' xsi:type="%s"' % self.extensiontype_)
-    def exportChildren(self, outfile, level, namespace_='', name_='person', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.name is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
-        for interest_ in self.interest:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_))
-        if self.category is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_))
-        for agent_ in self.agent:
-            agent_.export(outfile, level, namespace_, name_='agent', pretty_print=pretty_print)
-        for promoter_ in self.promoter:
-            promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print)
-        if self.description is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='person'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            showIndent(outfile, level)
-            outfile.write('vegetable="%s",\n' % (self.vegetable,))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            showIndent(outfile, level)
-            outfile.write('fruit="%s",\n' % (self.fruit,))
-        if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            showIndent(outfile, level)
-            outfile.write('ratio=%f,\n' % (self.ratio,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            showIndent(outfile, level)
-            outfile.write('id=%d,\n' % (self.id,))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            showIndent(outfile, level)
-            outfile.write('value="%s",\n' % (self.value,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        showIndent(outfile, level)
-        outfile.write('interest=[\n')
-        level += 1
-        for interest_ in self.interest:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.category is not None:
-            showIndent(outfile, level)
-            outfile.write('category=%d,\n' % self.category)
-        showIndent(outfile, level)
-        outfile.write('agent=[\n')
-        level += 1
-        for agent_ in self.agent:
-            showIndent(outfile, level)
-            outfile.write('model_.agent(\n')
-            agent_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('promoter=[\n')
-        level += 1
-        for promoter_ in self.promoter:
-            showIndent(outfile, level)
-            outfile.write('model_.booster(\n')
-            promoter_.exportLiteral(outfile, level, name_='booster')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.description is not None:
-            showIndent(outfile, level)
-            outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('vegetable', node)
-        if value is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            self.vegetable = value
-        value = find_attr_value_('fruit', node)
-        if value is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            self.fruit = value
-        value = find_attr_value_('ratio', node)
-        if value is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            try:
-                self.ratio = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
-        value = find_attr_value_('id', node)
-        if value is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            try:
-                self.id = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value', node)
-        if value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            self.value = value
-        value = find_attr_value_('xsi:type', node)
-        if value is not None and 'xsi:type' not in already_processed:
-            already_processed.add('xsi:type')
-            self.extensiontype_ = value
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'name':
-            name_ = child_.text
-            name_ = self.gds_validate_string(name_, node, 'name')
-            self.name = name_
-        elif nodeName_ == 'interest':
-            interest_ = child_.text
-            interest_ = self.gds_validate_string(interest_, node, 'interest')
-            self.interest.append(interest_)
-        elif nodeName_ == 'category':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'category')
-            self.category = ival_
-        elif nodeName_ == 'agent':
-            obj_ = agent.factory()
-            obj_.build(child_)
-            self.agent.append(obj_)
-        elif nodeName_ == 'promoter':
-            obj_ = booster.factory()
-            obj_.build(child_)
-            self.promoter.append(obj_)
-        elif nodeName_ == 'description':
-            description_ = child_.text
-            description_ = self.gds_validate_string(description_, node, 'description')
-            self.description = description_
-# end class person
-
-
-class specialperson(person):
-    member_data_items_ = [
-    ]
-    subclass = None
-    superclass = person
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None):
-        super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, )
-        pass
-    def factory(*args_, **kwargs_):
-        if specialperson.subclass:
-            return specialperson.subclass(*args_, **kwargs_)
-        else:
-            return specialperson(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def hasContent_(self):
-        if (
-            super(specialperson, self).hasContent_()
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='specialperson', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='specialperson'):
-        super(specialperson, self).exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson')
-    def exportChildren(self, outfile, level, namespace_='', name_='specialperson', fromsubclass_=False, pretty_print=True):
-        super(specialperson, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='specialperson'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(specialperson, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(specialperson, self).exportLiteralChildren(outfile, level, name_)
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        super(specialperson, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        super(specialperson, self).buildChildren(child_, node, nodeName_, True)
-        pass
-# end class specialperson
-
-
-class param(GeneratedsSuper):
-    """Finding flow attribute unneccesary in practice. A unnamed parameter
-    is unbound/skipped."""
-    member_data_items_ = [
-        MemberSpec_('semantic', 'xs:token', 0),
-        MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 0),
-        MemberSpec_('sid', 'xs:NCName', 0),
-        MemberSpec_('type', 'xs:NMTOKEN', 0),
-        MemberSpec_('id', 'xs:string', 0),
-        MemberSpec_('valueOf_', 'xs:string', 0),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        self.semantic = _cast(None, semantic)
-        self.name = _cast(None, name)
-        self.flow = _cast(None, flow)
-        self.sid = _cast(None, sid)
-        self.type_ = _cast(None, type_)
-        self.id = _cast(None, id)
-        self.valueOf_ = valueOf_
-    def factory(*args_, **kwargs_):
-        if param.subclass:
-            return param.subclass(*args_, **kwargs_)
-        else:
-            return param(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_semantic(self): return self.semantic
-    def set_semantic(self, semantic): self.semantic = semantic
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def get_flow(self): return self.flow
-    def set_flow(self, flow): self.flow = flow
-    def get_sid(self): return self.sid
-    def set_sid(self, sid): self.sid = sid
-    def get_type(self): return self.type_
-    def set_type(self, type_): self.type_ = type_
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
-    def get_valueOf_(self): return self.valueOf_
-    def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
-    def hasContent_(self):
-        if (
-            self.valueOf_
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='param', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
-        if self.hasContent_():
-            outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), ))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            outfile.write(' name=%s' % (quote_attrib(self.name), ))
-        if self.flow is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
-        if self.sid is not None and 'sid' not in already_processed:
-            already_processed.add('sid')
-            outfile.write(' sid=%s' % (quote_attrib(self.sid), ))
-        if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.add('type_')
-            outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), ))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='param'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            showIndent(outfile, level)
-            outfile.write('semantic="%s",\n' % (self.semantic,))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            showIndent(outfile, level)
-            outfile.write('name="%s",\n' % (self.name,))
-        if self.flow is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            showIndent(outfile, level)
-            outfile.write('flow=%s,\n' % (self.flow,))
-        if self.sid is not None and 'sid' not in already_processed:
-            already_processed.add('sid')
-            showIndent(outfile, level)
-            outfile.write('sid="%s",\n' % (self.sid,))
-        if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.add('type_')
-            showIndent(outfile, level)
-            outfile.write('type_="%s",\n' % (self.type_,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            showIndent(outfile, level)
-            outfile.write('id="%s",\n' % (self.id,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        self.valueOf_ = get_all_text_(node)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('semantic', node)
-        if value is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            self.semantic = value
-            self.semantic = ' '.join(self.semantic.split())
-        value = find_attr_value_('name', node)
-        if value is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            self.name = value
-        value = find_attr_value_('flow', node)
-        if value is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            self.flow = value
-        value = find_attr_value_('sid', node)
-        if value is not None and 'sid' not in already_processed:
-            already_processed.add('sid')
-            self.sid = value
-        value = find_attr_value_('type', node)
-        if value is not None and 'type' not in already_processed:
-            already_processed.add('type')
-            self.type_ = value
-        value = find_attr_value_('id', node)
-        if value is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            self.id = value
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        pass
-# end class param
-
-
-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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
-        self.firstname = firstname
-        self.lastname = lastname
-        self.priority = priority
-        self.info = info
-        if vehicle is None:
-            self.vehicle = []
-        else:
-            self.vehicle = vehicle
-    def factory(*args_, **kwargs_):
-        if agent.subclass:
-            return agent.subclass(*args_, **kwargs_)
-        else:
-            return agent(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_firstname(self): return self.firstname
-    def set_firstname(self, firstname): self.firstname = firstname
-    def get_lastname(self): return self.lastname
-    def set_lastname(self, lastname): self.lastname = lastname
-    def get_priority(self): return self.priority
-    def set_priority(self, priority): self.priority = priority
-    def get_info(self): return self.info
-    def set_info(self, info): self.info = info
-    def get_vehicle(self): return self.vehicle
-    def set_vehicle(self, vehicle): self.vehicle = vehicle
-    def add_vehicle(self, value): self.vehicle.append(value)
-    def insert_vehicle(self, index, value): self.vehicle[index] = value
-    def hasContent_(self):
-        if (
-            self.firstname is not None or
-            self.lastname is not None or
-            self.priority is not None or
-            self.info is not None or
-            self.vehicle
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='agent', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='agent'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='agent', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.firstname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
-        if self.lastname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
-        if self.priority is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
-        if self.info is not None:
-            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
-        for vehicle_ in self.vehicle:
-            vehicle_.export(outfile, level, namespace_, name_='vehicle', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='agent'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.priority is not None:
-            showIndent(outfile, level)
-            outfile.write('priority=%f,\n' % self.priority)
-        if self.info is not None:
-            showIndent(outfile, level)
-            outfile.write('info=model_.info(\n')
-            self.info.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        showIndent(outfile, level)
-        outfile.write('vehicle=[\n')
-        level += 1
-        for vehicle_ in self.vehicle:
-            showIndent(outfile, level)
-            outfile.write('model_.vehicle(\n')
-            vehicle_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'firstname':
-            firstname_ = child_.text
-            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
-            self.firstname = firstname_
-        elif nodeName_ == 'lastname':
-            lastname_ = child_.text
-            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
-            self.lastname = lastname_
-        elif nodeName_ == 'priority':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'priority')
-            self.priority = fval_
-        elif nodeName_ == 'info':
-            obj_ = info.factory()
-            obj_.build(child_)
-            self.info = obj_
-        elif nodeName_ == 'vehicle':
-            type_name_ = child_.attrib.get(
-                '{http://www.w3.org/2001/XMLSchema-instance}type')
-            if type_name_ is None:
-                type_name_ = child_.attrib.get('type')
-            if type_name_ is not None:
-                type_names_ = type_name_.split(':')
-                if len(type_names_) == 1:
-                    type_name_ = type_names_[0]
-                else:
-                    type_name_ = type_names_[1]
-                class_ = globals()[type_name_]
-                obj_ = class_.factory()
-                obj_.build(child_)
-            else:
-                raise NotImplementedError(
-                    'Class not implemented for <vehicle> element')
-            self.vehicle.append(obj_)
-# end class agent
-
-
-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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
-        self.firstname = firstname
-        self.lastname = lastname
-        self.priority = priority
-        self.info = info
-    def factory(*args_, **kwargs_):
-        if special_agent.subclass:
-            return special_agent.subclass(*args_, **kwargs_)
-        else:
-            return special_agent(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_firstname(self): return self.firstname
-    def set_firstname(self, firstname): self.firstname = firstname
-    def get_lastname(self): return self.lastname
-    def set_lastname(self, lastname): self.lastname = lastname
-    def get_priority(self): return self.priority
-    def set_priority(self, priority): self.priority = priority
-    def get_info(self): return self.info
-    def set_info(self, info): self.info = info
-    def hasContent_(self):
-        if (
-            self.firstname is not None or
-            self.lastname is not None or
-            self.priority is not None or
-            self.info is not None
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='special-agent', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='special-agent'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='special-agent', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.firstname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
-        if self.lastname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
-        if self.priority is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
-        if self.info is not None:
-            self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='special-agent'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.priority is not None:
-            showIndent(outfile, level)
-            outfile.write('priority=%f,\n' % self.priority)
-        if self.info is not None:
-            showIndent(outfile, level)
-            outfile.write('info=model_.info(\n')
-            self.info.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'firstname':
-            firstname_ = child_.text
-            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
-            self.firstname = firstname_
-        elif nodeName_ == 'lastname':
-            lastname_ = child_.text
-            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
-            self.lastname = lastname_
-        elif nodeName_ == 'priority':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'priority')
-            self.priority = fval_
-        elif nodeName_ == 'info':
-            obj_ = info.factory()
-            obj_.build(child_)
-            self.info = obj_
-# end class special_agent
-
-
-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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
-        self.member_id = _cast(None, member_id)
-        self.firstname = firstname
-        self.lastname = lastname
-        self.other_name = other_name
-        self.class_ = class_
-        if other_value is None:
-            self.other_value = []
-        else:
-            self.other_value = other_value
-        if type_ is None:
-            self.type_ = []
-        else:
-            self.type_ = type_
-        if client_handler is None:
-            self.client_handler = []
-        else:
-            self.client_handler = client_handler
-    def factory(*args_, **kwargs_):
-        if booster.subclass:
-            return booster.subclass(*args_, **kwargs_)
-        else:
-            return booster(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_firstname(self): return self.firstname
-    def set_firstname(self, firstname): self.firstname = firstname
-    def get_lastname(self): return self.lastname
-    def set_lastname(self, lastname): self.lastname = lastname
-    def get_other_name(self): return self.other_name
-    def set_other_name(self, other_name): self.other_name = other_name
-    def get_class(self): return self.class_
-    def set_class(self, class_): self.class_ = class_
-    def get_other_value(self): return self.other_value
-    def set_other_value(self, other_value): self.other_value = other_value
-    def add_other_value(self, value): self.other_value.append(value)
-    def insert_other_value(self, index, value): self.other_value[index] = value
-    def get_type(self): return self.type_
-    def set_type(self, type_): self.type_ = type_
-    def add_type(self, value): self.type_.append(value)
-    def insert_type(self, index, value): self.type_[index] = value
-    def get_client_handler(self): return self.client_handler
-    def set_client_handler(self, client_handler): self.client_handler = client_handler
-    def add_client_handler(self, value): self.client_handler.append(value)
-    def insert_client_handler(self, index, value): self.client_handler[index] = value
-    def get_member_id(self): return self.member_id
-    def set_member_id(self, member_id): self.member_id = member_id
-    def hasContent_(self):
-        if (
-            self.firstname is not None or
-            self.lastname is not None or
-            self.other_name is not None or
-            self.class_ is not None or
-            self.other_value or
-            self.type_ or
-            self.client_handler
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='booster', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='booster'):
-        if self.member_id is not None and 'member_id' not in already_processed:
-            already_processed.add('member_id')
-            outfile.write(' member-id=%s' % (self.gds_format_string(quote_attrib(self.member_id).encode(ExternalEncoding), input_name='member-id'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='booster', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.firstname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
-        if self.lastname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
-        if self.other_name is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_))
-        if self.class_ is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sclass>%s</%sclass>%s' % (namespace_, self.gds_format_float(self.class_, input_name='class'), namespace_, eol_))
-        for other_value_ in self.other_value:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sother-value>%s</%sother-value>%s' % (namespace_, self.gds_format_float(other_value_, input_name='other-value'), namespace_, eol_))
-        for type_ in self.type_:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%stype>%s</%stype>%s' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_, eol_))
-        for client_handler_ in self.client_handler:
-            client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='booster'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.member_id is not None and 'member_id' not in already_processed:
-            already_processed.add('member_id')
-            showIndent(outfile, level)
-            outfile.write('member_id="%s",\n' % (self.member_id,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.other_name is not None:
-            showIndent(outfile, level)
-            outfile.write('other_name=%f,\n' % self.other_name)
-        if self.class_ is not None:
-            showIndent(outfile, level)
-            outfile.write('class_=%f,\n' % self.class_)
-        showIndent(outfile, level)
-        outfile.write('other_value=[\n')
-        level += 1
-        for other_value_ in self.other_value:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % other_value_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('type_=[\n')
-        level += 1
-        for type_ in self.type_:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % type_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('client_handler=[\n')
-        level += 1
-        for client_handler_ in self.client_handler:
-            showIndent(outfile, level)
-            outfile.write('model_.client_handlerType(\n')
-            client_handler_.exportLiteral(outfile, level, name_='client-handlerType')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('member-id', node)
-        if value is not None and 'member-id' not in already_processed:
-            already_processed.add('member-id')
-            self.member_id = value
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'firstname':
-            firstname_ = child_.text
-            firstname_ = self.gds_validate_string(firstname_, node, 'firstname')
-            self.firstname = firstname_
-        elif nodeName_ == 'lastname':
-            lastname_ = child_.text
-            lastname_ = self.gds_validate_string(lastname_, node, 'lastname')
-            self.lastname = lastname_
-        elif nodeName_ == 'other-name':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'other_name')
-            self.other_name = fval_
-        elif nodeName_ == 'class':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'class')
-            self.class_ = fval_
-        elif nodeName_ == 'other-value':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'other_value')
-            self.other_value.append(fval_)
-        elif nodeName_ == 'type':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'type')
-            self.type_.append(fval_)
-        elif nodeName_ == 'client-handler':
-            obj_ = client_handlerType.factory()
-            obj_.build(child_)
-            self.client_handler.append(obj_)
-# end class booster
-
-
-class info(GeneratedsSuper):
-    member_data_items_ = [
-        MemberSpec_('rating', 'xs:float', 0),
-        MemberSpec_('type', 'xs:integer', 0),
-        MemberSpec_('name', 'xs:string', 0),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, rating=None, type_=None, name=None):
-        self.rating = _cast(float, rating)
-        self.type_ = _cast(int, type_)
-        self.name = _cast(None, name)
-        pass
-    def factory(*args_, **kwargs_):
-        if info.subclass:
-            return info.subclass(*args_, **kwargs_)
-        else:
-            return info(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_rating(self): return self.rating
-    def set_rating(self, rating): self.rating = rating
-    def get_type(self): return self.type_
-    def set_type(self, type_): self.type_ = type_
-    def get_name(self): return self.name
-    def set_name(self, name): self.name = name
-    def hasContent_(self):
-        if (
-
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='info', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='info')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
-        if self.rating is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
-        if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.add('type_')
-            outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type'))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='info'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.rating is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            showIndent(outfile, level)
-            outfile.write('rating=%f,\n' % (self.rating,))
-        if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.add('type_')
-            showIndent(outfile, level)
-            outfile.write('type_=%d,\n' % (self.type_,))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            showIndent(outfile, level)
-            outfile.write('name="%s",\n' % (self.name,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('rating', node)
-        if value is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            try:
-                self.rating = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (rating): %s' % exp)
-        value = find_attr_value_('type', node)
-        if value is not None and 'type' not in already_processed:
-            already_processed.add('type')
-            try:
-                self.type_ = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('name', node)
-        if value is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            self.name = value
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        pass
-# end class info
-
-
-class vehicle(GeneratedsSuper):
-    member_data_items_ = [
-        MemberSpec_('wheelcount', 'xs:integer', 0),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, wheelcount=None, extensiontype_=None):
-        self.wheelcount = wheelcount
-        self.extensiontype_ = extensiontype_
-    def factory(*args_, **kwargs_):
-        if vehicle.subclass:
-            return vehicle.subclass(*args_, **kwargs_)
-        else:
-            return vehicle(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_wheelcount(self): return self.wheelcount
-    def set_wheelcount(self, wheelcount): self.wheelcount = wheelcount
-    def get_extensiontype_(self): return self.extensiontype_
-    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
-    def hasContent_(self):
-        if (
-            self.wheelcount is not None
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='vehicle', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='vehicle')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='vehicle'):
-        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
-            already_processed.add('xsi:type')
-            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-            outfile.write(' xsi:type="%s"' % self.extensiontype_)
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='vehicle', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.wheelcount is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%swheelcount>%s</%swheelcount>%s' % (namespace_, self.gds_format_integer(self.wheelcount, input_name='wheelcount'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='vehicle'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.wheelcount is not None:
-            showIndent(outfile, level)
-            outfile.write('wheelcount=%d,\n' % self.wheelcount)
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('xsi:type', node)
-        if value is not None and 'xsi:type' not in already_processed:
-            already_processed.add('xsi:type')
-            self.extensiontype_ = value
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'wheelcount':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'wheelcount')
-            self.wheelcount = ival_
-# end class vehicle
-
-
-class automobile(vehicle):
-    member_data_items_ = [
-        MemberSpec_('drivername', 'xs:string', 0),
-    ]
-    subclass = None
-    superclass = vehicle
-    def __init__(self, wheelcount=None, drivername=None):
-        super(automobile, self).__init__(wheelcount, )
-        self.drivername = drivername
-    def factory(*args_, **kwargs_):
-        if automobile.subclass:
-            return automobile.subclass(*args_, **kwargs_)
-        else:
-            return automobile(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_drivername(self): return self.drivername
-    def set_drivername(self, drivername): self.drivername = drivername
-    def hasContent_(self):
-        if (
-            self.drivername is not None or
-            super(automobile, self).hasContent_()
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='automobile', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='automobile')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='automobile'):
-        super(automobile, self).exportAttributes(outfile, level, already_processed, namespace_, name_='automobile')
-    def exportChildren(self, outfile, level, namespace_='', name_='automobile', fromsubclass_=False, pretty_print=True):
-        super(automobile, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.drivername is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdrivername>%s</%sdrivername>%s' % (namespace_, self.gds_format_string(quote_xml(self.drivername).encode(ExternalEncoding), input_name='drivername'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='automobile'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(automobile, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(automobile, self).exportLiteralChildren(outfile, level, name_)
-        if self.drivername is not None:
-            showIndent(outfile, level)
-            outfile.write('drivername=%s,\n' % quote_python(self.drivername).encode(ExternalEncoding))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        super(automobile, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'drivername':
-            drivername_ = child_.text
-            drivername_ = self.gds_validate_string(drivername_, node, 'drivername')
-            self.drivername = drivername_
-        super(automobile, self).buildChildren(child_, node, nodeName_, True)
-# end class automobile
-
-
-class airplane(vehicle):
-    member_data_items_ = [
-        MemberSpec_('pilotname', 'xs:string', 0),
-    ]
-    subclass = None
-    superclass = vehicle
-    def __init__(self, wheelcount=None, pilotname=None):
-        super(airplane, self).__init__(wheelcount, )
-        self.pilotname = pilotname
-    def factory(*args_, **kwargs_):
-        if airplane.subclass:
-            return airplane.subclass(*args_, **kwargs_)
-        else:
-            return airplane(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_pilotname(self): return self.pilotname
-    def set_pilotname(self, pilotname): self.pilotname = pilotname
-    def hasContent_(self):
-        if (
-            self.pilotname is not None or
-            super(airplane, self).hasContent_()
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='airplane', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='airplane')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='airplane'):
-        super(airplane, self).exportAttributes(outfile, level, already_processed, namespace_, name_='airplane')
-    def exportChildren(self, outfile, level, namespace_='', name_='airplane', fromsubclass_=False, pretty_print=True):
-        super(airplane, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.pilotname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%spilotname>%s</%spilotname>%s' % (namespace_, self.gds_format_string(quote_xml(self.pilotname).encode(ExternalEncoding), input_name='pilotname'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='airplane'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(airplane, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(airplane, self).exportLiteralChildren(outfile, level, name_)
-        if self.pilotname is not None:
-            showIndent(outfile, level)
-            outfile.write('pilotname=%s,\n' % quote_python(self.pilotname).encode(ExternalEncoding))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        super(airplane, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'pilotname':
-            pilotname_ = child_.text
-            pilotname_ = self.gds_validate_string(pilotname_, node, 'pilotname')
-            self.pilotname = pilotname_
-        super(airplane, self).buildChildren(child_, node, nodeName_, True)
-# end class airplane
-
-
-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_('attrnegint', 'xs:negativeInteger', 0),
-        MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0),
-        MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 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),
-    ]
-    subclass = None
-    superclass = person
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
-        self.language = _cast(None, language)
-        self.area = _cast(None, area)
-        self.attrnegint = _cast(int, attrnegint)
-        self.attrposint = _cast(int, attrposint)
-        self.attrnonnegint = _cast(int, attrnonnegint)
-        self.attrnonposint = _cast(int, attrnonposint)
-        self.email = email
-        self.elposint = elposint
-        self.elnonposint = elnonposint
-        self.elnegint = elnegint
-        self.elnonnegint = elnonnegint
-        if isinstance(eldate, basestring):
-            initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date()
-        else:
-            initvalue_ = eldate
-        self.eldate = initvalue_
-        self.eltoken = eltoken
-        self.elshort = elshort
-        self.ellong = ellong
-        self.elparam = elparam
-        self.elarraytypes = elarraytypes
-        self.extensiontype_ = extensiontype_
-    def factory(*args_, **kwargs_):
-        if programmer.subclass:
-            return programmer.subclass(*args_, **kwargs_)
-        else:
-            return programmer(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_email(self): return self.email
-    def set_email(self, email): self.email = email
-    def get_elposint(self): return self.elposint
-    def set_elposint(self, elposint): self.elposint = elposint
-    def get_elnonposint(self): return self.elnonposint
-    def set_elnonposint(self, elnonposint): self.elnonposint = elnonposint
-    def get_elnegint(self): return self.elnegint
-    def set_elnegint(self, elnegint): self.elnegint = elnegint
-    def get_elnonnegint(self): return self.elnonnegint
-    def set_elnonnegint(self, elnonnegint): self.elnonnegint = elnonnegint
-    def get_eldate(self): return self.eldate
-    def set_eldate(self, eldate): self.eldate = eldate
-    def get_eltoken(self): return self.eltoken
-    def set_eltoken(self, eltoken): self.eltoken = eltoken
-    def get_elshort(self): return self.elshort
-    def set_elshort(self, elshort): self.elshort = elshort
-    def get_ellong(self): return self.ellong
-    def set_ellong(self, ellong): self.ellong = ellong
-    def get_elparam(self): return self.elparam
-    def set_elparam(self, elparam): self.elparam = elparam
-    def get_elarraytypes(self): return self.elarraytypes
-    def set_elarraytypes(self, elarraytypes): self.elarraytypes = elarraytypes
-    def get_language(self): return self.language
-    def set_language(self, language): self.language = language
-    def get_area(self): return self.area
-    def set_area(self, area): self.area = area
-    def get_attrnegint(self): return self.attrnegint
-    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
-    def get_attrposint(self): return self.attrposint
-    def set_attrposint(self, attrposint): self.attrposint = attrposint
-    def get_attrnonnegint(self): return self.attrnonnegint
-    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
-    def get_attrnonposint(self): return self.attrnonposint
-    def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint
-    def get_extensiontype_(self): return self.extensiontype_
-    def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
-    def validate_ArrayTypes(self, value):
-        # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
-    def hasContent_(self):
-        if (
-            self.email is not None or
-            self.elposint is not None or
-            self.elnonposint is not None or
-            self.elnegint is not None or
-            self.elnonnegint is not None or
-            self.eldate is not None or
-            self.eltoken is not None or
-            self.elshort is not None or
-            self.ellong is not None or
-            self.elparam is not None or
-            self.elarraytypes is not None or
-            super(programmer, self).hasContent_()
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='programmer', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='programmer'):
-        super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
-        if self.language is not None and 'language' not in already_processed:
-            already_processed.add('language')
-            outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), ))
-        if self.area is not None and 'area' not in already_processed:
-            already_processed.add('area')
-            outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), ))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
-        if self.attrposint is not None and 'attrposint' not in already_processed:
-            already_processed.add('attrposint')
-            outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint'))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
-        if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
-            already_processed.add('attrnonposint')
-            outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint'))
-        if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
-            already_processed.add('xsi:type')
-            outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
-            outfile.write(' xsi:type="%s"' % self.extensiontype_)
-    def exportChildren(self, outfile, level, namespace_='', name_='programmer', fromsubclass_=False, pretty_print=True):
-        super(programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.email is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_))
-        if self.elposint is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_))
-        if self.elnonposint is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%selnonposint>%s</%selnonposint>%s' % (namespace_, self.gds_format_integer(self.elnonposint, input_name='elnonposint'), namespace_, eol_))
-        if self.elnegint is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%selnegint>%s</%selnegint>%s' % (namespace_, self.gds_format_integer(self.elnegint, input_name='elnegint'), namespace_, eol_))
-        if self.elnonnegint is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%selnonnegint>%s</%selnonnegint>%s' % (namespace_, self.gds_format_integer(self.elnonnegint, input_name='elnonnegint'), namespace_, eol_))
-        if self.eldate is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%seldate>%s</%seldate>%s' % (namespace_, self.gds_format_date(self.eldate, input_name='eldate'), namespace_, eol_))
-        if self.eltoken is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_))
-        if self.elshort is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_))
-        if self.ellong is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sellong>%s</%sellong>%s' % (namespace_, self.gds_format_integer(self.ellong, input_name='ellong'), namespace_, eol_))
-        if self.elparam is not None:
-            self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print)
-        if self.elarraytypes is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='programmer'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.language is not None and 'language' not in already_processed:
-            already_processed.add('language')
-            showIndent(outfile, level)
-            outfile.write('language="%s",\n' % (self.language,))
-        if self.area is not None and 'area' not in already_processed:
-            already_processed.add('area')
-            showIndent(outfile, level)
-            outfile.write('area="%s",\n' % (self.area,))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnegint=%d,\n' % (self.attrnegint,))
-        if self.attrposint is not None and 'attrposint' not in already_processed:
-            already_processed.add('attrposint')
-            showIndent(outfile, level)
-            outfile.write('attrposint=%d,\n' % (self.attrposint,))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,))
-        if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
-            already_processed.add('attrnonposint')
-            showIndent(outfile, level)
-            outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,))
-        super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.email is not None:
-            showIndent(outfile, level)
-            outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding))
-        if self.elposint is not None:
-            showIndent(outfile, level)
-            outfile.write('elposint=%d,\n' % self.elposint)
-        if self.elnonposint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnonposint=%d,\n' % self.elnonposint)
-        if self.elnegint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnegint=%d,\n' % self.elnegint)
-        if self.elnonnegint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnonnegint=%d,\n' % self.elnonnegint)
-        if self.eldate is not None:
-            showIndent(outfile, level)
-            outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate'))
-        if self.eltoken is not None:
-            showIndent(outfile, level)
-            outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding))
-        if self.elshort is not None:
-            showIndent(outfile, level)
-            outfile.write('elshort=%d,\n' % self.elshort)
-        if self.ellong is not None:
-            showIndent(outfile, level)
-            outfile.write('ellong=%d,\n' % self.ellong)
-        if self.elparam is not None:
-            showIndent(outfile, level)
-            outfile.write('elparam=model_.param(\n')
-            self.elparam.exportLiteral(outfile, level, name_='elparam')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.elarraytypes is not None:
-            showIndent(outfile, level)
-            outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('language', node)
-        if value is not None and 'language' not in already_processed:
-            already_processed.add('language')
-            self.language = value
-        value = find_attr_value_('area', node)
-        if value is not None and 'area' not in already_processed:
-            already_processed.add('area')
-            self.area = value
-        value = find_attr_value_('attrnegint', node)
-        if value is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            try:
-                self.attrnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnegint >= 0:
-                raise_parse_error(node, 'Invalid NegativeInteger')
-        value = find_attr_value_('attrposint', node)
-        if value is not None and 'attrposint' not in already_processed:
-            already_processed.add('attrposint')
-            try:
-                self.attrposint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrposint <= 0:
-                raise_parse_error(node, 'Invalid PositiveInteger')
-        value = find_attr_value_('attrnonnegint', node)
-        if value is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            try:
-                self.attrnonnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnonnegint < 0:
-                raise_parse_error(node, 'Invalid NonNegativeInteger')
-        value = find_attr_value_('attrnonposint', node)
-        if value is not None and 'attrnonposint' not in already_processed:
-            already_processed.add('attrnonposint')
-            try:
-                self.attrnonposint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnonposint > 0:
-                raise_parse_error(node, 'Invalid NonPositiveInteger')
-        value = find_attr_value_('xsi:type', node)
-        if value is not None and 'xsi:type' not in already_processed:
-            already_processed.add('xsi:type')
-            self.extensiontype_ = value
-        super(programmer, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'email':
-            email_ = child_.text
-            email_ = self.gds_validate_string(email_, node, 'email')
-            self.email = email_
-        elif nodeName_ == 'elposint':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            if ival_ <= 0:
-                raise_parse_error(child_, 'requires positiveInteger')
-            ival_ = self.gds_validate_integer(ival_, node, 'elposint')
-            self.elposint = ival_
-        elif nodeName_ == 'elnonposint':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            if ival_ > 0:
-                raise_parse_error(child_, 'requires nonPositiveInteger')
-            ival_ = self.gds_validate_integer(ival_, node, 'elnonposint')
-            self.elnonposint = ival_
-        elif nodeName_ == 'elnegint':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            if ival_ >= 0:
-                raise_parse_error(child_, 'requires negativeInteger')
-            ival_ = self.gds_validate_integer(ival_, node, 'elnegint')
-            self.elnegint = ival_
-        elif nodeName_ == 'elnonnegint':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            if ival_ < 0:
-                raise_parse_error(child_, 'requires nonNegativeInteger')
-            ival_ = self.gds_validate_integer(ival_, node, 'elnonnegint')
-            self.elnonnegint = ival_
-        elif nodeName_ == 'eldate':
-            sval_ = child_.text
-            dval_ = self.gds_parse_date(sval_)
-            self.eldate = dval_
-        elif nodeName_ == 'eltoken':
-            eltoken_ = child_.text
-            eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
-            eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken')
-            self.eltoken = eltoken_
-        elif nodeName_ == 'elshort':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'elshort')
-            self.elshort = ival_
-        elif nodeName_ == 'ellong':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'ellong')
-            self.ellong = ival_
-        elif nodeName_ == 'elparam':
-            obj_ = param.factory()
-            obj_.build(child_)
-            self.elparam = obj_
-        elif nodeName_ == 'elarraytypes':
-            elarraytypes_ = child_.text
-            elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
-            self.elarraytypes = elarraytypes_
-            self.validate_ArrayTypes(self.elarraytypes)    # validate type ArrayTypes
-        super(programmer, self).buildChildren(child_, node, nodeName_, True)
-# end class programmer
-
-
-class client_handlerType(GeneratedsSuper):
-    member_data_items_ = [
-        MemberSpec_('fullname', 'xs:string', 0),
-        MemberSpec_('refid', 'xs:integer', 0),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, fullname=None, refid=None):
-        self.fullname = fullname
-        self.refid = refid
-    def factory(*args_, **kwargs_):
-        if client_handlerType.subclass:
-            return client_handlerType.subclass(*args_, **kwargs_)
-        else:
-            return client_handlerType(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_fullname(self): return self.fullname
-    def set_fullname(self, fullname): self.fullname = fullname
-    def get_refid(self): return self.refid
-    def set_refid(self, refid): self.refid = refid
-    def hasContent_(self):
-        if (
-            self.fullname is not None or
-            self.refid is not None
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='client-handlerType', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='client-handlerType'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='client-handlerType', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.fullname is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_))
-        if self.refid is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='client-handlerType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.fullname is not None:
-            showIndent(outfile, level)
-            outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding))
-        if self.refid is not None:
-            showIndent(outfile, level)
-            outfile.write('refid=%d,\n' % self.refid)
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'fullname':
-            fullname_ = child_.text
-            fullname_ = self.gds_validate_string(fullname_, node, 'fullname')
-            self.fullname = fullname_
-        elif nodeName_ == 'refid':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'refid')
-            self.refid = ival_
-# end class client_handlerType
-
-
-class java_programmer(programmer):
-    """A Java programmer type of person. Programmers are very special and
-    Java programmers are nice also, but not as especially wonderful
-    as Python programmers, of course."""
-    member_data_items_ = [
-        MemberSpec_('status', 'xs:string', 0),
-        MemberSpec_('nick-name', 'xs:string', 0),
-        MemberSpec_('favorite_editor', 'xs:string', 0),
-    ]
-    subclass = None
-    superclass = programmer
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
-        super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
-        self.status = _cast(None, status)
-        self.nick_name = _cast(None, nick_name)
-        self.favorite_editor = favorite_editor
-    def factory(*args_, **kwargs_):
-        if java_programmer.subclass:
-            return java_programmer.subclass(*args_, **kwargs_)
-        else:
-            return java_programmer(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_favorite_editor(self): return self.favorite_editor
-    def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
-    def get_status(self): return self.status
-    def set_status(self, status): self.status = status
-    def get_nick_name(self): return self.nick_name
-    def set_nick_name(self, nick_name): self.nick_name = nick_name
-    def hasContent_(self):
-        if (
-            self.favorite_editor is not None or
-            super(java_programmer, self).hasContent_()
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='java-programmer', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'):
-        super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), ))
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.add('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True):
-        super(java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.favorite_editor is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='java-programmer'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            showIndent(outfile, level)
-            outfile.write('status="%s",\n' % (self.status,))
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.add('nick_name')
-            showIndent(outfile, level)
-            outfile.write('nick_name="%s",\n' % (self.nick_name,))
-        super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(java_programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.favorite_editor is not None:
-            showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('status', node)
-        if value is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            self.status = value
-        value = find_attr_value_('nick-name', node)
-        if value is not None and 'nick-name' not in already_processed:
-            already_processed.add('nick-name')
-            self.nick_name = value
-        super(java_programmer, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'favorite-editor':
-            favorite_editor_ = child_.text
-            favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
-            self.favorite_editor = favorite_editor_
-        super(java_programmer, self).buildChildren(child_, node, nodeName_, True)
-# end class java_programmer
-
-
-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),
-    ]
-    subclass = None
-    superclass = programmer
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
-        super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, )
-        self.nick_name = _cast(None, nick_name)
-        self.favorite_editor = favorite_editor
-    def factory(*args_, **kwargs_):
-        if python_programmer.subclass:
-            return python_programmer.subclass(*args_, **kwargs_)
-        else:
-            return python_programmer(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_favorite_editor(self): return self.favorite_editor
-    def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
-    def get_nick_name(self): return self.nick_name
-    def set_nick_name(self, nick_name): self.nick_name = nick_name
-    def hasContent_(self):
-        if (
-            self.favorite_editor is not None or
-            super(python_programmer, self).hasContent_()
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='python-programmer', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='python-programmer'):
-        super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.add('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True):
-        super(python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.favorite_editor is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='python-programmer'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.add('nick_name')
-            showIndent(outfile, level)
-            outfile.write('nick_name="%s",\n' % (self.nick_name,))
-        super(python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(python_programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.favorite_editor is not None:
-            showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('nick-name', node)
-        if value is not None and 'nick-name' not in already_processed:
-            already_processed.add('nick-name')
-            self.nick_name = value
-        super(python_programmer, self).buildAttributes(node, attrs, already_processed)
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'favorite-editor':
-            favorite_editor_ = child_.text
-            favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
-            self.favorite_editor = favorite_editor_
-        super(python_programmer, self).buildChildren(child_, node, nodeName_, True)
-# end class python_programmer
-
-
-GDSClassesMapping = {
-    'client-handler': client_handlerType,
-    'elparam': param,
-    'promoter': booster,
-}
-
-
-USAGE_TEXT = """
-Usage: python <Parser>.py [ -s ] <in_xml_file>
-"""
-
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def get_root_tag(node):
-    tag = Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = GDSClassesMapping.get(tag)
-    if rootClass is None:
-        rootClass = globals().get(tag)
-    return tag, rootClass
-
-
-def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='',
-##             pretty_print=True)
-    return rootObj
-
-
-def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    mapping = {}
-    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
-    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
-##     if not silence:
-##         content = etree_.tostring(
-##             rootElement, pretty_print=True,
-##             xml_declaration=True, encoding="utf-8")
-##         sys.stdout.write(content)
-##         sys.stdout.write('\n')
-    return rootObj, rootElement, mapping, reverse_mapping
-
-
-def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
-    if rootClass is None:
-        rootClass = people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_="people",
-##             namespacedef_='')
-    return rootObj
-
-
-def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'people'
-        rootClass = people
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('#from people_procincl2_sup import *\n\n')
-##         sys.stdout.write('import people_procincl2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
-##         sys.stdout.write(')\n')
-    return rootObj
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) == 1:
-        parse(args[0])
-    else:
-        usage()
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
-
-
-__all__ = [
-    "agent",
-    "airplane",
-    "automobile",
-    "booster",
-    "client_handlerType",
-    "comments",
-    "info",
-    "java_programmer",
-    "param",
-    "people",
-    "person",
-    "programmer",
-    "python_programmer",
-    "special_agent",
-    "specialperson",
-    "vehicle"
-]
diff --git a/tests/people_procincl_a.xsd b/tests/people_procincl_a.xsd
index 6fad497..d637f39 100644
--- a/tests/people_procincl_a.xsd
+++ b/tests/people_procincl_a.xsd
@@ -5,7 +5,7 @@
   <xs:include schemaLocation="people_10b.xsd" />
 -->
 
-  <xs:include schemaLocation="http://www.rexx.com/~dkuhlman/people_procincl_c.xsd" />
+  <xs:include schemaLocation="http://www.davekuhlman.org/people_procincl_c.xsd" />
 
     <xs:element name="comments">
         <xs:complexType mixed="true">
diff --git a/tests/prefix_classname.xml b/tests/prefix_classname.xml
new file mode 100644
index 0000000..322414c
--- /dev/null
+++ b/tests/prefix_classname.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+<people>
+
+    <comments>1. This is a <emp>foolish</emp> comment.  It is <emp>really</emp> important.</comments>
+    <comments>2. This is a <emp>silly</emp> comment.  It is <emp>very</emp> significant.</comments>
+
+
+    <person id="1" value="abcd" ratio="3.2" extraattr="aaa">
+        <name>Alberta</name>
+        <interest>gardening</interest>
+        <interest>reading</interest>
+        <category>5</category>
+        <hot  />
+        <hot.agent oneattr="bbb" twoattr="ccc">
+            <firstname>Paula</firstname>
+            <lastname>Peterson</lastname>
+            <priority>4.3</priority>
+        </hot.agent>
+    </person> 
+
+    <person id="2">
+        <name>Bernardo</name>
+        <interest>programming</interest>
+        <category>0</category>
+        <agent>
+            <firstname>Darren</firstname>
+            <lastname>Diddly</lastname>
+            <priority>4.5</priority>
+            <info name="Albert Abasinian" type="321" rating="5.33">
+            Albert is a test for attributes + character content +
+            *no* element content.
+            </info>
+        </agent>
+    </person>
+
+    <programmer id="2" language="python" area="xml">
+        <name>Charles Carlson</name>
+        <interest>programming</interest>
+        <category>2233</category>
+        <description>A very happy programmer</description>
+        <email>charles@happyprogrammers.com</email>
+        <agent>
+            <firstname>Ernest</firstname>
+            <lastname>Echo</lastname>
+            <priority>3.8</priority>
+            <info name="George Gregory" type="321" rating="5.33" />
+        </agent>
+        <elposint>14</elposint>
+        <elnegint>-12</elnegint>
+        <elnonnegint>4</elnonnegint>
+        <elnonposint>0</elnonposint>
+        <eldate>2005-04-26</eldate>
+        <eldatetime>2005-04-26T10:11:12</eldatetime>
+        <eltoken>aa bb    cc
+            dd</eltoken>
+        <elshort>123</elshort>
+        <ellong>13241234123412341234</ellong>
+        <elparam id="id001" name="Davy" semantic="a big    semantic"/>
+    </programmer>
+
+    <person id="3">
+        <name>Charlie</name>
+        <interest>people</interest>
+        <interest>cats</interest>
+        <interest>dogs</interest>
+        <category>8</category>
+        <promoter>
+            <firstname>David</firstname>
+            <lastname>Donaldson</lastname>
+            <client>
+                <fullname>Arnold Applebee</fullname>
+                <refid>10001</refid>
+            </client>
+        </promoter>
+        <promoter>
+            <firstname>Edward</firstname>
+            <lastname>Eddleberry</lastname>
+            <client>
+                <fullname>Arnold Applebee</fullname>
+                <refid>10001</refid>
+            </client>
+        </promoter>
+    </person>
+
+    <person id="4" />
+
+    <python-programmer vegetable="tomato" fruit="peach" language="python" area="xml" nick-name="davy" id="232" ratio="8.7" value="abcd">
+        <favorite-editor>jed</favorite-editor>
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info name="Harvey Hippolite" type="543" rating="6.55" />
+        </agent>
+    </python-programmer>
+
+    <java-programmer vegetable="tomato" fruit="peach" language="python" area="xml" nick-name="davy" id="232" ratio="8.7" value="abcd">
+        <favorite-editor>jed</favorite-editor>
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info name="Harvey Hippolite" type="543" rating="6.55" />
+        </agent>
+    </java-programmer>
+
+</people>
+
diff --git a/tests/prefix_classname.xsd b/tests/prefix_classname.xsd
new file mode 100644
index 0000000..a852025
--- /dev/null
+++ b/tests/prefix_classname.xsd
@@ -0,0 +1,203 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:element name="people">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="comments" type="comments" maxOccurs="unbounded"/>
+                <xs:element name="person" maxOccurs="unbounded" type="person"/>
+                <xs:element name="programmer" maxOccurs="unbounded" type="programmer"/>
+                <xs:element name="python-programmer" maxOccurs="unbounded" type="python-programmer"/>
+                <xs:element name="java-programmer" maxOccurs="unbounded" type="java-programmer"/>
+			</xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="comments">
+        <xs:complexType mixed="true">
+            <xs:sequence>
+                <!-- 
+                <xs:element name="emp" type="xs:string" />
+                -->
+                <xs:element name="emp" type="xs:string" maxOccurs="unbounded"/>
+			</xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="person">
+        <xs:complexType mixed="0">
+            <xs:sequence>
+                <xs:element name="name" type="xs:string"/>
+                <xs:element name="interest" type="xs:string" maxOccurs="unbounded" />
+				<xs:element name="category" type="xs:integer"/>
+                <xs:element name="agent" type="agent" maxOccurs="unbounded" />
+                <xs:element name="promoter" type="booster" maxOccurs="unbounded" />
+                <xs:element name="description" type="xs:string"/>
+			</xs:sequence>
+            <xs:attribute name="value" type="xs:ID" />
+            <xs:attribute name="id" type="xs:integer" />
+            <xs:attribute name="ratio" type="xs:float" />
+            <xs:attributeGroup ref="favorites" />
+        </xs:complexType>
+    </xs:element>
+
+    <!--
+    <xs:element name="description-a" type="xs:string" substitutionGroup="description" />
+    -->
+
+    <xs:element name="programmer">
+        <xs:complexType mixed="0">
+            <xs:complexContent>
+                <xs:extension base="person">
+                    <xs:sequence>
+                        <!--
+                        <xs:element name="description" type="xs:string"/>
+                        -->
+                        <xs:element name="email" type="xs:string"/>
+                        <xs:element name="elposint" type="xs:positiveInteger"/>
+                        <xs:element name="elnonposint" type="xs:nonPositiveInteger"/>
+                        <xs:element name="elnegint" type="xs:negativeInteger"/>
+                        <xs:element name="elnonnegint" type="xs:nonNegativeInteger"/>
+                        <xs:element name="eldate" type="xs:date"/>
+                        <xs:element name="eldatetime" type="xs:dateTime"/>
+                        <xs:element name="eltoken" type="xs:token"/>
+                        <xs:element name="elshort" type="xs:short"/>
+                        <xs:element name="ellong" type="xs:long"/>
+                        <xs:element name="elparam" type="param"/>
+                        <xs:element name="elarraytypes" type="ArrayTypes"/>
+                        
+                    </xs:sequence>
+                    <xs:attribute name="language" type="xs:string" />
+                    <xs:attribute name="area"/>
+                    <xs:attribute name="attrposint" type="xs:positiveInteger"/>
+                    <xs:attribute name="attrnonposint" type="xs:nonPositiveInteger"/>
+                    <xs:attribute name="attrnegint" type="xs:negativeInteger"/>
+                    <xs:attribute name="attrnonnegint" type="xs:nonNegativeInteger"/>
+                </xs:extension>
+            </xs:complexContent>
+        </xs:complexType>
+    </xs:element>
+
+
+    <xs:element name="param">
+        <xs:annotation>
+            <xs:documentation>Finding flow attribute unneccesary in practice. A unnamed parameter is unbound/skipped.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:simpleContent>
+                <xs:extension base="xs:string">
+                    <xs:attribute name="id" type="xs:ID" />
+                    <xs:attribute name="name" type="xs:NCName" />
+                    <xs:attribute name="sid" type="xs:NCName" />
+                    <xs:attribute name="flow" type="FlowType" />
+                    <xs:attribute name="semantic" type="xs:token" />
+                    <xs:attribute name="type" type="xs:NMTOKEN" use="required" />
+                </xs:extension>
+            </xs:simpleContent>
+        </xs:complexType>
+    </xs:element>
+
+
+    <xs:simpleType name="ArrayTypes">
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="float" />
+            <xs:enumeration value="int" />
+            <xs:enumeration value="Name" />
+            <xs:enumeration value="token" />
+        </xs:restriction>
+    </xs:simpleType>
+
+
+
+    <xs:element name="python-programmer">
+        <xs:complexType mixed="0">
+            <xs:complexContent>
+                <xs:extension base="programmer">
+                    <xs:sequence>
+                        <xs:element name="favorite-editor" type="xs:string"/>
+                    </xs:sequence>
+                    <xs:attribute name="nick-name"/>
+                </xs:extension>
+            </xs:complexContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="java-programmer">
+        <xs:complexType mixed="0">
+            <xs:complexContent>
+                <xs:extension base="programmer">
+                    <xs:sequence>
+                        <xs:element name="favorite-editor" type="xs:string"/>
+                    </xs:sequence>
+                    <xs:attribute name="nick-name"/>
+                    <xs:attribute name="status"/>
+                </xs:extension>
+            </xs:complexContent>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="agent">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="firstname" type="xs:string"/>
+                <xs:element name="lastname" type="xs:string"/>
+                <xs:element name="priority" type="xs:float"/>
+                <xs:element name="info" type="info"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="special-agent" substitutionGroup="agent">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="firstname" type="xs:string"/>
+                <xs:element name="lastname" type="xs:string"/>
+                <xs:element name="priority" type="xs:float"/>
+                <xs:element name="info" type="info"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:element name="booster">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="firstname" type="xs:string"/>
+                <xs:element name="lastname" type="xs:string"/>
+                <xs:element name="other-name" type="xs:float"/>
+                <xs:element name="class" type="xs:float"/>
+                <xs:element name="other-value" type="xs:float" maxOccurs="unbounded" />
+                <xs:element name="type" type="xs:float" maxOccurs="unbounded" />
+                <xs:element name="client-handler" maxOccurs="unbounded">
+                    <xs:complexType>
+                        <xs:sequence>
+                            <xs:element name="fullname" type="xs:string"/>
+                            <xs:element name="refid" type="xs:integer"/>
+                        </xs:sequence>
+                    </xs:complexType>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <!-- Test for element with attributes but no children.
+         Should use valueOf.
+    -->
+    <xs:element name="info">
+        <xs:complexType>
+            <xs:sequence>
+			</xs:sequence>
+            <xs:attribute name="name" type="xs:string" />
+            <xs:attribute name="type" type="xs:integer" />
+            <xs:attribute name="rating" type="xs:float" />
+        </xs:complexType>
+    </xs:element>
+
+
+  <xs:attributeGroup name="favorites">
+    <xs:attribute name="fruit" />
+    <xs:attribute name="vegetable" />
+  </xs:attributeGroup>
+
+ 
+</xs:schema>
+
diff --git a/tests/prefix_classname1_out.xml b/tests/prefix_classname1_out.xml
new file mode 100644
index 0000000..c9bb446
--- /dev/null
+++ b/tests/prefix_classname1_out.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" ?>
+<people>
+    <comments>
+1. This is a <emp>foolish</emp> comment.  It is <emp>really</emp> important.    </comments>
+    <comments>
+2. This is a <emp>silly</emp> comment.  It is <emp>very</emp> significant.    </comments>
+    <person value="abcd" id="1" ratio="3.2">
+        <name>Alberta</name>
+        <interest>gardening</interest>
+        <interest>reading</interest>
+        <category>5</category>
+    </person>
+    <person id="2">
+        <name>Bernardo</name>
+        <interest>programming</interest>
+        <category>0</category>
+        <agent>
+            <firstname>Darren</firstname>
+            <lastname>Diddly</lastname>
+            <priority>4.5</priority>
+            <info name="Albert Abasinian" type="321" rating="5.33"/>
+        </agent>
+    </person>
+    <person id="3">
+        <name>Charlie</name>
+        <interest>people</interest>
+        <interest>cats</interest>
+        <interest>dogs</interest>
+        <category>8</category>
+        <promoter>
+            <firstname>David</firstname>
+            <lastname>Donaldson</lastname>
+        </promoter>
+        <promoter>
+            <firstname>Edward</firstname>
+            <lastname>Eddleberry</lastname>
+        </promoter>
+    </person>
+    <person id="4"/>
+    <programmer id="2" language="python" area="xml">
+        <name>Charles Carlson</name>
+        <interest>programming</interest>
+        <category>2233</category>
+        <agent>
+            <firstname>Ernest</firstname>
+            <lastname>Echo</lastname>
+            <priority>3.8</priority>
+            <info name="George Gregory" type="321" rating="5.33"/>
+        </agent>
+        <description>A very happy programmer</description>
+        <email>charles@happyprogrammers.com</email>
+        <elposint>14</elposint>
+        <elnonposint>0</elnonposint>
+        <elnegint>-12</elnegint>
+        <elnonnegint>4</elnonnegint>
+        <eldate>2005-04-26</eldate>
+        <eldatetime>2005-04-26T10:11:12</eldatetime>
+        <eltoken>aa bb cc dd</eltoken>
+        <elshort>123</elshort>
+        <ellong>13241234123412341234</ellong>
+        <elparam id="id001" name="Davy" semantic="a big semantic"/>
+    </programmer>
+    <python-programmer value="abcd" id="232" ratio="8.699999999999999" fruit="peach" vegetable="tomato" language="python" area="xml" nick-name="davy">
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info name="Harvey Hippolite" type="543" rating="6.55"/>
+        </agent>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <favorite-editor>jed</favorite-editor>
+    </python-programmer>
+    <java-programmer value="abcd" id="232" ratio="8.699999999999999" fruit="peach" vegetable="tomato" language="python" area="xml" nick-name="davy">
+        <name>Darrel Dawson</name>
+        <interest>hang gliding</interest>
+        <category>3344</category>
+        <agent>
+            <firstname>Harvey</firstname>
+            <lastname>Hippolite</lastname>
+            <priority>5.2</priority>
+            <info name="Harvey Hippolite" type="543" rating="6.55"/>
+        </agent>
+        <description>An object-orientated programmer</description>
+        <email>darrel@happyprogrammers.com</email>
+        <favorite-editor>jed</favorite-editor>
+    </java-programmer>
+</people>
diff --git a/tests/prefix_classname1_sub.py b/tests/prefix_classname1_sub.py
new file mode 100644
index 0000000..df7507a
--- /dev/null
+++ b/tests/prefix_classname1_sub.py
@@ -0,0 +1,250 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('-p', 'tomato_')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/prefix_classname2_sup.py')
+#   ('-s', 'tests/prefix_classname2_sub.py')
+#   ('--super', 'prefix_classname2_sup')
+#
+# Command line arguments:
+#   tests/prefix_classname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions -p "tomato_" --member-specs="list" -f -o "tests/prefix_classname2_sup.py" -s "tests/prefix_classname2_sub.py" --super="prefix_classname2_sup" tests/prefix_classname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import prefix_classname2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class tomato_peopleSub(supermod.tomato_people):
+    def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        super(tomato_peopleSub, self).__init__(comments, person, programmer, python_programmer, java_programmer, )
+supermod.tomato_people.subclass = tomato_peopleSub
+# end class tomato_peopleSub
+
+
+class tomato_commentsSub(supermod.tomato_comments):
+    def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        super(tomato_commentsSub, self).__init__(emp, valueOf_, mixedclass_, content_, )
+supermod.tomato_comments.subclass = tomato_commentsSub
+# end class tomato_commentsSub
+
+
+class tomato_personSub(supermod.tomato_person):
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        super(tomato_personSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, )
+supermod.tomato_person.subclass = tomato_personSub
+# end class tomato_personSub
+
+
+class tomato_programmerSub(supermod.tomato_programmer):
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        super(tomato_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
+supermod.tomato_programmer.subclass = tomato_programmerSub
+# end class tomato_programmerSub
+
+
+class tomato_paramSub(supermod.tomato_param):
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        super(tomato_paramSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, )
+supermod.tomato_param.subclass = tomato_paramSub
+# end class tomato_paramSub
+
+
+class tomato_python_programmerSub(supermod.tomato_python_programmer):
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        super(tomato_python_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, )
+supermod.tomato_python_programmer.subclass = tomato_python_programmerSub
+# end class tomato_python_programmerSub
+
+
+class tomato_java_programmerSub(supermod.tomato_java_programmer):
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None):
+        super(tomato_java_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, )
+supermod.tomato_java_programmer.subclass = tomato_java_programmerSub
+# end class tomato_java_programmerSub
+
+
+class tomato_agentSub(supermod.tomato_agent):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        super(tomato_agentSub, self).__init__(firstname, lastname, priority, info, )
+supermod.tomato_agent.subclass = tomato_agentSub
+# end class tomato_agentSub
+
+
+class tomato_special_agentSub(supermod.tomato_special_agent):
+    def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        super(tomato_special_agentSub, self).__init__(firstname, lastname, priority, info, )
+supermod.tomato_special_agent.subclass = tomato_special_agentSub
+# end class tomato_special_agentSub
+
+
+class tomato_boosterSub(supermod.tomato_booster):
+    def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        super(tomato_boosterSub, self).__init__(firstname, lastname, other_name, class_, other_value, type_, client_handler, )
+supermod.tomato_booster.subclass = tomato_boosterSub
+# end class tomato_boosterSub
+
+
+class tomato_infoSub(supermod.tomato_info):
+    def __init__(self, name=None, type_=None, rating=None):
+        super(tomato_infoSub, self).__init__(name, type_, rating, )
+supermod.tomato_info.subclass = tomato_infoSub
+# end class tomato_infoSub
+
+
+class tomato_client_handlerTypeSub(supermod.tomato_client_handlerType):
+    def __init__(self, fullname=None, refid=None):
+        super(tomato_client_handlerTypeSub, self).__init__(fullname, refid, )
+supermod.tomato_client_handlerType.subclass = tomato_client_handlerTypeSub
+# end class tomato_client_handlerTypeSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'people'
+        rootClass = supermod.tomato_people
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from prefix_classname2_sup import *\n\n')
+        sys.stdout.write('import prefix_classname2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/out2_sup.py b/tests/prefix_classname1_sup.py
similarity index 59%
rename from tests/out2_sup.py
rename to tests/prefix_classname1_sup.py
index 250b7a4..eddff87 100644
--- a/tests/out2_sup.py
+++ b/tests/prefix_classname1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('-p', 'tomato_')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/prefix_classname2_sup.py')
+#   ('-s', 'tests/prefix_classname2_sub.py')
+#   ('--super', 'prefix_classname2_sup')
+#
+# Command line arguments:
+#   tests/prefix_classname.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions -p "tomato_" --member-specs="list" -f -o "tests/prefix_classname2_sup.py" -s "tests/prefix_classname2_sub.py" --super="prefix_classname2_sup" tests/prefix_classname.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -608,7 +660,7 @@ def _cast(typ, value):
 #
 
 
-class people(GeneratedsSuper):
+class tomato_people(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('comments', 'comments', 1),
         MemberSpec_('person', 'person', 1),
@@ -619,6 +671,7 @@ class people(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -640,31 +693,41 @@ class people(GeneratedsSuper):
         else:
             self.java_programmer = java_programmer
     def factory(*args_, **kwargs_):
-        if people.subclass:
-            return people.subclass(*args_, **kwargs_)
-        else:
-            return people(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_people)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_people.subclass:
+            return tomato_people.subclass(*args_, **kwargs_)
+        else:
+            return tomato_people(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_comments(self): return self.comments
     def set_comments(self, comments): self.comments = comments
     def add_comments(self, value): self.comments.append(value)
-    def insert_comments(self, index, value): self.comments[index] = value
+    def insert_comments_at(self, index, value): self.comments.insert(index, value)
+    def replace_comments_at(self, index, value): self.comments[index] = value
     def get_person(self): return self.person
     def set_person(self, person): self.person = person
     def add_person(self, value): self.person.append(value)
-    def insert_person(self, index, value): self.person[index] = value
+    def insert_person_at(self, index, value): self.person.insert(index, value)
+    def replace_person_at(self, index, value): self.person[index] = value
     def get_programmer(self): return self.programmer
     def set_programmer(self, programmer): self.programmer = programmer
     def add_programmer(self, value): self.programmer.append(value)
-    def insert_programmer(self, index, value): self.programmer[index] = value
+    def insert_programmer_at(self, index, value): self.programmer.insert(index, value)
+    def replace_programmer_at(self, index, value): self.programmer[index] = value
     def get_python_programmer(self): return self.python_programmer
     def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer
     def add_python_programmer(self, value): self.python_programmer.append(value)
-    def insert_python_programmer(self, index, value): self.python_programmer[index] = value
+    def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value)
+    def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value
     def get_java_programmer(self): return self.java_programmer
     def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer
     def add_java_programmer(self, value): self.java_programmer.append(value)
-    def insert_java_programmer(self, index, value): self.java_programmer[index] = value
+    def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value)
+    def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value
     def hasContent_(self):
         if (
             self.comments or
@@ -681,13 +744,15 @@ class people(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='people')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='people', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -709,161 +774,47 @@ class people(GeneratedsSuper):
             python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print)
         for java_programmer_ in self.java_programmer:
             java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='people'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('comments=[\n')
-        level += 1
-        for comments_ in self.comments:
-            showIndent(outfile, level)
-            outfile.write('model_.comments(\n')
-            comments_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('person=[\n')
-        level += 1
-        for person_ in self.person:
-            showIndent(outfile, level)
-            outfile.write('model_.person(\n')
-            person_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('programmer=[\n')
-        level += 1
-        for programmer_ in self.programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.programmer(\n')
-            programmer_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('python_programmer=[\n')
-        level += 1
-        for python_programmer_ in self.python_programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.python_programmer(\n')
-            python_programmer_.exportLiteral(outfile, level, name_='python-programmer')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('java_programmer=[\n')
-        level += 1
-        for java_programmer_ in self.java_programmer:
-            showIndent(outfile, level)
-            outfile.write('model_.java_programmer(\n')
-            java_programmer_.exportLiteral(outfile, level, name_='java-programmer')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'comments':
-            obj_ = comments.factory()
+            obj_ = tomato_comments.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
-            class_obj_ = self.get_class_obj_(child_, person)
+            class_obj_ = self.get_class_obj_(child_, tomato_person)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'programmer':
-            class_obj_ = self.get_class_obj_(child_, programmer)
+            class_obj_ = self.get_class_obj_(child_, tomato_programmer)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
-            obj_ = python_programmer.factory()
+            obj_ = tomato_python_programmer.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
-            obj_ = java_programmer.factory()
+            obj_ = tomato_java_programmer.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
-    def walk_and_update(self):
-        members = people._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if people.superclass != None:
-          people.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: people  depth: %d' % (counter, depth, )
-        members = people._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-    def set_up(self):
-        global types, counter
-        import types as types_module
-        types = types_module
-        counter = 0
-# end class people
-
-
-class comments(GeneratedsSuper):
+            obj_.original_tagname_ = 'java-programmer'
+# end class tomato_people
+
+
+class tomato_comments(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('emp', 'xs:string', 1),
         MemberSpec_('valueOf_', [], 0),
@@ -871,6 +822,7 @@ class comments(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -886,21 +838,27 @@ class comments(GeneratedsSuper):
             self.content_ = content_
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
-        if comments.subclass:
-            return comments.subclass(*args_, **kwargs_)
-        else:
-            return comments(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_comments)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_comments.subclass:
+            return tomato_comments.subclass(*args_, **kwargs_)
+        else:
+            return tomato_comments(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_emp(self): return self.emp
     def set_emp(self, emp): self.emp = emp
     def add_emp(self, value): self.emp.append(value)
-    def insert_emp(self, index, value): self.emp[index] = value
+    def insert_emp_at(self, index, value): self.emp.insert(index, value)
+    def replace_emp_at(self, index, value): self.emp[index] = value
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
             self.emp or
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -910,13 +868,15 @@ class comments(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='comments', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -927,24 +887,6 @@ class comments(GeneratedsSuper):
         if not fromsubclass_:
             for item_ in self.content_:
                 item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='comments'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('content_ = [\n')
-        for item_ in self.content_:
-            item_.exportLiteral(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -956,6 +898,7 @@ class comments(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -968,62 +911,16 @@ class comments(GeneratedsSuper):
             obj_ = self.mixedclass_(MixedContainer.CategoryText,
                 MixedContainer.TypeNone, '', child_.tail)
             self.content_.append(obj_)
-    def walk_and_update(self):
-        members = comments._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if comments.superclass != None:
-          comments.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: comments  depth: %d' % (counter, depth, )
-        members = comments._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class comments
+# end class tomato_comments
 
 
-class person(GeneratedsSuper):
+class tomato_person(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('id', 'xs:integer', 0),
         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),
@@ -1033,12 +930,13 @@ class person(GeneratedsSuper):
     ]
     subclass = None
     superclass = None
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
-        self.vegetable = _cast(None, vegetable)
-        self.fruit = _cast(None, fruit)
-        self.ratio = _cast(float, ratio)
-        self.id = _cast(int, id)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.value = _cast(None, value)
+        self.id = _cast(int, id)
+        self.ratio = _cast(float, ratio)
+        self.fruit = _cast(None, fruit)
+        self.vegetable = _cast(None, vegetable)
         self.name = name
         if interest is None:
             self.interest = []
@@ -1056,39 +954,47 @@ class person(GeneratedsSuper):
         self.description = description
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
-        if person.subclass:
-            return person.subclass(*args_, **kwargs_)
-        else:
-            return person(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_person)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_person.subclass:
+            return tomato_person.subclass(*args_, **kwargs_)
+        else:
+            return tomato_person(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
     def get_interest(self): return self.interest
     def set_interest(self, interest): self.interest = interest
     def add_interest(self, value): self.interest.append(value)
-    def insert_interest(self, index, value): self.interest[index] = value
+    def insert_interest_at(self, index, value): self.interest.insert(index, value)
+    def replace_interest_at(self, index, value): self.interest[index] = value
     def get_category(self): return self.category
     def set_category(self, category): self.category = category
     def get_agent(self): return self.agent
     def set_agent(self, agent): self.agent = agent
     def add_agent(self, value): self.agent.append(value)
-    def insert_agent(self, index, value): self.agent[index] = value
+    def insert_agent_at(self, index, value): self.agent.insert(index, value)
+    def replace_agent_at(self, index, value): self.agent[index] = value
     def get_promoter(self): return self.promoter
     def set_promoter(self, promoter): self.promoter = promoter
     def add_promoter(self, value): self.promoter.append(value)
-    def insert_promoter(self, index, value): self.promoter[index] = value
+    def insert_promoter_at(self, index, value): self.promoter.insert(index, value)
+    def replace_promoter_at(self, index, value): self.promoter[index] = value
     def get_description(self): return self.description
     def set_description(self, description): self.description = description
-    def get_vegetable(self): return self.vegetable
-    def set_vegetable(self, vegetable): self.vegetable = vegetable
-    def get_fruit(self): return self.fruit
-    def set_fruit(self, fruit): self.fruit = fruit
-    def get_ratio(self): return self.ratio
-    def set_ratio(self, ratio): self.ratio = ratio
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
     def get_value(self): return self.value
     def set_value(self, value): self.value = value
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_ratio(self): return self.ratio
+    def set_ratio(self, ratio): self.ratio = ratio
+    def get_fruit(self): return self.fruit
+    def set_fruit(self, fruit): self.fruit = fruit
+    def get_vegetable(self): return self.vegetable
+    def set_vegetable(self, vegetable): self.vegetable = vegetable
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def hasContent_(self):
@@ -1108,33 +1014,35 @@ class person(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='person')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='person', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), ))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), ))
-        if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            outfile.write(' value=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value), input_name='value')), ))
         if self.id is not None and 'id' not in already_processed:
             already_processed.add('id')
             outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id'))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), ))
+        if self.ratio is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio'))
+        if self.fruit is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            outfile.write(' fruit=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.fruit), input_name='fruit')), ))
+        if self.vegetable is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            outfile.write(' vegetable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.vegetable), input_name='vegetable')), ))
         if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
@@ -1146,10 +1054,10 @@ class person(GeneratedsSuper):
             eol_ = ''
         if self.name is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_))
+            outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_))
         for interest_ in self.interest:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_))
+            outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(interest_), input_name='interest')), namespace_, eol_))
         if self.category is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_))
@@ -1159,110 +1067,41 @@ class person(GeneratedsSuper):
             promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print)
         if self.description is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='person'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.vegetable is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            showIndent(outfile, level)
-            outfile.write('vegetable="%s",\n' % (self.vegetable,))
-        if self.fruit is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            showIndent(outfile, level)
-            outfile.write('fruit="%s",\n' % (self.fruit,))
-        if self.ratio is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            showIndent(outfile, level)
-            outfile.write('ratio=%f,\n' % (self.ratio,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            showIndent(outfile, level)
-            outfile.write('id=%d,\n' % (self.id,))
-        if self.value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            showIndent(outfile, level)
-            outfile.write('value="%s",\n' % (self.value,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.name is not None:
-            showIndent(outfile, level)
-            outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding))
-        showIndent(outfile, level)
-        outfile.write('interest=[\n')
-        level += 1
-        for interest_ in self.interest:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.category is not None:
-            showIndent(outfile, level)
-            outfile.write('category=%d,\n' % self.category)
-        showIndent(outfile, level)
-        outfile.write('agent=[\n')
-        level += 1
-        for agent_ in self.agent:
-            showIndent(outfile, level)
-            outfile.write('model_.agent(\n')
-            agent_.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('promoter=[\n')
-        level += 1
-        for promoter_ in self.promoter:
-            showIndent(outfile, level)
-            outfile.write('model_.booster(\n')
-            promoter_.exportLiteral(outfile, level, name_='booster')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.description is not None:
-            showIndent(outfile, level)
-            outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding))
+            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('vegetable', node)
-        if value is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            self.vegetable = value
-        value = find_attr_value_('fruit', node)
-        if value is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            self.fruit = value
-        value = find_attr_value_('ratio', node)
-        if value is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            try:
-                self.ratio = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('value', node)
+        if value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            self.value = value
         value = find_attr_value_('id', node)
         if value is not None and 'id' not in already_processed:
             already_processed.add('id')
             try:
                 self.id = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value', node)
-        if value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            self.value = value
+        value = find_attr_value_('ratio', node)
+        if value is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            try:
+                self.ratio = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('fruit', node)
+        if value is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            self.fruit = value
+        value = find_attr_value_('vegetable', node)
+        if value is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            self.vegetable = value
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
@@ -1280,79 +1119,35 @@ class person(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'category')
             self.category = ival_
         elif nodeName_ == 'agent':
-            obj_ = agent.factory()
+            obj_ = tomato_agent.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
-            obj_ = booster.factory()
+            obj_ = tomato_booster.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
             self.description = description_
-    def walk_and_update(self):
-        members = person._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if person.superclass != None:
-          person.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: person  depth: %d' % (counter, depth, )
-        members = person._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class person
+# end class tomato_person
 
 
-class programmer(person):
+class tomato_programmer(tomato_person):
     member_data_items_ = [
         MemberSpec_('language', 'xs:string', 0),
         MemberSpec_('area', 'xs:string', 0),
-        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
         MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 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),
@@ -1367,26 +1162,27 @@ class programmer(person):
         MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0),
     ]
     subclass = None
-    superclass = person
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, )
+    superclass = tomato_person
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
+        super(tomato_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
-        self.attrnegint = _cast(int, attrnegint)
         self.attrposint = _cast(int, attrposint)
-        self.attrnonnegint = _cast(int, attrnonnegint)
         self.attrnonposint = _cast(int, attrnonposint)
+        self.attrnegint = _cast(int, attrnegint)
+        self.attrnonnegint = _cast(int, attrnonnegint)
         self.email = email
         self.elposint = elposint
         self.elnonposint = elnonposint
         self.elnegint = elnegint
         self.elnonnegint = elnonnegint
-        if isinstance(eldate, basestring):
+        if isinstance(eldate, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date()
         else:
             initvalue_ = eldate
         self.eldate = initvalue_
-        if isinstance(eldatetime, basestring):
+        if isinstance(eldatetime, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = eldatetime
@@ -1396,12 +1192,18 @@ class programmer(person):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
-        if programmer.subclass:
-            return programmer.subclass(*args_, **kwargs_)
-        else:
-            return programmer(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_programmer.subclass:
+            return tomato_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_programmer(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_email(self): return self.email
     def set_email(self, email): self.email = email
@@ -1431,19 +1233,28 @@ class programmer(person):
     def set_language(self, language): self.language = language
     def get_area(self): return self.area
     def set_area(self, area): self.area = area
-    def get_attrnegint(self): return self.attrnegint
-    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
     def get_attrposint(self): return self.attrposint
     def set_attrposint(self, attrposint): self.attrposint = attrposint
-    def get_attrnonnegint(self): return self.attrnonnegint
-    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
     def get_attrnonposint(self): return self.attrnonposint
     def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint
+    def get_attrnegint(self): return self.attrnegint
+    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
+    def get_attrnonnegint(self): return self.attrnonnegint
+    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['float', 'int', 'Name', 'token']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
@@ -1458,7 +1269,7 @@ class programmer(person):
             self.ellong is not None or
             self.elparam is not None or
             self.elarraytypes is not None or
-            super(programmer, self).hasContent_()
+            super(tomato_programmer, self).hasContent_()
         ):
             return True
         else:
@@ -1468,50 +1279,52 @@ class programmer(person):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='programmer'):
-        super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
+        super(tomato_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer')
         if self.language is not None and 'language' not in already_processed:
             already_processed.add('language')
-            outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), ))
+            outfile.write(' language=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.language), input_name='language')), ))
         if self.area is not None and 'area' not in already_processed:
             already_processed.add('area')
-            outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), ))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+            outfile.write(' area=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.area), input_name='area')), ))
         if self.attrposint is not None and 'attrposint' not in already_processed:
             already_processed.add('attrposint')
             outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint'))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
         if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
             already_processed.add('attrnonposint')
             outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint'))
+        if self.attrnegint is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint'))
+        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint'))
         if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
             outfile.write(' xsi:type="%s"' % self.extensiontype_)
     def exportChildren(self, outfile, level, namespace_='', name_='programmer', fromsubclass_=False, pretty_print=True):
-        super(programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        super(tomato_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
         if self.email is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_))
+            outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.email), input_name='email')), namespace_, eol_))
         if self.elposint is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_))
@@ -1532,7 +1345,7 @@ class programmer(person):
             outfile.write('<%seldatetime>%s</%seldatetime>%s' % (namespace_, self.gds_format_datetime(self.eldatetime, input_name='eldatetime'), namespace_, eol_))
         if self.eltoken is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_))
+            outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.eltoken), input_name='eltoken')), namespace_, eol_))
         if self.elshort is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_))
@@ -1543,136 +1356,64 @@ class programmer(person):
             self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print)
         if self.elarraytypes is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='programmer'):
-        level += 1
+            outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.elarraytypes), input_name='elarraytypes')), namespace_, eol_))
+    def build(self, node):
         already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.language is not None and 'language' not in already_processed:
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('language', node)
+        if value is not None and 'language' not in already_processed:
             already_processed.add('language')
-            showIndent(outfile, level)
-            outfile.write('language="%s",\n' % (self.language,))
-        if self.area is not None and 'area' not in already_processed:
+            self.language = value
+        value = find_attr_value_('area', node)
+        if value is not None and 'area' not in already_processed:
             already_processed.add('area')
-            showIndent(outfile, level)
-            outfile.write('area="%s",\n' % (self.area,))
-        if self.attrnegint is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnegint=%d,\n' % (self.attrnegint,))
-        if self.attrposint is not None and 'attrposint' not in already_processed:
+            self.area = value
+        value = find_attr_value_('attrposint', node)
+        if value is not None and 'attrposint' not in already_processed:
             already_processed.add('attrposint')
-            showIndent(outfile, level)
-            outfile.write('attrposint=%d,\n' % (self.attrposint,))
-        if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            showIndent(outfile, level)
-            outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,))
-        if self.attrnonposint is not None and 'attrnonposint' not in already_processed:
+            try:
+                self.attrposint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrposint <= 0:
+                raise_parse_error(node, 'Invalid PositiveInteger')
+        value = find_attr_value_('attrnonposint', node)
+        if value is not None and 'attrnonposint' not in already_processed:
             already_processed.add('attrnonposint')
-            showIndent(outfile, level)
-            outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,))
-        super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.email is not None:
-            showIndent(outfile, level)
-            outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding))
-        if self.elposint is not None:
-            showIndent(outfile, level)
-            outfile.write('elposint=%d,\n' % self.elposint)
-        if self.elnonposint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnonposint=%d,\n' % self.elnonposint)
-        if self.elnegint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnegint=%d,\n' % self.elnegint)
-        if self.elnonnegint is not None:
-            showIndent(outfile, level)
-            outfile.write('elnonnegint=%d,\n' % self.elnonnegint)
-        if self.eldate is not None:
-            showIndent(outfile, level)
-            outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate'))
-        if self.eldatetime is not None:
-            showIndent(outfile, level)
-            outfile.write('eldatetime=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.eldatetime, input_name='eldatetime'))
-        if self.eltoken is not None:
-            showIndent(outfile, level)
-            outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding))
-        if self.elshort is not None:
-            showIndent(outfile, level)
-            outfile.write('elshort=%d,\n' % self.elshort)
-        if self.ellong is not None:
-            showIndent(outfile, level)
-            outfile.write('ellong=%d,\n' % self.ellong)
-        if self.elparam is not None:
-            showIndent(outfile, level)
-            outfile.write('elparam=model_.param(\n')
-            self.elparam.exportLiteral(outfile, level, name_='elparam')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        if self.elarraytypes is not None:
-            showIndent(outfile, level)
-            outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding))
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('language', node)
-        if value is not None and 'language' not in already_processed:
-            already_processed.add('language')
-            self.language = value
-        value = find_attr_value_('area', node)
-        if value is not None and 'area' not in already_processed:
-            already_processed.add('area')
-            self.area = value
+            try:
+                self.attrnonposint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonposint > 0:
+                raise_parse_error(node, 'Invalid NonPositiveInteger')
         value = find_attr_value_('attrnegint', node)
         if value is not None and 'attrnegint' not in already_processed:
             already_processed.add('attrnegint')
             try:
                 self.attrnegint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrnegint >= 0:
                 raise_parse_error(node, 'Invalid NegativeInteger')
-        value = find_attr_value_('attrposint', node)
-        if value is not None and 'attrposint' not in already_processed:
-            already_processed.add('attrposint')
-            try:
-                self.attrposint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrposint <= 0:
-                raise_parse_error(node, 'Invalid PositiveInteger')
         value = find_attr_value_('attrnonnegint', node)
         if value is not None and 'attrnonnegint' not in already_processed:
             already_processed.add('attrnonnegint')
             try:
                 self.attrnonnegint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrnonnegint < 0:
                 raise_parse_error(node, 'Invalid NonNegativeInteger')
-        value = find_attr_value_('attrnonposint', node)
-        if value is not None and 'attrnonposint' not in already_processed:
-            already_processed.add('attrnonposint')
-            try:
-                self.attrnonposint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnonposint > 0:
-                raise_parse_error(node, 'Invalid NonPositiveInteger')
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             self.extensiontype_ = value
-        super(programmer, self).buildAttributes(node, attrs, already_processed)
+        super(tomato_programmer, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'email':
             email_ = child_.text
@@ -1682,7 +1423,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ <= 0:
                 raise_parse_error(child_, 'requires positiveInteger')
@@ -1692,7 +1433,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ > 0:
                 raise_parse_error(child_, 'requires nonPositiveInteger')
@@ -1702,7 +1443,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ >= 0:
                 raise_parse_error(child_, 'requires negativeInteger')
@@ -1712,7 +1453,7 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ < 0:
                 raise_parse_error(child_, 'requires nonNegativeInteger')
@@ -1728,14 +1469,17 @@ class programmer(person):
             self.eldatetime = dval_
         elif nodeName_ == 'eltoken':
             eltoken_ = child_.text
-            eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            if eltoken_:
+                eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            else:
+                eltoken_ = ""
             eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken')
             self.eltoken = eltoken_
         elif nodeName_ == 'elshort':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'elshort')
             self.elshort = ival_
@@ -1743,114 +1487,76 @@ class programmer(person):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'ellong')
             self.ellong = ival_
         elif nodeName_ == 'elparam':
-            obj_ = param.factory()
+            obj_ = tomato_param.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
             self.elarraytypes = elarraytypes_
-            self.validate_ArrayTypes(self.elarraytypes)    # validate type ArrayTypes
-        super(programmer, self).buildChildren(child_, node, nodeName_, True)
-    def walk_and_update(self):
-        members = programmer._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if programmer.superclass != None:
-          programmer.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: programmer  depth: %d' % (counter, depth, )
-        members = programmer._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class programmer
+            # validate type ArrayTypes
+            self.validate_ArrayTypes(self.elarraytypes)
+        super(tomato_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_programmer
 
 
-class param(GeneratedsSuper):
+class tomato_param(GeneratedsSuper):
     """Finding flow attribute unneccesary in practice. A unnamed parameter
     is unbound/skipped."""
     member_data_items_ = [
-        MemberSpec_('semantic', 'xs:token', 0),
+        MemberSpec_('id', 'xs:string', 0),
         MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 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),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        self.semantic = _cast(None, semantic)
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.id = _cast(None, id)
         self.name = _cast(None, name)
-        self.flow = _cast(None, flow)
         self.sid = _cast(None, sid)
+        self.flow = _cast(None, flow)
+        self.semantic = _cast(None, semantic)
         self.type_ = _cast(None, type_)
-        self.id = _cast(None, id)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
-        if param.subclass:
-            return param.subclass(*args_, **kwargs_)
-        else:
-            return param(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_param)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_param.subclass:
+            return tomato_param.subclass(*args_, **kwargs_)
+        else:
+            return tomato_param(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_semantic(self): return self.semantic
-    def set_semantic(self, semantic): self.semantic = semantic
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
-    def get_flow(self): return self.flow
-    def set_flow(self, flow): self.flow = flow
     def get_sid(self): return self.sid
     def set_sid(self, sid): self.sid = sid
+    def get_flow(self): return self.flow
+    def set_flow(self, flow): self.flow = flow
+    def get_semantic(self): return self.semantic
+    def set_semantic(self, semantic): self.semantic = semantic
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1860,72 +1566,39 @@ class param(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), ))
+        if self.id is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), ))
         if self.name is not None and 'name' not in already_processed:
             already_processed.add('name')
             outfile.write(' name=%s' % (quote_attrib(self.name), ))
-        if self.flow is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
         if self.sid is not None and 'sid' not in already_processed:
             already_processed.add('sid')
             outfile.write(' sid=%s' % (quote_attrib(self.sid), ))
-        if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.add('type_')
-            outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), ))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='param'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.semantic is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            showIndent(outfile, level)
-            outfile.write('semantic="%s",\n' % (self.semantic,))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            showIndent(outfile, level)
-            outfile.write('name="%s",\n' % (self.name,))
         if self.flow is not None and 'flow' not in already_processed:
             already_processed.add('flow')
-            showIndent(outfile, level)
-            outfile.write('flow=%s,\n' % (self.flow,))
-        if self.sid is not None and 'sid' not in already_processed:
-            already_processed.add('sid')
-            showIndent(outfile, level)
-            outfile.write('sid="%s",\n' % (self.sid,))
+            outfile.write(' flow=%s' % (quote_attrib(self.flow), ))
+        if self.semantic is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            outfile.write(' semantic=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.semantic), input_name='semantic')), ))
         if self.type_ is not None and 'type_' not in already_processed:
             already_processed.add('type_')
-            showIndent(outfile, level)
-            outfile.write('type_="%s",\n' % (self.type_,))
-        if self.id is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            showIndent(outfile, level)
-            outfile.write('id="%s",\n' % (self.id,))
-    def exportLiteralChildren(self, outfile, level, name_):
+            outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), ))
+    def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True):
         pass
     def build(self, node):
         already_processed = set()
@@ -1934,99 +1607,60 @@ class param(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('semantic', node)
-        if value is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            self.semantic = value
-            self.semantic = ' '.join(self.semantic.split())
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
         value = find_attr_value_('name', node)
         if value is not None and 'name' not in already_processed:
             already_processed.add('name')
             self.name = value
-        value = find_attr_value_('flow', node)
-        if value is not None and 'flow' not in already_processed:
-            already_processed.add('flow')
-            self.flow = value
         value = find_attr_value_('sid', node)
         if value is not None and 'sid' not in already_processed:
             already_processed.add('sid')
             self.sid = value
+        value = find_attr_value_('flow', node)
+        if value is not None and 'flow' not in already_processed:
+            already_processed.add('flow')
+            self.flow = value
+        value = find_attr_value_('semantic', node)
+        if value is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            self.semantic = value
+            self.semantic = ' '.join(self.semantic.split())
         value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
             already_processed.add('type')
             self.type_ = value
-        value = find_attr_value_('id', node)
-        if value is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            self.id = value
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
-    def walk_and_update(self):
-        members = param._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if param.superclass != None:
-          param.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: param  depth: %d' % (counter, depth, )
-        members = param._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class param
+# end class tomato_param
 
 
-class python_programmer(programmer):
+class tomato_python_programmer(tomato_programmer):
     member_data_items_ = [
         MemberSpec_('nick-name', 'xs:string', 0),
         MemberSpec_('favorite_editor', 'xs:string', 0),
     ]
     subclass = None
-    superclass = programmer
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
-        super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
+    superclass = tomato_programmer
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(tomato_python_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
         self.favorite_editor = favorite_editor
     def factory(*args_, **kwargs_):
-        if python_programmer.subclass:
-            return python_programmer.subclass(*args_, **kwargs_)
-        else:
-            return python_programmer(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_python_programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_python_programmer.subclass:
+            return tomato_python_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_python_programmer(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_favorite_editor(self): return self.favorite_editor
     def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
@@ -2035,7 +1669,7 @@ class python_programmer(programmer):
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
-            super(python_programmer, self).hasContent_()
+            super(tomato_python_programmer, self).hasContent_()
         ):
             return True
         else:
@@ -2045,144 +1679,90 @@ class python_programmer(programmer):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='python-programmer'):
-        super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
+        super(tomato_python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer')
         if self.nick_name is not None and 'nick_name' not in already_processed:
             already_processed.add('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+            outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True):
-        super(python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        super(tomato_python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
         if self.favorite_editor is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='python-programmer'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.add('nick_name')
-            showIndent(outfile, level)
-            outfile.write('nick_name="%s",\n' % (self.nick_name,))
-        super(python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(python_programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.favorite_editor is not None:
-            showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
             already_processed.add('nick-name')
             self.nick_name = value
-        super(python_programmer, self).buildAttributes(node, attrs, already_processed)
+        super(tomato_python_programmer, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'favorite-editor':
             favorite_editor_ = child_.text
             favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
             self.favorite_editor = favorite_editor_
-        super(python_programmer, self).buildChildren(child_, node, nodeName_, True)
-    def walk_and_update(self):
-        members = python_programmer._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if python_programmer.superclass != None:
-          python_programmer.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: python_programmer  depth: %d' % (counter, depth, )
-        members = python_programmer._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class python_programmer
+        super(tomato_python_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_python_programmer
 
 
-class java_programmer(programmer):
+class tomato_java_programmer(tomato_programmer):
     member_data_items_ = [
-        MemberSpec_('status', 'xs:string', 0),
         MemberSpec_('nick-name', 'xs:string', 0),
+        MemberSpec_('status', 'xs:string', 0),
         MemberSpec_('favorite_editor', 'xs:string', 0),
     ]
     subclass = None
-    superclass = programmer
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None):
-        super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
-        self.status = _cast(None, status)
+    superclass = tomato_programmer
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None):
+        self.original_tagname_ = None
+        super(tomato_java_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
+        self.status = _cast(None, status)
         self.favorite_editor = favorite_editor
     def factory(*args_, **kwargs_):
-        if java_programmer.subclass:
-            return java_programmer.subclass(*args_, **kwargs_)
-        else:
-            return java_programmer(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_java_programmer)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_java_programmer.subclass:
+            return tomato_java_programmer.subclass(*args_, **kwargs_)
+        else:
+            return tomato_java_programmer(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_favorite_editor(self): return self.favorite_editor
     def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor
-    def get_status(self): return self.status
-    def set_status(self, status): self.status = status
     def get_nick_name(self): return self.nick_name
     def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def get_status(self): return self.status
+    def set_status(self, status): self.status = status
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
-            super(java_programmer, self).hasContent_()
+            super(tomato_java_programmer, self).hasContent_()
         ):
             return True
         else:
@@ -2192,127 +1772,63 @@ class java_programmer(programmer):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmer', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'):
-        super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), ))
+        super(tomato_java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer')
         if self.nick_name is not None and 'nick_name' not in already_processed:
             already_processed.add('nick_name')
-            outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), ))
+            outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), ))
+        if self.status is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            outfile.write(' status=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.status), input_name='status')), ))
     def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True):
-        super(java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
+        super(tomato_java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
         if self.favorite_editor is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='java-programmer'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.status is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            showIndent(outfile, level)
-            outfile.write('status="%s",\n' % (self.status,))
-        if self.nick_name is not None and 'nick_name' not in already_processed:
-            already_processed.add('nick_name')
-            showIndent(outfile, level)
-            outfile.write('nick_name="%s",\n' % (self.nick_name,))
-        super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(java_programmer, self).exportLiteralChildren(outfile, level, name_)
-        if self.favorite_editor is not None:
-            showIndent(outfile, level)
-            outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding))
+            outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('status', node)
-        if value is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            self.status = value
         value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
             already_processed.add('nick-name')
             self.nick_name = value
-        super(java_programmer, self).buildAttributes(node, attrs, already_processed)
+        value = find_attr_value_('status', node)
+        if value is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            self.status = value
+        super(tomato_java_programmer, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'favorite-editor':
             favorite_editor_ = child_.text
             favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor')
             self.favorite_editor = favorite_editor_
-        super(java_programmer, self).buildChildren(child_, node, nodeName_, True)
-    def walk_and_update(self):
-        members = java_programmer._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if java_programmer.superclass != None:
-          java_programmer.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: java_programmer  depth: %d' % (counter, depth, )
-        members = java_programmer._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class java_programmer
+        super(tomato_java_programmer, self).buildChildren(child_, node, nodeName_, True)
+# end class tomato_java_programmer
 
 
-class agent(GeneratedsSuper):
+class tomato_agent(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('firstname', 'xs:string', 0),
         MemberSpec_('lastname', 'xs:string', 0),
@@ -2322,15 +1838,21 @@ class agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
         self.info = info
     def factory(*args_, **kwargs_):
-        if agent.subclass:
-            return agent.subclass(*args_, **kwargs_)
-        else:
-            return agent(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_agent)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_agent.subclass:
+            return tomato_agent.subclass(*args_, **kwargs_)
+        else:
+            return tomato_agent(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_firstname(self): return self.firstname
     def set_firstname(self, firstname): self.firstname = firstname
@@ -2355,13 +1877,15 @@ class agent(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='agent', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2375,45 +1899,22 @@ class agent(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.priority is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
         if self.info is not None:
             self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='agent'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.priority is not None:
-            showIndent(outfile, level)
-            outfile.write('priority=%f,\n' % self.priority)
-        if self.info is not None:
-            showIndent(outfile, level)
-            outfile.write('info=model_.info(\n')
-            self.info.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2429,64 +1930,19 @@ class agent(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
         elif nodeName_ == 'info':
-            obj_ = info.factory()
+            obj_ = tomato_info.factory()
             obj_.build(child_)
             self.info = obj_
-    def walk_and_update(self):
-        members = agent._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if agent.superclass != None:
-          agent.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: agent  depth: %d' % (counter, depth, )
-        members = agent._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class agent
+            obj_.original_tagname_ = 'info'
+# end class tomato_agent
 
 
-class special_agent(GeneratedsSuper):
+class tomato_special_agent(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('firstname', 'xs:string', 0),
         MemberSpec_('lastname', 'xs:string', 0),
@@ -2496,15 +1952,21 @@ class special_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
         self.info = info
     def factory(*args_, **kwargs_):
-        if special_agent.subclass:
-            return special_agent.subclass(*args_, **kwargs_)
-        else:
-            return special_agent(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_special_agent)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_special_agent.subclass:
+            return tomato_special_agent.subclass(*args_, **kwargs_)
+        else:
+            return tomato_special_agent(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_firstname(self): return self.firstname
     def set_firstname(self, firstname): self.firstname = firstname
@@ -2529,13 +1991,15 @@ class special_agent(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='special-agent', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2549,45 +2013,22 @@ class special_agent(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.priority is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_))
         if self.info is not None:
             self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='special-agent'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.priority is not None:
-            showIndent(outfile, level)
-            outfile.write('priority=%f,\n' % self.priority)
-        if self.info is not None:
-            showIndent(outfile, level)
-            outfile.write('info=model_.info(\n')
-            self.info.exportLiteral(outfile, level)
-            showIndent(outfile, level)
-            outfile.write('),\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2603,64 +2044,19 @@ class special_agent(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
         elif nodeName_ == 'info':
-            obj_ = info.factory()
+            obj_ = tomato_info.factory()
             obj_.build(child_)
             self.info = obj_
-    def walk_and_update(self):
-        members = special_agent._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if special_agent.superclass != None:
-          special_agent.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: special_agent  depth: %d' % (counter, depth, )
-        members = special_agent._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class special_agent
+            obj_.original_tagname_ = 'info'
+# end class tomato_special_agent
 
 
-class booster(GeneratedsSuper):
+class tomato_booster(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('firstname', 'xs:string', 0),
         MemberSpec_('lastname', 'xs:string', 0),
@@ -2673,6 +2069,7 @@ class booster(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.other_name = other_name
@@ -2690,10 +2087,15 @@ class booster(GeneratedsSuper):
         else:
             self.client_handler = client_handler
     def factory(*args_, **kwargs_):
-        if booster.subclass:
-            return booster.subclass(*args_, **kwargs_)
-        else:
-            return booster(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_booster)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_booster.subclass:
+            return tomato_booster.subclass(*args_, **kwargs_)
+        else:
+            return tomato_booster(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_firstname(self): return self.firstname
     def set_firstname(self, firstname): self.firstname = firstname
@@ -2706,15 +2108,18 @@ class booster(GeneratedsSuper):
     def get_other_value(self): return self.other_value
     def set_other_value(self, other_value): self.other_value = other_value
     def add_other_value(self, value): self.other_value.append(value)
-    def insert_other_value(self, index, value): self.other_value[index] = value
+    def insert_other_value_at(self, index, value): self.other_value.insert(index, value)
+    def replace_other_value_at(self, index, value): self.other_value[index] = value
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
     def add_type(self, value): self.type_.append(value)
-    def insert_type(self, index, value): self.type_[index] = value
+    def insert_type_at(self, index, value): self.type_.insert(index, value)
+    def replace_type_at(self, index, value): self.type_[index] = value
     def get_client_handler(self): return self.client_handler
     def set_client_handler(self, client_handler): self.client_handler = client_handler
     def add_client_handler(self, value): self.client_handler.append(value)
-    def insert_client_handler(self, index, value): self.client_handler[index] = value
+    def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value)
+    def replace_client_handler_at(self, index, value): self.client_handler[index] = value
     def hasContent_(self):
         if (
             self.firstname is not None or
@@ -2733,13 +2138,15 @@ class booster(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='booster', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -2753,10 +2160,10 @@ class booster(GeneratedsSuper):
             eol_ = ''
         if self.firstname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_))
+            outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_))
         if self.lastname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_))
+            outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_))
         if self.other_name is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_))
@@ -2771,63 +2178,13 @@ class booster(GeneratedsSuper):
             outfile.write('<%stype>%s</%stype>%s' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_, eol_))
         for client_handler_ in self.client_handler:
             client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print)
-    def exportLiteral(self, outfile, level, name_='booster'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.firstname is not None:
-            showIndent(outfile, level)
-            outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding))
-        if self.lastname is not None:
-            showIndent(outfile, level)
-            outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding))
-        if self.other_name is not None:
-            showIndent(outfile, level)
-            outfile.write('other_name=%f,\n' % self.other_name)
-        if self.class_ is not None:
-            showIndent(outfile, level)
-            outfile.write('class_=%f,\n' % self.class_)
-        showIndent(outfile, level)
-        outfile.write('other_value=[\n')
-        level += 1
-        for other_value_ in self.other_value:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % other_value_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('type_=[\n')
-        level += 1
-        for type_ in self.type_:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % type_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        showIndent(outfile, level)
-        outfile.write('client_handler=[\n')
-        level += 1
-        for client_handler_ in self.client_handler:
-            showIndent(outfile, level)
-            outfile.write('model_.client_handlerType(\n')
-            client_handler_.exportLiteral(outfile, level, name_='client-handlerType')
-            showIndent(outfile, level)
-            outfile.write('),\n')
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2843,7 +2200,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'other_name')
             self.other_name = fval_
@@ -2851,7 +2208,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'class')
             self.class_ = fval_
@@ -2859,7 +2216,7 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'other_value')
             self.other_value.append(fval_)
@@ -2867,88 +2224,48 @@ class booster(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'type')
             self.type_.append(fval_)
         elif nodeName_ == 'client-handler':
-            obj_ = client_handlerType.factory()
+            obj_ = tomato_client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
-    def walk_and_update(self):
-        members = booster._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if booster.superclass != None:
-          booster.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: booster  depth: %d' % (counter, depth, )
-        members = booster._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class booster
+            obj_.original_tagname_ = 'client-handler'
+# end class tomato_booster
 
 
-class info(GeneratedsSuper):
+class tomato_info(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('rating', 'xs:float', 0),
-        MemberSpec_('type', 'xs:integer', 0),
         MemberSpec_('name', 'xs:string', 0),
+        MemberSpec_('type', 'xs:integer', 0),
+        MemberSpec_('rating', 'xs:float', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, rating=None, type_=None, name=None):
-        self.rating = _cast(float, rating)
-        self.type_ = _cast(int, type_)
+    def __init__(self, name=None, type_=None, rating=None):
+        self.original_tagname_ = None
         self.name = _cast(None, name)
-        pass
+        self.type_ = _cast(int, type_)
+        self.rating = _cast(float, rating)
     def factory(*args_, **kwargs_):
-        if info.subclass:
-            return info.subclass(*args_, **kwargs_)
-        else:
-            return info(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_info)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_info.subclass:
+            return tomato_info.subclass(*args_, **kwargs_)
+        else:
+            return tomato_info(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_rating(self): return self.rating
-    def set_rating(self, rating): self.rating = rating
-    def get_type(self): return self.type_
-    def set_type(self, type_): self.type_ = type_
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def get_rating(self): return self.rating
+    def set_rating(self, rating): self.rating = rating
     def hasContent_(self):
         if (
 
@@ -2961,48 +2278,29 @@ class info(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='info')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='info', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
-        if self.rating is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+        if self.name is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), ))
         if self.type_ is not None and 'type_' not in already_processed:
             already_processed.add('type_')
             outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type'))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), ))
-    def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True):
-        pass
-    def exportLiteral(self, outfile, level, name_='info'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
         if self.rating is not None and 'rating' not in already_processed:
             already_processed.add('rating')
-            showIndent(outfile, level)
-            outfile.write('rating=%f,\n' % (self.rating,))
-        if self.type_ is not None and 'type_' not in already_processed:
-            already_processed.add('type_')
-            showIndent(outfile, level)
-            outfile.write('type_=%d,\n' % (self.type_,))
-        if self.name is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            showIndent(outfile, level)
-            outfile.write('name="%s",\n' % (self.name,))
-    def exportLiteralChildren(self, outfile, level, name_):
+            outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating'))
+    def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True):
         pass
     def build(self, node):
         already_processed = set()
@@ -3010,77 +2308,32 @@ class info(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('rating', node)
-        if value is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            try:
-                self.rating = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (rating): %s' % exp)
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
         value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
             already_processed.add('type')
             try:
                 self.type_ = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('name', node)
-        if value is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            self.name = value
+        value = find_attr_value_('rating', node)
+        if value is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            try:
+                self.rating = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (rating): %s' % exp)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
-    def walk_and_update(self):
-        members = info._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if info.superclass != None:
-          info.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: info  depth: %d' % (counter, depth, )
-        members = info._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class info
+# end class tomato_info
 
 
-class client_handlerType(GeneratedsSuper):
+class tomato_client_handlerType(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('fullname', 'xs:string', 0),
         MemberSpec_('refid', 'xs:integer', 0),
@@ -3088,13 +2341,19 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
-        if client_handlerType.subclass:
-            return client_handlerType.subclass(*args_, **kwargs_)
-        else:
-            return client_handlerType(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, tomato_client_handlerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if tomato_client_handlerType.subclass:
+            return tomato_client_handlerType.subclass(*args_, **kwargs_)
+        else:
+            return tomato_client_handlerType(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_fullname(self): return self.fullname
     def set_fullname(self, fullname): self.fullname = fullname
@@ -3113,13 +2372,15 @@ class client_handlerType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -3133,31 +2394,17 @@ class client_handlerType(GeneratedsSuper):
             eol_ = ''
         if self.fullname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_))
+            outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.fullname), input_name='fullname')), namespace_, eol_))
         if self.refid is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='client-handlerType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.fullname is not None:
-            showIndent(outfile, level)
-            outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding))
-        if self.refid is not None:
-            showIndent(outfile, level)
-            outfile.write('refid=%d,\n' % self.refid)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -3169,73 +2416,27 @@ class client_handlerType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'refid')
             self.refid = ival_
-    def walk_and_update(self):
-        members = client_handlerType._member_data_items
-        for member in members:
-            obj1 = getattr(self, member.get_name())
-            if member.get_data_type() == 'xs:date':
-                newvalue = date_calcs.date_from_string(obj1)
-                setattr(self, member.get_name(), newvalue)
-            elif member.get_container():
-                for child in obj1:
-                    if type(child) == types.InstanceType:
-                        child.walk_and_update()
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_update()
-        if client_handlerType.superclass != None:
-          client_handlerType.superclass.walk_and_update(self)
-    def walk_and_show(self, depth):
-        global counter
-        counter += 1
-        depth += 1
-        print '%d. class: client_handlerType  depth: %d' % (counter, depth, )
-        members = client_handlerType._member_data_items
-        for member in members:
-            s1 = member.get_name()
-            s2 = member.get_data_type()
-            s3 = '%d' % member.get_container()
-            obj1 = getattr(self, member.get_name())
-            if member.get_container():
-                s4 = '<container>'
-            else:
-                if type(obj1) != types.InstanceType:
-                    s4 = '%s' % obj1
-                else:
-                    s4 = '<instance>'
-            s5 = '%s%s%s  %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, )
-            print '   ', s5
-        for member in members:
-            if member.get_container():
-                for child in getattr(self, member.get_name()):
-                    if type(child) == types.InstanceType:
-                        child.walk_and_show(depth)
-            else:
-                obj1 = getattr(self, member.get_name())
-                if type(obj1) == types.InstanceType:
-                    obj1.walk_and_show(depth)
-# end class client_handlerType
+# end class tomato_client_handlerType
 
 
 GDSClassesMapping = {
-    'client-handler': client_handlerType,
-    'elparam': param,
-    'promoter': booster,
+    'client-handler': tomato_client_handlerType,
+    'elparam': tomato_param,
+    'promoter': tomato_booster,
 }
 
 
 USAGE_TEXT = """
-Usage: python <Parser>.py [ -s ] <in_xml_file>
+Usage: python <tomato_Parser>.py [ -s ] <in_xml_file>
 """
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -3248,12 +2449,13 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
         rootTag = 'people'
-        rootClass = people
+        rootClass = tomato_people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -3268,12 +2470,13 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
         rootTag = 'people'
-        rootClass = people
+        rootClass = tomato_people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -3291,13 +2494,17 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = people
+        rootTag = 'people'
+        rootClass = tomato_people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -3305,26 +2512,27 @@ def parseString(inString, silence=False):
     if not silence:
         sys.stdout.write('<?xml version="1.0" ?>\n')
         rootObj.export(
-            sys.stdout, 0, name_="people",
+            sys.stdout, 0, name_=rootTag,
             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
         rootTag = 'people'
-        rootClass = people
+        rootClass = tomato_people
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
     if not silence:
-        sys.stdout.write('#from out2_sup import *\n\n')
-        sys.stdout.write('import out2_sup as model_\n\n')
-        sys.stdout.write('rootObj = model_.rootTag(\n')
+        sys.stdout.write('#from prefix_classname2_sup import *\n\n')
+        sys.stdout.write('import prefix_classname2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
         sys.stdout.write(')\n')
     return rootObj
@@ -3344,16 +2552,16 @@ if __name__ == '__main__':
 
 
 __all__ = [
-    "agent",
-    "booster",
-    "client_handlerType",
-    "comments",
-    "info",
-    "java_programmer",
-    "param",
-    "people",
-    "person",
-    "programmer",
-    "python_programmer",
-    "special_agent"
+    "tomato_agent",
+    "tomato_booster",
+    "tomato_client_handlerType",
+    "tomato_comments",
+    "tomato_info",
+    "tomato_java_programmer",
+    "tomato_param",
+    "tomato_people",
+    "tomato_person",
+    "tomato_programmer",
+    "tomato_python_programmer",
+    "tomato_special_agent"
 ]
diff --git a/tests/recursive_simpletype1_sub.py b/tests/recursive_simpletype1_sub.py
index db59f2a..336b026 100644
--- a/tests/recursive_simpletype1_sub.py
+++ b/tests/recursive_simpletype1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/recursive_simpletype2_sup.py')
+#   ('-s', 'tests/recursive_simpletype2_sub.py')
+#   ('--super', 'recursive_simpletype2_sup')
+#
+# Command line arguments:
+#   tests/recursive_simpletype.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/recursive_simpletype2_sup.py" -s "tests/recursive_simpletype2_sub.py" --super="recursive_simpletype2_sup" tests/recursive_simpletype.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import recursive_simpletype2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -91,11 +64,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -111,11 +85,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -135,11 +110,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -154,11 +130,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PersonType'
         rootClass = supermod.PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -167,8 +144,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from recursive_simpletype2_sup import *\n\n')
 ##         sys.stdout.write('import recursive_simpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.person(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="person")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -179,7 +156,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py
index a675310..571ffda 100644
--- a/tests/recursive_simpletype1_sup.py
+++ b/tests/recursive_simpletype1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/recursive_simpletype2_sup.py')
+#   ('-s', 'tests/recursive_simpletype2_sub.py')
+#   ('--super', 'recursive_simpletype2_sup')
+#
+# Command line arguments:
+#   tests/recursive_simpletype.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/recursive_simpletype2_sup.py" -s "tests/recursive_simpletype2_sub.py" --super="recursive_simpletype2_sup" tests/recursive_simpletype.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -617,10 +669,16 @@ class PersonType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, personId=None, fname=None, lname=None):
+        self.original_tagname_ = None
         self.personId = personId
         self.fname = fname
         self.lname = lname
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, PersonType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if PersonType.subclass:
             return PersonType.subclass(*args_, **kwargs_)
         else:
@@ -646,13 +704,15 @@ class PersonType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='PersonType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='PersonType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -669,34 +729,17 @@ class PersonType(GeneratedsSuper):
             outfile.write('<%spersonId>%s</%spersonId>%s' % (namespace_, self.gds_format_integer(self.personId, input_name='personId'), namespace_, eol_))
         if self.fname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfname>%s</%sfname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fname).encode(ExternalEncoding), input_name='fname'), namespace_, eol_))
+            outfile.write('<%sfname>%s</%sfname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.fname), input_name='fname')), namespace_, eol_))
         if self.lname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%slname>%s</%slname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lname).encode(ExternalEncoding), input_name='lname'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='PersonType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.personId is not None:
-            showIndent(outfile, level)
-            outfile.write('personId=%d,\n' % self.personId)
-        if self.fname is not None:
-            showIndent(outfile, level)
-            outfile.write('fname=%s,\n' % quote_python(self.fname).encode(ExternalEncoding))
-        if self.lname is not None:
-            showIndent(outfile, level)
-            outfile.write('lname=%s,\n' % quote_python(self.lname).encode(ExternalEncoding))
+            outfile.write('<%slname>%s</%slname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lname), input_name='lname')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -704,7 +747,7 @@ class PersonType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'personId')
             self.personId = ival_
@@ -730,7 +773,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -743,11 +786,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -763,11 +807,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -786,12 +831,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -800,17 +849,18 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="person",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
+        rootTag = 'PersonType'
         rootClass = PersonType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -819,7 +869,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from recursive_simpletype2_sup import *\n\n')
 ##         sys.stdout.write('import recursive_simpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/reference_simpletype.xsd b/tests/reference_simpletype.xsd
new file mode 100644
index 0000000..48727fc
--- /dev/null
+++ b/tests/reference_simpletype.xsd
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2015 (x64) (http://www.altova.com) by Michael de Paly (FOTON Germany Construction Machines) -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
+    <xs:element name="test_ref_element" type="xs:integer"/>
+    <xs:attribute name="test_ref_attr" type="xs:integer"/>
+    <xs:attribute name="other_ref_attr" type="xs:float"/>
+    <xs:element name="dummy">
+        <xs:annotation>
+            <xs:documentation>Comment describing your root element</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element ref="test_ref_element"/>
+                <xs:element name="test_normal_element" type="xs:integer"/>
+            </xs:sequence>
+            <xs:attribute ref="test_ref_attr"/>
+            <xs:attribute name="test_normal_attr" type="xs:integer"/>
+        </xs:complexType>
+    </xs:element>
+</xs:schema>
diff --git a/tests/recursive_simpletype2_sub.py b/tests/reference_simpletype1_sub.py
similarity index 50%
rename from tests/recursive_simpletype2_sub.py
rename to tests/reference_simpletype1_sub.py
index db59f2a..9297c7a 100644
--- a/tests/recursive_simpletype2_sub.py
+++ b/tests/reference_simpletype1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/reference_simpletype2_sup.py')
+#   ('-s', 'tests/reference_simpletype2_sub.py')
+#   ('--super', 'reference_simpletype2_sup')
+#
+# Command line arguments:
+#   tests/reference_simpletype.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/reference_simpletype2_sup.py" -s "tests/reference_simpletype2_sub.py" --super="reference_simpletype2_sup" tests/reference_simpletype.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
+
+import reference_simpletype2_sup as supermod
 
-import recursive_simpletype2_sup as supermod
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -74,11 +47,11 @@ ExternalEncoding = 'ascii'
 #
 
 
-class PersonTypeSub(supermod.PersonType):
-    def __init__(self, personId=None, fname=None, lname=None):
-        super(PersonTypeSub, self).__init__(personId, fname, lname, )
-supermod.PersonType.subclass = PersonTypeSub
-# end class PersonTypeSub
+class dummySub(supermod.dummy):
+    def __init__(self, test_ref_attr=None, test_normal_attr=None, test_ref_element=None, test_normal_element=None):
+        super(dummySub, self).__init__(test_ref_attr, test_normal_attr, test_ref_element, test_normal_element, )
+supermod.dummy.subclass = dummySub
+# end class dummySub
 
 
 def get_root_tag(node):
@@ -91,12 +64,13 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
-        rootClass = supermod.PersonType
+        rootTag = 'xs_integer'
+        rootClass = supermod.xs_integer
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -111,12 +85,13 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
-        rootClass = supermod.PersonType
+        rootTag = 'xs_integer'
+        rootClass = supermod.xs_integer
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -135,12 +110,13 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'person'
-        rootClass = supermod.PersonType
+        rootTag = 'xs_integer'
+        rootClass = supermod.xs_integer
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -154,21 +130,22 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = supermod.PersonType
+        rootTag = 'xs_integer'
+        rootClass = supermod.xs_integer
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
 ##     if not silence:
-##         sys.stdout.write('#from recursive_simpletype2_sup import *\n\n')
-##         sys.stdout.write('import recursive_simpletype2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.person(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="person")
+##         sys.stdout.write('#from reference_simpletype2_sup import *\n\n')
+##         sys.stdout.write('import reference_simpletype2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -179,7 +156,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/attr_groups2_sup.py b/tests/reference_simpletype1_sup.py
similarity index 63%
rename from tests/attr_groups2_sup.py
rename to tests/reference_simpletype1_sup.py
index d1db370..849823a 100644
--- a/tests/attr_groups2_sup.py
+++ b/tests/reference_simpletype1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/reference_simpletype2_sup.py')
+#   ('-s', 'tests/reference_simpletype2_sub.py')
+#   ('--super', 'reference_simpletype2_sup')
+#
+# Command line arguments:
+#   tests/reference_simpletype.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/reference_simpletype2_sup.py" -s "tests/reference_simpletype2_sub.py" --super="reference_simpletype2_sup" tests/reference_simpletype.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -608,217 +660,128 @@ def _cast(typ, value):
 #
 
 
-class GetUserReq(GeneratedsSuper):
+class dummy(GeneratedsSuper):
+    """Comment describing your root element"""
     member_data_items_ = [
-        MemberSpec_('value04', 'xsd:integer', 0),
-        MemberSpec_('value05', 'xsd:string', 0),
-        MemberSpec_('value06', 'xsd:integer', 0),
-        MemberSpec_('value07', 'xsd:integer', 0),
-        MemberSpec_('value01', 'xsd:string', 0),
-        MemberSpec_('value02', 'xsd:integer', 0),
-        MemberSpec_('value03', 'xsd:string', 0),
-        MemberSpec_('sequence', 'xsd:unsignedLong', 0),
-        MemberSpec_('returnedTags', 'xsd:string', 0),
+        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),
     ]
     subclass = None
     superclass = None
-    def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None):
-        self.value04 = _cast(int, value04)
-        self.value05 = _cast(None, value05)
-        self.value06 = _cast(int, value06)
-        self.value07 = _cast(int, value07)
-        self.value01 = _cast(None, value01)
-        self.value02 = _cast(int, value02)
-        self.value03 = _cast(None, value03)
-        self.sequence = _cast(int, sequence)
-        self.returnedTags = returnedTags
+    def __init__(self, test_ref_attr=None, test_normal_attr=None, test_ref_element=None, test_normal_element=None):
+        self.original_tagname_ = None
+        self.test_ref_attr = _cast(int, test_ref_attr)
+        self.test_normal_attr = _cast(int, test_normal_attr)
+        self.test_ref_element = test_ref_element
+        self.test_normal_element = test_normal_element
     def factory(*args_, **kwargs_):
-        if GetUserReq.subclass:
-            return GetUserReq.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, dummy)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if dummy.subclass:
+            return dummy.subclass(*args_, **kwargs_)
         else:
-            return GetUserReq(*args_, **kwargs_)
+            return dummy(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_returnedTags(self): return self.returnedTags
-    def set_returnedTags(self, returnedTags): self.returnedTags = returnedTags
-    def get_value04(self): return self.value04
-    def set_value04(self, value04): self.value04 = value04
-    def get_value05(self): return self.value05
-    def set_value05(self, value05): self.value05 = value05
-    def get_value06(self): return self.value06
-    def set_value06(self, value06): self.value06 = value06
-    def get_value07(self): return self.value07
-    def set_value07(self, value07): self.value07 = value07
-    def get_value01(self): return self.value01
-    def set_value01(self, value01): self.value01 = value01
-    def get_value02(self): return self.value02
-    def set_value02(self, value02): self.value02 = value02
-    def get_value03(self): return self.value03
-    def set_value03(self, value03): self.value03 = value03
-    def get_sequence(self): return self.sequence
-    def set_sequence(self, sequence): self.sequence = sequence
+    def get_test_ref_element(self): return self.test_ref_element
+    def set_test_ref_element(self, test_ref_element): self.test_ref_element = test_ref_element
+    def get_test_normal_element(self): return self.test_normal_element
+    def set_test_normal_element(self, test_normal_element): self.test_normal_element = test_normal_element
+    def get_test_ref_attr(self): return self.test_ref_attr
+    def set_test_ref_attr(self, test_ref_attr): self.test_ref_attr = test_ref_attr
+    def get_test_normal_attr(self): return self.test_normal_attr
+    def set_test_normal_attr(self, test_normal_attr): self.test_normal_attr = test_normal_attr
     def hasContent_(self):
         if (
-            self.returnedTags is not None
+            self.test_ref_element is not None or
+            self.test_normal_element is not None
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='GetUserReq', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='dummy', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='GetUserReq')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='dummy')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='dummy', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='GetUserReq'):
-        if self.value04 is not None and 'value04' not in already_processed:
-            already_processed.add('value04')
-            outfile.write(' value04="%s"' % self.gds_format_integer(self.value04, input_name='value04'))
-        if self.value05 is not None and 'value05' not in already_processed:
-            already_processed.add('value05')
-            outfile.write(' value05=%s' % (self.gds_format_string(quote_attrib(self.value05).encode(ExternalEncoding), input_name='value05'), ))
-        if self.value06 is not None and 'value06' not in already_processed:
-            already_processed.add('value06')
-            outfile.write(' value06="%s"' % self.gds_format_integer(self.value06, input_name='value06'))
-        if self.value07 is not None and 'value07' not in already_processed:
-            already_processed.add('value07')
-            outfile.write(' value07="%s"' % self.gds_format_integer(self.value07, input_name='value07'))
-        if self.value01 is not None and 'value01' not in already_processed:
-            already_processed.add('value01')
-            outfile.write(' value01=%s' % (self.gds_format_string(quote_attrib(self.value01).encode(ExternalEncoding), input_name='value01'), ))
-        if self.value02 is not None and 'value02' not in already_processed:
-            already_processed.add('value02')
-            outfile.write(' value02="%s"' % self.gds_format_integer(self.value02, input_name='value02'))
-        if self.value03 is not None and 'value03' not in already_processed:
-            already_processed.add('value03')
-            outfile.write(' value03=%s' % (self.gds_format_string(quote_attrib(self.value03).encode(ExternalEncoding), input_name='value03'), ))
-        if self.sequence is not None and 'sequence' not in already_processed:
-            already_processed.add('sequence')
-            outfile.write(' sequence="%s"' % self.gds_format_integer(self.sequence, input_name='sequence'))
-    def exportChildren(self, outfile, level, namespace_='', name_='GetUserReq', fromsubclass_=False, pretty_print=True):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='dummy'):
+        if self.test_ref_attr is not None and 'test_ref_attr' not in already_processed:
+            already_processed.add('test_ref_attr')
+            outfile.write(' test_ref_attr="%s"' % self.gds_format_integer(self.test_ref_attr, input_name='test_ref_attr'))
+        if self.test_normal_attr is not None and 'test_normal_attr' not in already_processed:
+            already_processed.add('test_normal_attr')
+            outfile.write(' test_normal_attr="%s"' % self.gds_format_integer(self.test_normal_attr, input_name='test_normal_attr'))
+    def exportChildren(self, outfile, level, namespace_='', name_='dummy', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
-        if self.returnedTags is not None:
+        if self.test_ref_element is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sreturnedTags>%s</%sreturnedTags>%s' % (namespace_, self.gds_format_string(quote_xml(self.returnedTags).encode(ExternalEncoding), input_name='returnedTags'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='GetUserReq'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.value04 is not None and 'value04' not in already_processed:
-            already_processed.add('value04')
-            showIndent(outfile, level)
-            outfile.write('value04=%d,\n' % (self.value04,))
-        if self.value05 is not None and 'value05' not in already_processed:
-            already_processed.add('value05')
-            showIndent(outfile, level)
-            outfile.write('value05="%s",\n' % (self.value05,))
-        if self.value06 is not None and 'value06' not in already_processed:
-            already_processed.add('value06')
-            showIndent(outfile, level)
-            outfile.write('value06=%d,\n' % (self.value06,))
-        if self.value07 is not None and 'value07' not in already_processed:
-            already_processed.add('value07')
-            showIndent(outfile, level)
-            outfile.write('value07=%d,\n' % (self.value07,))
-        if self.value01 is not None and 'value01' not in already_processed:
-            already_processed.add('value01')
-            showIndent(outfile, level)
-            outfile.write('value01="%s",\n' % (self.value01,))
-        if self.value02 is not None and 'value02' not in already_processed:
-            already_processed.add('value02')
-            showIndent(outfile, level)
-            outfile.write('value02=%d,\n' % (self.value02,))
-        if self.value03 is not None and 'value03' not in already_processed:
-            already_processed.add('value03')
-            showIndent(outfile, level)
-            outfile.write('value03="%s",\n' % (self.value03,))
-        if self.sequence is not None and 'sequence' not in already_processed:
-            already_processed.add('sequence')
-            showIndent(outfile, level)
-            outfile.write('sequence=%d,\n' % (self.sequence,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.returnedTags is not None:
-            showIndent(outfile, level)
-            outfile.write('returnedTags=%s,\n' % quote_python(self.returnedTags).encode(ExternalEncoding))
+            outfile.write('<%stest_ref_element>%s</%stest_ref_element>%s' % (namespace_, self.gds_format_integer(self.test_ref_element, input_name='test_ref_element'), namespace_, eol_))
+        if self.test_normal_element is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stest_normal_element>%s</%stest_normal_element>%s' % (namespace_, self.gds_format_integer(self.test_normal_element, input_name='test_normal_element'), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('value04', node)
-        if value is not None and 'value04' not in already_processed:
-            already_processed.add('value04')
+        value = find_attr_value_('test_ref_attr', node)
+        if value is not None and 'test_ref_attr' not in already_processed:
+            already_processed.add('test_ref_attr')
             try:
-                self.value04 = int(value)
-            except ValueError, exp:
+                self.test_ref_attr = int(value)
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value05', node)
-        if value is not None and 'value05' not in already_processed:
-            already_processed.add('value05')
-            self.value05 = value
-        value = find_attr_value_('value06', node)
-        if value is not None and 'value06' not in already_processed:
-            already_processed.add('value06')
+        value = find_attr_value_('test_normal_attr', node)
+        if value is not None and 'test_normal_attr' not in already_processed:
+            already_processed.add('test_normal_attr')
             try:
-                self.value06 = int(value)
-            except ValueError, exp:
+                self.test_normal_attr = int(value)
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value07', node)
-        if value is not None and 'value07' not in already_processed:
-            already_processed.add('value07')
-            try:
-                self.value07 = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value01', node)
-        if value is not None and 'value01' not in already_processed:
-            already_processed.add('value01')
-            self.value01 = value
-        value = find_attr_value_('value02', node)
-        if value is not None and 'value02' not in already_processed:
-            already_processed.add('value02')
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'test_ref_element':
+            sval_ = child_.text
             try:
-                self.value02 = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value03', node)
-        if value is not None and 'value03' not in already_processed:
-            already_processed.add('value03')
-            self.value03 = value
-        value = find_attr_value_('sequence', node)
-        if value is not None and 'sequence' not in already_processed:
-            already_processed.add('sequence')
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'test_ref_element')
+            self.test_ref_element = ival_
+        elif nodeName_ == 'test_normal_element':
+            sval_ = child_.text
             try:
-                self.sequence = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'returnedTags':
-            returnedTags_ = child_.text
-            returnedTags_ = self.gds_validate_string(returnedTags_, node, 'returnedTags')
-            self.returnedTags = returnedTags_
-# end class GetUserReq
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'test_normal_element')
+            self.test_normal_element = ival_
+# end class dummy
 
 
 GDSClassesMapping = {
-    'getUser': GetUserReq,
 }
 
 
@@ -828,7 +791,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -841,12 +804,13 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
-        rootClass = GetUserReq
+        rootTag = 'xs_integer'
+        rootClass = xs_integer
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -861,12 +825,13 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
-        rootClass = GetUserReq
+        rootTag = 'xs_integer'
+        rootClass = xs_integer
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -884,13 +849,17 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootClass = GetUserReq
+        rootTag = 'xs_integer'
+        rootClass = xs_integer
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -898,26 +867,27 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="getUser",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'getUser'
-        rootClass = GetUserReq
+        rootTag = 'xs_integer'
+        rootClass = xs_integer
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
     doc = None
 ##     if not silence:
-##         sys.stdout.write('#from attr_groups2_sup import *\n\n')
-##         sys.stdout.write('import attr_groups2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('#from reference_simpletype2_sup import *\n\n')
+##         sys.stdout.write('import reference_simpletype2_sup as model_\n\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
@@ -937,5 +907,5 @@ if __name__ == '__main__':
 
 
 __all__ = [
-    "GetUserReq"
+    "dummy"
 ]
diff --git a/tests/rem_dup_elems.xml b/tests/rem_dup_elems.xml
new file mode 100644
index 0000000..6db5379
--- /dev/null
+++ b/tests/rem_dup_elems.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<authors>
+    <author>
+        <description>description one</description>
+    </author>
+    <author>
+        <description>description two</description>
+    </author>
+    <cooperation>sample cooperation one</cooperation>
+    <author>
+        <description>description three</description>
+    </author>
+    <cooperation>sample cooperation two</cooperation>
+    <author>
+        <description>description four</description>
+    </author>
+    <cooperation>sample cooperation three</cooperation>
+</authors>
diff --git a/tests/rem_dup_elems.xsd b/tests/rem_dup_elems.xsd
new file mode 100644
index 0000000..5cb3ed3
--- /dev/null
+++ b/tests/rem_dup_elems.xsd
@@ -0,0 +1,22 @@
+<xsd:schema
+    xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
+    >
+
+    <xsd:element name="authors" type="authorsType" />
+    <xsd:complexType name="authorsType">
+        <xsd:sequence>
+            <xsd:element ref="author"/>
+            <xsd:choice maxOccurs="unbounded" minOccurs="0">
+                <xsd:element ref="author"/>
+                <xsd:element name="cooperation" type="xsd:string"/>
+            </xsd:choice>
+        </xsd:sequence>
+    </xsd:complexType>
+
+    <xsd:complexType name="author">
+        <xsd:sequence>
+            <xsd:element name="description" type="xsd:string"/>
+        </xsd:sequence>
+    </xsd:complexType>
+
+</xsd:schema>
diff --git a/tests/rem_dup_elems1_out.xml b/tests/rem_dup_elems1_out.xml
new file mode 100644
index 0000000..69b44af
--- /dev/null
+++ b/tests/rem_dup_elems1_out.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" ?>
+<authors>
+    <author>
+        <description>description one</description>
+    </author>
+    <author>
+        <description>description two</description>
+    </author>
+    <author>
+        <description>description three</description>
+    </author>
+    <author>
+        <description>description four</description>
+    </author>
+    <cooperation>sample cooperation one</cooperation>
+    <cooperation>sample cooperation two</cooperation>
+    <cooperation>sample cooperation three</cooperation>
+</authors>
diff --git a/tests/rem_dup_elems1_sub.py b/tests/rem_dup_elems1_sub.py
new file mode 100644
index 0000000..c9f7ba4
--- /dev/null
+++ b/tests/rem_dup_elems1_sub.py
@@ -0,0 +1,181 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-a', 'xsd:')
+#   ('-o', 'tests/rem_dup_elems2_sup.py')
+#   ('-s', 'tests/rem_dup_elems2_sub.py')
+#   ('--super', 'rem_dup_elems2_sup')
+#   ('--no-warnings', '')
+#
+# Command line arguments:
+#   tests/rem_dup_elems.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -a "xsd:" -o "tests/rem_dup_elems2_sup.py" -s "tests/rem_dup_elems2_sub.py" --super="rem_dup_elems2_sup" --no-warnings tests/rem_dup_elems.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import rem_dup_elems2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class authorsTypeSub(supermod.authorsType):
+    def __init__(self, author=None, cooperation=None):
+        super(authorsTypeSub, self).__init__(author, cooperation, )
+supermod.authorsType.subclass = authorsTypeSub
+# end class authorsTypeSub
+
+
+class authorSub(supermod.author):
+    def __init__(self, description=None):
+        super(authorSub, self).__init__(description, )
+supermod.author.subclass = authorSub
+# end class authorSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'authorsType'
+        rootClass = supermod.authorsType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'authorsType'
+        rootClass = supermod.authorsType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'authorsType'
+        rootClass = supermod.authorsType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'authorsType'
+        rootClass = supermod.authorsType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from rem_dup_elems2_sup import *\n\n')
+        sys.stdout.write('import rem_dup_elems2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/rem_dup_elems1_sup.py b/tests/rem_dup_elems1_sup.py
new file mode 100644
index 0000000..ee67fd2
--- /dev/null
+++ b/tests/rem_dup_elems1_sup.py
@@ -0,0 +1,965 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-a', 'xsd:')
+#   ('-o', 'tests/rem_dup_elems2_sup.py')
+#   ('-s', 'tests/rem_dup_elems2_sub.py')
+#   ('--super', 'rem_dup_elems2_sup')
+#   ('--no-warnings', '')
+#
+# Command line arguments:
+#   tests/rem_dup_elems.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -a "xsd:" -o "tests/rem_dup_elems2_sup.py" -s "tests/rem_dup_elems2_sub.py" --super="rem_dup_elems2_sup" --no-warnings tests/rem_dup_elems.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class authorsType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('author', 'author', 1),
+        MemberSpec_('cooperation', 'xsd:string', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, author=None, cooperation=None):
+        self.original_tagname_ = None
+        if author is None:
+            self.author = []
+        else:
+            self.author = author
+        if cooperation is None:
+            self.cooperation = []
+        else:
+            self.cooperation = cooperation
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, authorsType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if authorsType.subclass:
+            return authorsType.subclass(*args_, **kwargs_)
+        else:
+            return authorsType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_author(self): return self.author
+    def set_author(self, author): self.author = author
+    def add_author(self, value): self.author.append(value)
+    def insert_author_at(self, index, value): self.author.insert(index, value)
+    def replace_author_at(self, index, value): self.author[index] = value
+    def get_cooperation(self): return self.cooperation
+    def set_cooperation(self, cooperation): self.cooperation = cooperation
+    def add_cooperation(self, value): self.cooperation.append(value)
+    def insert_cooperation_at(self, index, value): self.cooperation.insert(index, value)
+    def replace_cooperation_at(self, index, value): self.cooperation[index] = value
+    def hasContent_(self):
+        if (
+            self.author or
+            self.cooperation
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='authorsType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='authorsType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='authorsType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='authorsType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='authorsType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for author_ in self.author:
+            author_.export(outfile, level, namespace_, name_='author', pretty_print=pretty_print)
+        for cooperation_ in self.cooperation:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%scooperation>%s</%scooperation>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(cooperation_), input_name='cooperation')), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'author':
+            obj_ = author.factory()
+            obj_.build(child_)
+            self.author.append(obj_)
+            obj_.original_tagname_ = 'author'
+        elif nodeName_ == 'cooperation':
+            cooperation_ = child_.text
+            cooperation_ = self.gds_validate_string(cooperation_, node, 'cooperation')
+            self.cooperation.append(cooperation_)
+# end class authorsType
+
+
+class author(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('description', 'xsd:string', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, description=None):
+        self.original_tagname_ = None
+        self.description = description
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, author)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if author.subclass:
+            return author.subclass(*args_, **kwargs_)
+        else:
+            return author(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_description(self): return self.description
+    def set_description(self, description): self.description = description
+    def hasContent_(self):
+        if (
+            self.description is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='author', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='author')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='author', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='author'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='author', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.description is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'description':
+            description_ = child_.text
+            description_ = self.gds_validate_string(description_, node, 'description')
+            self.description = description_
+# end class author
+
+
+GDSClassesMapping = {
+    'authors': authorsType,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'authorsType'
+        rootClass = authorsType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'authorsType'
+        rootClass = authorsType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'authorsType'
+        rootClass = authorsType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'authorsType'
+        rootClass = authorsType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from rem_dup_elems2_sup import *\n\n')
+        sys.stdout.write('import rem_dup_elems2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "author",
+    "authorsType"
+]
diff --git a/tests/simplecontent_restriction1_sub.py b/tests/simplecontent_restriction1_sub.py
index f986e75..8ed52f9 100644
--- a/tests/simplecontent_restriction1_sub.py
+++ b/tests/simplecontent_restriction1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/simplecontent_restriction2_sup.py')
+#   ('-s', 'tests/simplecontent_restriction2_sub.py')
+#   ('--super', 'simplecontent_restriction2_sup')
+#
+# Command line arguments:
+#   tests/simplecontent_restriction.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simplecontent_restriction2_sup.py" -s "tests/simplecontent_restriction2_sub.py" --super="simplecontent_restriction2_sup" tests/simplecontent_restriction.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import simplecontent_restriction2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,22 +48,22 @@ ExternalEncoding = 'ascii'
 
 
 class IdentifierTypeSub(supermod.IdentifierType):
-    def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None, extensiontype_=None):
-        super(IdentifierTypeSub, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, extensiontype_, )
+    def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None, extensiontype_=None):
+        super(IdentifierTypeSub, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, extensiontype_, )
 supermod.IdentifierType.subclass = IdentifierTypeSub
 # end class IdentifierTypeSub
 
 
 class BillOfResourcesIDTypeSub(supermod.BillOfResourcesIDType):
-    def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None):
-        super(BillOfResourcesIDTypeSub, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, )
+    def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None):
+        super(BillOfResourcesIDTypeSub, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, )
 supermod.BillOfResourcesIDType.subclass = BillOfResourcesIDTypeSub
 # end class BillOfResourcesIDTypeSub
 
 
 class BillOfMaterialIDTypeSub(supermod.BillOfMaterialIDType):
-    def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None):
-        super(BillOfMaterialIDTypeSub, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, )
+    def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None):
+        super(BillOfMaterialIDTypeSub, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, )
 supermod.BillOfMaterialIDType.subclass = BillOfMaterialIDTypeSub
 # end class BillOfMaterialIDTypeSub
 
@@ -105,7 +78,8 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -125,7 +99,8 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -149,7 +124,8 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -168,11 +144,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'IdentifierType'
         rootClass = supermod.IdentifierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -181,8 +158,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simplecontent_restriction2_sup import *\n\n')
 ##         sys.stdout.write('import simplecontent_restriction2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.IdentifierType(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="IdentifierType")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -193,7 +170,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py
index 330b45e..155013f 100644
--- a/tests/simplecontent_restriction1_sup.py
+++ b/tests/simplecontent_restriction1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/simplecontent_restriction2_sup.py')
+#   ('-s', 'tests/simplecontent_restriction2_sub.py')
+#   ('--super', 'simplecontent_restriction2_sup')
+#
+# Command line arguments:
+#   tests/simplecontent_restriction.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simplecontent_restriction2_sup.py" -s "tests/simplecontent_restriction2_sub.py" --super="simplecontent_restriction2_sup" tests/simplecontent_restriction.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -610,45 +662,51 @@ def _cast(typ, value):
 
 class IdentifierType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('schemeDataURI', 'xsd:anyURI', 0),
         MemberSpec_('schemeID', 'xsd:normalizedString', 0),
-        MemberSpec_('schemeAgencyName', 'xsd:string', 0),
-        MemberSpec_('schemeAgencyID', '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_('valueOf_', 'xsd:normalizedString', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None, extensiontype_=None):
-        self.schemeDataURI = _cast(None, schemeDataURI)
+    def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.schemeID = _cast(None, schemeID)
-        self.schemeAgencyName = _cast(None, schemeAgencyName)
-        self.schemeAgencyID = _cast(None, schemeAgencyID)
         self.schemeName = _cast(None, schemeName)
+        self.schemeAgencyID = _cast(None, schemeAgencyID)
+        self.schemeAgencyName = _cast(None, schemeAgencyName)
         self.schemeVersionID = _cast(None, schemeVersionID)
+        self.schemeDataURI = _cast(None, schemeDataURI)
         self.schemeURI = _cast(None, schemeURI)
         self.valueOf_ = valueOf_
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, IdentifierType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if IdentifierType.subclass:
             return IdentifierType.subclass(*args_, **kwargs_)
         else:
             return IdentifierType(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_schemeDataURI(self): return self.schemeDataURI
-    def set_schemeDataURI(self, schemeDataURI): self.schemeDataURI = schemeDataURI
     def get_schemeID(self): return self.schemeID
     def set_schemeID(self, schemeID): self.schemeID = schemeID
-    def get_schemeAgencyName(self): return self.schemeAgencyName
-    def set_schemeAgencyName(self, schemeAgencyName): self.schemeAgencyName = schemeAgencyName
-    def get_schemeAgencyID(self): return self.schemeAgencyID
-    def set_schemeAgencyID(self, schemeAgencyID): self.schemeAgencyID = schemeAgencyID
     def get_schemeName(self): return self.schemeName
     def set_schemeName(self, schemeName): self.schemeName = schemeName
+    def get_schemeAgencyID(self): return self.schemeAgencyID
+    def set_schemeAgencyID(self, schemeAgencyID): self.schemeAgencyID = schemeAgencyID
+    def get_schemeAgencyName(self): return self.schemeAgencyName
+    def set_schemeAgencyName(self, schemeAgencyName): self.schemeAgencyName = schemeAgencyName
     def get_schemeVersionID(self): return self.schemeVersionID
     def set_schemeVersionID(self, schemeVersionID): self.schemeVersionID = schemeVersionID
+    def get_schemeDataURI(self): return self.schemeDataURI
+    def set_schemeDataURI(self, schemeDataURI): self.schemeDataURI = schemeDataURI
     def get_schemeURI(self): return self.schemeURI
     def set_schemeURI(self, schemeURI): self.schemeURI = schemeURI
     def get_valueOf_(self): return self.valueOf_
@@ -657,7 +715,7 @@ class IdentifierType(GeneratedsSuper):
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -667,84 +725,47 @@ class IdentifierType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='IdentifierType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='IdentifierType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='IdentifierType'):
-        if self.schemeDataURI is not None and 'schemeDataURI' not in already_processed:
-            already_processed.add('schemeDataURI')
-            outfile.write(' schemeDataURI=%s' % (self.gds_format_string(quote_attrib(self.schemeDataURI).encode(ExternalEncoding), input_name='schemeDataURI'), ))
         if self.schemeID is not None and 'schemeID' not in already_processed:
             already_processed.add('schemeID')
-            outfile.write(' schemeID=%s' % (self.gds_format_string(quote_attrib(self.schemeID).encode(ExternalEncoding), input_name='schemeID'), ))
-        if self.schemeAgencyName is not None and 'schemeAgencyName' not in already_processed:
-            already_processed.add('schemeAgencyName')
-            outfile.write(' schemeAgencyName=%s' % (self.gds_format_string(quote_attrib(self.schemeAgencyName).encode(ExternalEncoding), input_name='schemeAgencyName'), ))
-        if self.schemeAgencyID is not None and 'schemeAgencyID' not in already_processed:
-            already_processed.add('schemeAgencyID')
-            outfile.write(' schemeAgencyID=%s' % (self.gds_format_string(quote_attrib(self.schemeAgencyID).encode(ExternalEncoding), input_name='schemeAgencyID'), ))
+            outfile.write(' schemeID=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeID), input_name='schemeID')), ))
         if self.schemeName is not None and 'schemeName' not in already_processed:
             already_processed.add('schemeName')
-            outfile.write(' schemeName=%s' % (self.gds_format_string(quote_attrib(self.schemeName).encode(ExternalEncoding), input_name='schemeName'), ))
+            outfile.write(' schemeName=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeName), input_name='schemeName')), ))
+        if self.schemeAgencyID is not None and 'schemeAgencyID' not in already_processed:
+            already_processed.add('schemeAgencyID')
+            outfile.write(' schemeAgencyID=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeAgencyID), input_name='schemeAgencyID')), ))
+        if self.schemeAgencyName is not None and 'schemeAgencyName' not in already_processed:
+            already_processed.add('schemeAgencyName')
+            outfile.write(' schemeAgencyName=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeAgencyName), input_name='schemeAgencyName')), ))
         if self.schemeVersionID is not None and 'schemeVersionID' not in already_processed:
             already_processed.add('schemeVersionID')
-            outfile.write(' schemeVersionID=%s' % (self.gds_format_string(quote_attrib(self.schemeVersionID).encode(ExternalEncoding), input_name='schemeVersionID'), ))
+            outfile.write(' schemeVersionID=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeVersionID), input_name='schemeVersionID')), ))
+        if self.schemeDataURI is not None and 'schemeDataURI' not in already_processed:
+            already_processed.add('schemeDataURI')
+            outfile.write(' schemeDataURI=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeDataURI), input_name='schemeDataURI')), ))
         if self.schemeURI is not None and 'schemeURI' not in already_processed:
             already_processed.add('schemeURI')
-            outfile.write(' schemeURI=%s' % (self.gds_format_string(quote_attrib(self.schemeURI).encode(ExternalEncoding), input_name='schemeURI'), ))
+            outfile.write(' schemeURI=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeURI), input_name='schemeURI')), ))
         if self.extensiontype_ is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
             outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
             outfile.write(' xsi:type="%s"' % self.extensiontype_)
     def exportChildren(self, outfile, level, namespace_='', name_='IdentifierType', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='IdentifierType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.schemeDataURI is not None and 'schemeDataURI' not in already_processed:
-            already_processed.add('schemeDataURI')
-            showIndent(outfile, level)
-            outfile.write('schemeDataURI="%s",\n' % (self.schemeDataURI,))
-        if self.schemeID is not None and 'schemeID' not in already_processed:
-            already_processed.add('schemeID')
-            showIndent(outfile, level)
-            outfile.write('schemeID="%s",\n' % (self.schemeID,))
-        if self.schemeAgencyName is not None and 'schemeAgencyName' not in already_processed:
-            already_processed.add('schemeAgencyName')
-            showIndent(outfile, level)
-            outfile.write('schemeAgencyName="%s",\n' % (self.schemeAgencyName,))
-        if self.schemeAgencyID is not None and 'schemeAgencyID' not in already_processed:
-            already_processed.add('schemeAgencyID')
-            showIndent(outfile, level)
-            outfile.write('schemeAgencyID="%s",\n' % (self.schemeAgencyID,))
-        if self.schemeName is not None and 'schemeName' not in already_processed:
-            already_processed.add('schemeName')
-            showIndent(outfile, level)
-            outfile.write('schemeName="%s",\n' % (self.schemeName,))
-        if self.schemeVersionID is not None and 'schemeVersionID' not in already_processed:
-            already_processed.add('schemeVersionID')
-            showIndent(outfile, level)
-            outfile.write('schemeVersionID="%s",\n' % (self.schemeVersionID,))
-        if self.schemeURI is not None and 'schemeURI' not in already_processed:
-            already_processed.add('schemeURI')
-            showIndent(outfile, level)
-            outfile.write('schemeURI="%s",\n' % (self.schemeURI,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -752,31 +773,32 @@ class IdentifierType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('schemeDataURI', node)
-        if value is not None and 'schemeDataURI' not in already_processed:
-            already_processed.add('schemeDataURI')
-            self.schemeDataURI = value
         value = find_attr_value_('schemeID', node)
         if value is not None and 'schemeID' not in already_processed:
             already_processed.add('schemeID')
             self.schemeID = value
-        value = find_attr_value_('schemeAgencyName', node)
-        if value is not None and 'schemeAgencyName' not in already_processed:
-            already_processed.add('schemeAgencyName')
-            self.schemeAgencyName = value
-        value = find_attr_value_('schemeAgencyID', node)
-        if value is not None and 'schemeAgencyID' not in already_processed:
-            already_processed.add('schemeAgencyID')
-            self.schemeAgencyID = value
         value = find_attr_value_('schemeName', node)
         if value is not None and 'schemeName' not in already_processed:
             already_processed.add('schemeName')
             self.schemeName = value
+        value = find_attr_value_('schemeAgencyID', node)
+        if value is not None and 'schemeAgencyID' not in already_processed:
+            already_processed.add('schemeAgencyID')
+            self.schemeAgencyID = value
+        value = find_attr_value_('schemeAgencyName', node)
+        if value is not None and 'schemeAgencyName' not in already_processed:
+            already_processed.add('schemeAgencyName')
+            self.schemeAgencyName = value
         value = find_attr_value_('schemeVersionID', node)
         if value is not None and 'schemeVersionID' not in already_processed:
             already_processed.add('schemeVersionID')
             self.schemeVersionID = value
+        value = find_attr_value_('schemeDataURI', node)
+        if value is not None and 'schemeDataURI' not in already_processed:
+            already_processed.add('schemeDataURI')
+            self.schemeDataURI = value
         value = find_attr_value_('schemeURI', node)
         if value is not None and 'schemeURI' not in already_processed:
             already_processed.add('schemeURI')
@@ -796,10 +818,16 @@ class BillOfResourcesIDType(IdentifierType):
     ]
     subclass = None
     superclass = IdentifierType
-    def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None):
-        super(BillOfResourcesIDType, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, )
+    def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None):
+        self.original_tagname_ = None
+        super(BillOfResourcesIDType, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, )
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, BillOfResourcesIDType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if BillOfResourcesIDType.subclass:
             return BillOfResourcesIDType.subclass(*args_, **kwargs_)
         else:
@@ -809,7 +837,7 @@ class BillOfResourcesIDType(IdentifierType):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_ or
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_ or
             super(BillOfResourcesIDType, self).hasContent_()
         ):
             return True
@@ -820,14 +848,16 @@ class BillOfResourcesIDType(IdentifierType):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BillOfResourcesIDType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='BillOfResourcesIDType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
@@ -836,19 +866,6 @@ class BillOfResourcesIDType(IdentifierType):
     def exportChildren(self, outfile, level, namespace_='', name_='BillOfResourcesIDType', fromsubclass_=False, pretty_print=True):
         super(BillOfResourcesIDType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         pass
-    def exportLiteral(self, outfile, level, name_='BillOfResourcesIDType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(BillOfResourcesIDType, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(BillOfResourcesIDType, self).exportLiteralChildren(outfile, level, name_)
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -856,6 +873,7 @@ class BillOfResourcesIDType(IdentifierType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(BillOfResourcesIDType, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -869,10 +887,16 @@ class BillOfMaterialIDType(IdentifierType):
     ]
     subclass = None
     superclass = IdentifierType
-    def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None):
-        super(BillOfMaterialIDType, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, )
+    def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None):
+        self.original_tagname_ = None
+        super(BillOfMaterialIDType, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, )
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, BillOfMaterialIDType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if BillOfMaterialIDType.subclass:
             return BillOfMaterialIDType.subclass(*args_, **kwargs_)
         else:
@@ -882,7 +906,7 @@ class BillOfMaterialIDType(IdentifierType):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_ or
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_ or
             super(BillOfMaterialIDType, self).hasContent_()
         ):
             return True
@@ -893,14 +917,16 @@ class BillOfMaterialIDType(IdentifierType):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BillOfMaterialIDType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='BillOfMaterialIDType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
@@ -909,19 +935,6 @@ class BillOfMaterialIDType(IdentifierType):
     def exportChildren(self, outfile, level, namespace_='', name_='BillOfMaterialIDType', fromsubclass_=False, pretty_print=True):
         super(BillOfMaterialIDType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         pass
-    def exportLiteral(self, outfile, level, name_='BillOfMaterialIDType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        super(BillOfMaterialIDType, self).exportLiteralAttributes(outfile, level, already_processed, name_)
-    def exportLiteralChildren(self, outfile, level, name_):
-        super(BillOfMaterialIDType, self).exportLiteralChildren(outfile, level, name_)
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -929,6 +942,7 @@ class BillOfMaterialIDType(IdentifierType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(BillOfMaterialIDType, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -946,7 +960,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -959,7 +973,8 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -979,7 +994,8 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -1002,12 +1018,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'IdentifierType'
         rootClass = IdentifierType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1016,13 +1036,14 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="IdentifierType",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -1035,7 +1056,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simplecontent_restriction2_sup import *\n\n')
 ##         sys.stdout.write('import simplecontent_restriction2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/simpletype_memberspecs1_sub.py b/tests/simpletype_memberspecs1_sub.py
index f917d7b..908d5c4 100644
--- a/tests/simpletype_memberspecs1_sub.py
+++ b/tests/simpletype_memberspecs1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/simpletype_memberspecs2_sup.py')
+#   ('-s', 'tests/simpletype_memberspecs2_sub.py')
+#   ('--super', 'simpletype_memberspecs2_sup')
+#
+# Command line arguments:
+#   tests/simpletype_memberspecs.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simpletype_memberspecs2_sup.py" -s "tests/simpletype_memberspecs2_sub.py" --super="simpletype_memberspecs2_sup" tests/simpletype_memberspecs.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import simpletype_memberspecs2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -98,7 +71,8 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -118,7 +92,8 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -142,7 +117,8 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -161,11 +137,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'SpecialDate'
         rootClass = supermod.SpecialDate
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +151,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletype_memberspecs2_sup import *\n\n')
 ##         sys.stdout.write('import simpletype_memberspecs2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.SpecialDate(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="SpecialDate")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -186,7 +163,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index 555820d..7531654 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/simpletype_memberspecs2_sup.py')
+#   ('-s', 'tests/simpletype_memberspecs2_sub.py')
+#   ('--super', 'simpletype_memberspecs2_sup')
+#
+# Command line arguments:
+#   tests/simpletype_memberspecs.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simpletype_memberspecs2_sup.py" -s "tests/simpletype_memberspecs2_sub.py" --super="simpletype_memberspecs2_sup" tests/simpletype_memberspecs.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -616,9 +668,15 @@ class SpecialDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, SpecialProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.SpecialProperty = _cast(None, SpecialProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, SpecialDate)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if SpecialDate.subclass:
             return SpecialDate.subclass(*args_, **kwargs_)
         else:
@@ -630,48 +688,35 @@ class SpecialDate(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='pl:', name_='SpecialDate', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='pl:', name_='SpecialDate', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='SpecialDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='pl:', name_='SpecialDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='pl:', name_='SpecialDate'):
         if self.SpecialProperty is not None and 'SpecialProperty' not in already_processed:
             already_processed.add('SpecialProperty')
-            outfile.write(' SpecialProperty=%s' % (self.gds_format_string(quote_attrib(self.SpecialProperty).encode(ExternalEncoding), input_name='SpecialProperty'), ))
+            outfile.write(' SpecialProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.SpecialProperty), input_name='SpecialProperty')), ))
     def exportChildren(self, outfile, level, namespace_='pl:', name_='SpecialDate', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='SpecialDate'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.SpecialProperty is not None and 'SpecialProperty' not in already_processed:
-            already_processed.add('SpecialProperty')
-            showIndent(outfile, level)
-            outfile.write('SpecialProperty="%s",\n' % (self.SpecialProperty,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -679,6 +724,7 @@ class SpecialDate(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('SpecialProperty', node)
         if value is not None and 'SpecialProperty' not in already_processed:
@@ -697,9 +743,15 @@ class ExtremeDate(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, ExtremeProperty=None, valueOf_=None):
+        self.original_tagname_ = None
         self.ExtremeProperty = _cast(None, ExtremeProperty)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, ExtremeDate)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if ExtremeDate.subclass:
             return ExtremeDate.subclass(*args_, **kwargs_)
         else:
@@ -711,48 +763,35 @@ class ExtremeDate(GeneratedsSuper):
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='pl:', name_='ExtremeDate', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='pl:', name_='ExtremeDate', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='ExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write(str(self.valueOf_).encode(ExternalEncoding))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            outfile.write(self.convert_unicode(self.valueOf_))
+            self.exportChildren(outfile, level + 1, namespace_='pl:', name_='ExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='pl:', name_='ExtremeDate'):
         if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed:
             already_processed.add('ExtremeProperty')
-            outfile.write(' ExtremeProperty=%s' % (self.gds_format_string(quote_attrib(self.ExtremeProperty).encode(ExternalEncoding), input_name='ExtremeProperty'), ))
+            outfile.write(' ExtremeProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.ExtremeProperty), input_name='ExtremeProperty')), ))
     def exportChildren(self, outfile, level, namespace_='pl:', name_='ExtremeDate', fromsubclass_=False, pretty_print=True):
         pass
-    def exportLiteral(self, outfile, level, name_='ExtremeDate'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-        showIndent(outfile, level)
-        outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,))
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed:
-            already_processed.add('ExtremeProperty')
-            showIndent(outfile, level)
-            outfile.write('ExtremeProperty="%s",\n' % (self.ExtremeProperty,))
-    def exportLiteralChildren(self, outfile, level, name_):
-        pass
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -760,6 +799,7 @@ class ExtremeDate(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('ExtremeProperty', node)
         if value is not None and 'ExtremeProperty' not in already_processed:
@@ -780,7 +820,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -793,7 +833,8 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -813,7 +854,8 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -836,12 +878,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'SpecialDate'
         rootClass = SpecialDate
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -850,13 +896,14 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="SpecialDate",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
@@ -869,7 +916,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletype_memberspecs2_sup import *\n\n')
 ##         sys.stdout.write('import simpletype_memberspecs2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/simpletypes_other.xml b/tests/simpletypes_other.xml
new file mode 100644
index 0000000..779a6e2
--- /dev/null
+++ b/tests/simpletypes_other.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<simpleTypeTests
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+>
+
+    <simpleTypeTest>
+        <datetime1>2021</datetime1>
+        <datetime2>2022-06</datetime2>
+        <datetime3>08</datetime3>
+        <datetime4>09-14</datetime4>
+        <datetime5>24</datetime5>
+    </simpleTypeTest>
+
+</simpleTypeTests>
+
diff --git a/tests/simpletypes_other.xsd b/tests/simpletypes_other.xsd
index 95eadb5..5be7d4c 100644
--- a/tests/simpletypes_other.xsd
+++ b/tests/simpletypes_other.xsd
@@ -8,12 +8,14 @@
     </xs:element>
     <xs:complexType name="simpleTypeTestsType">
         <xs:sequence>
-            <xs:element name="simpleTypeTest" maxOccurs="unbounded" type="simpleTypeTestType"/>
+            <xs:element
+                name="simpleTypeTest"
+                maxOccurs="unbounded"
+                type="simpleTypeTestDefs"/>
         </xs:sequence>
     </xs:complexType>
 
-    <xs:element name="simpleTypeTest" type="simpleTypeTestType"/>
-    <xs:complexType mixed="0" name="simpleTypeTest">
+    <xs:complexType mixed="0" name="simpleTypeTestDefs">
         <xs:complexContent>
             <xs:sequence>
                 <xs:element name="datetime1" type="xs:gYear"/>
diff --git a/tests/simpletypes_other2_sub.py b/tests/simpletypes_other1_sub.py
similarity index 58%
rename from tests/simpletypes_other2_sub.py
rename to tests/simpletypes_other1_sub.py
index 81260f7..4792c10 100644
--- a/tests/simpletypes_other2_sub.py
+++ b/tests/simpletypes_other1_sub.py
@@ -3,64 +3,37 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/simpletypes_other2_sup.py')
+#   ('-s', 'tests/simpletypes_other2_sub.py')
+#   ('--super', 'simpletypes_other2_sup')
+#
+# Command line arguments:
+#   tests/simpletypes_other.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simpletypes_other2_sup.py" -s "tests/simpletypes_other2_sub.py" --super="simpletypes_other2_sup" tests/simpletypes_other.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import simpletypes_other2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -81,11 +54,11 @@ supermod.simpleTypeTestsType.subclass = simpleTypeTestsTypeSub
 # end class simpleTypeTestsTypeSub
 
 
-class simpleTypeTestSub(supermod.simpleTypeTest):
+class simpleTypeTestDefsSub(supermod.simpleTypeTestDefs):
     def __init__(self, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None, integerVal1=None, integerVal2=None, stringVal1=None, stringVal2=None, booleanVal1=None, booleanVal2=None, decimalVal1=None, decimalVal2=None, doubleVal1=None, doubleVal2=None, floatVal1=None, floatVal2=None, dateVal1=None, dateVal2=None, dateTimeVal1=None, dateTimeVal2=None):
-        super(simpleTypeTestSub, self).__init__(datetime1, datetime2, datetime3, datetime4, datetime5, integerVal1, integerVal2, stringVal1, stringVal2, booleanVal1, booleanVal2, decimalVal1, decimalVal2, doubleVal1, doubleVal2, floatVal1, floatVal2, dateVal1, dateVal2, dateTimeVal1, dateTimeVal2, )
-supermod.simpleTypeTest.subclass = simpleTypeTestSub
-# end class simpleTypeTestSub
+        super(simpleTypeTestDefsSub, self).__init__(datetime1, datetime2, datetime3, datetime4, datetime5, integerVal1, integerVal2, stringVal1, stringVal2, booleanVal1, booleanVal2, decimalVal1, decimalVal2, doubleVal1, doubleVal2, floatVal1, floatVal2, dateVal1, dateVal2, dateTimeVal1, dateTimeVal2, )
+supermod.simpleTypeTestDefs.subclass = simpleTypeTestDefsSub
+# end class simpleTypeTestDefsSub
 
 
 def get_root_tag(node):
@@ -98,11 +71,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -118,11 +92,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -142,11 +117,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -161,11 +137,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'simpleTypeTestsType'
         rootClass = supermod.simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -174,8 +151,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletypes_other2_sup import *\n\n')
 ##         sys.stdout.write('import simpletypes_other2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.simpleTypeTests(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="simpleTypeTests")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -186,7 +163,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py
index a8bb2c8..7efca4b 100644
--- a/tests/simpletypes_other1_sup.py
+++ b/tests/simpletypes_other1_sup.py
@@ -4,66 +4,54 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/simpletypes_other2_sup.py')
+#   ('-s', 'tests/simpletypes_other2_sub.py')
+#   ('--super', 'simpletypes_other2_sup')
+#
+# Command line arguments:
+#   tests/simpletypes_other.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simpletypes_other2_sup.py" -s "tests/simpletypes_other2_sub.py" --super="simpletypes_other2_sup" tests/simpletypes_other.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +79,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +148,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +203,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +214,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +237,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +261,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +293,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +363,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +411,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +514,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +555,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -610,16 +662,22 @@ def _cast(typ, value):
 
 class simpleTypeTestsType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('simpleTypeTest', 'simpleTypeTest', 1),
+        MemberSpec_('simpleTypeTest', 'simpleTypeTestDefs', 1),
     ]
     subclass = None
     superclass = None
     def __init__(self, simpleTypeTest=None):
+        self.original_tagname_ = None
         if simpleTypeTest is None:
             self.simpleTypeTest = []
         else:
             self.simpleTypeTest = simpleTypeTest
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleTypeTestsType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if simpleTypeTestsType.subclass:
             return simpleTypeTestsType.subclass(*args_, **kwargs_)
         else:
@@ -628,7 +686,8 @@ class simpleTypeTestsType(GeneratedsSuper):
     def get_simpleTypeTest(self): return self.simpleTypeTest
     def set_simpleTypeTest(self, simpleTypeTest): self.simpleTypeTest = simpleTypeTest
     def add_simpleTypeTest(self, value): self.simpleTypeTest.append(value)
-    def insert_simpleTypeTest(self, index, value): self.simpleTypeTest[index] = value
+    def insert_simpleTypeTest_at(self, index, value): self.simpleTypeTest.insert(index, value)
+    def replace_simpleTypeTest_at(self, index, value): self.simpleTypeTest[index] = value
     def hasContent_(self):
         if (
             self.simpleTypeTest
@@ -641,13 +700,15 @@ class simpleTypeTestsType(GeneratedsSuper):
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTestsType')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTypeTestsType', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -660,43 +721,26 @@ class simpleTypeTestsType(GeneratedsSuper):
         else:
             eol_ = ''
         for simpleTypeTest_ in self.simpleTypeTest:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%ssimpleTypeTest>%s</%ssimpleTypeTest>%s' % (namespace_, self.gds_format_string(quote_xml(simpleTypeTest_).encode(ExternalEncoding), input_name='simpleTypeTest'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='simpleTypeTestsType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('simpleTypeTest=[\n')
-        level += 1
-        for simpleTypeTest_ in self.simpleTypeTest:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(simpleTypeTest_).encode(ExternalEncoding))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
+            simpleTypeTest_.export(outfile, level, namespace_, name_='simpleTypeTest', pretty_print=pretty_print)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'simpleTypeTest':
-            simpleTypeTest_ = child_.text
-            simpleTypeTest_ = self.gds_validate_string(simpleTypeTest_, node, 'simpleTypeTest')
-            self.simpleTypeTest.append(simpleTypeTest_)
+            obj_ = simpleTypeTestDefs.factory()
+            obj_.build(child_)
+            self.simpleTypeTest.append(obj_)
+            obj_.original_tagname_ = 'simpleTypeTest'
 # end class simpleTypeTestsType
 
 
-class simpleTypeTest(GeneratedsSuper):
+class simpleTypeTestDefs(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('datetime1', 'xs:gYear', 0),
         MemberSpec_('datetime2', 'xs:gYearMonth', 0),
@@ -723,6 +767,7 @@ class simpleTypeTest(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None, integerVal1=None, integerVal2=None, stringVal1=None, stringVal2=None, booleanVal1=None, booleanVal2=None, decimalVal1=None, decimalVal2=None, doubleVal1=None, doubleVal2=None, floatVal1=None, floatVal2=None, dateVal1=None, dateVal2=None, dateTimeVal1=None, dateTimeVal2=None):
+        self.original_tagname_ = None
         self.datetime1 = datetime1
         self.datetime2 = datetime2
         self.datetime3 = datetime3
@@ -758,7 +803,7 @@ class simpleTypeTest(GeneratedsSuper):
             self.floatVal2 = []
         else:
             self.floatVal2 = floatVal2
-        if isinstance(dateVal1, basestring):
+        if isinstance(dateVal1, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(dateVal1, '%Y-%m-%d').date()
         else:
             initvalue_ = dateVal1
@@ -767,7 +812,7 @@ class simpleTypeTest(GeneratedsSuper):
             self.dateVal2 = []
         else:
             self.dateVal2 = dateVal2
-        if isinstance(dateTimeVal1, basestring):
+        if isinstance(dateTimeVal1, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(dateTimeVal1, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = dateTimeVal1
@@ -777,10 +822,15 @@ class simpleTypeTest(GeneratedsSuper):
         else:
             self.dateTimeVal2 = dateTimeVal2
     def factory(*args_, **kwargs_):
-        if simpleTypeTest.subclass:
-            return simpleTypeTest.subclass(*args_, **kwargs_)
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleTypeTestDefs)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if simpleTypeTestDefs.subclass:
+            return simpleTypeTestDefs.subclass(*args_, **kwargs_)
         else:
-            return simpleTypeTest(*args_, **kwargs_)
+            return simpleTypeTestDefs(*args_, **kwargs_)
     factory = staticmethod(factory)
     def get_datetime1(self): return self.datetime1
     def set_datetime1(self, datetime1): self.datetime1 = datetime1
@@ -797,49 +847,57 @@ class simpleTypeTest(GeneratedsSuper):
     def get_integerVal2(self): return self.integerVal2
     def set_integerVal2(self, integerVal2): self.integerVal2 = integerVal2
     def add_integerVal2(self, value): self.integerVal2.append(value)
-    def insert_integerVal2(self, index, value): self.integerVal2[index] = value
+    def insert_integerVal2_at(self, index, value): self.integerVal2.insert(index, value)
+    def replace_integerVal2_at(self, index, value): self.integerVal2[index] = value
     def get_stringVal1(self): return self.stringVal1
     def set_stringVal1(self, stringVal1): self.stringVal1 = stringVal1
     def get_stringVal2(self): return self.stringVal2
     def set_stringVal2(self, stringVal2): self.stringVal2 = stringVal2
     def add_stringVal2(self, value): self.stringVal2.append(value)
-    def insert_stringVal2(self, index, value): self.stringVal2[index] = value
+    def insert_stringVal2_at(self, index, value): self.stringVal2.insert(index, value)
+    def replace_stringVal2_at(self, index, value): self.stringVal2[index] = value
     def get_booleanVal1(self): return self.booleanVal1
     def set_booleanVal1(self, booleanVal1): self.booleanVal1 = booleanVal1
     def get_booleanVal2(self): return self.booleanVal2
     def set_booleanVal2(self, booleanVal2): self.booleanVal2 = booleanVal2
     def add_booleanVal2(self, value): self.booleanVal2.append(value)
-    def insert_booleanVal2(self, index, value): self.booleanVal2[index] = value
+    def insert_booleanVal2_at(self, index, value): self.booleanVal2.insert(index, value)
+    def replace_booleanVal2_at(self, index, value): self.booleanVal2[index] = value
     def get_decimalVal1(self): return self.decimalVal1
     def set_decimalVal1(self, decimalVal1): self.decimalVal1 = decimalVal1
     def get_decimalVal2(self): return self.decimalVal2
     def set_decimalVal2(self, decimalVal2): self.decimalVal2 = decimalVal2
     def add_decimalVal2(self, value): self.decimalVal2.append(value)
-    def insert_decimalVal2(self, index, value): self.decimalVal2[index] = value
+    def insert_decimalVal2_at(self, index, value): self.decimalVal2.insert(index, value)
+    def replace_decimalVal2_at(self, index, value): self.decimalVal2[index] = value
     def get_doubleVal1(self): return self.doubleVal1
     def set_doubleVal1(self, doubleVal1): self.doubleVal1 = doubleVal1
     def get_doubleVal2(self): return self.doubleVal2
     def set_doubleVal2(self, doubleVal2): self.doubleVal2 = doubleVal2
     def add_doubleVal2(self, value): self.doubleVal2.append(value)
-    def insert_doubleVal2(self, index, value): self.doubleVal2[index] = value
+    def insert_doubleVal2_at(self, index, value): self.doubleVal2.insert(index, value)
+    def replace_doubleVal2_at(self, index, value): self.doubleVal2[index] = value
     def get_floatVal1(self): return self.floatVal1
     def set_floatVal1(self, floatVal1): self.floatVal1 = floatVal1
     def get_floatVal2(self): return self.floatVal2
     def set_floatVal2(self, floatVal2): self.floatVal2 = floatVal2
     def add_floatVal2(self, value): self.floatVal2.append(value)
-    def insert_floatVal2(self, index, value): self.floatVal2[index] = value
+    def insert_floatVal2_at(self, index, value): self.floatVal2.insert(index, value)
+    def replace_floatVal2_at(self, index, value): self.floatVal2[index] = value
     def get_dateVal1(self): return self.dateVal1
     def set_dateVal1(self, dateVal1): self.dateVal1 = dateVal1
     def get_dateVal2(self): return self.dateVal2
     def set_dateVal2(self, dateVal2): self.dateVal2 = dateVal2
     def add_dateVal2(self, value): self.dateVal2.append(value)
-    def insert_dateVal2(self, index, value): self.dateVal2[index] = value
+    def insert_dateVal2_at(self, index, value): self.dateVal2.insert(index, value)
+    def replace_dateVal2_at(self, index, value): self.dateVal2[index] = value
     def get_dateTimeVal1(self): return self.dateTimeVal1
     def set_dateTimeVal1(self, dateTimeVal1): self.dateTimeVal1 = dateTimeVal1
     def get_dateTimeVal2(self): return self.dateTimeVal2
     def set_dateTimeVal2(self, dateTimeVal2): self.dateTimeVal2 = dateTimeVal2
     def add_dateTimeVal2(self, value): self.dateTimeVal2.append(value)
-    def insert_dateTimeVal2(self, index, value): self.dateTimeVal2[index] = value
+    def insert_dateTimeVal2_at(self, index, value): self.dateTimeVal2.insert(index, value)
+    def replace_dateTimeVal2_at(self, index, value): self.dateTimeVal2[index] = value
     def hasContent_(self):
         if (
             self.datetime1 is not None or
@@ -867,44 +925,46 @@ class simpleTypeTest(GeneratedsSuper):
             return True
         else:
             return False
-    def export(self, outfile, level, namespace_='', name_='simpleTypeTest', namespacedef_='', pretty_print=True):
+    def export(self, outfile, level, namespace_='', name_='simpleTypeTestDefs', namespacedef_='', pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
         showIndent(outfile, level, pretty_print)
         outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
         already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTest')
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTestDefs')
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTypeTestDefs', pretty_print=pretty_print)
             showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTypeTest'):
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTypeTestDefs'):
         pass
-    def exportChildren(self, outfile, level, namespace_='', name_='simpleTypeTest', fromsubclass_=False, pretty_print=True):
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleTypeTestDefs', fromsubclass_=False, pretty_print=True):
         if pretty_print:
             eol_ = '\n'
         else:
             eol_ = ''
         if self.datetime1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime1>%s</%sdatetime1>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime1).encode(ExternalEncoding), input_name='datetime1'), namespace_, eol_))
+            outfile.write('<%sdatetime1>%s</%sdatetime1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime1), input_name='datetime1')), namespace_, eol_))
         if self.datetime2 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime2>%s</%sdatetime2>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime2).encode(ExternalEncoding), input_name='datetime2'), namespace_, eol_))
+            outfile.write('<%sdatetime2>%s</%sdatetime2>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime2), input_name='datetime2')), namespace_, eol_))
         if self.datetime3 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime3>%s</%sdatetime3>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime3).encode(ExternalEncoding), input_name='datetime3'), namespace_, eol_))
+            outfile.write('<%sdatetime3>%s</%sdatetime3>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime3), input_name='datetime3')), namespace_, eol_))
         if self.datetime4 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime4>%s</%sdatetime4>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime4).encode(ExternalEncoding), input_name='datetime4'), namespace_, eol_))
+            outfile.write('<%sdatetime4>%s</%sdatetime4>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime4), input_name='datetime4')), namespace_, eol_))
         if self.datetime5 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime5>%s</%sdatetime5>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime5).encode(ExternalEncoding), input_name='datetime5'), namespace_, eol_))
+            outfile.write('<%sdatetime5>%s</%sdatetime5>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime5), input_name='datetime5')), namespace_, eol_))
         if self.integerVal1 is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%sintegerVal1>%s</%sintegerVal1>%s' % (namespace_, self.gds_format_integer(self.integerVal1, input_name='integerVal1'), namespace_, eol_))
@@ -913,10 +973,10 @@ class simpleTypeTest(GeneratedsSuper):
             outfile.write('<%sintegerVal2>%s</%sintegerVal2>%s' % (namespace_, self.gds_format_integer(integerVal2_, input_name='integerVal2'), namespace_, eol_))
         if self.stringVal1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstringVal1>%s</%sstringVal1>%s' % (namespace_, self.gds_format_string(quote_xml(self.stringVal1).encode(ExternalEncoding), input_name='stringVal1'), namespace_, eol_))
+            outfile.write('<%sstringVal1>%s</%sstringVal1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.stringVal1), input_name='stringVal1')), namespace_, eol_))
         for stringVal2_ in self.stringVal2:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstringVal2>%s</%sstringVal2>%s' % (namespace_, self.gds_format_string(quote_xml(stringVal2_).encode(ExternalEncoding), input_name='stringVal2'), namespace_, eol_))
+            outfile.write('<%sstringVal2>%s</%sstringVal2>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(stringVal2_), input_name='stringVal2')), namespace_, eol_))
         if self.booleanVal1 is not None:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%sbooleanVal1>%s</%sbooleanVal1>%s' % (namespace_, self.gds_format_boolean(self.booleanVal1, input_name='booleanVal1'), namespace_, eol_))
@@ -953,132 +1013,13 @@ class simpleTypeTest(GeneratedsSuper):
         for dateTimeVal2_ in self.dateTimeVal2:
             showIndent(outfile, level, pretty_print)
             outfile.write('<%sdateTimeVal2>%s</%sdateTimeVal2>%s' % (namespace_, self.gds_format_datetime(dateTimeVal2_, input_name='dateTimeVal2'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='simpleTypeTest'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.datetime1 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime1=%s,\n' % quote_python(self.datetime1).encode(ExternalEncoding))
-        if self.datetime2 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime2=%s,\n' % quote_python(self.datetime2).encode(ExternalEncoding))
-        if self.datetime3 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime3=%s,\n' % quote_python(self.datetime3).encode(ExternalEncoding))
-        if self.datetime4 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime4=%s,\n' % quote_python(self.datetime4).encode(ExternalEncoding))
-        if self.datetime5 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime5=%s,\n' % quote_python(self.datetime5).encode(ExternalEncoding))
-        if self.integerVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('integerVal1=%d,\n' % self.integerVal1)
-        showIndent(outfile, level)
-        outfile.write('integerVal2=[\n')
-        level += 1
-        for integerVal2_ in self.integerVal2:
-            showIndent(outfile, level)
-            outfile.write('%d,\n' % integerVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.stringVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('stringVal1=%s,\n' % quote_python(self.stringVal1).encode(ExternalEncoding))
-        showIndent(outfile, level)
-        outfile.write('stringVal2=[\n')
-        level += 1
-        for stringVal2_ in self.stringVal2:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(stringVal2_).encode(ExternalEncoding))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.booleanVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('booleanVal1=%s,\n' % self.booleanVal1)
-        showIndent(outfile, level)
-        outfile.write('booleanVal2=[\n')
-        level += 1
-        for booleanVal2_ in self.booleanVal2:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % booleanVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.decimalVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('decimalVal1=%f,\n' % self.decimalVal1)
-        showIndent(outfile, level)
-        outfile.write('decimalVal2=[\n')
-        level += 1
-        for decimalVal2_ in self.decimalVal2:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % decimalVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.doubleVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('doubleVal1=%e,\n' % self.doubleVal1)
-        showIndent(outfile, level)
-        outfile.write('doubleVal2=[\n')
-        level += 1
-        for doubleVal2_ in self.doubleVal2:
-            showIndent(outfile, level)
-            outfile.write('%e,\n' % doubleVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.floatVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('floatVal1=%f,\n' % self.floatVal1)
-        showIndent(outfile, level)
-        outfile.write('floatVal2=[\n')
-        level += 1
-        for floatVal2_ in self.floatVal2:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % floatVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.dateVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('dateVal1=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.dateVal1, input_name='dateVal1'))
-        showIndent(outfile, level)
-        outfile.write('dateVal2=[\n')
-        level += 1
-        for dateVal2_ in self.dateVal2:
-            showIndent(outfile, level)
-            outfile.write('model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(dateVal2_, input_name='dateVal2'))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.dateTimeVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('dateTimeVal1=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.dateTimeVal1, input_name='dateTimeVal1'))
-        showIndent(outfile, level)
-        outfile.write('dateTimeVal2=[\n')
-        level += 1
-        for dateTimeVal2_ in self.dateTimeVal2:
-            showIndent(outfile, level)
-            outfile.write('model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(dateTimeVal2_, input_name='dateTimeVal2'))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1106,7 +1047,7 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'integerVal1')
             self.integerVal1 = ival_
@@ -1114,7 +1055,7 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'integerVal2')
             self.integerVal2.append(ival_)
@@ -1150,7 +1091,7 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'decimalVal1')
             self.decimalVal1 = fval_
@@ -1158,7 +1099,7 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'decimalVal2')
             self.decimalVal2.append(fval_)
@@ -1166,7 +1107,7 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'doubleVal1')
             self.doubleVal1 = fval_
@@ -1174,7 +1115,7 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'doubleVal2')
             self.doubleVal2.append(fval_)
@@ -1182,7 +1123,7 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'floatVal1')
             self.floatVal1 = fval_
@@ -1190,7 +1131,7 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'floatVal2')
             self.floatVal2.append(fval_)
@@ -1210,10 +1151,11 @@ class simpleTypeTest(GeneratedsSuper):
             sval_ = child_.text
             dval_ = self.gds_parse_datetime(sval_)
             self.dateTimeVal2.append(dval_)
-# end class simpleTypeTest
+# end class simpleTypeTestDefs
 
 
 GDSClassesMapping = {
+    'simpleTypeTest': simpleTypeTestDefs,
     'simpleTypeTests': simpleTypeTestsType,
 }
 
@@ -1224,7 +1166,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -1237,11 +1179,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1257,11 +1200,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1280,12 +1224,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1294,17 +1242,18 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="simpleTypeTests",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'simpleTypeTests'
+        rootTag = 'simpleTypeTestsType'
         rootClass = simpleTypeTestsType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -1313,7 +1262,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from simpletypes_other2_sup import *\n\n')
 ##         sys.stdout.write('import simpletypes_other2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
@@ -1333,6 +1282,6 @@ if __name__ == '__main__':
 
 
 __all__ = [
-    "simpleTypeTest",
+    "simpleTypeTestDefs",
     "simpleTypeTestsType"
 ]
diff --git a/tests/simpletypes_other2_sup.py b/tests/simpletypes_other2_sup.py
deleted file mode 100644
index a8bb2c8..0000000
--- a/tests/simpletypes_other2_sup.py
+++ /dev/null
@@ -1,1338 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-#
-# Generated  by generateDS.py.
-#
-
-import sys
-import getopt
-import re as re_
-import base64
-import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
-        # Use the lxml ElementTree compatible parser so that, e.g.,
-        #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
-    return doc
-
-#
-# User methods
-#
-# Calls to the methods in these classes are generated by generateDS.py.
-# You can replace these methods by re-implementing the following class
-#   in a module named generatedssuper.py.
-
-try:
-    from generatedssuper import GeneratedsSuper
-except ImportError, exp:
-
-    class GeneratedsSuper(object):
-        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
-        class _FixedOffsetTZ(datetime_.tzinfo):
-            def __init__(self, offset, name):
-                self.__offset = datetime_.timedelta(minutes=offset)
-                self.__name = name
-            def utcoffset(self, dt):
-                return self.__offset
-            def tzname(self, dt):
-                return self.__name
-            def dst(self, dt):
-                return None
-        def gds_format_string(self, input_data, input_name=''):
-            return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_base64(self, input_data, input_name=''):
-            return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_integer(self, input_data, input_name=''):
-            return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
-        def gds_format_float(self, input_data, input_name=''):
-            return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
-        def gds_format_double(self, input_data, input_name=''):
-            return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                try:
-                    float(value)
-                except (TypeError, ValueError):
-                    raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
-        def gds_format_boolean(self, input_data, input_name=''):
-            return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
-            values = input_data.split()
-            for value in values:
-                if value not in ('true', '1', 'false', '0', ):
-                    raise_parse_error(
-                        node,
-                        'Requires sequence of booleans '
-                        '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_datetime(self, input_data, input_name=''):
-            if input_data.microsecond == 0:
-                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
-                    input_data.year,
-                    input_data.month,
-                    input_data.day,
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                )
-            else:
-                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
-                    input_data.year,
-                    input_data.month,
-                    input_data.day,
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
-                )
-            if input_data.tzinfo is not None:
-                tzoff = input_data.tzinfo.utcoffset(input_data)
-                if tzoff is not None:
-                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                    if total_seconds == 0:
-                        _svalue += 'Z'
-                    else:
-                        if total_seconds < 0:
-                            _svalue += '-'
-                            total_seconds *= -1
-                        else:
-                            _svalue += '+'
-                        hours = total_seconds // 3600
-                        minutes = (total_seconds - (hours * 3600)) // 60
-                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            return _svalue
-        @classmethod
-        def gds_parse_datetime(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
-                dt = datetime_.datetime.strptime(
-                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
-            else:
-                dt = datetime_.datetime.strptime(
-                    input_data, '%Y-%m-%dT%H:%M:%S')
-            dt = dt.replace(tzinfo=tz)
-            return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_date(self, input_data, input_name=''):
-            _svalue = '%04d-%02d-%02d' % (
-                input_data.year,
-                input_data.month,
-                input_data.day,
-            )
-            try:
-                if input_data.tzinfo is not None:
-                    tzoff = input_data.tzinfo.utcoffset(input_data)
-                    if tzoff is not None:
-                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                        if total_seconds == 0:
-                            _svalue += 'Z'
-                        else:
-                            if total_seconds < 0:
-                                _svalue += '-'
-                                total_seconds *= -1
-                            else:
-                                _svalue += '+'
-                            hours = total_seconds // 3600
-                            minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            except AttributeError:
-                pass
-            return _svalue
-        @classmethod
-        def gds_parse_date(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
-            dt = dt.replace(tzinfo=tz)
-            return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
-            return input_data
-        def gds_format_time(self, input_data, input_name=''):
-            if input_data.microsecond == 0:
-                _svalue = '%02d:%02d:%02d' % (
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                )
-            else:
-                _svalue = '%02d:%02d:%02d.%s' % (
-                    input_data.hour,
-                    input_data.minute,
-                    input_data.second,
-                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
-                )
-            if input_data.tzinfo is not None:
-                tzoff = input_data.tzinfo.utcoffset(input_data)
-                if tzoff is not None:
-                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
-                    if total_seconds == 0:
-                        _svalue += 'Z'
-                    else:
-                        if total_seconds < 0:
-                            _svalue += '-'
-                            total_seconds *= -1
-                        else:
-                            _svalue += '+'
-                        hours = total_seconds // 3600
-                        minutes = (total_seconds - (hours * 3600)) // 60
-                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
-            return _svalue
-        @classmethod
-        def gds_parse_time(cls, input_data):
-            tz = None
-            if input_data[-1] == 'Z':
-                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
-                input_data = input_data[:-1]
-            else:
-                results = GeneratedsSuper.tzoff_pattern.search(input_data)
-                if results is not None:
-                    tzoff_parts = results.group(2).split(':')
-                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
-                    if results.group(1) == '-':
-                        tzoff *= -1
-                    tz = GeneratedsSuper._FixedOffsetTZ(
-                        tzoff, results.group(0))
-                    input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
-                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
-            else:
-                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
-            dt = dt.replace(tzinfo=tz)
-            return dt.time()
-        def gds_str_lower(self, instring):
-            return instring.lower()
-        def get_path_(self, node):
-            path_list = []
-            self.get_path_list_(node, path_list)
-            path_list.reverse()
-            path = '/'.join(path_list)
-            return path
-        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
-        def get_path_list_(self, node, path_list):
-            if node is None:
-                return
-            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
-            if tag:
-                path_list.append(tag)
-            self.get_path_list_(node.getparent(), path_list)
-        def get_class_obj_(self, node, default_class=None):
-            class_obj1 = default_class
-            if 'xsi' in node.nsmap:
-                classname = node.get('{%s}type' % node.nsmap['xsi'])
-                if classname is not None:
-                    names = classname.split(':')
-                    if len(names) == 2:
-                        classname = names[1]
-                    class_obj2 = globals().get(classname)
-                    if class_obj2 is not None:
-                        class_obj1 = class_obj2
-            return class_obj1
-        def gds_build_any(self, node, type_name=None):
-            return None
-        @classmethod
-        def gds_reverse_node_mapping(cls, mapping):
-            return dict(((v, k) for k, v in mapping.iteritems()))
-
-
-#
-# If you have installed IPython you can uncomment and use the following.
-# IPython is available from http://ipython.scipy.org/.
-#
-
-## from IPython.Shell import IPShellEmbed
-## args = ''
-## ipshell = IPShellEmbed(args,
-##     banner = 'Dropping into IPython',
-##     exit_msg = 'Leaving Interpreter, back to program.')
-
-# Then use the following line where and when you want to drop into the
-# IPython shell:
-#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
-
-#
-# Globals
-#
-
-ExternalEncoding = 'ascii'
-Tag_pattern_ = re_.compile(r'({.*})?(.*)')
-String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
-Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
-
-#
-# Support/utility functions.
-#
-
-
-def showIndent(outfile, level, pretty_print=True):
-    if pretty_print:
-        for idx in range(level):
-            outfile.write('    ')
-
-
-def quote_xml(inStr):
-    if not inStr:
-        return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
-    s1 = s1.replace('<', '&lt;')
-    s1 = s1.replace('>', '&gt;')
-    return s1
-
-
-def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
-    s1 = s1.replace('<', '&lt;')
-    s1 = s1.replace('>', '&gt;')
-    if '"' in s1:
-        if "'" in s1:
-            s1 = '"%s"' % s1.replace('"', "&quot;")
-        else:
-            s1 = "'%s'" % s1
-    else:
-        s1 = '"%s"' % s1
-    return s1
-
-
-def quote_python(inStr):
-    s1 = inStr
-    if s1.find("'") == -1:
-        if s1.find('\n') == -1:
-            return "'%s'" % s1
-        else:
-            return "'''%s'''" % s1
-    else:
-        if s1.find('"') != -1:
-            s1 = s1.replace('"', '\\"')
-        if s1.find('\n') == -1:
-            return '"%s"' % s1
-        else:
-            return '"""%s"""' % s1
-
-
-def get_all_text_(node):
-    if node.text is not None:
-        text = node.text
-    else:
-        text = ''
-    for child in node:
-        if child.tail is not None:
-            text += child.tail
-    return text
-
-
-def find_attr_value_(attr_name, node):
-    attrs = node.attrib
-    attr_parts = attr_name.split(':')
-    value = None
-    if len(attr_parts) == 1:
-        value = attrs.get(attr_name)
-    elif len(attr_parts) == 2:
-        prefix, name = attr_parts
-        namespace = node.nsmap.get(prefix)
-        if namespace is not None:
-            value = attrs.get('{%s}%s' % (namespace, name, ))
-    return value
-
-
-class GDSParseError(Exception):
-    pass
-
-
-def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
-    raise GDSParseError(msg)
-
-
-class MixedContainer:
-    # Constants for category:
-    CategoryNone = 0
-    CategoryText = 1
-    CategorySimple = 2
-    CategoryComplex = 3
-    # Constants for content_type:
-    TypeNone = 0
-    TypeText = 1
-    TypeString = 2
-    TypeInteger = 3
-    TypeFloat = 4
-    TypeDecimal = 5
-    TypeDouble = 6
-    TypeBoolean = 7
-    TypeBase64 = 8
-    def __init__(self, category, content_type, name, value):
-        self.category = category
-        self.content_type = content_type
-        self.name = name
-        self.value = value
-    def getCategory(self):
-        return self.category
-    def getContenttype(self, content_type):
-        return self.content_type
-    def getValue(self):
-        return self.value
-    def getName(self):
-        return self.name
-    def export(self, outfile, level, name, namespace, pretty_print=True):
-        if self.category == MixedContainer.CategoryText:
-            # Prevent exporting empty content as empty lines.
-            if self.value.strip():
-                outfile.write(self.value)
-        elif self.category == MixedContainer.CategorySimple:
-            self.exportSimple(outfile, level, name)
-        else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
-    def exportSimple(self, outfile, level, name):
-        if self.content_type == MixedContainer.TypeString:
-            outfile.write('<%s>%s</%s>' % (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeInteger or \
-                self.content_type == MixedContainer.TypeBoolean:
-            outfile.write('<%s>%d</%s>' % (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeFloat or \
-                self.content_type == MixedContainer.TypeDecimal:
-            outfile.write('<%s>%f</%s>' % (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeDouble:
-            outfile.write('<%s>%g</%s>' % (
-                self.name, self.value, self.name))
-        elif self.content_type == MixedContainer.TypeBase64:
-            outfile.write('<%s>%s</%s>' % (
-                self.name, base64.b64encode(self.value), self.name))
-    def to_etree(self, element):
-        if self.category == MixedContainer.CategoryText:
-            # Prevent exporting empty content as empty lines.
-            if self.value.strip():
-                if len(element) > 0:
-                    if element[-1].tail is None:
-                        element[-1].tail = self.value
-                    else:
-                        element[-1].tail += self.value
-                else:
-                    if element.text is None:
-                        element.text = self.value
-                    else:
-                        element.text += self.value
-        elif self.category == MixedContainer.CategorySimple:
-            subelement = etree_.SubElement(element, '%s' % self.name)
-            subelement.text = self.to_etree_simple()
-        else:    # category == MixedContainer.CategoryComplex
-            self.value.to_etree(element)
-    def to_etree_simple(self):
-        if self.content_type == MixedContainer.TypeString:
-            text = self.value
-        elif (self.content_type == MixedContainer.TypeInteger or
-                self.content_type == MixedContainer.TypeBoolean):
-            text = '%d' % self.value
-        elif (self.content_type == MixedContainer.TypeFloat or
-                self.content_type == MixedContainer.TypeDecimal):
-            text = '%f' % self.value
-        elif self.content_type == MixedContainer.TypeDouble:
-            text = '%g' % self.value
-        elif self.content_type == MixedContainer.TypeBase64:
-            text = '%s' % base64.b64encode(self.value)
-        return text
-    def exportLiteral(self, outfile, level, name):
-        if self.category == MixedContainer.CategoryText:
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
-                    self.category, self.content_type, self.name, self.value))
-        elif self.category == MixedContainer.CategorySimple:
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
-                    self.category, self.content_type, self.name, self.value))
-        else:    # category == MixedContainer.CategoryComplex
-            showIndent(outfile, level)
-            outfile.write(
-                'model_.MixedContainer(%d, %d, "%s",\n' % (
-                    self.category, self.content_type, self.name,))
-            self.value.exportLiteral(outfile, level + 1)
-            showIndent(outfile, level)
-            outfile.write(')\n')
-
-
-class MemberSpec_(object):
-    def __init__(self, name='', data_type='', container=0):
-        self.name = name
-        self.data_type = data_type
-        self.container = container
-    def set_name(self, name): self.name = name
-    def get_name(self): return self.name
-    def set_data_type(self, data_type): self.data_type = data_type
-    def get_data_type_chain(self): return self.data_type
-    def get_data_type(self):
-        if isinstance(self.data_type, list):
-            if len(self.data_type) > 0:
-                return self.data_type[-1]
-            else:
-                return 'xs:string'
-        else:
-            return self.data_type
-    def set_container(self, container): self.container = container
-    def get_container(self): return self.container
-
-
-def _cast(typ, value):
-    if typ is None or value is None:
-        return value
-    return typ(value)
-
-#
-# Data representation classes.
-#
-
-
-class simpleTypeTestsType(GeneratedsSuper):
-    member_data_items_ = [
-        MemberSpec_('simpleTypeTest', 'simpleTypeTest', 1),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, simpleTypeTest=None):
-        if simpleTypeTest is None:
-            self.simpleTypeTest = []
-        else:
-            self.simpleTypeTest = simpleTypeTest
-    def factory(*args_, **kwargs_):
-        if simpleTypeTestsType.subclass:
-            return simpleTypeTestsType.subclass(*args_, **kwargs_)
-        else:
-            return simpleTypeTestsType(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_simpleTypeTest(self): return self.simpleTypeTest
-    def set_simpleTypeTest(self, simpleTypeTest): self.simpleTypeTest = simpleTypeTest
-    def add_simpleTypeTest(self, value): self.simpleTypeTest.append(value)
-    def insert_simpleTypeTest(self, index, value): self.simpleTypeTest[index] = value
-    def hasContent_(self):
-        if (
-            self.simpleTypeTest
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='simpleTypeTestsType', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTestsType')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTypeTestsType'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='simpleTypeTestsType', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        for simpleTypeTest_ in self.simpleTypeTest:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%ssimpleTypeTest>%s</%ssimpleTypeTest>%s' % (namespace_, self.gds_format_string(quote_xml(simpleTypeTest_).encode(ExternalEncoding), input_name='simpleTypeTest'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='simpleTypeTestsType'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        showIndent(outfile, level)
-        outfile.write('simpleTypeTest=[\n')
-        level += 1
-        for simpleTypeTest_ in self.simpleTypeTest:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(simpleTypeTest_).encode(ExternalEncoding))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'simpleTypeTest':
-            simpleTypeTest_ = child_.text
-            simpleTypeTest_ = self.gds_validate_string(simpleTypeTest_, node, 'simpleTypeTest')
-            self.simpleTypeTest.append(simpleTypeTest_)
-# end class simpleTypeTestsType
-
-
-class simpleTypeTest(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),
-    ]
-    subclass = None
-    superclass = None
-    def __init__(self, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None, integerVal1=None, integerVal2=None, stringVal1=None, stringVal2=None, booleanVal1=None, booleanVal2=None, decimalVal1=None, decimalVal2=None, doubleVal1=None, doubleVal2=None, floatVal1=None, floatVal2=None, dateVal1=None, dateVal2=None, dateTimeVal1=None, dateTimeVal2=None):
-        self.datetime1 = datetime1
-        self.datetime2 = datetime2
-        self.datetime3 = datetime3
-        self.datetime4 = datetime4
-        self.datetime5 = datetime5
-        self.integerVal1 = integerVal1
-        if integerVal2 is None:
-            self.integerVal2 = []
-        else:
-            self.integerVal2 = integerVal2
-        self.stringVal1 = stringVal1
-        if stringVal2 is None:
-            self.stringVal2 = []
-        else:
-            self.stringVal2 = stringVal2
-        self.booleanVal1 = booleanVal1
-        if booleanVal2 is None:
-            self.booleanVal2 = []
-        else:
-            self.booleanVal2 = booleanVal2
-        self.decimalVal1 = decimalVal1
-        if decimalVal2 is None:
-            self.decimalVal2 = []
-        else:
-            self.decimalVal2 = decimalVal2
-        self.doubleVal1 = doubleVal1
-        if doubleVal2 is None:
-            self.doubleVal2 = []
-        else:
-            self.doubleVal2 = doubleVal2
-        self.floatVal1 = floatVal1
-        if floatVal2 is None:
-            self.floatVal2 = []
-        else:
-            self.floatVal2 = floatVal2
-        if isinstance(dateVal1, basestring):
-            initvalue_ = datetime_.datetime.strptime(dateVal1, '%Y-%m-%d').date()
-        else:
-            initvalue_ = dateVal1
-        self.dateVal1 = initvalue_
-        if dateVal2 is None:
-            self.dateVal2 = []
-        else:
-            self.dateVal2 = dateVal2
-        if isinstance(dateTimeVal1, basestring):
-            initvalue_ = datetime_.datetime.strptime(dateTimeVal1, '%Y-%m-%dT%H:%M:%S')
-        else:
-            initvalue_ = dateTimeVal1
-        self.dateTimeVal1 = initvalue_
-        if dateTimeVal2 is None:
-            self.dateTimeVal2 = []
-        else:
-            self.dateTimeVal2 = dateTimeVal2
-    def factory(*args_, **kwargs_):
-        if simpleTypeTest.subclass:
-            return simpleTypeTest.subclass(*args_, **kwargs_)
-        else:
-            return simpleTypeTest(*args_, **kwargs_)
-    factory = staticmethod(factory)
-    def get_datetime1(self): return self.datetime1
-    def set_datetime1(self, datetime1): self.datetime1 = datetime1
-    def get_datetime2(self): return self.datetime2
-    def set_datetime2(self, datetime2): self.datetime2 = datetime2
-    def get_datetime3(self): return self.datetime3
-    def set_datetime3(self, datetime3): self.datetime3 = datetime3
-    def get_datetime4(self): return self.datetime4
-    def set_datetime4(self, datetime4): self.datetime4 = datetime4
-    def get_datetime5(self): return self.datetime5
-    def set_datetime5(self, datetime5): self.datetime5 = datetime5
-    def get_integerVal1(self): return self.integerVal1
-    def set_integerVal1(self, integerVal1): self.integerVal1 = integerVal1
-    def get_integerVal2(self): return self.integerVal2
-    def set_integerVal2(self, integerVal2): self.integerVal2 = integerVal2
-    def add_integerVal2(self, value): self.integerVal2.append(value)
-    def insert_integerVal2(self, index, value): self.integerVal2[index] = value
-    def get_stringVal1(self): return self.stringVal1
-    def set_stringVal1(self, stringVal1): self.stringVal1 = stringVal1
-    def get_stringVal2(self): return self.stringVal2
-    def set_stringVal2(self, stringVal2): self.stringVal2 = stringVal2
-    def add_stringVal2(self, value): self.stringVal2.append(value)
-    def insert_stringVal2(self, index, value): self.stringVal2[index] = value
-    def get_booleanVal1(self): return self.booleanVal1
-    def set_booleanVal1(self, booleanVal1): self.booleanVal1 = booleanVal1
-    def get_booleanVal2(self): return self.booleanVal2
-    def set_booleanVal2(self, booleanVal2): self.booleanVal2 = booleanVal2
-    def add_booleanVal2(self, value): self.booleanVal2.append(value)
-    def insert_booleanVal2(self, index, value): self.booleanVal2[index] = value
-    def get_decimalVal1(self): return self.decimalVal1
-    def set_decimalVal1(self, decimalVal1): self.decimalVal1 = decimalVal1
-    def get_decimalVal2(self): return self.decimalVal2
-    def set_decimalVal2(self, decimalVal2): self.decimalVal2 = decimalVal2
-    def add_decimalVal2(self, value): self.decimalVal2.append(value)
-    def insert_decimalVal2(self, index, value): self.decimalVal2[index] = value
-    def get_doubleVal1(self): return self.doubleVal1
-    def set_doubleVal1(self, doubleVal1): self.doubleVal1 = doubleVal1
-    def get_doubleVal2(self): return self.doubleVal2
-    def set_doubleVal2(self, doubleVal2): self.doubleVal2 = doubleVal2
-    def add_doubleVal2(self, value): self.doubleVal2.append(value)
-    def insert_doubleVal2(self, index, value): self.doubleVal2[index] = value
-    def get_floatVal1(self): return self.floatVal1
-    def set_floatVal1(self, floatVal1): self.floatVal1 = floatVal1
-    def get_floatVal2(self): return self.floatVal2
-    def set_floatVal2(self, floatVal2): self.floatVal2 = floatVal2
-    def add_floatVal2(self, value): self.floatVal2.append(value)
-    def insert_floatVal2(self, index, value): self.floatVal2[index] = value
-    def get_dateVal1(self): return self.dateVal1
-    def set_dateVal1(self, dateVal1): self.dateVal1 = dateVal1
-    def get_dateVal2(self): return self.dateVal2
-    def set_dateVal2(self, dateVal2): self.dateVal2 = dateVal2
-    def add_dateVal2(self, value): self.dateVal2.append(value)
-    def insert_dateVal2(self, index, value): self.dateVal2[index] = value
-    def get_dateTimeVal1(self): return self.dateTimeVal1
-    def set_dateTimeVal1(self, dateTimeVal1): self.dateTimeVal1 = dateTimeVal1
-    def get_dateTimeVal2(self): return self.dateTimeVal2
-    def set_dateTimeVal2(self, dateTimeVal2): self.dateTimeVal2 = dateTimeVal2
-    def add_dateTimeVal2(self, value): self.dateTimeVal2.append(value)
-    def insert_dateTimeVal2(self, index, value): self.dateTimeVal2[index] = value
-    def hasContent_(self):
-        if (
-            self.datetime1 is not None or
-            self.datetime2 is not None or
-            self.datetime3 is not None or
-            self.datetime4 is not None or
-            self.datetime5 is not None or
-            self.integerVal1 is not None or
-            self.integerVal2 or
-            self.stringVal1 is not None or
-            self.stringVal2 or
-            self.booleanVal1 is not None or
-            self.booleanVal2 or
-            self.decimalVal1 is not None or
-            self.decimalVal2 or
-            self.doubleVal1 is not None or
-            self.doubleVal2 or
-            self.floatVal1 is not None or
-            self.floatVal2 or
-            self.dateVal1 is not None or
-            self.dateVal2 or
-            self.dateTimeVal1 is not None or
-            self.dateTimeVal2
-        ):
-            return True
-        else:
-            return False
-    def export(self, outfile, level, namespace_='', name_='simpleTypeTest', namespacedef_='', pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        showIndent(outfile, level, pretty_print)
-        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
-        already_processed = set()
-        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTest')
-        if self.hasContent_():
-            outfile.write('>%s' % (eol_, ))
-            self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print)
-            showIndent(outfile, level, pretty_print)
-            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
-        else:
-            outfile.write('/>%s' % (eol_, ))
-    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTypeTest'):
-        pass
-    def exportChildren(self, outfile, level, namespace_='', name_='simpleTypeTest', fromsubclass_=False, pretty_print=True):
-        if pretty_print:
-            eol_ = '\n'
-        else:
-            eol_ = ''
-        if self.datetime1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime1>%s</%sdatetime1>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime1).encode(ExternalEncoding), input_name='datetime1'), namespace_, eol_))
-        if self.datetime2 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime2>%s</%sdatetime2>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime2).encode(ExternalEncoding), input_name='datetime2'), namespace_, eol_))
-        if self.datetime3 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime3>%s</%sdatetime3>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime3).encode(ExternalEncoding), input_name='datetime3'), namespace_, eol_))
-        if self.datetime4 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime4>%s</%sdatetime4>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime4).encode(ExternalEncoding), input_name='datetime4'), namespace_, eol_))
-        if self.datetime5 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdatetime5>%s</%sdatetime5>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime5).encode(ExternalEncoding), input_name='datetime5'), namespace_, eol_))
-        if self.integerVal1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sintegerVal1>%s</%sintegerVal1>%s' % (namespace_, self.gds_format_integer(self.integerVal1, input_name='integerVal1'), namespace_, eol_))
-        for integerVal2_ in self.integerVal2:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sintegerVal2>%s</%sintegerVal2>%s' % (namespace_, self.gds_format_integer(integerVal2_, input_name='integerVal2'), namespace_, eol_))
-        if self.stringVal1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstringVal1>%s</%sstringVal1>%s' % (namespace_, self.gds_format_string(quote_xml(self.stringVal1).encode(ExternalEncoding), input_name='stringVal1'), namespace_, eol_))
-        for stringVal2_ in self.stringVal2:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstringVal2>%s</%sstringVal2>%s' % (namespace_, self.gds_format_string(quote_xml(stringVal2_).encode(ExternalEncoding), input_name='stringVal2'), namespace_, eol_))
-        if self.booleanVal1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sbooleanVal1>%s</%sbooleanVal1>%s' % (namespace_, self.gds_format_boolean(self.booleanVal1, input_name='booleanVal1'), namespace_, eol_))
-        for booleanVal2_ in self.booleanVal2:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sbooleanVal2>%s</%sbooleanVal2>%s' % (namespace_, self.gds_format_boolean(booleanVal2_, input_name='booleanVal2'), namespace_, eol_))
-        if self.decimalVal1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdecimalVal1>%s</%sdecimalVal1>%s' % (namespace_, self.gds_format_float(self.decimalVal1, input_name='decimalVal1'), namespace_, eol_))
-        for decimalVal2_ in self.decimalVal2:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdecimalVal2>%s</%sdecimalVal2>%s' % (namespace_, self.gds_format_float(decimalVal2_, input_name='decimalVal2'), namespace_, eol_))
-        if self.doubleVal1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdoubleVal1>%s</%sdoubleVal1>%s' % (namespace_, self.gds_format_double(self.doubleVal1, input_name='doubleVal1'), namespace_, eol_))
-        for doubleVal2_ in self.doubleVal2:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdoubleVal2>%s</%sdoubleVal2>%s' % (namespace_, self.gds_format_double(doubleVal2_, input_name='doubleVal2'), namespace_, eol_))
-        if self.floatVal1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfloatVal1>%s</%sfloatVal1>%s' % (namespace_, self.gds_format_float(self.floatVal1, input_name='floatVal1'), namespace_, eol_))
-        for floatVal2_ in self.floatVal2:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sfloatVal2>%s</%sfloatVal2>%s' % (namespace_, self.gds_format_float(floatVal2_, input_name='floatVal2'), namespace_, eol_))
-        if self.dateVal1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdateVal1>%s</%sdateVal1>%s' % (namespace_, self.gds_format_date(self.dateVal1, input_name='dateVal1'), namespace_, eol_))
-        for dateVal2_ in self.dateVal2:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdateVal2>%s</%sdateVal2>%s' % (namespace_, self.gds_format_date(dateVal2_, input_name='dateVal2'), namespace_, eol_))
-        if self.dateTimeVal1 is not None:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdateTimeVal1>%s</%sdateTimeVal1>%s' % (namespace_, self.gds_format_datetime(self.dateTimeVal1, input_name='dateTimeVal1'), namespace_, eol_))
-        for dateTimeVal2_ in self.dateTimeVal2:
-            showIndent(outfile, level, pretty_print)
-            outfile.write('<%sdateTimeVal2>%s</%sdateTimeVal2>%s' % (namespace_, self.gds_format_datetime(dateTimeVal2_, input_name='dateTimeVal2'), namespace_, eol_))
-    def exportLiteral(self, outfile, level, name_='simpleTypeTest'):
-        level += 1
-        already_processed = set()
-        self.exportLiteralAttributes(outfile, level, already_processed, name_)
-        if self.hasContent_():
-            self.exportLiteralChildren(outfile, level, name_)
-    def exportLiteralAttributes(self, outfile, level, already_processed, name_):
-        pass
-    def exportLiteralChildren(self, outfile, level, name_):
-        if self.datetime1 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime1=%s,\n' % quote_python(self.datetime1).encode(ExternalEncoding))
-        if self.datetime2 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime2=%s,\n' % quote_python(self.datetime2).encode(ExternalEncoding))
-        if self.datetime3 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime3=%s,\n' % quote_python(self.datetime3).encode(ExternalEncoding))
-        if self.datetime4 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime4=%s,\n' % quote_python(self.datetime4).encode(ExternalEncoding))
-        if self.datetime5 is not None:
-            showIndent(outfile, level)
-            outfile.write('datetime5=%s,\n' % quote_python(self.datetime5).encode(ExternalEncoding))
-        if self.integerVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('integerVal1=%d,\n' % self.integerVal1)
-        showIndent(outfile, level)
-        outfile.write('integerVal2=[\n')
-        level += 1
-        for integerVal2_ in self.integerVal2:
-            showIndent(outfile, level)
-            outfile.write('%d,\n' % integerVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.stringVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('stringVal1=%s,\n' % quote_python(self.stringVal1).encode(ExternalEncoding))
-        showIndent(outfile, level)
-        outfile.write('stringVal2=[\n')
-        level += 1
-        for stringVal2_ in self.stringVal2:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % quote_python(stringVal2_).encode(ExternalEncoding))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.booleanVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('booleanVal1=%s,\n' % self.booleanVal1)
-        showIndent(outfile, level)
-        outfile.write('booleanVal2=[\n')
-        level += 1
-        for booleanVal2_ in self.booleanVal2:
-            showIndent(outfile, level)
-            outfile.write('%s,\n' % booleanVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.decimalVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('decimalVal1=%f,\n' % self.decimalVal1)
-        showIndent(outfile, level)
-        outfile.write('decimalVal2=[\n')
-        level += 1
-        for decimalVal2_ in self.decimalVal2:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % decimalVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.doubleVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('doubleVal1=%e,\n' % self.doubleVal1)
-        showIndent(outfile, level)
-        outfile.write('doubleVal2=[\n')
-        level += 1
-        for doubleVal2_ in self.doubleVal2:
-            showIndent(outfile, level)
-            outfile.write('%e,\n' % doubleVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.floatVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('floatVal1=%f,\n' % self.floatVal1)
-        showIndent(outfile, level)
-        outfile.write('floatVal2=[\n')
-        level += 1
-        for floatVal2_ in self.floatVal2:
-            showIndent(outfile, level)
-            outfile.write('%f,\n' % floatVal2_)
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.dateVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('dateVal1=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.dateVal1, input_name='dateVal1'))
-        showIndent(outfile, level)
-        outfile.write('dateVal2=[\n')
-        level += 1
-        for dateVal2_ in self.dateVal2:
-            showIndent(outfile, level)
-            outfile.write('model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(dateVal2_, input_name='dateVal2'))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-        if self.dateTimeVal1 is not None:
-            showIndent(outfile, level)
-            outfile.write('dateTimeVal1=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.dateTimeVal1, input_name='dateTimeVal1'))
-        showIndent(outfile, level)
-        outfile.write('dateTimeVal2=[\n')
-        level += 1
-        for dateTimeVal2_ in self.dateTimeVal2:
-            showIndent(outfile, level)
-            outfile.write('model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(dateTimeVal2_, input_name='dateTimeVal2'))
-        level -= 1
-        showIndent(outfile, level)
-        outfile.write('],\n')
-    def build(self, node):
-        already_processed = set()
-        self.buildAttributes(node, node.attrib, already_processed)
-        for child in node:
-            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
-            self.buildChildren(child, node, nodeName_)
-    def buildAttributes(self, node, attrs, already_processed):
-        pass
-    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        if nodeName_ == 'datetime1':
-            datetime1_ = child_.text
-            datetime1_ = self.gds_validate_string(datetime1_, node, 'datetime1')
-            self.datetime1 = datetime1_
-        elif nodeName_ == 'datetime2':
-            datetime2_ = child_.text
-            datetime2_ = self.gds_validate_string(datetime2_, node, 'datetime2')
-            self.datetime2 = datetime2_
-        elif nodeName_ == 'datetime3':
-            datetime3_ = child_.text
-            datetime3_ = self.gds_validate_string(datetime3_, node, 'datetime3')
-            self.datetime3 = datetime3_
-        elif nodeName_ == 'datetime4':
-            datetime4_ = child_.text
-            datetime4_ = self.gds_validate_string(datetime4_, node, 'datetime4')
-            self.datetime4 = datetime4_
-        elif nodeName_ == 'datetime5':
-            datetime5_ = child_.text
-            datetime5_ = self.gds_validate_string(datetime5_, node, 'datetime5')
-            self.datetime5 = datetime5_
-        elif nodeName_ == 'integerVal1':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'integerVal1')
-            self.integerVal1 = ival_
-        elif nodeName_ == 'integerVal2':
-            sval_ = child_.text
-            try:
-                ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires integer: %s' % exp)
-            ival_ = self.gds_validate_integer(ival_, node, 'integerVal2')
-            self.integerVal2.append(ival_)
-        elif nodeName_ == 'stringVal1':
-            stringVal1_ = child_.text
-            stringVal1_ = self.gds_validate_string(stringVal1_, node, 'stringVal1')
-            self.stringVal1 = stringVal1_
-        elif nodeName_ == 'stringVal2':
-            stringVal2_ = child_.text
-            stringVal2_ = self.gds_validate_string(stringVal2_, node, 'stringVal2')
-            self.stringVal2.append(stringVal2_)
-        elif nodeName_ == 'booleanVal1':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            ival_ = self.gds_validate_boolean(ival_, node, 'booleanVal1')
-            self.booleanVal1 = ival_
-        elif nodeName_ == 'booleanVal2':
-            sval_ = child_.text
-            if sval_ in ('true', '1'):
-                ival_ = True
-            elif sval_ in ('false', '0'):
-                ival_ = False
-            else:
-                raise_parse_error(child_, 'requires boolean')
-            ival_ = self.gds_validate_boolean(ival_, node, 'booleanVal2')
-            self.booleanVal2.append(ival_)
-        elif nodeName_ == 'decimalVal1':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'decimalVal1')
-            self.decimalVal1 = fval_
-        elif nodeName_ == 'decimalVal2':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'decimalVal2')
-            self.decimalVal2.append(fval_)
-        elif nodeName_ == 'doubleVal1':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'doubleVal1')
-            self.doubleVal1 = fval_
-        elif nodeName_ == 'doubleVal2':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'doubleVal2')
-            self.doubleVal2.append(fval_)
-        elif nodeName_ == 'floatVal1':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'floatVal1')
-            self.floatVal1 = fval_
-        elif nodeName_ == 'floatVal2':
-            sval_ = child_.text
-            try:
-                fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
-                raise_parse_error(child_, 'requires float or double: %s' % exp)
-            fval_ = self.gds_validate_float(fval_, node, 'floatVal2')
-            self.floatVal2.append(fval_)
-        elif nodeName_ == 'dateVal1':
-            sval_ = child_.text
-            dval_ = self.gds_parse_date(sval_)
-            self.dateVal1 = dval_
-        elif nodeName_ == 'dateVal2':
-            sval_ = child_.text
-            dval_ = self.gds_parse_date(sval_)
-            self.dateVal2.append(dval_)
-        elif nodeName_ == 'dateTimeVal1':
-            sval_ = child_.text
-            dval_ = self.gds_parse_datetime(sval_)
-            self.dateTimeVal1 = dval_
-        elif nodeName_ == 'dateTimeVal2':
-            sval_ = child_.text
-            dval_ = self.gds_parse_datetime(sval_)
-            self.dateTimeVal2.append(dval_)
-# end class simpleTypeTest
-
-
-GDSClassesMapping = {
-    'simpleTypeTests': simpleTypeTestsType,
-}
-
-
-USAGE_TEXT = """
-Usage: python <Parser>.py [ -s ] <in_xml_file>
-"""
-
-
-def usage():
-    print USAGE_TEXT
-    sys.exit(1)
-
-
-def get_root_tag(node):
-    tag = Tag_pattern_.match(node.tag).groups()[-1]
-    rootClass = GDSClassesMapping.get(tag)
-    if rootClass is None:
-        rootClass = globals().get(tag)
-    return tag, rootClass
-
-
-def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'simpleTypeTests'
-        rootClass = simpleTypeTestsType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_=rootTag,
-##             namespacedef_='',
-##             pretty_print=True)
-    return rootObj
-
-
-def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'simpleTypeTests'
-        rootClass = simpleTypeTestsType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-    mapping = {}
-    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
-    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
-##     if not silence:
-##         content = etree_.tostring(
-##             rootElement, pretty_print=True,
-##             xml_declaration=True, encoding="utf-8")
-##         sys.stdout.write(content)
-##         sys.stdout.write('\n')
-    return rootObj, rootElement, mapping, reverse_mapping
-
-
-def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
-    rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
-    if rootClass is None:
-        rootClass = simpleTypeTestsType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('<?xml version="1.0" ?>\n')
-##         rootObj.export(
-##             sys.stdout, 0, name_="simpleTypeTests",
-##             namespacedef_='')
-    return rootObj
-
-
-def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
-    rootNode = doc.getroot()
-    rootTag, rootClass = get_root_tag(rootNode)
-    if rootClass is None:
-        rootTag = 'simpleTypeTests'
-        rootClass = simpleTypeTestsType
-    rootObj = rootClass.factory()
-    rootObj.build(rootNode)
-    # Enable Python to collect the space used by the DOM.
-    doc = None
-##     if not silence:
-##         sys.stdout.write('#from simpletypes_other2_sup import *\n\n')
-##         sys.stdout.write('import simpletypes_other2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
-##         sys.stdout.write(')\n')
-    return rootObj
-
-
-def main():
-    args = sys.argv[1:]
-    if len(args) == 1:
-        parse(args[0])
-    else:
-        usage()
-
-
-if __name__ == '__main__':
-    #import pdb; pdb.set_trace()
-    main()
-
-
-__all__ = [
-    "simpleTypeTest",
-    "simpleTypeTestsType"
-]
diff --git a/tests/test.py b/tests/test.py
index 7b13b39..d76e266 100755
--- a/tests/test.py
+++ b/tests/test.py
@@ -1,30 +1,48 @@
 #!/usr/bin/env python
 
+from __future__ import print_function
+
+import difflib
 import sys
+import os
 import subprocess
 import getopt
 import unittest
+
 from lxml import etree
 
+#import generateDS
+
 
 class GenTest(unittest.TestCase):
-    def execute(self, cmd, cwd=None):
+    def execute(self, cmd, cwd=None, env=None):
         p = subprocess.Popen(
             cmd, cwd=cwd,
             stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-            shell=True)
+            shell=True,
+            env=env)
         stdout, stderr = p.communicate()
         return stdout, stderr
 
-    def setUp(self):
-        cmd = (
-            'python generateDS.py --no-dates --no-versions -f '
-            '-o tests/out2_sup.py -s tests/out2_sub.py '
-            '--super=out2_sup -u gends_user_methods tests/people.xsd'
-        )
-        stdout, stderr = self.execute(cmd, cwd='..')
-        self.failUnlessEqual(len(stdout), 0)
-        self.failUnlessEqual(len(stderr), 0)
+    def executeClean(self, cmd, cwd=None, env=None):
+        if env is None:
+            env = os.environ
+        stdout, stderr = self.execute(cmd, cwd, env)
+        self.assertEqual(
+            len(stdout), 0, "stdout was not empty:\n{}".format(stdout))
+        self.assertEqual(
+            len(stderr), 0, "stderr was not empty:\n{}".format(stderr))
+
+##     def setUp(self):
+##         print('running setUp')
+##         cmd = (
+##             'python generateDS.py --no-dates --no-versions -f '
+##             '-o tests/out2_sup.py -s tests/out2_sub.py '
+##             '--super=out2_sup -u gends_user_methods tests/people.xsd'
+##         )
+##         stdout, stderr = self.execute(cmd, cwd='..')
+##         self.failUnlessEqual(len(stdout), 0)
+##         self.failUnlessEqual(len(stderr), 0)
 
 ##     def tearDown(self):
 ##         for f in [ "out2_sub.py", "out2_sup.py" ]:
@@ -34,19 +52,18 @@ class GenTest(unittest.TestCase):
 ##                 pass
 
     def test_001_compare_superclasses(self):
-        cmd = 'diff out1_sup.py out2_sup.py'
-        result, err = self.execute(cmd)
-        #print 'len(result):', len(result)
-        # Ignore the differing lines containing the date/time.
-        #self.failUnless(len(result) < 130 and result.find('Generated') > -1)
-        self.check_result(result, err, ())
-
-    def test_002_compare_subclasses(self):
-        cmd = 'diff out1_sub.py out2_sub.py'
-        result, err = self.execute(cmd)
-        # Ignore the differing lines containing the date/time.
-        #self.failUnless(len(result) < 130 and result.find('Generated') > -1)
-        self.check_result(result, err, ())
+        cmd = (
+            'python generateDS.py --no-dates --no-versions -f '
+            '-o tests/out2_sup.py -s tests/out2_sub.py '
+            '--export="write literal" '
+            '--super=out2_sup -u gends_user_methods tests/people.xsd'
+        )
+        self.executeClean(cmd, cwd='..')
+        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_sub.py')
 
     def test_003_element_groups(self):
         cmdTempl = (
@@ -57,7 +74,7 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'groups'
         cmd = cmdTempl % (t_, t_, t_, t_)
-        result, err = self.execute(cmd, cwd='..')
+        self.executeClean(cmd, cwd='..')
         # Verify the structure
         cmdTempl = (
             'python -c "import %s_sub; print '
@@ -85,6 +102,9 @@ class GenTest(unittest.TestCase):
 ['value 1 1', 'group1 1', 'group2 1', 'value 1 2']
 ['value 2 1', 'group1 2', 'group2 2', 'value 2 2']
 """)
+        # cleanup generated files
+        self.remove('{}_sup.py'.format(t_))
+        self.remove('{}_sub.py'.format(t_))
 
     def test_004_valueof(self):
         cmdTempl = (
@@ -95,7 +115,7 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'valueof'
         cmd = cmdTempl % (t_, t_, t_, t_)
-        result, err = self.execute(cmd, cwd='..')
+        self.executeClean(cmd, cwd='..')
         # load the XML, and verify the proper data was loaded
         # Run these commands::
         #     import valueof_sub
@@ -134,6 +154,9 @@ class GenTest(unittest.TestCase):
         self.failUnlessEqual(result, """\
 ('child1', 'value1')
 """)
+        # cleanup generated files
+        self.remove('{}_sup.py'.format(t_))
+        self.remove('{}_sub.py'.format(t_))
 
     ns_for_import_xml1 = """\
 <root xmlns="http://a" xmlns:bl="http://blah">
@@ -182,13 +205,15 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'anysimpletype'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, err = self.execute(cmd, cwd='..')
-        cmd = 'diff anysimpletype1_sup.py anysimpletype2_sup.py'
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff anysimpletype1_sub.py anysimpletype2_sub.py'
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            'anysimpletype1_sup.py',
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('anysimpletype1_sub.py', '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_007_simpletype_memberspecs(self):
         cmdTempl = (
@@ -199,13 +224,15 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'simpletype_memberspecs'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_008_extensions(self):
         cmdTempl = (
@@ -216,15 +243,24 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'extensions'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_009_literal(self):
+        cmd = (
+            'python generateDS.py --no-dates --no-versions -f '
+            '-o tests/out2_sup.py -s tests/out2_sub.py '
+            '--export="write literal" '
+            '--super=out2_sup -u gends_user_methods tests/people.xsd'
+        )
+        self.executeClean(cmd, cwd='..')
         import out2_sup
         save_stdout = sys.stdout
         sys.stdout = open('literal2.py', 'w')
@@ -238,6 +274,10 @@ class GenTest(unittest.TestCase):
         content2 = infile.read()
         infile.close()
         self.failUnlessEqual(content1, content2)
+        # cleanup generated files
+        self.remove('literal2.py')
+        #self.remove('out2_sup.py')
+        self.remove('out2_sub.py')
 
     def test_010_simplecontent_restriction(self):
         cmdTempl = (
@@ -248,13 +288,15 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'simplecontent_restriction'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_011_annotations(self):
         cmdTempl = (
@@ -265,15 +307,17 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'annotations'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
-
-    def test_012_abstracttype(self):
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+
+    def test_012_abstract_type(self):
         cmdTempl = (
             'python generateDS.py --no-dates --no-versions '
             '--silence --member-specs=list -f '
@@ -282,15 +326,17 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'abstract_type'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
-
-    def test_013_procincl(self):
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+
+    def test_013_people_procincl(self):
         cmdTempl = (
             'python generateDS.py --no-dates --no-versions '
             '--silence --member-specs=list -f '
@@ -300,15 +346,17 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'people_procincl'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
-
-    def test_014_xsi_type(self):
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+
+    def test_014_ipo(self):
         cmdTempl = (
             'python generateDS.py --no-dates --no-versions '
             '--member-specs=list -f '
@@ -317,19 +365,18 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'ipo'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
-        cmdTempl = 'python tests/%s2_sup.py tests/ipo.xml > tests/%s2_out.xml'
-        cmd = cmdTempl % (t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_out.xml %s2_out.xml' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml'
+        cmd = cmdTempl % (t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_out.xml'.format(t_))
 
     def test_015_recursive_simpletype(self):
         cmdTempl = (
@@ -341,13 +388,15 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'recursive_simpletype'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_016_anywildcard(self):
         cmdTempl = (
@@ -359,13 +408,15 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'anywildcard'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_017_attr_groups(self):
         cmdTempl = (
@@ -377,13 +428,15 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'attr_groups'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_018_simpletypes_other(self):
         cmdTempl = (
@@ -395,13 +448,15 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'simpletypes_other'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_019_to_etree(self):
         cmdTempl = (
@@ -414,13 +469,12 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'to_etree'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
         import to_etree2_sup
         rootObj, rootElement, mapping, reverse_mapping = \
             to_etree2_sup.parseEtree('to_etree.xml')
@@ -430,9 +484,11 @@ class GenTest(unittest.TestCase):
         outfile = open('to_etree2.xml', 'w')
         outfile.write(content)
         outfile.close()
-        cmd = 'diff %s1.xml %s2.xml' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.compareFiles('{}1.xml'.format(t_), '{}2.xml'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+        self.remove('{}2.xml'.format(t_))
 
     def test_020_catalogtest(self):
         cmdTempl = (
@@ -445,13 +501,15 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'catalogtest'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
 
     def test_021_anonymous_type(self):
         cmdTempl = (
@@ -463,41 +521,327 @@ class GenTest(unittest.TestCase):
         )
         t_ = 'anonymous_type'
         cmd = cmdTempl % (t_, t_, t_, t_, )
-        result, _ = self.execute(cmd, cwd='..')
-        cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ('sys.stdout.write',))
-        cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, )
-        result, err = self.execute(cmd)
-        self.check_result(result, err, ())
-
-    def check_result(self, result, err, ignore_strings):
-        self.failUnlessEqual(len(result), 0)
-        self.failUnlessEqual(len(err), 0)
-        return True
-##         if len(err) > 0:
-##             return False
-##         lines = result.split('\n')
-##         len1 = len(lines)
-##         if len1 > 5:
-##             return False
-##         elif len1 > 1 and len1 <= 5:
-##             s1 = '\n'.join(lines[:4])
-##             found = False
-##             for s2 in ignore_strings:
-##                 if s1.find(s2) > -1:
-##                     found = True
-##                     break
-##             if not found:
-##                 return False
-##         return True
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+
+    def test_022_one_per(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--silence --member-specs=list -f '
+            '--one-file-per-xsd --output-directory="tests/OnePer" '
+            '--module-suffix="One" '
+            '--super=%s2_sup '
+            'tests/%s00.xsd'
+        )
+        t_ = 'oneper'
+        cmd = cmdTempl % (t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            'OnePer{}{}Type00_1One.py'.format(os.sep, t_),
+            'OnePer{}{}Type00_2One.py'.format(os.sep, t_),
+            ('sys.stdout.write',))
+        self.compareFiles(
+            'OnePer{}{}Type01_1One.py'.format(os.sep, t_),
+            'OnePer{}{}Type01_2One.py'.format(os.sep, t_),
+            ('sys.stdout.write',))
+        self.compareFiles(
+            'OnePer{}{}Type02_1One.py'.format(os.sep, t_),
+            'OnePer{}{}Type02_2One.py'.format(os.sep, t_),
+            ('sys.stdout.write',))
+        self.compareFiles(
+            'OnePer{}{}Type03_1One.py'.format(os.sep, t_),
+            'OnePer{}{}Type03_2One.py'.format(os.sep, t_),
+            ('sys.stdout.write',))
+        # cleanup generated files
+        self.remove('OnePer{}{}Type00_1One.py'.format(os.sep, t_))
+        self.remove('OnePer{}{}Type01_1One.py'.format(os.sep, t_))
+        self.remove('OnePer{}{}Type02_1One.py'.format(os.sep, t_))
+        self.remove('OnePer{}{}Type03_1One.py'.format(os.sep, t_))
+
+    def test_023_mapcleanname(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--silence --member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'mapcleanname'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+
+    def test_024_prefix_classname(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '-p tomato_ '
+            '--member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'prefix_classname'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml'
+        cmd = cmdTempl % (t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+        self.remove('{}2_out.xml'.format(t_))
+
+    def test_025_validate_simpletypes(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'validate_simpletypes'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        cmdTempl = (
+            'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml '
+            '2> tests/%s2_warnings.txt'
+        )
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_))
+        self.compareFiles(
+            '{}1_warnings.txt'.format(t_), '{}2_warnings.txt'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_out.xml'.format(t_))
+        self.remove('{}2_warnings.txt'.format(t_))
+
+    def test_026_reference_simpletype(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--silence --member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'reference_simpletype'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+
+    def test_027_cdata(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--silence --member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--silence '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'cdata'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+
+        import cdata2_sup as cdatalib
+        cdatalist = cdatalib.cdataListType()
+        cdata1 = cdatalib.cdataType()
+        cdata1.set_script("<![CDATA[ccc < ddd & eee]]>")
+        cdatalist.add_cdatalist(cdata1)
+        cdata2 = cdatalib.cdataType()
+        cdata2.set_script(
+            "aaa < bbb <![CDATA[ccc < ddd]]> eee < & fff" +
+            "<<![CDATA[ggg < & hhh]]>& iii < jjj"
+        )
+        cdatalist.add_cdatalist(cdata2)
+        with open('%s2.xml' % t_, 'w') as outfile:
+            cdatalist.export(outfile, 0)
+        self.compareFiles('{}1.xml'.format(t_), '{}2.xml'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+        self.remove('{}2.xml'.format(t_))
+
+    def test_028_defaults_coverage(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--silence --member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'defaults_coverage'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+
+    def test_029_defaults_cases(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'defaults_cases'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml'
+        cmd = cmdTempl % (t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+        self.remove('{}2_out.xml'.format(t_))
+
+    def test_030_nested_def(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            'tests/%s.xsd'
+        )
+        t_ = 'nested_def'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # Need to preserve generated files for next command, cleanup at end
+        cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml'
+        cmd = cmdTempl % (t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+        self.remove('{}2_out.xml'.format(t_))
+
+    #
+    # Test enhancements to cleanupName function.
+    def test_031_cleanupname(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--silence --member-specs=list -f '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup '
+            "--cleanup-name-list=\"[('[-:.]', '_'), "
+            "('^Type', 'Class'), "
+            "('Type$', 'Kind'), "
+            "('[ABC]', 'M'), "
+            "('[XYZ]', 'N'), "
+            "]\" "
+            'tests/%s.xsd'
+        )
+        t_ = 'cleanupname'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+
+    def test_032_rem_dup_elems(self):
+        cmdTempl = (
+            'python generateDS.py --no-dates --no-versions '
+            '--member-specs=list -f -a "xsd:" '
+            '-o tests/%s2_sup.py -s tests/%s2_sub.py '
+            '--super=%s2_sup --no-warnings '
+            'tests/%s.xsd'
+        )
+        t_ = 'rem_dup_elems'
+        cmd = cmdTempl % (t_, t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles(
+            '{}1_sup.py'.format(t_),
+            '{}2_sup.py'.format(t_),
+            ('sys.stdout.write',))
+        self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_))
+        # Need to preserve generated files for next command, cleanup at end
+        cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml'
+        cmd = cmdTempl % (t_, t_, t_, )
+        self.executeClean(cmd, cwd='..')
+        self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_))
+        # cleanup generated files
+        self.remove('{}2_sup.py'.format(t_))
+        self.remove('{}2_sub.py'.format(t_))
+        self.remove('{}2_out.xml'.format(t_))
+
+    def compareFiles(self, left, right, ignore=None):
+        with open(left) as left_file:
+            with open(right) as right_file:
+                diffs = difflib.unified_diff(
+                    left_file.readlines(), right_file.readlines())
+        diffs = list(diffs)
+        if diffs:
+            diffs = ''.join(diffs[2:12])
+            self.fail("Files differed:\n{}".format(diffs))
+
+    def remove(self, filename):
+        os.remove(filename)
 
 
 # Make the test suite.
 def suite():
     # The following is obsolete.  See Lib/unittest.py.
     #return unittest.makeSuite(GenTest)
-    loader = unittest.TestLoader()
+    loader = unittest.defaultTestLoader
     testsuite = loader.loadTestsFromTestCase(GenTest)
     return testsuite
 
@@ -520,7 +864,7 @@ Example:
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(-1)
 
 
diff --git a/tests/to_etree.xsd b/tests/to_etree.xsd
index 71d2860..1324971 100644
--- a/tests/to_etree.xsd
+++ b/tests/to_etree.xsd
@@ -337,4 +337,3 @@
     </xs:complexType>
 
 </xs:schema>
-
diff --git a/tests/to_etree1.xml b/tests/to_etree1.xml
index c82a500..05566ba 100644
--- a/tests/to_etree1.xml
+++ b/tests/to_etree1.xml
@@ -3,7 +3,7 @@
   <comments>1. This is a <emp>foolish</emp> comment.  <bold>It</bold> is <emp>really</emp> important.</comments>
   <comments>2. This is a <emp>silly</emp> comment.  It is <emp>very</emp> significant.</comments>
   <comments><emp>3.</emp> This is a empty  comment.  </comments>
-  <person ratio="3.2" id="1" value="abcd">
+  <person value="abcd" id="1" ratio="3.2">
     <name>Alberta</name>
     <interest>gardening</interest>
     <interest>reading</interest>
@@ -22,7 +22,7 @@
       <firstname>Darren</firstname>
       <lastname>Diddly</lastname>
       <priority>4.5</priority>
-      <info rating="5.33" type="321" name="Albert Abasinian"/>
+      <info name="Albert Abasinian" type="321" rating="5.33"/>
       <vehicle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="airplane">
         <wheelcount>36</wheelcount>
         <pilotname>Felicity Flygirl</pilotname>
@@ -75,7 +75,7 @@
       <firstname>Harry</firstname>
       <lastname>Hapton</lastname>
       <priority>4.5</priority>
-      <info rating="5.33" type="321" name="Harry Hapton"/>
+      <info name="Harry Hapton" type="321" rating="5.33"/>
     </agent>
     <range>35</range>
   </specialperson>
@@ -87,7 +87,7 @@
       <firstname>Ernest</firstname>
       <lastname>Echo</lastname>
       <priority>3.8</priority>
-      <info rating="5.33" type="321" name="George Gregory"/>
+      <info name="George Gregory" type="321" rating="5.33"/>
     </agent>
     <description>A very happy programmer</description>
     <range>45</range>
@@ -102,9 +102,9 @@
     <eltoken>aa bb cc dd ee</eltoken>
     <elshort>123</elshort>
     <ellong>13241234123412341234</ellong>
-    <elparam semantic="a big semantic" name="Davy" id="id001"/>
+    <elparam id="id001" name="Davy" semantic="a big semantic"/>
   </programmer>
-  <python-programmer vegetable="tomato" fruit="peach" ratio="8.699999999999999" id="232" value="abcd" language="python" area="xml" drcs_attr="git" nick-name="davy" gui_developer="true">
+  <python-programmer value="abcd" id="232" ratio="8.699999999999999" fruit="peach" vegetable="tomato" language="python" area="xml" nick-name="davy" drcs_attr="git" gui_developer="true">
     <name>Darrel Dawson</name>
     <interest>hang gliding</interest>
     <category>3344</category>
@@ -112,7 +112,7 @@
       <firstname>Harvey</firstname>
       <lastname>Hippolite</lastname>
       <priority>5.2</priority>
-      <info rating="6.55" type="543" name="Harvey Hippolite"/>
+      <info name="Harvey Hippolite" type="543" rating="6.55"/>
     </agent>
     <description>An object-orientated programmer</description>
     <range>27</range>
@@ -120,7 +120,7 @@
     <favorite-editor>jed</favorite-editor>
     <drcs>mercurial</drcs>
   </python-programmer>
-  <java-programmer vegetable="tomato" fruit="peach" ratio="8.699999999999999" id="232" value="abcd" language="python" area="xml" nick-name="davy">
+  <java-programmer value="abcd" id="232" ratio="8.699999999999999" fruit="peach" vegetable="tomato" language="python" area="xml" nick-name="davy">
     <name>Darrel Dawson</name>
     <interest>hang gliding</interest>
     <category>3344</category>
@@ -128,7 +128,7 @@
       <firstname>Harvey</firstname>
       <lastname>Hippolite</lastname>
       <priority>5.2</priority>
-      <info rating="6.55" type="543" name="Harvey Hippolite"/>
+      <info name="Harvey Hippolite" type="543" rating="6.55"/>
     </agent>
     <description>An &lt;object-orientated&gt; programmer &amp; stuff.</description>
     <range>28</range>
diff --git a/tests/to_etree1_sub.py b/tests/to_etree1_sub.py
index 1771174..de64934 100644
--- a/tests/to_etree1_sub.py
+++ b/tests/to_etree1_sub.py
@@ -3,64 +3,39 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/to_etree2_sup.py')
+#   ('-s', 'tests/to_etree2_sub.py')
+#   ('--export', 'etree')
+#   ('--silence', '')
+#   ('--super', 'to_etree2_sup')
+#
+# Command line arguments:
+#   tests/to_etree.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/to_etree2_sup.py" -s "tests/to_etree2_sub.py" --export="etree" --silence --super="to_etree2_sup" tests/to_etree.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
+from lxml import etree as etree_
 
 import to_etree2_sup as supermod
 
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
-try:
-    # lxml
-    from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
-except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -89,43 +64,43 @@ supermod.commentsType.subclass = commentsTypeSub
 
 
 class personTypeSub(supermod.personType):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None):
-        super(personTypeSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None):
+        super(personTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, )
 supermod.personType.subclass = personTypeSub
 # end class personTypeSub
 
 
 class specialpersonSub(supermod.specialperson):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None):
-        super(specialpersonSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None):
+        super(specialpersonSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, )
 supermod.specialperson.subclass = specialpersonSub
 # end class specialpersonSub
 
 
 class programmerTypeSub(supermod.programmerType):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmerTypeSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        super(programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, )
 supermod.programmerType.subclass = programmerTypeSub
 # end class programmerTypeSub
 
 
 class paramTypeSub(supermod.paramType):
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        super(paramTypeSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, )
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        super(paramTypeSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, )
 supermod.paramType.subclass = paramTypeSub
 # end class paramTypeSub
 
 
 class python_programmerTypeSub(supermod.python_programmerType):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, drcs_attr=None, nick_name=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None):
-        super(python_programmerTypeSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, drcs_attr, nick_name, gui_developer, favorite_editor, flowvalue, drcs, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, drcs_attr=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None):
+        super(python_programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, drcs_attr, gui_developer, favorite_editor, flowvalue, drcs, )
 supermod.python_programmerType.subclass = python_programmerTypeSub
 # end class python_programmerTypeSub
 
 
 class java_programmerTypeSub(supermod.java_programmerType):
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None):
-        super(java_programmerTypeSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, datetime1, datetime2, datetime3, datetime4, datetime5, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None):
+        super(java_programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, datetime1, datetime2, datetime3, datetime4, datetime5, )
 supermod.java_programmerType.subclass = java_programmerTypeSub
 # end class java_programmerTypeSub
 
@@ -159,8 +134,8 @@ supermod.boosterType.subclass = boosterTypeSub
 
 
 class infoTypeSub(supermod.infoType):
-    def __init__(self, rating=None, type_=None, name=None):
-        super(infoTypeSub, self).__init__(rating, type_, name, )
+    def __init__(self, name=None, type_=None, rating=None):
+        super(infoTypeSub, self).__init__(name, type_, rating, )
 supermod.infoType.subclass = infoTypeSub
 # end class infoTypeSub
 
@@ -210,11 +185,12 @@ def get_root_tag(node):
 
 
 def parse(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -230,11 +206,12 @@ def parse(inFilename, silence=False):
 
 
 def parseEtree(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -254,11 +231,12 @@ def parseEtree(inFilename, silence=False):
 
 def parseString(inString, silence=False):
     from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -273,11 +251,12 @@ def parseString(inString, silence=False):
 
 
 def parseLiteral(inFilename, silence=False):
-    doc = parsexml_(inFilename)
+    parser = None
+    doc = parsexml_(inFilename, parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'peopleType'
         rootClass = supermod.peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -286,8 +265,8 @@ def parseLiteral(inFilename, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from to_etree2_sup import *\n\n')
 ##         sys.stdout.write('import to_etree2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.people(\n')
-##         rootObj.exportLiteral(sys.stdout, 0, name_="people")
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
+##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
 
@@ -298,7 +277,7 @@ Usage: python ???.py <infilename>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index 4e8bfd1..a91bf21 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -4,66 +4,56 @@
 #
 # Generated  by generateDS.py.
 #
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--silence', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/to_etree2_sup.py')
+#   ('-s', 'tests/to_etree2_sub.py')
+#   ('--export', 'etree')
+#   ('--silence', '')
+#   ('--super', 'to_etree2_sup')
+#
+# Command line arguments:
+#   tests/to_etree.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/to_etree2_sup.py" -s "tests/to_etree2_sub.py" --export="etree" --silence --super="to_etree2_sup" tests/to_etree.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
 
 import sys
-import getopt
 import re as re_
 import base64
 import datetime as datetime_
-
-etree_ = None
-Verbose_import_ = False
-(
-    XMLParser_import_none, XMLParser_import_lxml,
-    XMLParser_import_elementtree
-) = range(3)
-XMLParser_import_library = None
+import warnings as warnings_
 try:
-    # lxml
     from lxml import etree as etree_
-    XMLParser_import_library = XMLParser_import_lxml
-    if Verbose_import_:
-        print("running with lxml.etree")
 except ImportError:
-    try:
-        # cElementTree from Python 2.5+
-        import xml.etree.cElementTree as etree_
-        XMLParser_import_library = XMLParser_import_elementtree
-        if Verbose_import_:
-            print("running with cElementTree on Python 2.5+")
-    except ImportError:
-        try:
-            # ElementTree from Python 2.5+
-            import xml.etree.ElementTree as etree_
-            XMLParser_import_library = XMLParser_import_elementtree
-            if Verbose_import_:
-                print("running with ElementTree on Python 2.5+")
-        except ImportError:
-            try:
-                # normal cElementTree install
-                import cElementTree as etree_
-                XMLParser_import_library = XMLParser_import_elementtree
-                if Verbose_import_:
-                    print("running with cElementTree")
-            except ImportError:
-                try:
-                    # normal ElementTree install
-                    import elementtree.ElementTree as etree_
-                    XMLParser_import_library = XMLParser_import_elementtree
-                    if Verbose_import_:
-                        print("running with ElementTree")
-                except ImportError:
-                    raise ImportError(
-                        "Failed to import ElementTree from any known place")
-
-
-def parsexml_(*args, **kwargs):
-    if (XMLParser_import_library == XMLParser_import_lxml and
-            'parser' not in kwargs):
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
         # Use the lxml ElementTree compatible parser so that, e.g.,
         #   we ignore comments.
-        kwargs['parser'] = etree_.ETCompatXMLParser()
-    doc = etree_.parse(*args, **kwargs)
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
     return doc
 
 #
@@ -75,7 +65,7 @@ def parsexml_(*args, **kwargs):
 
 try:
     from generatedssuper import GeneratedsSuper
-except ImportError, exp:
+except ImportError as exp:
 
     class GeneratedsSuper(object):
         tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
@@ -91,61 +81,68 @@ except ImportError, exp:
                 return None
         def gds_format_string(self, input_data, input_name=''):
             return input_data
-        def gds_validate_string(self, input_data, node, input_name=''):
-            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
         def gds_format_base64(self, input_data, input_name=''):
             return base64.b64encode(input_data)
-        def gds_validate_base64(self, input_data, node, input_name=''):
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer(self, input_data, input_name=''):
             return '%d' % input_data
-        def gds_validate_integer(self, input_data, node, input_name=''):
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_integer_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_integer_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
-                    float(value)
+                    int(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of integers')
-            return input_data
+            return values
         def gds_format_float(self, input_data, input_name=''):
             return ('%.15f' % input_data).rstrip('0')
-        def gds_validate_float(self, input_data, node, input_name=''):
+        def gds_validate_float(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_float_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_float_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of floats')
-            return input_data
+            return values
         def gds_format_double(self, input_data, input_name=''):
             return '%e' % input_data
-        def gds_validate_double(self, input_data, node, input_name=''):
+        def gds_validate_double(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_double_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_double_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 try:
                     float(value)
                 except (TypeError, ValueError):
                     raise_parse_error(node, 'Requires sequence of doubles')
-            return input_data
+            return values
         def gds_format_boolean(self, input_data, input_name=''):
             return ('%s' % input_data).lower()
-        def gds_validate_boolean(self, input_data, node, input_name=''):
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_boolean_list(self, input_data, input_name=''):
-            return '%s' % input_data
-        def gds_validate_boolean_list(self, input_data, node, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
             values = input_data.split()
             for value in values:
                 if value not in ('true', '1', 'false', '0', ):
@@ -153,8 +150,8 @@ except ImportError, exp:
                         node,
                         'Requires sequence of booleans '
                         '("true", "1", "false", "0")')
-            return input_data
-        def gds_validate_datetime(self, input_data, node, input_name=''):
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_datetime(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -208,7 +205,10 @@ except ImportError, exp:
                     tz = GeneratedsSuper._FixedOffsetTZ(
                         tzoff, results.group(0))
                     input_data = input_data[:-6]
-            if len(input_data.split('.')) > 1:
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
                 dt = datetime_.datetime.strptime(
                     input_data, '%Y-%m-%dT%H:%M:%S.%f')
             else:
@@ -216,7 +216,7 @@ except ImportError, exp:
                     input_data, '%Y-%m-%dT%H:%M:%S')
             dt = dt.replace(tzinfo=tz)
             return dt
-        def gds_validate_date(self, input_data, node, input_name=''):
+        def gds_validate_date(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_date(self, input_data, input_name=''):
             _svalue = '%04d-%02d-%02d' % (
@@ -239,7 +239,8 @@ except ImportError, exp:
                                 _svalue += '+'
                             hours = total_seconds // 3600
                             minutes = (total_seconds - (hours * 3600)) // 60
-                            _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
             except AttributeError:
                 pass
             return _svalue
@@ -262,7 +263,7 @@ except ImportError, exp:
             dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
             dt = dt.replace(tzinfo=tz)
             return dt.date()
-        def gds_validate_time(self, input_data, node, input_name=''):
+        def gds_validate_time(self, input_data, node=None, input_name=''):
             return input_data
         def gds_format_time(self, input_data, input_name=''):
             if input_data.microsecond == 0:
@@ -294,6 +295,21 @@ except ImportError, exp:
                         minutes = (total_seconds - (hours * 3600)) // 60
                         _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
             return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
         @classmethod
         def gds_parse_time(cls, input_data):
             tz = None
@@ -349,6 +365,29 @@ except ImportError, exp:
         @classmethod
         def gds_reverse_node_mapping(cls, mapping):
             return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
 
 
 #
@@ -374,6 +413,11 @@ ExternalEncoding = 'ascii'
 Tag_pattern_ = re_.compile(r'({.*})?(.*)')
 String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
 Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
 
 #
 # Support/utility functions.
@@ -387,19 +431,32 @@ def showIndent(outfile, level, pretty_print=True):
 
 
 def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
     if not inStr:
         return ''
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
-    s1 = s1.replace('&', '&amp;')
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
     return s1
 
 
 def quote_attrib(inStr):
-    s1 = (isinstance(inStr, basestring) and inStr or
-          '%s' % inStr)
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s1 = s1.replace('&', '&amp;')
     s1 = s1.replace('<', '&lt;')
     s1 = s1.replace('>', '&gt;')
@@ -459,11 +516,7 @@ class GDSParseError(Exception):
 
 
 def raise_parse_error(node, msg):
-    if XMLParser_import_library == XMLParser_import_lxml:
-        msg = '%s (element %s/line %d)' % (
-            msg, node.tag, node.sourceline, )
-    else:
-        msg = '%s (element %s)' % (msg, node.tag, )
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
     raise GDSParseError(msg)
 
 
@@ -504,7 +557,8 @@ class MixedContainer:
         elif self.category == MixedContainer.CategorySimple:
             self.exportSimple(outfile, level, name)
         else:    # category == MixedContainer.CategoryComplex
-            self.value.export(outfile, level, namespace, name, pretty_print)
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
     def exportSimple(self, outfile, level, name):
         if self.content_type == MixedContainer.TypeString:
             outfile.write('<%s>%s</%s>' % (
@@ -620,6 +674,7 @@ class peopleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None):
+        self.original_tagname_ = None
         if comments is None:
             self.comments = []
         else:
@@ -645,6 +700,11 @@ class peopleType(GeneratedsSuper):
         else:
             self.java_programmer = java_programmer
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, peopleType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if peopleType.subclass:
             return peopleType.subclass(*args_, **kwargs_)
         else:
@@ -653,27 +713,33 @@ class peopleType(GeneratedsSuper):
     def get_comments(self): return self.comments
     def set_comments(self, comments): self.comments = comments
     def add_comments(self, value): self.comments.append(value)
-    def insert_comments(self, index, value): self.comments[index] = value
+    def insert_comments_at(self, index, value): self.comments.insert(index, value)
+    def replace_comments_at(self, index, value): self.comments[index] = value
     def get_person(self): return self.person
     def set_person(self, person): self.person = person
     def add_person(self, value): self.person.append(value)
-    def insert_person(self, index, value): self.person[index] = value
+    def insert_person_at(self, index, value): self.person.insert(index, value)
+    def replace_person_at(self, index, value): self.person[index] = value
     def get_specialperson(self): return self.specialperson
     def set_specialperson(self, specialperson): self.specialperson = specialperson
     def add_specialperson(self, value): self.specialperson.append(value)
-    def insert_specialperson(self, index, value): self.specialperson[index] = value
+    def insert_specialperson_at(self, index, value): self.specialperson.insert(index, value)
+    def replace_specialperson_at(self, index, value): self.specialperson[index] = value
     def get_programmer(self): return self.programmer
     def set_programmer(self, programmer): self.programmer = programmer
     def add_programmer(self, value): self.programmer.append(value)
-    def insert_programmer(self, index, value): self.programmer[index] = value
+    def insert_programmer_at(self, index, value): self.programmer.insert(index, value)
+    def replace_programmer_at(self, index, value): self.programmer[index] = value
     def get_python_programmer(self): return self.python_programmer
     def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer
     def add_python_programmer(self, value): self.python_programmer.append(value)
-    def insert_python_programmer(self, index, value): self.python_programmer[index] = value
+    def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value)
+    def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value
     def get_java_programmer(self): return self.java_programmer
     def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer
     def add_java_programmer(self, value): self.java_programmer.append(value)
-    def insert_java_programmer(self, index, value): self.java_programmer[index] = value
+    def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value)
+    def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value
     def hasContent_(self):
         if (
             self.comments or
@@ -712,6 +778,7 @@ class peopleType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -719,28 +786,34 @@ class peopleType(GeneratedsSuper):
             obj_ = commentsType.factory()
             obj_.build(child_)
             self.comments.append(obj_)
+            obj_.original_tagname_ = 'comments'
         elif nodeName_ == 'person':
             class_obj_ = self.get_class_obj_(child_, personType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.person.append(obj_)
+            obj_.original_tagname_ = 'person'
         elif nodeName_ == 'specialperson':
             obj_ = specialperson.factory()
             obj_.build(child_)
             self.specialperson.append(obj_)
+            obj_.original_tagname_ = 'specialperson'
         elif nodeName_ == 'programmer':
             class_obj_ = self.get_class_obj_(child_, programmerType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.programmer.append(obj_)
+            obj_.original_tagname_ = 'programmer'
         elif nodeName_ == 'python-programmer':
             obj_ = python_programmerType.factory()
             obj_.build(child_)
             self.python_programmer.append(obj_)
+            obj_.original_tagname_ = 'python-programmer'
         elif nodeName_ == 'java-programmer':
             obj_ = java_programmerType.factory()
             obj_.build(child_)
             self.java_programmer.append(obj_)
+            obj_.original_tagname_ = 'java-programmer'
 # end class peopleType
 
 
@@ -753,6 +826,7 @@ class commentsType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None):
+        self.original_tagname_ = None
         if emp is None:
             self.emp = []
         else:
@@ -772,6 +846,11 @@ class commentsType(GeneratedsSuper):
             self.content_ = content_
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, commentsType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if commentsType.subclass:
             return commentsType.subclass(*args_, **kwargs_)
         else:
@@ -780,18 +859,20 @@ class commentsType(GeneratedsSuper):
     def get_emp(self): return self.emp
     def set_emp(self, emp): self.emp = emp
     def add_emp(self, value): self.emp.append(value)
-    def insert_emp(self, index, value): self.emp[index] = value
+    def insert_emp_at(self, index, value): self.emp.insert(index, value)
+    def replace_emp_at(self, index, value): self.emp[index] = value
     def get_bold(self): return self.bold
     def set_bold(self, bold): self.bold = bold
     def add_bold(self, value): self.bold.append(value)
-    def insert_bold(self, index, value): self.bold[index] = value
+    def insert_bold_at(self, index, value): self.bold.insert(index, value)
+    def replace_bold_at(self, index, value): self.bold[index] = value
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def hasContent_(self):
         if (
             self.emp or
             self.bold or
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -817,6 +898,7 @@ class commentsType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -839,11 +921,11 @@ class commentsType(GeneratedsSuper):
 
 class personType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('vegetable', 'xs:string', 0),
-        MemberSpec_('fruit', 'xs:string', 0),
-        MemberSpec_('ratio', 'xs:float', 0),
-        MemberSpec_('id', 'xs:integer', 0),
         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),
@@ -855,12 +937,13 @@ class personType(GeneratedsSuper):
     ]
     subclass = None
     superclass = None
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None):
-        self.vegetable = _cast(None, vegetable)
-        self.fruit = _cast(None, fruit)
-        self.ratio = _cast(float, ratio)
-        self.id = _cast(int, id)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.value = _cast(None, value)
+        self.id = _cast(int, id)
+        self.ratio = _cast(float, ratio)
+        self.fruit = _cast(None, fruit)
+        self.vegetable = _cast(None, vegetable)
         self.name = name
         if interest is None:
             self.interest = []
@@ -878,8 +961,14 @@ class personType(GeneratedsSuper):
             self.promoter = promoter
         self.description = description
         self.range_ = range_
+        self.validate_RangeType(self.range_)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, personType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if personType.subclass:
             return personType.subclass(*args_, **kwargs_)
         else:
@@ -890,7 +979,8 @@ class personType(GeneratedsSuper):
     def get_interest(self): return self.interest
     def set_interest(self, interest): self.interest = interest
     def add_interest(self, value): self.interest.append(value)
-    def insert_interest(self, index, value): self.interest[index] = value
+    def insert_interest_at(self, index, value): self.interest.insert(index, value)
+    def replace_interest_at(self, index, value): self.interest[index] = value
     def get_category(self): return self.category
     def set_category(self, category): self.category = category
     def get_hot_agent(self): return self.hot_agent
@@ -898,30 +988,33 @@ class personType(GeneratedsSuper):
     def get_agent(self): return self.agent
     def set_agent(self, agent): self.agent = agent
     def add_agent(self, value): self.agent.append(value)
-    def insert_agent(self, index, value): self.agent[index] = value
+    def insert_agent_at(self, index, value): self.agent.insert(index, value)
+    def replace_agent_at(self, index, value): self.agent[index] = value
     def get_promoter(self): return self.promoter
     def set_promoter(self, promoter): self.promoter = promoter
     def add_promoter(self, value): self.promoter.append(value)
-    def insert_promoter(self, index, value): self.promoter[index] = value
+    def insert_promoter_at(self, index, value): self.promoter.insert(index, value)
+    def replace_promoter_at(self, index, value): self.promoter[index] = value
     def get_description(self): return self.description
     def set_description(self, description): self.description = description
     def get_range(self): return self.range_
     def set_range(self, range_): self.range_ = range_
-    def get_vegetable(self): return self.vegetable
-    def set_vegetable(self, vegetable): self.vegetable = vegetable
-    def get_fruit(self): return self.fruit
-    def set_fruit(self, fruit): self.fruit = fruit
-    def get_ratio(self): return self.ratio
-    def set_ratio(self, ratio): self.ratio = ratio
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
     def get_value(self): return self.value
     def set_value(self, value): self.value = value
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
+    def get_ratio(self): return self.ratio
+    def set_ratio(self, ratio): self.ratio = ratio
+    def get_fruit(self): return self.fruit
+    def set_fruit(self, fruit): self.fruit = fruit
+    def get_vegetable(self): return self.vegetable
+    def set_vegetable(self, vegetable): self.vegetable = vegetable
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_RangeType(self, value):
         # Validate type RangeType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+            pass
     def hasContent_(self):
         if (
             self.name is not None or
@@ -943,16 +1036,16 @@ class personType(GeneratedsSuper):
             element = etree_.SubElement(parent_element, '{}' + name_)
         if self.extensiontype_ is not None:
             element.set('{http://www.w3.org/2001/XMLSchema-instance}type', self.extensiontype_)
-        if self.vegetable is not None:
-            element.set('vegetable', self.gds_format_string(self.vegetable))
-        if self.fruit is not None:
-            element.set('fruit', self.gds_format_string(self.fruit))
-        if self.ratio is not None:
-            element.set('ratio', self.gds_format_float(self.ratio))
-        if self.id is not None:
-            element.set('id', self.gds_format_integer(self.id))
         if self.value is not None:
             element.set('value', self.gds_format_string(self.value))
+        if self.id is not None:
+            element.set('id', self.gds_format_integer(self.id))
+        if self.ratio is not None:
+            element.set('ratio', self.gds_format_float(self.ratio))
+        if self.fruit is not None:
+            element.set('fruit', self.gds_format_string(self.fruit))
+        if self.vegetable is not None:
+            element.set('vegetable', self.gds_format_string(self.vegetable))
         if self.name is not None:
             name_ = self.name
             etree_.SubElement(element, '{}name').text = self.gds_format_string(name_)
@@ -983,33 +1076,34 @@ class personType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('vegetable', node)
-        if value is not None and 'vegetable' not in already_processed:
-            already_processed.add('vegetable')
-            self.vegetable = value
-        value = find_attr_value_('fruit', node)
-        if value is not None and 'fruit' not in already_processed:
-            already_processed.add('fruit')
-            self.fruit = value
-        value = find_attr_value_('ratio', node)
-        if value is not None and 'ratio' not in already_processed:
-            already_processed.add('ratio')
-            try:
-                self.ratio = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('value', node)
+        if value is not None and 'value' not in already_processed:
+            already_processed.add('value')
+            self.value = value
         value = find_attr_value_('id', node)
         if value is not None and 'id' not in already_processed:
             already_processed.add('id')
             try:
                 self.id = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('value', node)
-        if value is not None and 'value' not in already_processed:
-            already_processed.add('value')
-            self.value = value
+        value = find_attr_value_('ratio', node)
+        if value is not None and 'ratio' not in already_processed:
+            already_processed.add('ratio')
+            try:
+                self.ratio = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (ratio): %s' % exp)
+        value = find_attr_value_('fruit', node)
+        if value is not None and 'fruit' not in already_processed:
+            already_processed.add('fruit')
+            self.fruit = value
+        value = find_attr_value_('vegetable', node)
+        if value is not None and 'vegetable' not in already_processed:
+            already_processed.add('vegetable')
+            self.vegetable = value
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
@@ -1027,7 +1121,7 @@ class personType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'category')
             self.category = ival_
@@ -1035,15 +1129,18 @@ class personType(GeneratedsSuper):
             obj_ = hot_agent.factory()
             obj_.build(child_)
             self.hot_agent = obj_
+            obj_.original_tagname_ = 'hot.agent'
         elif nodeName_ == 'agent':
             class_obj_ = self.get_class_obj_(child_, agentType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.agent.append(obj_)
+            obj_.original_tagname_ = 'agent'
         elif nodeName_ == 'promoter':
             obj_ = boosterType.factory()
             obj_.build(child_)
             self.promoter.append(obj_)
+            obj_.original_tagname_ = 'promoter'
         elif nodeName_ == 'description':
             description_ = child_.text
             description_ = self.gds_validate_string(description_, node, 'description')
@@ -1052,11 +1149,12 @@ class personType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'range')
             self.range_ = ival_
-            self.validate_RangeType(self.range_)    # validate type RangeType
+            # validate type RangeType
+            self.validate_RangeType(self.range_)
 # end class personType
 
 
@@ -1065,10 +1163,15 @@ class specialperson(personType):
     ]
     subclass = None
     superclass = personType
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None):
-        super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, )
-        pass
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None):
+        self.original_tagname_ = None
+        super(specialperson, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, )
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, specialperson)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if specialperson.subclass:
             return specialperson.subclass(*args_, **kwargs_)
         else:
@@ -1092,6 +1195,7 @@ class specialperson(personType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(specialperson, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1104,10 +1208,10 @@ class programmerType(personType):
     member_data_items_ = [
         MemberSpec_('language', 'xs:string', 0),
         MemberSpec_('area', 'xs:string', 0),
-        MemberSpec_('attrnegint', 'xs:negativeInteger', 0),
         MemberSpec_('attrposint', 'xs:positiveInteger', 0),
-        MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 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),
@@ -1124,30 +1228,31 @@ class programmerType(personType):
     ]
     subclass = None
     superclass = personType
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
-        super(programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, )
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None):
+        self.original_tagname_ = None
+        super(programmerType, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, )
         self.language = _cast(None, language)
         self.area = _cast(None, area)
-        self.attrnegint = _cast(int, attrnegint)
         self.attrposint = _cast(int, attrposint)
-        self.attrnonnegint = _cast(int, attrnonnegint)
         self.attrnonposint = _cast(int, attrnonposint)
+        self.attrnegint = _cast(int, attrnegint)
+        self.attrnonnegint = _cast(int, attrnonnegint)
         self.email = email
         self.elposint = elposint
         self.elnonposint = elnonposint
         self.elnegint = elnegint
         self.elnonnegint = elnonnegint
-        if isinstance(eldate, basestring):
+        if isinstance(eldate, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date()
         else:
             initvalue_ = eldate
         self.eldate = initvalue_
-        if isinstance(eldatetime, basestring):
+        if isinstance(eldatetime, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = eldatetime
         self.eldatetime = initvalue_
-        if isinstance(eldatetime1, basestring):
+        if isinstance(eldatetime1, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(eldatetime1, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = eldatetime1
@@ -1157,8 +1262,14 @@ class programmerType(personType):
         self.ellong = ellong
         self.elparam = elparam
         self.elarraytypes = elarraytypes
+        self.validate_ArrayTypes(self.elarraytypes)
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, programmerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if programmerType.subclass:
             return programmerType.subclass(*args_, **kwargs_)
         else:
@@ -1194,19 +1305,28 @@ class programmerType(personType):
     def set_language(self, language): self.language = language
     def get_area(self): return self.area
     def set_area(self, area): self.area = area
-    def get_attrnegint(self): return self.attrnegint
-    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
     def get_attrposint(self): return self.attrposint
     def set_attrposint(self, attrposint): self.attrposint = attrposint
-    def get_attrnonnegint(self): return self.attrnonnegint
-    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
     def get_attrnonposint(self): return self.attrnonposint
     def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint
+    def get_attrnegint(self): return self.attrnegint
+    def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint
+    def get_attrnonnegint(self): return self.attrnonnegint
+    def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def validate_ArrayTypes(self, value):
         # Validate type ArrayTypes, a restriction on xs:NMTOKEN.
-        pass
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['float', 'int', 'Name', 'token']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} )
     def hasContent_(self):
         if (
             self.email is not None or
@@ -1235,14 +1355,14 @@ class programmerType(personType):
             element.set('language', self.gds_format_string(self.language))
         if self.area is not None:
             element.set('area', self.gds_format_string(self.area))
-        if self.attrnegint is not None:
-            element.set('attrnegint', self.gds_format_integer(self.attrnegint))
         if self.attrposint is not None:
             element.set('attrposint', self.gds_format_integer(self.attrposint))
-        if self.attrnonnegint is not None:
-            element.set('attrnonnegint', self.gds_format_integer(self.attrnonnegint))
         if self.attrnonposint is not None:
             element.set('attrnonposint', self.gds_format_integer(self.attrnonposint))
+        if self.attrnegint is not None:
+            element.set('attrnegint', self.gds_format_integer(self.attrnegint))
+        if self.attrnonnegint is not None:
+            element.set('attrnonnegint', self.gds_format_integer(self.attrnonnegint))
         if self.email is not None:
             email_ = self.email
             etree_.SubElement(element, '{}email').text = self.gds_format_string(email_)
@@ -1291,6 +1411,7 @@ class programmerType(personType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('language', node)
         if value is not None and 'language' not in already_processed:
@@ -1300,42 +1421,42 @@ class programmerType(personType):
         if value is not None and 'area' not in already_processed:
             already_processed.add('area')
             self.area = value
-        value = find_attr_value_('attrnegint', node)
-        if value is not None and 'attrnegint' not in already_processed:
-            already_processed.add('attrnegint')
-            try:
-                self.attrnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnegint >= 0:
-                raise_parse_error(node, 'Invalid NegativeInteger')
         value = find_attr_value_('attrposint', node)
         if value is not None and 'attrposint' not in already_processed:
             already_processed.add('attrposint')
             try:
                 self.attrposint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrposint <= 0:
                 raise_parse_error(node, 'Invalid PositiveInteger')
-        value = find_attr_value_('attrnonnegint', node)
-        if value is not None and 'attrnonnegint' not in already_processed:
-            already_processed.add('attrnonnegint')
-            try:
-                self.attrnonnegint = int(value)
-            except ValueError, exp:
-                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-            if self.attrnonnegint < 0:
-                raise_parse_error(node, 'Invalid NonNegativeInteger')
         value = find_attr_value_('attrnonposint', node)
         if value is not None and 'attrnonposint' not in already_processed:
             already_processed.add('attrnonposint')
             try:
                 self.attrnonposint = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             if self.attrnonposint > 0:
                 raise_parse_error(node, 'Invalid NonPositiveInteger')
+        value = find_attr_value_('attrnegint', node)
+        if value is not None and 'attrnegint' not in already_processed:
+            already_processed.add('attrnegint')
+            try:
+                self.attrnegint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnegint >= 0:
+                raise_parse_error(node, 'Invalid NegativeInteger')
+        value = find_attr_value_('attrnonnegint', node)
+        if value is not None and 'attrnonnegint' not in already_processed:
+            already_processed.add('attrnonnegint')
+            try:
+                self.attrnonnegint = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+            if self.attrnonnegint < 0:
+                raise_parse_error(node, 'Invalid NonNegativeInteger')
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
             already_processed.add('xsi:type')
@@ -1350,7 +1471,7 @@ class programmerType(personType):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ <= 0:
                 raise_parse_error(child_, 'requires positiveInteger')
@@ -1360,7 +1481,7 @@ class programmerType(personType):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ > 0:
                 raise_parse_error(child_, 'requires nonPositiveInteger')
@@ -1370,7 +1491,7 @@ class programmerType(personType):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ >= 0:
                 raise_parse_error(child_, 'requires negativeInteger')
@@ -1380,7 +1501,7 @@ class programmerType(personType):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             if ival_ < 0:
                 raise_parse_error(child_, 'requires nonNegativeInteger')
@@ -1400,14 +1521,17 @@ class programmerType(personType):
             self.eldatetime1 = dval_
         elif nodeName_ == 'eltoken':
             eltoken_ = child_.text
-            eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            if eltoken_:
+                eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip()
+            else:
+                eltoken_ = ""
             eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken')
             self.eltoken = eltoken_
         elif nodeName_ == 'elshort':
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'elshort')
             self.elshort = ival_
@@ -1415,7 +1539,7 @@ class programmerType(personType):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'ellong')
             self.ellong = ival_
@@ -1423,61 +1547,70 @@ class programmerType(personType):
             obj_ = paramType.factory()
             obj_.build(child_)
             self.elparam = obj_
+            obj_.original_tagname_ = 'elparam'
         elif nodeName_ == 'elarraytypes':
             elarraytypes_ = child_.text
             elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes')
             self.elarraytypes = elarraytypes_
-            self.validate_ArrayTypes(self.elarraytypes)    # validate type ArrayTypes
+            # validate type ArrayTypes
+            self.validate_ArrayTypes(self.elarraytypes)
         super(programmerType, self).buildChildren(child_, node, nodeName_, True)
 # end class programmerType
 
 
 class paramType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('semantic', 'xs:token', 0),
+        MemberSpec_('id', 'xs:string', 0),
         MemberSpec_('name', 'xs:NCName', 0),
-        MemberSpec_('flow', 'FlowType', 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),
         MemberSpec_('valueOf_', 'xs:string', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None):
-        self.semantic = _cast(None, semantic)
+    def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None):
+        self.original_tagname_ = None
+        self.id = _cast(None, id)
         self.name = _cast(None, name)
-        self.flow = _cast(None, flow)
         self.sid = _cast(None, sid)
+        self.flow = _cast(None, flow)
+        self.semantic = _cast(None, semantic)
         self.type_ = _cast(None, type_)
-        self.id = _cast(None, id)
         self.valueOf_ = valueOf_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, paramType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if paramType.subclass:
             return paramType.subclass(*args_, **kwargs_)
         else:
             return paramType(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_semantic(self): return self.semantic
-    def set_semantic(self, semantic): self.semantic = semantic
+    def get_id(self): return self.id
+    def set_id(self, id): self.id = id
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
-    def get_flow(self): return self.flow
-    def set_flow(self, flow): self.flow = flow
     def get_sid(self): return self.sid
     def set_sid(self, sid): self.sid = sid
+    def get_flow(self): return self.flow
+    def set_flow(self, flow): self.flow = flow
+    def get_semantic(self): return self.semantic
+    def set_semantic(self, semantic): self.semantic = semantic
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
-    def get_id(self): return self.id
-    def set_id(self, id): self.id = id
     def get_valueOf_(self): return self.valueOf_
     def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_
     def validate_FlowType(self, value):
         # Validate type FlowType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+            pass
     def hasContent_(self):
         if (
-            self.valueOf_
+            1 if type(self.valueOf_) in [int,float] else self.valueOf_
         ):
             return True
         else:
@@ -1487,18 +1620,20 @@ class paramType(GeneratedsSuper):
             element = etree_.Element('{}' + name_)
         else:
             element = etree_.SubElement(parent_element, '{}' + name_)
-        if self.semantic is not None:
-            element.set('semantic', self.gds_format_string(self.semantic))
+        if self.id is not None:
+            element.set('id', self.gds_format_string(self.id))
         if self.name is not None:
             element.set('name', self.name)
-        if self.flow is not None:
-            element.set('flow', self.flow)
         if self.sid is not None:
             element.set('sid', self.sid)
+        if self.flow is not None:
+            element.set('flow', self.flow)
+        if self.semantic is not None:
+            element.set('semantic', self.gds_format_string(self.semantic))
         if self.type_ is not None:
             element.set('type', self.gds_format_string(self.type_))
-        if self.id is not None:
-            element.set('id', self.gds_format_string(self.id))
+        if self.hasContent_():
+            element.text = self.gds_format_string(self.get_valueOf_())
         if mapping_ is not None:
             mapping_[self] = element
         return element
@@ -1509,36 +1644,37 @@ class paramType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('semantic', node)
-        if value is not None and 'semantic' not in already_processed:
-            already_processed.add('semantic')
-            self.semantic = value
-            self.semantic = ' '.join(self.semantic.split())
+        value = find_attr_value_('id', node)
+        if value is not None and 'id' not in already_processed:
+            already_processed.add('id')
+            self.id = value
         value = find_attr_value_('name', node)
         if value is not None and 'name' not in already_processed:
             already_processed.add('name')
             self.name = value
+        value = find_attr_value_('sid', node)
+        if value is not None and 'sid' not in already_processed:
+            already_processed.add('sid')
+            self.sid = value
         value = find_attr_value_('flow', node)
         if value is not None and 'flow' not in already_processed:
             already_processed.add('flow')
             try:
                 self.flow = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
             self.validate_FlowType(self.flow)    # validate type FlowType
-        value = find_attr_value_('sid', node)
-        if value is not None and 'sid' not in already_processed:
-            already_processed.add('sid')
-            self.sid = value
+        value = find_attr_value_('semantic', node)
+        if value is not None and 'semantic' not in already_processed:
+            already_processed.add('semantic')
+            self.semantic = value
+            self.semantic = ' '.join(self.semantic.split())
         value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
             already_processed.add('type')
             self.type_ = value
-        value = find_attr_value_('id', node)
-        if value is not None and 'id' not in already_processed:
-            already_processed.add('id')
-            self.id = value
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
 # end class paramType
@@ -1546,8 +1682,8 @@ class paramType(GeneratedsSuper):
 
 class python_programmerType(programmerType):
     member_data_items_ = [
-        MemberSpec_('drcs_attr', 'xs:string', 0),
         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),
@@ -1555,15 +1691,22 @@ class python_programmerType(programmerType):
     ]
     subclass = None
     superclass = programmerType
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, drcs_attr=None, nick_name=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None):
-        super(python_programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
-        self.drcs_attr = _cast(None, drcs_attr)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, drcs_attr=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None):
+        self.original_tagname_ = None
+        super(python_programmerType, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
+        self.drcs_attr = _cast(None, drcs_attr)
         self.gui_developer = _cast(bool, gui_developer)
         self.favorite_editor = favorite_editor
         self.flowvalue = flowvalue
+        self.validate_FlowType(self.flowvalue)
         self.drcs = drcs
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, python_programmerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if python_programmerType.subclass:
             return python_programmerType.subclass(*args_, **kwargs_)
         else:
@@ -1575,15 +1718,16 @@ class python_programmerType(programmerType):
     def set_flowvalue(self, flowvalue): self.flowvalue = flowvalue
     def get_drcs(self): return self.drcs
     def set_drcs(self, drcs): self.drcs = drcs
-    def get_drcs_attr(self): return self.drcs_attr
-    def set_drcs_attr(self, drcs_attr): self.drcs_attr = drcs_attr
     def get_nick_name(self): return self.nick_name
     def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def get_drcs_attr(self): return self.drcs_attr
+    def set_drcs_attr(self, drcs_attr): self.drcs_attr = drcs_attr
     def get_gui_developer(self): return self.gui_developer
     def set_gui_developer(self, gui_developer): self.gui_developer = gui_developer
     def validate_FlowType(self, value):
         # Validate type FlowType, a restriction on xs:integer.
-        pass
+        if value is not None and Validate_simpletypes_:
+            pass
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
@@ -1596,10 +1740,10 @@ class python_programmerType(programmerType):
             return False
     def to_etree(self, parent_element=None, name_='python-programmerType', mapping_=None):
         element = super(python_programmerType, self).to_etree(parent_element, name_, mapping_)
-        if self.drcs_attr is not None:
-            element.set('drcs_attr', self.gds_format_string(self.drcs_attr))
         if self.nick_name is not None:
             element.set('nick-name', self.gds_format_string(self.nick_name))
+        if self.drcs_attr is not None:
+            element.set('drcs_attr', self.gds_format_string(self.drcs_attr))
         if self.gui_developer is not None:
             element.set('gui_developer', self.gds_format_boolean(self.gui_developer))
         if self.favorite_editor is not None:
@@ -1620,15 +1764,16 @@ class python_programmerType(programmerType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('drcs', node)
-        if value is not None and 'drcs_attr' not in already_processed:
-            already_processed.add('drcs_attr')
-            self.drcs_attr = value
         value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
             already_processed.add('nick-name')
             self.nick_name = value
+        value = find_attr_value_('drcs', node)
+        if value is not None and 'drcs_attr' not in already_processed:
+            already_processed.add('drcs_attr')
+            self.drcs_attr = value
         value = find_attr_value_('gui_developer', node)
         if value is not None and 'gui_developer' not in already_processed:
             already_processed.add('gui_developer')
@@ -1648,11 +1793,12 @@ class python_programmerType(programmerType):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'flowvalue')
             self.flowvalue = ival_
-            self.validate_FlowType(self.flowvalue)    # validate type FlowType
+            # validate type FlowType
+            self.validate_FlowType(self.flowvalue)
         elif nodeName_ == 'drcs':
             drcs_ = child_.text
             drcs_ = self.gds_validate_string(drcs_, node, 'drcs')
@@ -1663,8 +1809,8 @@ class python_programmerType(programmerType):
 
 class java_programmerType(programmerType):
     member_data_items_ = [
-        MemberSpec_('status', 'xs:string', 0),
         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),
@@ -1674,10 +1820,11 @@ class java_programmerType(programmerType):
     ]
     subclass = None
     superclass = programmerType
-    def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None):
-        super(java_programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
-        self.status = _cast(None, status)
+    def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None):
+        self.original_tagname_ = None
+        super(java_programmerType, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, )
         self.nick_name = _cast(None, nick_name)
+        self.status = _cast(None, status)
         self.favorite_editor = favorite_editor
         self.datetime1 = datetime1
         self.datetime2 = datetime2
@@ -1685,6 +1832,11 @@ class java_programmerType(programmerType):
         self.datetime4 = datetime4
         self.datetime5 = datetime5
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, java_programmerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if java_programmerType.subclass:
             return java_programmerType.subclass(*args_, **kwargs_)
         else:
@@ -1702,10 +1854,10 @@ class java_programmerType(programmerType):
     def set_datetime4(self, datetime4): self.datetime4 = datetime4
     def get_datetime5(self): return self.datetime5
     def set_datetime5(self, datetime5): self.datetime5 = datetime5
-    def get_status(self): return self.status
-    def set_status(self, status): self.status = status
     def get_nick_name(self): return self.nick_name
     def set_nick_name(self, nick_name): self.nick_name = nick_name
+    def get_status(self): return self.status
+    def set_status(self, status): self.status = status
     def hasContent_(self):
         if (
             self.favorite_editor is not None or
@@ -1721,10 +1873,10 @@ class java_programmerType(programmerType):
             return False
     def to_etree(self, parent_element=None, name_='java-programmerType', mapping_=None):
         element = super(java_programmerType, self).to_etree(parent_element, name_, mapping_)
-        if self.status is not None:
-            element.set('status', self.gds_format_string(self.status))
         if self.nick_name is not None:
             element.set('nick-name', self.gds_format_string(self.nick_name))
+        if self.status is not None:
+            element.set('status', self.gds_format_string(self.status))
         if self.favorite_editor is not None:
             favorite_editor_ = self.favorite_editor
             etree_.SubElement(element, '{}favorite-editor').text = self.gds_format_string(favorite_editor_)
@@ -1752,15 +1904,16 @@ class java_programmerType(programmerType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('status', node)
-        if value is not None and 'status' not in already_processed:
-            already_processed.add('status')
-            self.status = value
         value = find_attr_value_('nick-name', node)
         if value is not None and 'nick-name' not in already_processed:
             already_processed.add('nick-name')
             self.nick_name = value
+        value = find_attr_value_('status', node)
+        if value is not None and 'status' not in already_processed:
+            already_processed.add('status')
+            self.status = value
         super(java_programmerType, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         if nodeName_ == 'favorite-editor':
@@ -1802,6 +1955,7 @@ class agentType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
@@ -1812,6 +1966,11 @@ class agentType(GeneratedsSuper):
             self.vehicle = vehicle
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, agentType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if agentType.subclass:
             return agentType.subclass(*args_, **kwargs_)
         else:
@@ -1828,7 +1987,8 @@ class agentType(GeneratedsSuper):
     def get_vehicle(self): return self.vehicle
     def set_vehicle(self, vehicle): self.vehicle = vehicle
     def add_vehicle(self, value): self.vehicle.append(value)
-    def insert_vehicle(self, index, value): self.vehicle[index] = value
+    def insert_vehicle_at(self, index, value): self.vehicle.insert(index, value)
+    def replace_vehicle_at(self, index, value): self.vehicle[index] = value
     def get_extensiontype_(self): return self.extensiontype_
     def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_
     def hasContent_(self):
@@ -1872,6 +2032,7 @@ class agentType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
@@ -1890,7 +2051,7 @@ class agentType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
@@ -1898,11 +2059,13 @@ class agentType(GeneratedsSuper):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         elif nodeName_ == 'vehicle':
             class_obj_ = self.get_class_obj_(child_, vehicleType)
             obj_ = class_obj_.factory()
             obj_.build(child_)
             self.vehicle.append(obj_)
+            obj_.original_tagname_ = 'vehicle'
 # end class agentType
 
 
@@ -1918,12 +2081,18 @@ class special_agentType(agentType):
     subclass = None
     superclass = agentType
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         super(special_agentType, self).__init__(firstname, lastname, priority, info, vehicle, )
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
         self.info = info
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, special_agentType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if special_agentType.subclass:
             return special_agentType.subclass(*args_, **kwargs_)
         else:
@@ -1971,6 +2140,7 @@ class special_agentType(agentType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(special_agentType, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -1986,7 +2156,7 @@ class special_agentType(agentType):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
@@ -1994,6 +2164,7 @@ class special_agentType(agentType):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         super(special_agentType, self).buildChildren(child_, node, nodeName_, True)
 # end class special_agentType
 
@@ -2010,12 +2181,18 @@ class weird_agentType(agentType):
     subclass = None
     superclass = agentType
     def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None):
+        self.original_tagname_ = None
         super(weird_agentType, self).__init__(firstname, lastname, priority, info, vehicle, )
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
         self.info = info
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, weird_agentType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if weird_agentType.subclass:
             return weird_agentType.subclass(*args_, **kwargs_)
         else:
@@ -2063,6 +2240,7 @@ class weird_agentType(agentType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(weird_agentType, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2078,7 +2256,7 @@ class weird_agentType(agentType):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
@@ -2086,6 +2264,7 @@ class weird_agentType(agentType):
             obj_ = infoType.factory()
             obj_.build(child_)
             self.info = obj_
+            obj_.original_tagname_ = 'info'
         super(weird_agentType, self).buildChildren(child_, node, nodeName_, True)
 # end class weird_agentType
 
@@ -2104,6 +2283,7 @@ class boosterType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None):
+        self.original_tagname_ = None
         self.member_id = _cast(None, member_id)
         self.firstname = firstname
         self.lastname = lastname
@@ -2122,6 +2302,11 @@ class boosterType(GeneratedsSuper):
         else:
             self.client_handler = client_handler
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, boosterType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if boosterType.subclass:
             return boosterType.subclass(*args_, **kwargs_)
         else:
@@ -2138,15 +2323,18 @@ class boosterType(GeneratedsSuper):
     def get_other_value(self): return self.other_value
     def set_other_value(self, other_value): self.other_value = other_value
     def add_other_value(self, value): self.other_value.append(value)
-    def insert_other_value(self, index, value): self.other_value[index] = value
+    def insert_other_value_at(self, index, value): self.other_value.insert(index, value)
+    def replace_other_value_at(self, index, value): self.other_value[index] = value
     def get_type(self): return self.type_
     def set_type(self, type_): self.type_ = type_
     def add_type(self, value): self.type_.append(value)
-    def insert_type(self, index, value): self.type_[index] = value
+    def insert_type_at(self, index, value): self.type_.insert(index, value)
+    def replace_type_at(self, index, value): self.type_[index] = value
     def get_client_handler(self): return self.client_handler
     def set_client_handler(self, client_handler): self.client_handler = client_handler
     def add_client_handler(self, value): self.client_handler.append(value)
-    def insert_client_handler(self, index, value): self.client_handler[index] = value
+    def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value)
+    def replace_client_handler_at(self, index, value): self.client_handler[index] = value
     def get_member_id(self): return self.member_id
     def set_member_id(self, member_id): self.member_id = member_id
     def hasContent_(self):
@@ -2196,6 +2384,7 @@ class boosterType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('member-id', node)
         if value is not None and 'member-id' not in already_processed:
@@ -2214,7 +2403,7 @@ class boosterType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'other_name')
             self.other_name = fval_
@@ -2222,7 +2411,7 @@ class boosterType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'class')
             self.class_ = fval_
@@ -2230,7 +2419,7 @@ class boosterType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'other_value')
             self.other_value.append(fval_)
@@ -2238,7 +2427,7 @@ class boosterType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'type')
             self.type_.append(fval_)
@@ -2246,34 +2435,40 @@ class boosterType(GeneratedsSuper):
             obj_ = client_handlerType.factory()
             obj_.build(child_)
             self.client_handler.append(obj_)
+            obj_.original_tagname_ = 'client-handler'
 # end class boosterType
 
 
 class infoType(GeneratedsSuper):
     member_data_items_ = [
-        MemberSpec_('rating', 'xs:float', 0),
-        MemberSpec_('type', 'xs:integer', 0),
         MemberSpec_('name', 'xs:string', 0),
+        MemberSpec_('type', 'xs:integer', 0),
+        MemberSpec_('rating', 'xs:float', 0),
     ]
     subclass = None
     superclass = None
-    def __init__(self, rating=None, type_=None, name=None):
-        self.rating = _cast(float, rating)
-        self.type_ = _cast(int, type_)
+    def __init__(self, name=None, type_=None, rating=None):
+        self.original_tagname_ = None
         self.name = _cast(None, name)
-        pass
+        self.type_ = _cast(int, type_)
+        self.rating = _cast(float, rating)
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, infoType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if infoType.subclass:
             return infoType.subclass(*args_, **kwargs_)
         else:
             return infoType(*args_, **kwargs_)
     factory = staticmethod(factory)
-    def get_rating(self): return self.rating
-    def set_rating(self, rating): self.rating = rating
-    def get_type(self): return self.type_
-    def set_type(self, type_): self.type_ = type_
     def get_name(self): return self.name
     def set_name(self, name): self.name = name
+    def get_type(self): return self.type_
+    def set_type(self, type_): self.type_ = type_
+    def get_rating(self): return self.rating
+    def set_rating(self, rating): self.rating = rating
     def hasContent_(self):
         if (
 
@@ -2286,12 +2481,12 @@ class infoType(GeneratedsSuper):
             element = etree_.Element('{}' + name_)
         else:
             element = etree_.SubElement(parent_element, '{}' + name_)
-        if self.rating is not None:
-            element.set('rating', self.gds_format_float(self.rating))
-        if self.type_ is not None:
-            element.set('type', self.gds_format_integer(self.type_))
         if self.name is not None:
             element.set('name', self.gds_format_string(self.name))
+        if self.type_ is not None:
+            element.set('type', self.gds_format_integer(self.type_))
+        if self.rating is not None:
+            element.set('rating', self.gds_format_float(self.rating))
         if mapping_ is not None:
             mapping_[self] = element
         return element
@@ -2301,25 +2496,26 @@ class infoType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
-        value = find_attr_value_('rating', node)
-        if value is not None and 'rating' not in already_processed:
-            already_processed.add('rating')
-            try:
-                self.rating = float(value)
-            except ValueError, exp:
-                raise ValueError('Bad float/double attribute (rating): %s' % exp)
+        value = find_attr_value_('name', node)
+        if value is not None and 'name' not in already_processed:
+            already_processed.add('name')
+            self.name = value
         value = find_attr_value_('type', node)
         if value is not None and 'type' not in already_processed:
             already_processed.add('type')
             try:
                 self.type_ = int(value)
-            except ValueError, exp:
+            except ValueError as exp:
                 raise_parse_error(node, 'Bad integer attribute: %s' % exp)
-        value = find_attr_value_('name', node)
-        if value is not None and 'name' not in already_processed:
-            already_processed.add('name')
-            self.name = value
+        value = find_attr_value_('rating', node)
+        if value is not None and 'rating' not in already_processed:
+            already_processed.add('rating')
+            try:
+                self.rating = float(value)
+            except ValueError as exp:
+                raise ValueError('Bad float/double attribute (rating): %s' % exp)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
         pass
 # end class infoType
@@ -2332,9 +2528,15 @@ class vehicleType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, wheelcount=None, extensiontype_=None):
+        self.original_tagname_ = None
         self.wheelcount = wheelcount
         self.extensiontype_ = extensiontype_
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, vehicleType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if vehicleType.subclass:
             return vehicleType.subclass(*args_, **kwargs_)
         else:
@@ -2370,6 +2572,7 @@ class vehicleType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         value = find_attr_value_('xsi:type', node)
         if value is not None and 'xsi:type' not in already_processed:
@@ -2380,7 +2583,7 @@ class vehicleType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'wheelcount')
             self.wheelcount = ival_
@@ -2394,9 +2597,15 @@ class automobile(vehicleType):
     subclass = None
     superclass = vehicleType
     def __init__(self, wheelcount=None, drivername=None):
+        self.original_tagname_ = None
         super(automobile, self).__init__(wheelcount, )
         self.drivername = drivername
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, automobile)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if automobile.subclass:
             return automobile.subclass(*args_, **kwargs_)
         else:
@@ -2426,6 +2635,7 @@ class automobile(vehicleType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(automobile, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2444,9 +2654,15 @@ class airplane(vehicleType):
     subclass = None
     superclass = vehicleType
     def __init__(self, wheelcount=None, pilotname=None):
+        self.original_tagname_ = None
         super(airplane, self).__init__(wheelcount, )
         self.pilotname = pilotname
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, airplane)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if airplane.subclass:
             return airplane.subclass(*args_, **kwargs_)
         else:
@@ -2476,6 +2692,7 @@ class airplane(vehicleType):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         super(airplane, self).buildAttributes(node, attrs, already_processed)
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2497,16 +2714,22 @@ class hot_agent(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, firstname='empty\\name', lastname='no \'last\' name', priority=None, startDate=None):
+        self.original_tagname_ = None
         self.firstname = firstname
         self.lastname = lastname
         self.priority = priority
-        if isinstance(startDate, basestring):
+        if isinstance(startDate, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(startDate, '%Y-%m-%d').date()
         else:
             initvalue_ = startDate
         self.startDate = initvalue_
         self.anyAttributes_ = {}
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, hot_agent)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if hot_agent.subclass:
             return hot_agent.subclass(*args_, **kwargs_)
         else:
@@ -2524,8 +2747,8 @@ class hot_agent(GeneratedsSuper):
     def set_anyAttributes_(self, anyAttributes_): self.anyAttributes_ = anyAttributes_
     def hasContent_(self):
         if (
-            self.firstname is not None or
-            self.lastname is not None or
+            self.firstname != "empty\name" or
+            self.lastname != "no 'last' name" or
             self.priority is not None or
             self.startDate is not None
         ):
@@ -2558,6 +2781,7 @@ class hot_agent(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         self.anyAttributes_ = {}
         for name, value in attrs.items():
@@ -2576,7 +2800,7 @@ class hot_agent(GeneratedsSuper):
             sval_ = child_.text
             try:
                 fval_ = float(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires float or double: %s' % exp)
             fval_ = self.gds_validate_float(fval_, node, 'priority')
             self.priority = fval_
@@ -2595,9 +2819,15 @@ class client_handlerType(GeneratedsSuper):
     subclass = None
     superclass = None
     def __init__(self, fullname=None, refid=None):
+        self.original_tagname_ = None
         self.fullname = fullname
         self.refid = refid
     def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, client_handlerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
         if client_handlerType.subclass:
             return client_handlerType.subclass(*args_, **kwargs_)
         else:
@@ -2635,6 +2865,7 @@ class client_handlerType(GeneratedsSuper):
         for child in node:
             nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
             self.buildChildren(child, node, nodeName_)
+        return self
     def buildAttributes(self, node, attrs, already_processed):
         pass
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
@@ -2646,7 +2877,7 @@ class client_handlerType(GeneratedsSuper):
             sval_ = child_.text
             try:
                 ival_ = int(sval_)
-            except (TypeError, ValueError), exp:
+            except (TypeError, ValueError) as exp:
                 raise_parse_error(child_, 'requires integer: %s' % exp)
             ival_ = self.gds_validate_integer(ival_, node, 'refid')
             self.refid = ival_
@@ -2654,22 +2885,22 @@ class client_handlerType(GeneratedsSuper):
 
 
 GDSClassesMapping = {
-    'info': infoType,
-    'promoter': boosterType,
-    'special-agent': special_agentType,
-    'elparam': paramType,
-    'python-programmer': python_programmerType,
-    'people': peopleType,
+    'agent': agentType,
+    'booster': boosterType,
     'client-handler': client_handlerType,
     'comments': commentsType,
-    'weird-agent': weird_agentType,
-    'person': personType,
-    'agent': agentType,
+    'elparam': paramType,
+    'info': infoType,
     'java-programmer': java_programmerType,
-    'vehicle': vehicleType,
-    'programmer': programmerType,
     'param': paramType,
-    'booster': boosterType,
+    'people': peopleType,
+    'person': personType,
+    'programmer': programmerType,
+    'promoter': boosterType,
+    'python-programmer': python_programmerType,
+    'special-agent': special_agentType,
+    'vehicle': vehicleType,
+    'weird-agent': weird_agentType,
 }
 
 
@@ -2679,7 +2910,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file>
 
 
 def usage():
-    print USAGE_TEXT
+    print(USAGE_TEXT)
     sys.exit(1)
 
 
@@ -2692,11 +2923,12 @@ def get_root_tag(node):
 
 
 def parse(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2712,11 +2944,12 @@ def parse(inFileName, silence=False):
 
 
 def parseEtree(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2735,12 +2968,16 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-    doc = parsexml_(StringIO(inString))
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
-    roots = get_root_tag(rootNode)
-    rootClass = roots[1]
+    rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2749,17 +2986,18 @@ def parseString(inString, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('<?xml version="1.0" ?>\n')
 ##         rootObj.export(
-##             sys.stdout, 0, name_="people",
+##             sys.stdout, 0, name_=rootTag,
 ##             namespacedef_='')
     return rootObj
 
 
 def parseLiteral(inFileName, silence=False):
-    doc = parsexml_(inFileName)
+    parser = None
+    doc = parsexml_(inFileName, parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
-        rootTag = 'people'
+        rootTag = 'peopleType'
         rootClass = peopleType
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
@@ -2768,7 +3006,7 @@ def parseLiteral(inFileName, silence=False):
 ##     if not silence:
 ##         sys.stdout.write('#from to_etree2_sup import *\n\n')
 ##         sys.stdout.write('import to_etree2_sup as model_\n\n')
-##         sys.stdout.write('rootObj = model_.rootTag(\n')
+##         sys.stdout.write('rootObj = model_.rootClass(\n')
 ##         rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
 ##         sys.stdout.write(')\n')
     return rootObj
diff --git a/tests/validate_simpletypes.xml b/tests/validate_simpletypes.xml
new file mode 100644
index 0000000..ba85927
--- /dev/null
+++ b/tests/validate_simpletypes.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+<container>
+    <sample1>
+        <integer_range_1_value>5</integer_range_1_value>
+        <pattern_value>aaa1234mnopzzz</pattern_value>
+        <pattern_value>bbbmn456opxxx</pattern_value>
+        <token_enum_value>float</token_enum_value>
+        <integer_range_incl_value>2</integer_range_incl_value>
+        <integer_range_excl_value>7</integer_range_excl_value>
+        <min_max_length_value>abc def ghi</min_max_length_value>
+        <length_value>0123456789</length_value>
+        <totaldigits_value>12.456</totaldigits_value>
+
+        <date_minincl_value>2015-07-01</date_minincl_value>
+        <date_maxincl_value>2015-07-01</date_maxincl_value>
+        <date_minexcl_value>2015-07-01</date_minexcl_value>
+        <date_maxexcl_value>2015-07-01</date_maxexcl_value>
+
+        <time_minincl_value>15:20:10</time_minincl_value>
+        <time_maxincl_value>15:20:10</time_maxincl_value>
+        <time_minexcl_value>15:20:10</time_minexcl_value>
+        <time_maxexcl_value>15:20:10</time_maxexcl_value>
+
+        <datetime_minincl_value>2015-07-01T14:20:10</datetime_minincl_value>
+        <datetime_maxincl_value>2015-05-01T14:20:10</datetime_maxincl_value>
+        <datetime_minexcl_value>2015-07-01T14:20:10</datetime_minexcl_value>
+        <datetime_maxexcl_value>2015-05-01T14:20:10</datetime_maxexcl_value>
+
+        <anonymous_float_value>2.2</anonymous_float_value>
+        <primative_integer>765</primative_integer>
+        <primative_float>54.321</primative_float>
+        <vbar_pattern_value>abcd</vbar_pattern_value>
+    </sample1>
+    <sample2_bad>
+        <integer_range_1_value>2</integer_range_1_value>
+        <pattern_value>mmaaa1234mnopzzz</pattern_value>
+        <token_enum_value>floatxx</token_enum_value>
+        <integer_range_incl_value>22</integer_range_incl_value>
+        <integer_range_excl_value>-40</integer_range_excl_value>
+        <min_max_length_value>mno pqr</min_max_length_value>
+        <length_value>012345</length_value>
+        <totaldigits_value>12.456789</totaldigits_value>
+        <anonymous_float_value>0.2</anonymous_float_value>
+        <vbar_pattern_value>efgh</vbar_pattern_value>
+    </sample2_bad>
+    <sample3_bad>
+        <integer_range_1_value>9</integer_range_1_value>
+        <pattern_value>aaa1234mnopzzzbcd</pattern_value>
+        <integer_range_incl_value>-50</integer_range_incl_value>
+        <min_max_length_value>asdf asdf asdf asdf asdf asdf</min_max_length_value>
+        <length_value>01234567890</length_value>
+        <totaldigits_value>12345678.45678901</totaldigits_value>
+
+        <date_minincl_value>2015-05-01</date_minincl_value>
+        <date_maxincl_value>2015-11-01</date_maxincl_value>
+        <date_minexcl_value>2015-05-01</date_minexcl_value>
+        <date_maxexcl_value>2015-11-01</date_maxexcl_value>
+
+        <time_minincl_value>13:30:00</time_minincl_value>
+        <time_maxincl_value>17:00:00</time_maxincl_value>
+        <time_minexcl_value>13:30:00</time_minexcl_value>
+        <time_maxexcl_value>17:00:00</time_maxexcl_value>
+
+        <datetime_minincl_value>2015-06-01T13:20:10</datetime_minincl_value>
+        <datetime_maxincl_value>2015-11-01T14:20:10</datetime_maxincl_value>
+        <datetime_minexcl_value>2015-06-01T13:20:10</datetime_minexcl_value>
+        <datetime_maxexcl_value>2015-11-01T14:20:10</datetime_maxexcl_value>
+
+        <anonymous_float_value>6.6</anonymous_float_value>
+    </sample3_bad>
+    <sample4_bad>
+        <pattern_value>aaa12zzz</pattern_value>
+    </sample4_bad>
+    <sample2>
+        <simpleTwoElementOne>
+            <simpleTwoElementTwo>abcdefghijklmno</simpleTwoElementTwo>
+        </simpleTwoElementOne>
+    </sample2>
+    <sample2>
+        <simpleTwoElementOne>
+            <simpleTwoElementTwo>pqrst</simpleTwoElementTwo>
+        </simpleTwoElementOne>
+    </sample2>
+</container>
diff --git a/tests/validate_simpletypes.xsd b/tests/validate_simpletypes.xsd
new file mode 100644
index 0000000..2493ac3
--- /dev/null
+++ b/tests/validate_simpletypes.xsd
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:element name="container" type="containerType"/>
+
+    <xs:complexType name="containerType">
+        <xs:sequence>
+            <xs:element name="sample1" type="simpleOneType" maxOccurs="unbounded"/>
+            <xs:element name="sample2_bad" type="simpleOneType" maxOccurs="unbounded"/>
+            <xs:element name="sample3_bad" type="simpleOneType" maxOccurs="unbounded"/>
+            <xs:element name="sample4_bad" type="simpleOneType" maxOccurs="unbounded"/>
+            <xs:element name="sample2" type="simpleTwoType" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="simpleOneType" mixed="0">
+        <xs:sequence>
+            <xs:element name="integer_range_1_value" type="integer_range_1_st"/>
+            <xs:element name="pattern_value" type="pattern_st"/>
+            <xs:element name="token_enum_value" type="token_enum_st"/>
+            <xs:element name="integer_range_incl_value" type="integer_range_incl_st"/>
+            <xs:element name="integer_range_excl_value" type="integer_range_excl_st"/>
+            <xs:element name="min_max_length_value" type="min_max_length_st"/>
+            <xs:element name="length_value" type="length_st"/>
+            <xs:element name="totalDigits_value" type="totalDigits_st"/>
+
+            <xs:element name="date_minincl_value" type="date_minincl_st"/>
+            <xs:element name="date_maxincl_value" type="date_maxincl_st"/>
+            <xs:element name="date_minexcl_value" type="date_minexcl_st"/>
+            <xs:element name="date_maxexcl_value" type="date_maxexcl_st"/>
+            <xs:element name="time_minincl_value" type="time_minincl_st"/>
+            <xs:element name="time_maxincl_value" type="time_maxincl_st"/>
+            <xs:element name="time_minexcl_value" type="time_minexcl_st"/>
+            <xs:element name="time_maxexcl_value" type="time_maxexcl_st"/>
+            <xs:element name="datetime_minincl_value" type="datetime_minincl_st"/>
+            <xs:element name="datetime_maxincl_value" type="datetime_maxincl_st"/>
+            <xs:element name="datetime_minexcl_value" type="datetime_minexcl_st"/>
+            <xs:element name="datetime_maxexcl_value" type="datetime_maxexcl_st"/>
+            <xs:element name="vbar_pattern_value" type="vbar_pattern_st"/>
+
+            <!-- Test for use of anonymous simple type. -->
+            <xs:element name="anonymous_float_value">
+                <xs:simpleType>
+                    <xs:restriction base="xs:float">
+                        <xs:minInclusive value="1.1"/>
+                        <xs:maxInclusive value="4.4"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:element>
+            <xs:element name="primative_integer" type="xs:integer"/>
+            <xs:element name="primative_float" type="xs:float"/>
+        </xs:sequence>
+    </xs:complexType>
+    <!-- Test for use of an anonymous simple type inside an anonymous complexType. -->
+    <xs:element name="simpleTypeData" type="simpleTwoType"/>
+    <xs:complexType name="simpleTwoType">
+        <xs:sequence>
+            <xs:element name="simpleTwoElementOne">
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="simpleTwoElementTwo">
+                            <xs:simpleType>
+                                <xs:restriction base="xs:string">
+                                    <xs:minLength value="12"/>
+                                    <xs:maxLength value="24"/>
+                                </xs:restriction>
+                            </xs:simpleType>
+                        </xs:element>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+    <xs:simpleType name="integer_range_1_st">
+        <xs:restriction base="integer_range_2_st">
+            <xs:minExclusive value="4"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="integer_range_2_st">
+        <xs:restriction base="xs:integer">
+            <xs:maxExclusive value="8"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="pattern_st">
+        <xs:restriction base="pattern_1_st">
+            <xs:pattern value="aaa.*zzz"/>
+            <xs:pattern value="bbb.*xxx"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="pattern_1_st">
+        <xs:restriction base="min_length_st">
+            <xs:pattern value=".*123.*"/>
+            <xs:pattern value=".*456.*"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="min_length_st">
+        <xs:restriction base="xs:string">
+            <xs:minLength value="10"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="token_enum_st">
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="float"/>
+            <xs:enumeration value="int"/>
+            <xs:enumeration value="Name"/>
+            <xs:enumeration value="token"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="integer_range_incl_st">
+        <xs:restriction base="xs:integer">
+            <xs:minInclusive value="-5"/>
+            <xs:maxInclusive value="10"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="integer_range_excl_st">
+        <xs:restriction base="xs:integer">
+            <xs:minExclusive value="-5"/>
+            <xs:maxExclusive value="10"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="min_max_length_st">
+        <xs:restriction base="xs:string">
+            <xs:minLength value="10"/>
+            <xs:maxLength value="20"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="length_st">
+        <xs:restriction base="xs:string">
+            <xs:length value="10"/>
+        </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType name="totalDigits_st">
+        <xs:restriction base="xs:decimal">
+            <xs:totalDigits value="15"/>
+            <xs:fractionDigits value="5"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="date_minincl_st">
+        <xs:restriction base="xs:date">
+            <xs:minInclusive value="2015-06-01"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="date_maxincl_st">
+        <xs:restriction base="xs:date">
+            <xs:maxInclusive value="2015-10-31"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="date_minexcl_st">
+        <xs:restriction base="xs:date">
+            <xs:minExclusive value="2015-06-01"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="date_maxexcl_st">
+        <xs:restriction base="xs:date">
+            <xs:maxExclusive value="2015-10-31"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="time_minincl_st">
+        <xs:restriction base="xs:time">
+            <xs:minInclusive value="14:20:10"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="time_maxincl_st">
+        <xs:restriction base="xs:time">
+            <xs:maxInclusive value="16:20:10"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="time_minexcl_st">
+        <xs:restriction base="xs:time">
+            <xs:minExclusive value="14:20:10"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="time_maxexcl_st">
+        <xs:restriction base="xs:time">
+            <xs:maxExclusive value="16:20:10"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="datetime_minincl_st">
+        <xs:restriction base="xs:dateTime">
+            <xs:minInclusive value="2015-06-01T14:20:10"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="datetime_maxincl_st">
+        <xs:restriction base="xs:dateTime">
+            <xs:maxInclusive value="2015-10-31T16:20:10"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="datetime_minexcl_st">
+        <xs:restriction base="xs:dateTime">
+            <xs:minExclusive value="2015-06-01T14:20:10"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="datetime_maxexcl_st">
+        <xs:restriction base="xs:dateTime">
+            <xs:maxExclusive value="2015-10-31T16:20:10"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="vbar_pattern_st">
+        <xs:restriction base="xs:string">
+            <xs:pattern value="abcd|ef\|gh" />
+        </xs:restriction>
+    </xs:simpleType>
+
+</xs:schema>
diff --git a/tests/validate_simpletypes1_out.xml b/tests/validate_simpletypes1_out.xml
new file mode 100644
index 0000000..b6d8392
--- /dev/null
+++ b/tests/validate_simpletypes1_out.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" ?>
+<container>
+    <sample1>
+        <integer_range_1_value>5</integer_range_1_value>
+        <pattern_value>bbbmn456opxxx</pattern_value>
+        <token_enum_value>float</token_enum_value>
+        <integer_range_incl_value>2</integer_range_incl_value>
+        <integer_range_excl_value>7</integer_range_excl_value>
+        <min_max_length_value>abc def ghi</min_max_length_value>
+        <length_value>0123456789</length_value>
+        <date_minincl_value>2015-07-01</date_minincl_value>
+        <date_maxincl_value>2015-07-01</date_maxincl_value>
+        <date_minexcl_value>2015-07-01</date_minexcl_value>
+        <date_maxexcl_value>2015-07-01</date_maxexcl_value>
+        <time_minincl_value>15:20:10</time_minincl_value>
+        <time_maxincl_value>15:20:10</time_maxincl_value>
+        <time_minexcl_value>15:20:10</time_minexcl_value>
+        <time_maxexcl_value>15:20:10</time_maxexcl_value>
+        <datetime_minincl_value>2015-07-01T14:20:10</datetime_minincl_value>
+        <datetime_maxincl_value>2015-05-01T14:20:10</datetime_maxincl_value>
+        <datetime_minexcl_value>2015-07-01T14:20:10</datetime_minexcl_value>
+        <datetime_maxexcl_value>2015-05-01T14:20:10</datetime_maxexcl_value>
+        <vbar_pattern_value>abcd</vbar_pattern_value>
+        <anonymous_float_value>2.2</anonymous_float_value>
+        <primative_integer>765</primative_integer>
+        <primative_float>54.320999999999998</primative_float>
+    </sample1>
+    <sample2_bad>
+        <integer_range_1_value>2</integer_range_1_value>
+        <pattern_value>mmaaa1234mnopzzz</pattern_value>
+        <token_enum_value>floatxx</token_enum_value>
+        <integer_range_incl_value>22</integer_range_incl_value>
+        <integer_range_excl_value>-40</integer_range_excl_value>
+        <min_max_length_value>mno pqr</min_max_length_value>
+        <length_value>012345</length_value>
+        <vbar_pattern_value>efgh</vbar_pattern_value>
+        <anonymous_float_value>0.2</anonymous_float_value>
+    </sample2_bad>
+    <sample3_bad>
+        <integer_range_1_value>9</integer_range_1_value>
+        <pattern_value>aaa1234mnopzzzbcd</pattern_value>
+        <integer_range_incl_value>-50</integer_range_incl_value>
+        <min_max_length_value>asdf asdf asdf asdf asdf asdf</min_max_length_value>
+        <length_value>01234567890</length_value>
+        <date_minincl_value>2015-05-01</date_minincl_value>
+        <date_maxincl_value>2015-11-01</date_maxincl_value>
+        <date_minexcl_value>2015-05-01</date_minexcl_value>
+        <date_maxexcl_value>2015-11-01</date_maxexcl_value>
+        <time_minincl_value>13:30:00</time_minincl_value>
+        <time_maxincl_value>17:00:00</time_maxincl_value>
+        <time_minexcl_value>13:30:00</time_minexcl_value>
+        <time_maxexcl_value>17:00:00</time_maxexcl_value>
+        <datetime_minincl_value>2015-06-01T13:20:10</datetime_minincl_value>
+        <datetime_maxincl_value>2015-11-01T14:20:10</datetime_maxincl_value>
+        <datetime_minexcl_value>2015-06-01T13:20:10</datetime_minexcl_value>
+        <datetime_maxexcl_value>2015-11-01T14:20:10</datetime_maxexcl_value>
+        <anonymous_float_value>6.6</anonymous_float_value>
+    </sample3_bad>
+    <sample4_bad>
+        <pattern_value>aaa12zzz</pattern_value>
+    </sample4_bad>
+    <sample2>
+        <simpleTwoElementOne>
+            <simpleTwoElementTwo>abcdefghijklmno</simpleTwoElementTwo>
+        </simpleTwoElementOne>
+    </sample2>
+    <sample2>
+        <simpleTwoElementOne>
+            <simpleTwoElementTwo>pqrst</simpleTwoElementTwo>
+        </simpleTwoElementOne>
+    </sample2>
+</container>
diff --git a/tests/validate_simpletypes1_sub.py b/tests/validate_simpletypes1_sub.py
new file mode 100644
index 0000000..e0f4a98
--- /dev/null
+++ b/tests/validate_simpletypes1_sub.py
@@ -0,0 +1,193 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/validate_simpletypes2_sup.py')
+#   ('-s', 'tests/validate_simpletypes2_sub.py')
+#   ('--super', 'validate_simpletypes2_sup')
+#
+# Command line arguments:
+#   tests/validate_simpletypes.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import validate_simpletypes2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class containerTypeSub(supermod.containerType):
+    def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None):
+        super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample4_bad, sample2, )
+supermod.containerType.subclass = containerTypeSub
+# end class containerTypeSub
+
+
+class simpleOneTypeSub(supermod.simpleOneType):
+    def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, vbar_pattern_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None):
+        super(simpleOneTypeSub, self).__init__(integer_range_1_value, pattern_value, token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totalDigits_value, date_minincl_value, date_maxincl_value, date_minexcl_value, date_maxexcl_value, time_minincl_value, time_maxincl_value, time_minexcl_value, time_maxexcl_value, datetime_minincl_value, datetime_maxincl_value, datetime_minexcl_value, datetime_maxexcl_value, vbar_pattern_value, anonymous_float_value, primative_integer, primative_float, )
+supermod.simpleOneType.subclass = simpleOneTypeSub
+# end class simpleOneTypeSub
+
+
+class simpleTwoTypeSub(supermod.simpleTwoType):
+    def __init__(self, simpleTwoElementOne=None):
+        super(simpleTwoTypeSub, self).__init__(simpleTwoElementOne, )
+supermod.simpleTwoType.subclass = simpleTwoTypeSub
+# end class simpleTwoTypeSub
+
+
+class simpleTwoElementOneTypeSub(supermod.simpleTwoElementOneType):
+    def __init__(self, simpleTwoElementTwo=None):
+        super(simpleTwoElementOneTypeSub, self).__init__(simpleTwoElementTwo, )
+supermod.simpleTwoElementOneType.subclass = simpleTwoElementOneTypeSub
+# end class simpleTwoElementOneTypeSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from validate_simpletypes2_sup import *\n\n')
+        sys.stdout.write('import validate_simpletypes2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py
new file mode 100644
index 0000000..7e21557
--- /dev/null
+++ b/tests/validate_simpletypes1_sup.py
@@ -0,0 +1,1723 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/validate_simpletypes2_sup.py')
+#   ('-s', 'tests/validate_simpletypes2_sub.py')
+#   ('--super', 'validate_simpletypes2_sup')
+#
+# Command line arguments:
+#   tests/validate_simpletypes.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class containerType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('sample1', 'simpleOneType', 1),
+        MemberSpec_('sample2_bad', 'simpleOneType', 1),
+        MemberSpec_('sample3_bad', 'simpleOneType', 1),
+        MemberSpec_('sample4_bad', 'simpleOneType', 1),
+        MemberSpec_('sample2', 'simpleTwoType', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None):
+        self.original_tagname_ = None
+        if sample1 is None:
+            self.sample1 = []
+        else:
+            self.sample1 = sample1
+        if sample2_bad is None:
+            self.sample2_bad = []
+        else:
+            self.sample2_bad = sample2_bad
+        if sample3_bad is None:
+            self.sample3_bad = []
+        else:
+            self.sample3_bad = sample3_bad
+        if sample4_bad is None:
+            self.sample4_bad = []
+        else:
+            self.sample4_bad = sample4_bad
+        if sample2 is None:
+            self.sample2 = []
+        else:
+            self.sample2 = sample2
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, containerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if containerType.subclass:
+            return containerType.subclass(*args_, **kwargs_)
+        else:
+            return containerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_sample1(self): return self.sample1
+    def set_sample1(self, sample1): self.sample1 = sample1
+    def add_sample1(self, value): self.sample1.append(value)
+    def insert_sample1_at(self, index, value): self.sample1.insert(index, value)
+    def replace_sample1_at(self, index, value): self.sample1[index] = value
+    def get_sample2_bad(self): return self.sample2_bad
+    def set_sample2_bad(self, sample2_bad): self.sample2_bad = sample2_bad
+    def add_sample2_bad(self, value): self.sample2_bad.append(value)
+    def insert_sample2_bad_at(self, index, value): self.sample2_bad.insert(index, value)
+    def replace_sample2_bad_at(self, index, value): self.sample2_bad[index] = value
+    def get_sample3_bad(self): return self.sample3_bad
+    def set_sample3_bad(self, sample3_bad): self.sample3_bad = sample3_bad
+    def add_sample3_bad(self, value): self.sample3_bad.append(value)
+    def insert_sample3_bad_at(self, index, value): self.sample3_bad.insert(index, value)
+    def replace_sample3_bad_at(self, index, value): self.sample3_bad[index] = value
+    def get_sample4_bad(self): return self.sample4_bad
+    def set_sample4_bad(self, sample4_bad): self.sample4_bad = sample4_bad
+    def add_sample4_bad(self, value): self.sample4_bad.append(value)
+    def insert_sample4_bad_at(self, index, value): self.sample4_bad.insert(index, value)
+    def replace_sample4_bad_at(self, index, value): self.sample4_bad[index] = value
+    def get_sample2(self): return self.sample2
+    def set_sample2(self, sample2): self.sample2 = sample2
+    def add_sample2(self, value): self.sample2.append(value)
+    def insert_sample2_at(self, index, value): self.sample2.insert(index, value)
+    def replace_sample2_at(self, index, value): self.sample2[index] = value
+    def hasContent_(self):
+        if (
+            self.sample1 or
+            self.sample2_bad or
+            self.sample3_bad or
+            self.sample4_bad or
+            self.sample2
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='containerType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for sample1_ in self.sample1:
+            sample1_.export(outfile, level, namespace_, name_='sample1', pretty_print=pretty_print)
+        for sample2_bad_ in self.sample2_bad:
+            sample2_bad_.export(outfile, level, namespace_, name_='sample2_bad', pretty_print=pretty_print)
+        for sample3_bad_ in self.sample3_bad:
+            sample3_bad_.export(outfile, level, namespace_, name_='sample3_bad', pretty_print=pretty_print)
+        for sample4_bad_ in self.sample4_bad:
+            sample4_bad_.export(outfile, level, namespace_, name_='sample4_bad', pretty_print=pretty_print)
+        for sample2_ in self.sample2:
+            sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'sample1':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample1.append(obj_)
+            obj_.original_tagname_ = 'sample1'
+        elif nodeName_ == 'sample2_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample2_bad.append(obj_)
+            obj_.original_tagname_ = 'sample2_bad'
+        elif nodeName_ == 'sample3_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample3_bad.append(obj_)
+            obj_.original_tagname_ = 'sample3_bad'
+        elif nodeName_ == 'sample4_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample4_bad.append(obj_)
+            obj_.original_tagname_ = 'sample4_bad'
+        elif nodeName_ == 'sample2':
+            obj_ = simpleTwoType.factory()
+            obj_.build(child_)
+            self.sample2.append(obj_)
+            obj_.original_tagname_ = 'sample2'
+# end class containerType
+
+
+class simpleOneType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, vbar_pattern_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None):
+        self.original_tagname_ = None
+        self.integer_range_1_value = integer_range_1_value
+        self.validate_integer_range_1_st(self.integer_range_1_value)
+        self.pattern_value = pattern_value
+        self.validate_pattern_st(self.pattern_value)
+        self.token_enum_value = token_enum_value
+        self.validate_token_enum_st(self.token_enum_value)
+        self.integer_range_incl_value = integer_range_incl_value
+        self.validate_integer_range_incl_st(self.integer_range_incl_value)
+        self.integer_range_excl_value = integer_range_excl_value
+        self.validate_integer_range_excl_st(self.integer_range_excl_value)
+        self.min_max_length_value = min_max_length_value
+        self.validate_min_max_length_st(self.min_max_length_value)
+        self.length_value = length_value
+        self.validate_length_st(self.length_value)
+        self.totalDigits_value = totalDigits_value
+        self.validate_totalDigits_st(self.totalDigits_value)
+        if isinstance(date_minincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(date_minincl_value, '%Y-%m-%d').date()
+        else:
+            initvalue_ = date_minincl_value
+        self.date_minincl_value = initvalue_
+        if isinstance(date_maxincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(date_maxincl_value, '%Y-%m-%d').date()
+        else:
+            initvalue_ = date_maxincl_value
+        self.date_maxincl_value = initvalue_
+        if isinstance(date_minexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(date_minexcl_value, '%Y-%m-%d').date()
+        else:
+            initvalue_ = date_minexcl_value
+        self.date_minexcl_value = initvalue_
+        if isinstance(date_maxexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(date_maxexcl_value, '%Y-%m-%d').date()
+        else:
+            initvalue_ = date_maxexcl_value
+        self.date_maxexcl_value = initvalue_
+        if isinstance(time_minincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(time_minincl_value, '%H:%M:%S').time()
+        else:
+            initvalue_ = time_minincl_value
+        self.time_minincl_value = initvalue_
+        if isinstance(time_maxincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(time_maxincl_value, '%H:%M:%S').time()
+        else:
+            initvalue_ = time_maxincl_value
+        self.time_maxincl_value = initvalue_
+        if isinstance(time_minexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(time_minexcl_value, '%H:%M:%S').time()
+        else:
+            initvalue_ = time_minexcl_value
+        self.time_minexcl_value = initvalue_
+        if isinstance(time_maxexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(time_maxexcl_value, '%H:%M:%S').time()
+        else:
+            initvalue_ = time_maxexcl_value
+        self.time_maxexcl_value = initvalue_
+        if isinstance(datetime_minincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(datetime_minincl_value, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = datetime_minincl_value
+        self.datetime_minincl_value = initvalue_
+        if isinstance(datetime_maxincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(datetime_maxincl_value, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = datetime_maxincl_value
+        self.datetime_maxincl_value = initvalue_
+        if isinstance(datetime_minexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(datetime_minexcl_value, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = datetime_minexcl_value
+        self.datetime_minexcl_value = initvalue_
+        if isinstance(datetime_maxexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(datetime_maxexcl_value, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = datetime_maxexcl_value
+        self.datetime_maxexcl_value = initvalue_
+        self.vbar_pattern_value = vbar_pattern_value
+        self.validate_vbar_pattern_st(self.vbar_pattern_value)
+        self.anonymous_float_value = anonymous_float_value
+        self.validate_anonymous_float_valueType(self.anonymous_float_value)
+        self.primative_integer = primative_integer
+        self.primative_float = primative_float
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleOneType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if simpleOneType.subclass:
+            return simpleOneType.subclass(*args_, **kwargs_)
+        else:
+            return simpleOneType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_integer_range_1_value(self): return self.integer_range_1_value
+    def set_integer_range_1_value(self, integer_range_1_value): self.integer_range_1_value = integer_range_1_value
+    def get_pattern_value(self): return self.pattern_value
+    def set_pattern_value(self, pattern_value): self.pattern_value = pattern_value
+    def get_token_enum_value(self): return self.token_enum_value
+    def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value
+    def get_integer_range_incl_value(self): return self.integer_range_incl_value
+    def set_integer_range_incl_value(self, integer_range_incl_value): self.integer_range_incl_value = integer_range_incl_value
+    def get_integer_range_excl_value(self): return self.integer_range_excl_value
+    def set_integer_range_excl_value(self, integer_range_excl_value): self.integer_range_excl_value = integer_range_excl_value
+    def get_min_max_length_value(self): return self.min_max_length_value
+    def set_min_max_length_value(self, min_max_length_value): self.min_max_length_value = min_max_length_value
+    def get_length_value(self): return self.length_value
+    def set_length_value(self, length_value): self.length_value = length_value
+    def get_totalDigits_value(self): return self.totalDigits_value
+    def set_totalDigits_value(self, totalDigits_value): self.totalDigits_value = totalDigits_value
+    def get_date_minincl_value(self): return self.date_minincl_value
+    def set_date_minincl_value(self, date_minincl_value): self.date_minincl_value = date_minincl_value
+    def get_date_maxincl_value(self): return self.date_maxincl_value
+    def set_date_maxincl_value(self, date_maxincl_value): self.date_maxincl_value = date_maxincl_value
+    def get_date_minexcl_value(self): return self.date_minexcl_value
+    def set_date_minexcl_value(self, date_minexcl_value): self.date_minexcl_value = date_minexcl_value
+    def get_date_maxexcl_value(self): return self.date_maxexcl_value
+    def set_date_maxexcl_value(self, date_maxexcl_value): self.date_maxexcl_value = date_maxexcl_value
+    def get_time_minincl_value(self): return self.time_minincl_value
+    def set_time_minincl_value(self, time_minincl_value): self.time_minincl_value = time_minincl_value
+    def get_time_maxincl_value(self): return self.time_maxincl_value
+    def set_time_maxincl_value(self, time_maxincl_value): self.time_maxincl_value = time_maxincl_value
+    def get_time_minexcl_value(self): return self.time_minexcl_value
+    def set_time_minexcl_value(self, time_minexcl_value): self.time_minexcl_value = time_minexcl_value
+    def get_time_maxexcl_value(self): return self.time_maxexcl_value
+    def set_time_maxexcl_value(self, time_maxexcl_value): self.time_maxexcl_value = time_maxexcl_value
+    def get_datetime_minincl_value(self): return self.datetime_minincl_value
+    def set_datetime_minincl_value(self, datetime_minincl_value): self.datetime_minincl_value = datetime_minincl_value
+    def get_datetime_maxincl_value(self): return self.datetime_maxincl_value
+    def set_datetime_maxincl_value(self, datetime_maxincl_value): self.datetime_maxincl_value = datetime_maxincl_value
+    def get_datetime_minexcl_value(self): return self.datetime_minexcl_value
+    def set_datetime_minexcl_value(self, datetime_minexcl_value): self.datetime_minexcl_value = datetime_minexcl_value
+    def get_datetime_maxexcl_value(self): return self.datetime_maxexcl_value
+    def set_datetime_maxexcl_value(self, datetime_maxexcl_value): self.datetime_maxexcl_value = datetime_maxexcl_value
+    def get_vbar_pattern_value(self): return self.vbar_pattern_value
+    def set_vbar_pattern_value(self, vbar_pattern_value): self.vbar_pattern_value = vbar_pattern_value
+    def get_anonymous_float_value(self): return self.anonymous_float_value
+    def set_anonymous_float_value(self, anonymous_float_value): self.anonymous_float_value = anonymous_float_value
+    def get_primative_integer(self): return self.primative_integer
+    def set_primative_integer(self, primative_integer): self.primative_integer = primative_integer
+    def get_primative_float(self): return self.primative_float
+    def set_primative_float(self, primative_float): self.primative_float = primative_float
+    def validate_integer_range_1_st(self, value):
+        # Validate type integer_range_1_st, a restriction on integer_range_2_st.
+        if value is not None and Validate_simpletypes_:
+            if value <= 4:
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} )
+            if value >= 8:
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} )
+    def validate_pattern_st(self, value):
+        # Validate type pattern_st, a restriction on pattern_1_st.
+        if value is not None and Validate_simpletypes_:
+            if len(str(value)) < 10:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} )
+            if not self.gds_validate_simple_patterns(
+                    self.validate_pattern_st_patterns_, value):
+                warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
+    validate_pattern_st_patterns_ = [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+    def validate_token_enum_st(self, value):
+        # Validate type token_enum_st, a restriction on xs:NMTOKEN.
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['float', 'int', 'Name', 'token']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
+    def validate_integer_range_incl_st(self, value):
+        # Validate type integer_range_incl_st, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+            if value < -5:
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
+            if value > 10:
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
+    def validate_integer_range_excl_st(self, value):
+        # Validate type integer_range_excl_st, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+            if value <= -5:
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
+            if value >= 10:
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_excl_st' % {"value" : value} )
+    def validate_min_max_length_st(self, value):
+        # Validate type min_max_length_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+            if len(value) > 20:
+                warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+            if len(value) < 10:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+    def validate_length_st(self, value):
+        # Validate type length_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+            if len(value) != 10:
+                warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
+    def validate_totalDigits_st(self, value):
+        # Validate type totalDigits_st, a restriction on xs:decimal.
+        if value is not None and Validate_simpletypes_:
+            if len(str(value)) >= 15:
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on totalDigits_st' % {"value" : value} )
+    def validate_date_minincl_st(self, value):
+        # Validate type date_minincl_st, a restriction on xs:date.
+        if value is not None and Validate_simpletypes_:
+            if value < self.gds_parse_date('2015-06-01'):
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} )
+    def validate_date_maxincl_st(self, value):
+        # Validate type date_maxincl_st, a restriction on xs:date.
+        if value is not None and Validate_simpletypes_:
+            if value > self.gds_parse_date('2015-10-31'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} )
+    def validate_date_minexcl_st(self, value):
+        # Validate type date_minexcl_st, a restriction on xs:date.
+        if value is not None and Validate_simpletypes_:
+            if value <= self.gds_parse_date('2015-06-01'):
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} )
+    def validate_date_maxexcl_st(self, value):
+        # Validate type date_maxexcl_st, a restriction on xs:date.
+        if value is not None and Validate_simpletypes_:
+            if value >= self.gds_parse_date('2015-10-31'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} )
+    def validate_time_minincl_st(self, value):
+        # Validate type time_minincl_st, a restriction on xs:time.
+        if value is not None and Validate_simpletypes_:
+            if value < self.gds_parse_time('14:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} )
+    def validate_time_maxincl_st(self, value):
+        # Validate type time_maxincl_st, a restriction on xs:time.
+        if value is not None and Validate_simpletypes_:
+            if value > self.gds_parse_time('16:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} )
+    def validate_time_minexcl_st(self, value):
+        # Validate type time_minexcl_st, a restriction on xs:time.
+        if value is not None and Validate_simpletypes_:
+            if value <= self.gds_parse_time('14:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} )
+    def validate_time_maxexcl_st(self, value):
+        # Validate type time_maxexcl_st, a restriction on xs:time.
+        if value is not None and Validate_simpletypes_:
+            if value >= self.gds_parse_time('16:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} )
+    def validate_datetime_minincl_st(self, value):
+        # Validate type datetime_minincl_st, a restriction on xs:dateTime.
+        if value is not None and Validate_simpletypes_:
+            if value < self.gds_parse_datetime('2015-06-01T14:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} )
+    def validate_datetime_maxincl_st(self, value):
+        # Validate type datetime_maxincl_st, a restriction on xs:dateTime.
+        if value is not None and Validate_simpletypes_:
+            if value > self.gds_parse_datetime('2015-10-31T16:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} )
+    def validate_datetime_minexcl_st(self, value):
+        # Validate type datetime_minexcl_st, a restriction on xs:dateTime.
+        if value is not None and Validate_simpletypes_:
+            if value <= self.gds_parse_datetime('2015-06-01T14:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} )
+    def validate_datetime_maxexcl_st(self, value):
+        # Validate type datetime_maxexcl_st, a restriction on xs:dateTime.
+        if value is not None and Validate_simpletypes_:
+            if value >= self.gds_parse_datetime('2015-10-31T16:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} )
+    def validate_vbar_pattern_st(self, value):
+        # Validate type vbar_pattern_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+            if not self.gds_validate_simple_patterns(
+                    self.validate_vbar_pattern_st_patterns_, value):
+                warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_vbar_pattern_st_patterns_, ))
+    validate_vbar_pattern_st_patterns_ = [['^abcd$|^ef\\|gh$']]
+    def validate_anonymous_float_valueType(self, value):
+        # Validate type anonymous_float_valueType, a restriction on xs:float.
+        if value is not None and Validate_simpletypes_:
+            if value < 1.1:
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+            if value > 4.4:
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+    def hasContent_(self):
+        if (
+            self.integer_range_1_value is not None or
+            self.pattern_value is not None or
+            self.token_enum_value is not None or
+            self.integer_range_incl_value is not None or
+            self.integer_range_excl_value is not None or
+            self.min_max_length_value is not None or
+            self.length_value is not None or
+            self.totalDigits_value is not None or
+            self.date_minincl_value is not None or
+            self.date_maxincl_value is not None or
+            self.date_minexcl_value is not None or
+            self.date_maxexcl_value is not None or
+            self.time_minincl_value is not None or
+            self.time_maxincl_value is not None or
+            self.time_minexcl_value is not None or
+            self.time_maxexcl_value is not None or
+            self.datetime_minincl_value is not None or
+            self.datetime_maxincl_value is not None or
+            self.datetime_minexcl_value is not None or
+            self.datetime_maxexcl_value is not None or
+            self.vbar_pattern_value is not None or
+            self.anonymous_float_value is not None or
+            self.primative_integer is not None or
+            self.primative_float is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleOneType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleOneType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleOneType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleOneType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleOneType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.integer_range_1_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_1_value>%s</%sinteger_range_1_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_1_value, input_name='integer_range_1_value'), namespace_, eol_))
+        if self.pattern_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%spattern_value>%s</%spattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.pattern_value), input_name='pattern_value')), namespace_, eol_))
+        if self.token_enum_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.token_enum_value), input_name='token_enum_value')), namespace_, eol_))
+        if self.integer_range_incl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_incl_value>%s</%sinteger_range_incl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_incl_value, input_name='integer_range_incl_value'), namespace_, eol_))
+        if self.integer_range_excl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_excl_value>%s</%sinteger_range_excl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_excl_value, input_name='integer_range_excl_value'), namespace_, eol_))
+        if self.min_max_length_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%smin_max_length_value>%s</%smin_max_length_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.min_max_length_value), input_name='min_max_length_value')), namespace_, eol_))
+        if self.length_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slength_value>%s</%slength_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.length_value), input_name='length_value')), namespace_, eol_))
+        if self.totalDigits_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stotalDigits_value>%s</%stotalDigits_value>%s' % (namespace_, self.gds_format_float(self.totalDigits_value, input_name='totalDigits_value'), namespace_, eol_))
+        if self.date_minincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdate_minincl_value>%s</%sdate_minincl_value>%s' % (namespace_, self.gds_format_date(self.date_minincl_value, input_name='date_minincl_value'), namespace_, eol_))
+        if self.date_maxincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdate_maxincl_value>%s</%sdate_maxincl_value>%s' % (namespace_, self.gds_format_date(self.date_maxincl_value, input_name='date_maxincl_value'), namespace_, eol_))
+        if self.date_minexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdate_minexcl_value>%s</%sdate_minexcl_value>%s' % (namespace_, self.gds_format_date(self.date_minexcl_value, input_name='date_minexcl_value'), namespace_, eol_))
+        if self.date_maxexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdate_maxexcl_value>%s</%sdate_maxexcl_value>%s' % (namespace_, self.gds_format_date(self.date_maxexcl_value, input_name='date_maxexcl_value'), namespace_, eol_))
+        if self.time_minincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stime_minincl_value>%s</%stime_minincl_value>%s' % (namespace_, self.gds_format_time(self.time_minincl_value, input_name='time_minincl_value'), namespace_, eol_))
+        if self.time_maxincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stime_maxincl_value>%s</%stime_maxincl_value>%s' % (namespace_, self.gds_format_time(self.time_maxincl_value, input_name='time_maxincl_value'), namespace_, eol_))
+        if self.time_minexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stime_minexcl_value>%s</%stime_minexcl_value>%s' % (namespace_, self.gds_format_time(self.time_minexcl_value, input_name='time_minexcl_value'), namespace_, eol_))
+        if self.time_maxexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stime_maxexcl_value>%s</%stime_maxexcl_value>%s' % (namespace_, self.gds_format_time(self.time_maxexcl_value, input_name='time_maxexcl_value'), namespace_, eol_))
+        if self.datetime_minincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdatetime_minincl_value>%s</%sdatetime_minincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minincl_value, input_name='datetime_minincl_value'), namespace_, eol_))
+        if self.datetime_maxincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdatetime_maxincl_value>%s</%sdatetime_maxincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxincl_value, input_name='datetime_maxincl_value'), namespace_, eol_))
+        if self.datetime_minexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdatetime_minexcl_value>%s</%sdatetime_minexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minexcl_value, input_name='datetime_minexcl_value'), namespace_, eol_))
+        if self.datetime_maxexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdatetime_maxexcl_value>%s</%sdatetime_maxexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxexcl_value, input_name='datetime_maxexcl_value'), namespace_, eol_))
+        if self.vbar_pattern_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%svbar_pattern_value>%s</%svbar_pattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.vbar_pattern_value), input_name='vbar_pattern_value')), namespace_, eol_))
+        if self.anonymous_float_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sanonymous_float_value>%s</%sanonymous_float_value>%s' % (namespace_, self.gds_format_float(self.anonymous_float_value, input_name='anonymous_float_value'), namespace_, eol_))
+        if self.primative_integer is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sprimative_integer>%s</%sprimative_integer>%s' % (namespace_, self.gds_format_integer(self.primative_integer, input_name='primative_integer'), namespace_, eol_))
+        if self.primative_float is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sprimative_float>%s</%sprimative_float>%s' % (namespace_, self.gds_format_float(self.primative_float, input_name='primative_float'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'integer_range_1_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_1_value')
+            self.integer_range_1_value = ival_
+            # validate type integer_range_1_st
+            self.validate_integer_range_1_st(self.integer_range_1_value)
+        elif nodeName_ == 'pattern_value':
+            pattern_value_ = child_.text
+            pattern_value_ = self.gds_validate_string(pattern_value_, node, 'pattern_value')
+            self.pattern_value = pattern_value_
+            # validate type pattern_st
+            self.validate_pattern_st(self.pattern_value)
+        elif nodeName_ == 'token_enum_value':
+            token_enum_value_ = child_.text
+            token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value')
+            self.token_enum_value = token_enum_value_
+            # validate type token_enum_st
+            self.validate_token_enum_st(self.token_enum_value)
+        elif nodeName_ == 'integer_range_incl_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value')
+            self.integer_range_incl_value = ival_
+            # validate type integer_range_incl_st
+            self.validate_integer_range_incl_st(self.integer_range_incl_value)
+        elif nodeName_ == 'integer_range_excl_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value')
+            self.integer_range_excl_value = ival_
+            # validate type integer_range_excl_st
+            self.validate_integer_range_excl_st(self.integer_range_excl_value)
+        elif nodeName_ == 'min_max_length_value':
+            min_max_length_value_ = child_.text
+            min_max_length_value_ = self.gds_validate_string(min_max_length_value_, node, 'min_max_length_value')
+            self.min_max_length_value = min_max_length_value_
+            # validate type min_max_length_st
+            self.validate_min_max_length_st(self.min_max_length_value)
+        elif nodeName_ == 'length_value':
+            length_value_ = child_.text
+            length_value_ = self.gds_validate_string(length_value_, node, 'length_value')
+            self.length_value = length_value_
+            # validate type length_st
+            self.validate_length_st(self.length_value)
+        elif nodeName_ == 'totalDigits_value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'totalDigits_value')
+            self.totalDigits_value = fval_
+            # validate type totalDigits_st
+            self.validate_totalDigits_st(self.totalDigits_value)
+        elif nodeName_ == 'date_minincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.date_minincl_value = dval_
+            # validate type date_minincl_st
+            self.validate_date_minincl_st(self.date_minincl_value)
+        elif nodeName_ == 'date_maxincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.date_maxincl_value = dval_
+            # validate type date_maxincl_st
+            self.validate_date_maxincl_st(self.date_maxincl_value)
+        elif nodeName_ == 'date_minexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.date_minexcl_value = dval_
+            # validate type date_minexcl_st
+            self.validate_date_minexcl_st(self.date_minexcl_value)
+        elif nodeName_ == 'date_maxexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.date_maxexcl_value = dval_
+            # validate type date_maxexcl_st
+            self.validate_date_maxexcl_st(self.date_maxexcl_value)
+        elif nodeName_ == 'time_minincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.time_minincl_value = dval_
+            # validate type time_minincl_st
+            self.validate_time_minincl_st(self.time_minincl_value)
+        elif nodeName_ == 'time_maxincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.time_maxincl_value = dval_
+            # validate type time_maxincl_st
+            self.validate_time_maxincl_st(self.time_maxincl_value)
+        elif nodeName_ == 'time_minexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.time_minexcl_value = dval_
+            # validate type time_minexcl_st
+            self.validate_time_minexcl_st(self.time_minexcl_value)
+        elif nodeName_ == 'time_maxexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.time_maxexcl_value = dval_
+            # validate type time_maxexcl_st
+            self.validate_time_maxexcl_st(self.time_maxexcl_value)
+        elif nodeName_ == 'datetime_minincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.datetime_minincl_value = dval_
+            # validate type datetime_minincl_st
+            self.validate_datetime_minincl_st(self.datetime_minincl_value)
+        elif nodeName_ == 'datetime_maxincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.datetime_maxincl_value = dval_
+            # validate type datetime_maxincl_st
+            self.validate_datetime_maxincl_st(self.datetime_maxincl_value)
+        elif nodeName_ == 'datetime_minexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.datetime_minexcl_value = dval_
+            # validate type datetime_minexcl_st
+            self.validate_datetime_minexcl_st(self.datetime_minexcl_value)
+        elif nodeName_ == 'datetime_maxexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.datetime_maxexcl_value = dval_
+            # validate type datetime_maxexcl_st
+            self.validate_datetime_maxexcl_st(self.datetime_maxexcl_value)
+        elif nodeName_ == 'vbar_pattern_value':
+            vbar_pattern_value_ = child_.text
+            vbar_pattern_value_ = self.gds_validate_string(vbar_pattern_value_, node, 'vbar_pattern_value')
+            self.vbar_pattern_value = vbar_pattern_value_
+            # validate type vbar_pattern_st
+            self.validate_vbar_pattern_st(self.vbar_pattern_value)
+        elif nodeName_ == 'anonymous_float_value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value')
+            self.anonymous_float_value = fval_
+            # validate type anonymous_float_valueType
+            self.validate_anonymous_float_valueType(self.anonymous_float_value)
+        elif nodeName_ == 'primative_integer':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'primative_integer')
+            self.primative_integer = ival_
+        elif nodeName_ == 'primative_float':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'primative_float')
+            self.primative_float = fval_
+# end class simpleOneType
+
+
+class simpleTwoType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, simpleTwoElementOne=None):
+        self.original_tagname_ = None
+        self.simpleTwoElementOne = simpleTwoElementOne
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleTwoType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if simpleTwoType.subclass:
+            return simpleTwoType.subclass(*args_, **kwargs_)
+        else:
+            return simpleTwoType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_simpleTwoElementOne(self): return self.simpleTwoElementOne
+    def set_simpleTwoElementOne(self, simpleTwoElementOne): self.simpleTwoElementOne = simpleTwoElementOne
+    def hasContent_(self):
+        if (
+            self.simpleTwoElementOne is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleTwoType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.simpleTwoElementOne is not None:
+            self.simpleTwoElementOne.export(outfile, level, namespace_, name_='simpleTwoElementOne', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'simpleTwoElementOne':
+            obj_ = simpleTwoElementOneType.factory()
+            obj_.build(child_)
+            self.simpleTwoElementOne = obj_
+            obj_.original_tagname_ = 'simpleTwoElementOne'
+# end class simpleTwoType
+
+
+class simpleTwoElementOneType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, simpleTwoElementTwo=None):
+        self.original_tagname_ = None
+        self.simpleTwoElementTwo = simpleTwoElementTwo
+        self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo)
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleTwoElementOneType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if simpleTwoElementOneType.subclass:
+            return simpleTwoElementOneType.subclass(*args_, **kwargs_)
+        else:
+            return simpleTwoElementOneType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_simpleTwoElementTwo(self): return self.simpleTwoElementTwo
+    def set_simpleTwoElementTwo(self, simpleTwoElementTwo): self.simpleTwoElementTwo = simpleTwoElementTwo
+    def validate_simpleTwoElementTwoType(self, value):
+        # Validate type simpleTwoElementTwoType, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+            if len(value) > 24:
+                warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
+            if len(value) < 12:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
+    def hasContent_(self):
+        if (
+            self.simpleTwoElementTwo is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoElementOneType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoElementOneType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoElementOneType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.simpleTwoElementTwo is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%ssimpleTwoElementTwo>%s</%ssimpleTwoElementTwo>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.simpleTwoElementTwo), input_name='simpleTwoElementTwo')), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'simpleTwoElementTwo':
+            simpleTwoElementTwo_ = child_.text
+            simpleTwoElementTwo_ = self.gds_validate_string(simpleTwoElementTwo_, node, 'simpleTwoElementTwo')
+            self.simpleTwoElementTwo = simpleTwoElementTwo_
+            # validate type simpleTwoElementTwoType
+            self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo)
+# end class simpleTwoElementOneType
+
+
+GDSClassesMapping = {
+    'container': containerType,
+    'sample1': simpleOneType,
+    'sample2': simpleTwoType,
+    'sample2_bad': simpleOneType,
+    'sample3_bad': simpleOneType,
+    'sample4_bad': simpleOneType,
+    'simpleTwoElementOne': simpleTwoElementOneType,
+    'simpleTypeData': simpleTwoType,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from validate_simpletypes2_sup import *\n\n')
+        sys.stdout.write('import validate_simpletypes2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "containerType",
+    "simpleOneType",
+    "simpleTwoElementOneType",
+    "simpleTwoType"
+]
diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt
new file mode 100644
index 0000000..0c0f475
--- /dev/null
+++ b/tests/validate_simpletypes1_warnings.txt
@@ -0,0 +1,60 @@
+tests/validate_simpletypes2_sup.py:990: 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.*$']]
+  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
+  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
+  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
+  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
+  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
+  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
+  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$']]
+  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
+  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.*$']]
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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
+  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.*$']]
+  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
+  warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
diff --git a/tests/validate_simpletypes2_sub.py b/tests/validate_simpletypes2_sub.py
new file mode 100644
index 0000000..e0f4a98
--- /dev/null
+++ b/tests/validate_simpletypes2_sub.py
@@ -0,0 +1,193 @@
+#!/usr/bin/env python
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/validate_simpletypes2_sup.py')
+#   ('-s', 'tests/validate_simpletypes2_sub.py')
+#   ('--super', 'validate_simpletypes2_sup')
+#
+# Command line arguments:
+#   tests/validate_simpletypes.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+from lxml import etree as etree_
+
+import validate_simpletypes2_sup as supermod
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        parser = etree_.ETCompatXMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+
+#
+# Data representation classes
+#
+
+
+class containerTypeSub(supermod.containerType):
+    def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None):
+        super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample4_bad, sample2, )
+supermod.containerType.subclass = containerTypeSub
+# end class containerTypeSub
+
+
+class simpleOneTypeSub(supermod.simpleOneType):
+    def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, vbar_pattern_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None):
+        super(simpleOneTypeSub, self).__init__(integer_range_1_value, pattern_value, token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totalDigits_value, date_minincl_value, date_maxincl_value, date_minexcl_value, date_maxexcl_value, time_minincl_value, time_maxincl_value, time_minexcl_value, time_maxexcl_value, datetime_minincl_value, datetime_maxincl_value, datetime_minexcl_value, datetime_maxexcl_value, vbar_pattern_value, anonymous_float_value, primative_integer, primative_float, )
+supermod.simpleOneType.subclass = simpleOneTypeSub
+# end class simpleOneTypeSub
+
+
+class simpleTwoTypeSub(supermod.simpleTwoType):
+    def __init__(self, simpleTwoElementOne=None):
+        super(simpleTwoTypeSub, self).__init__(simpleTwoElementOne, )
+supermod.simpleTwoType.subclass = simpleTwoTypeSub
+# end class simpleTwoTypeSub
+
+
+class simpleTwoElementOneTypeSub(supermod.simpleTwoElementOneType):
+    def __init__(self, simpleTwoElementTwo=None):
+        super(simpleTwoElementOneTypeSub, self).__init__(simpleTwoElementTwo, )
+supermod.simpleTwoElementOneType.subclass = simpleTwoElementOneTypeSub
+# end class simpleTwoElementOneTypeSub
+
+
+def get_root_tag(node):
+    tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = None
+    rootClass = supermod.GDSClassesMapping.get(tag)
+    if rootClass is None and hasattr(supermod, tag):
+        rootClass = getattr(supermod, tag)
+    return tag, rootClass
+
+
+def parse(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    from StringIO import StringIO
+    parser = None
+    doc = parsexml_(StringIO(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFilename, silence=False):
+    parser = None
+    doc = parsexml_(inFilename, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = supermod.containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from validate_simpletypes2_sup import *\n\n')
+        sys.stdout.write('import validate_simpletypes2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+USAGE_TEXT = """
+Usage: python ???.py <infilename>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) != 1:
+        usage()
+    infilename = args[0]
+    parse(infilename)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py
new file mode 100644
index 0000000..7e21557
--- /dev/null
+++ b/tests/validate_simpletypes2_sup.py
@@ -0,0 +1,1723 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+#
+# Generated  by generateDS.py.
+#
+# Command line options:
+#   ('--no-dates', '')
+#   ('--no-versions', '')
+#   ('--member-specs', 'list')
+#   ('-f', '')
+#   ('-o', 'tests/validate_simpletypes2_sup.py')
+#   ('-s', 'tests/validate_simpletypes2_sub.py')
+#   ('--super', 'validate_simpletypes2_sup')
+#
+# Command line arguments:
+#   tests/validate_simpletypes.xsd
+#
+# Command line:
+#   generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd
+#
+# Current working directory (os.getcwd()):
+#   generateds
+#
+
+import sys
+import re as re_
+import base64
+import datetime as datetime_
+import warnings as warnings_
+try:
+    from lxml import etree as etree_
+except ImportError:
+    from xml.etree import ElementTree as etree_
+
+
+Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
+
+
+def parsexml_(infile, parser=None, **kwargs):
+    if parser is None:
+        # Use the lxml ElementTree compatible parser so that, e.g.,
+        #   we ignore comments.
+        try:
+            parser = etree_.ETCompatXMLParser()
+        except AttributeError:
+            # fallback to xml.etree
+            parser = etree_.XMLParser()
+    doc = etree_.parse(infile, parser=parser, **kwargs)
+    return doc
+
+#
+# User methods
+#
+# Calls to the methods in these classes are generated by generateDS.py.
+# You can replace these methods by re-implementing the following class
+#   in a module named generatedssuper.py.
+
+try:
+    from generatedssuper import GeneratedsSuper
+except ImportError as exp:
+
+    class GeneratedsSuper(object):
+        tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$')
+        class _FixedOffsetTZ(datetime_.tzinfo):
+            def __init__(self, offset, name):
+                self.__offset = datetime_.timedelta(minutes=offset)
+                self.__name = name
+            def utcoffset(self, dt):
+                return self.__offset
+            def tzname(self, dt):
+                return self.__name
+            def dst(self, dt):
+                return None
+        def gds_format_string(self, input_data, input_name=''):
+            return input_data
+        def gds_validate_string(self, input_data, node=None, input_name=''):
+            if not input_data:
+                return ''
+            else:
+                return input_data
+        def gds_format_base64(self, input_data, input_name=''):
+            return base64.b64encode(input_data)
+        def gds_validate_base64(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer(self, input_data, input_name=''):
+            return '%d' % input_data
+        def gds_validate_integer(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_integer_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_integer_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    int(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of integers')
+            return values
+        def gds_format_float(self, input_data, input_name=''):
+            return ('%.15f' % input_data).rstrip('0')
+        def gds_validate_float(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_float_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_float_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of floats')
+            return values
+        def gds_format_double(self, input_data, input_name=''):
+            return '%e' % input_data
+        def gds_validate_double(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_double_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_double_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                try:
+                    float(value)
+                except (TypeError, ValueError):
+                    raise_parse_error(node, 'Requires sequence of doubles')
+            return values
+        def gds_format_boolean(self, input_data, input_name=''):
+            return ('%s' % input_data).lower()
+        def gds_validate_boolean(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_boolean_list(self, input_data, input_name=''):
+            return '%s' % ' '.join(input_data)
+        def gds_validate_boolean_list(
+                self, input_data, node=None, input_name=''):
+            values = input_data.split()
+            for value in values:
+                if value not in ('true', '1', 'false', '0', ):
+                    raise_parse_error(
+                        node,
+                        'Requires sequence of booleans '
+                        '("true", "1", "false", "0")')
+            return values
+        def gds_validate_datetime(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_datetime(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % (
+                    input_data.year,
+                    input_data.month,
+                    input_data.day,
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        @classmethod
+        def gds_parse_datetime(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            time_parts = input_data.split('.')
+            if len(time_parts) > 1:
+                micro_seconds = int(float('0.' + time_parts[1]) * 1000000)
+                input_data = '%s.%s' % (time_parts[0], micro_seconds, )
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(
+                    input_data, '%Y-%m-%dT%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt
+        def gds_validate_date(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_date(self, input_data, input_name=''):
+            _svalue = '%04d-%02d-%02d' % (
+                input_data.year,
+                input_data.month,
+                input_data.day,
+            )
+            try:
+                if input_data.tzinfo is not None:
+                    tzoff = input_data.tzinfo.utcoffset(input_data)
+                    if tzoff is not None:
+                        total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                        if total_seconds == 0:
+                            _svalue += 'Z'
+                        else:
+                            if total_seconds < 0:
+                                _svalue += '-'
+                                total_seconds *= -1
+                            else:
+                                _svalue += '+'
+                            hours = total_seconds // 3600
+                            minutes = (total_seconds - (hours * 3600)) // 60
+                            _svalue += '{0:02d}:{1:02d}'.format(
+                                hours, minutes)
+            except AttributeError:
+                pass
+            return _svalue
+        @classmethod
+        def gds_parse_date(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d')
+            dt = dt.replace(tzinfo=tz)
+            return dt.date()
+        def gds_validate_time(self, input_data, node=None, input_name=''):
+            return input_data
+        def gds_format_time(self, input_data, input_name=''):
+            if input_data.microsecond == 0:
+                _svalue = '%02d:%02d:%02d' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                )
+            else:
+                _svalue = '%02d:%02d:%02d.%s' % (
+                    input_data.hour,
+                    input_data.minute,
+                    input_data.second,
+                    ('%f' % (float(input_data.microsecond) / 1000000))[2:],
+                )
+            if input_data.tzinfo is not None:
+                tzoff = input_data.tzinfo.utcoffset(input_data)
+                if tzoff is not None:
+                    total_seconds = tzoff.seconds + (86400 * tzoff.days)
+                    if total_seconds == 0:
+                        _svalue += 'Z'
+                    else:
+                        if total_seconds < 0:
+                            _svalue += '-'
+                            total_seconds *= -1
+                        else:
+                            _svalue += '+'
+                        hours = total_seconds // 3600
+                        minutes = (total_seconds - (hours * 3600)) // 60
+                        _svalue += '{0:02d}:{1:02d}'.format(hours, minutes)
+            return _svalue
+        def gds_validate_simple_patterns(self, patterns, target):
+            # pat is a list of lists of strings/patterns.  We should:
+            # - AND the outer elements
+            # - OR the inner elements
+            found1 = True
+            for patterns1 in patterns:
+                found2 = False
+                for patterns2 in patterns1:
+                    if re_.search(patterns2, target) is not None:
+                        found2 = True
+                        break
+                if not found2:
+                    found1 = False
+                    break
+            return found1
+        @classmethod
+        def gds_parse_time(cls, input_data):
+            tz = None
+            if input_data[-1] == 'Z':
+                tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC')
+                input_data = input_data[:-1]
+            else:
+                results = GeneratedsSuper.tzoff_pattern.search(input_data)
+                if results is not None:
+                    tzoff_parts = results.group(2).split(':')
+                    tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1])
+                    if results.group(1) == '-':
+                        tzoff *= -1
+                    tz = GeneratedsSuper._FixedOffsetTZ(
+                        tzoff, results.group(0))
+                    input_data = input_data[:-6]
+            if len(input_data.split('.')) > 1:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f')
+            else:
+                dt = datetime_.datetime.strptime(input_data, '%H:%M:%S')
+            dt = dt.replace(tzinfo=tz)
+            return dt.time()
+        def gds_str_lower(self, instring):
+            return instring.lower()
+        def get_path_(self, node):
+            path_list = []
+            self.get_path_list_(node, path_list)
+            path_list.reverse()
+            path = '/'.join(path_list)
+            return path
+        Tag_strip_pattern_ = re_.compile(r'\{.*\}')
+        def get_path_list_(self, node, path_list):
+            if node is None:
+                return
+            tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag)
+            if tag:
+                path_list.append(tag)
+            self.get_path_list_(node.getparent(), path_list)
+        def get_class_obj_(self, node, default_class=None):
+            class_obj1 = default_class
+            if 'xsi' in node.nsmap:
+                classname = node.get('{%s}type' % node.nsmap['xsi'])
+                if classname is not None:
+                    names = classname.split(':')
+                    if len(names) == 2:
+                        classname = names[1]
+                    class_obj2 = globals().get(classname)
+                    if class_obj2 is not None:
+                        class_obj1 = class_obj2
+            return class_obj1
+        def gds_build_any(self, node, type_name=None):
+            return None
+        @classmethod
+        def gds_reverse_node_mapping(cls, mapping):
+            return dict(((v, k) for k, v in mapping.iteritems()))
+        @staticmethod
+        def gds_encode(instring):
+            if sys.version_info.major == 2:
+                return instring.encode(ExternalEncoding)
+            else:
+                return instring
+        @staticmethod
+        def convert_unicode(instring):
+            if isinstance(instring, str):
+                result = quote_xml(instring)
+            elif sys.version_info.major == 2 and isinstance(instring, unicode):
+                result = quote_xml(instring).encode('utf8')
+            else:
+                result = GeneratedsSuper.gds_encode(str(instring))
+            return result
+
+    def getSubclassFromModule_(module, class_):
+        '''Get the subclass of a class from a specific module.'''
+        name = class_.__name__ + 'Sub'
+        if hasattr(module, name):
+            return getattr(module, name)
+        else:
+            return None
+
+
+#
+# If you have installed IPython you can uncomment and use the following.
+# IPython is available from http://ipython.scipy.org/.
+#
+
+## from IPython.Shell import IPShellEmbed
+## args = ''
+## ipshell = IPShellEmbed(args,
+##     banner = 'Dropping into IPython',
+##     exit_msg = 'Leaving Interpreter, back to program.')
+
+# Then use the following line where and when you want to drop into the
+# IPython shell:
+#    ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit')
+
+#
+# Globals
+#
+
+ExternalEncoding = 'ascii'
+Tag_pattern_ = re_.compile(r'({.*})?(.*)')
+String_cleanup_pat_ = re_.compile(r"[\n\r\s]+")
+Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)')
+CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL)
+
+# Change this to redirect the generated superclass module to use a
+# specific subclass module.
+CurrentSubclassModule_ = None
+
+#
+# Support/utility functions.
+#
+
+
+def showIndent(outfile, level, pretty_print=True):
+    if pretty_print:
+        for idx in range(level):
+            outfile.write('    ')
+
+
+def quote_xml(inStr):
+    "Escape markup chars, but do not modify CDATA sections."
+    if not inStr:
+        return ''
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s2 = ''
+    pos = 0
+    matchobjects = CDATA_pattern_.finditer(s1)
+    for mo in matchobjects:
+        s3 = s1[pos:mo.start()]
+        s2 += quote_xml_aux(s3)
+        s2 += s1[mo.start():mo.end()]
+        pos = mo.end()
+    s3 = s1[pos:]
+    s2 += quote_xml_aux(s3)
+    return s2
+
+
+def quote_xml_aux(inStr):
+    s1 = inStr.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    return s1
+
+
+def quote_attrib(inStr):
+    s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
+    s1 = s1.replace('&', '&amp;')
+    s1 = s1.replace('<', '&lt;')
+    s1 = s1.replace('>', '&gt;')
+    if '"' in s1:
+        if "'" in s1:
+            s1 = '"%s"' % s1.replace('"', "&quot;")
+        else:
+            s1 = "'%s'" % s1
+    else:
+        s1 = '"%s"' % s1
+    return s1
+
+
+def quote_python(inStr):
+    s1 = inStr
+    if s1.find("'") == -1:
+        if s1.find('\n') == -1:
+            return "'%s'" % s1
+        else:
+            return "'''%s'''" % s1
+    else:
+        if s1.find('"') != -1:
+            s1 = s1.replace('"', '\\"')
+        if s1.find('\n') == -1:
+            return '"%s"' % s1
+        else:
+            return '"""%s"""' % s1
+
+
+def get_all_text_(node):
+    if node.text is not None:
+        text = node.text
+    else:
+        text = ''
+    for child in node:
+        if child.tail is not None:
+            text += child.tail
+    return text
+
+
+def find_attr_value_(attr_name, node):
+    attrs = node.attrib
+    attr_parts = attr_name.split(':')
+    value = None
+    if len(attr_parts) == 1:
+        value = attrs.get(attr_name)
+    elif len(attr_parts) == 2:
+        prefix, name = attr_parts
+        namespace = node.nsmap.get(prefix)
+        if namespace is not None:
+            value = attrs.get('{%s}%s' % (namespace, name, ))
+    return value
+
+
+class GDSParseError(Exception):
+    pass
+
+
+def raise_parse_error(node, msg):
+    msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, )
+    raise GDSParseError(msg)
+
+
+class MixedContainer:
+    # Constants for category:
+    CategoryNone = 0
+    CategoryText = 1
+    CategorySimple = 2
+    CategoryComplex = 3
+    # Constants for content_type:
+    TypeNone = 0
+    TypeText = 1
+    TypeString = 2
+    TypeInteger = 3
+    TypeFloat = 4
+    TypeDecimal = 5
+    TypeDouble = 6
+    TypeBoolean = 7
+    TypeBase64 = 8
+    def __init__(self, category, content_type, name, value):
+        self.category = category
+        self.content_type = content_type
+        self.name = name
+        self.value = value
+    def getCategory(self):
+        return self.category
+    def getContenttype(self, content_type):
+        return self.content_type
+    def getValue(self):
+        return self.value
+    def getName(self):
+        return self.name
+    def export(self, outfile, level, name, namespace, pretty_print=True):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                outfile.write(self.value)
+        elif self.category == MixedContainer.CategorySimple:
+            self.exportSimple(outfile, level, name)
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.export(
+                outfile, level, namespace, name, pretty_print=pretty_print)
+    def exportSimple(self, outfile, level, name):
+        if self.content_type == MixedContainer.TypeString:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeInteger or \
+                self.content_type == MixedContainer.TypeBoolean:
+            outfile.write('<%s>%d</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeFloat or \
+                self.content_type == MixedContainer.TypeDecimal:
+            outfile.write('<%s>%f</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeDouble:
+            outfile.write('<%s>%g</%s>' % (
+                self.name, self.value, self.name))
+        elif self.content_type == MixedContainer.TypeBase64:
+            outfile.write('<%s>%s</%s>' % (
+                self.name, base64.b64encode(self.value), self.name))
+    def to_etree(self, element):
+        if self.category == MixedContainer.CategoryText:
+            # Prevent exporting empty content as empty lines.
+            if self.value.strip():
+                if len(element) > 0:
+                    if element[-1].tail is None:
+                        element[-1].tail = self.value
+                    else:
+                        element[-1].tail += self.value
+                else:
+                    if element.text is None:
+                        element.text = self.value
+                    else:
+                        element.text += self.value
+        elif self.category == MixedContainer.CategorySimple:
+            subelement = etree_.SubElement(element, '%s' % self.name)
+            subelement.text = self.to_etree_simple()
+        else:    # category == MixedContainer.CategoryComplex
+            self.value.to_etree(element)
+    def to_etree_simple(self):
+        if self.content_type == MixedContainer.TypeString:
+            text = self.value
+        elif (self.content_type == MixedContainer.TypeInteger or
+                self.content_type == MixedContainer.TypeBoolean):
+            text = '%d' % self.value
+        elif (self.content_type == MixedContainer.TypeFloat or
+                self.content_type == MixedContainer.TypeDecimal):
+            text = '%f' % self.value
+        elif self.content_type == MixedContainer.TypeDouble:
+            text = '%g' % self.value
+        elif self.content_type == MixedContainer.TypeBase64:
+            text = '%s' % base64.b64encode(self.value)
+        return text
+    def exportLiteral(self, outfile, level, name):
+        if self.category == MixedContainer.CategoryText:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        elif self.category == MixedContainer.CategorySimple:
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % (
+                    self.category, self.content_type, self.name, self.value))
+        else:    # category == MixedContainer.CategoryComplex
+            showIndent(outfile, level)
+            outfile.write(
+                'model_.MixedContainer(%d, %d, "%s",\n' % (
+                    self.category, self.content_type, self.name,))
+            self.value.exportLiteral(outfile, level + 1)
+            showIndent(outfile, level)
+            outfile.write(')\n')
+
+
+class MemberSpec_(object):
+    def __init__(self, name='', data_type='', container=0):
+        self.name = name
+        self.data_type = data_type
+        self.container = container
+    def set_name(self, name): self.name = name
+    def get_name(self): return self.name
+    def set_data_type(self, data_type): self.data_type = data_type
+    def get_data_type_chain(self): return self.data_type
+    def get_data_type(self):
+        if isinstance(self.data_type, list):
+            if len(self.data_type) > 0:
+                return self.data_type[-1]
+            else:
+                return 'xs:string'
+        else:
+            return self.data_type
+    def set_container(self, container): self.container = container
+    def get_container(self): return self.container
+
+
+def _cast(typ, value):
+    if typ is None or value is None:
+        return value
+    return typ(value)
+
+#
+# Data representation classes.
+#
+
+
+class containerType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('sample1', 'simpleOneType', 1),
+        MemberSpec_('sample2_bad', 'simpleOneType', 1),
+        MemberSpec_('sample3_bad', 'simpleOneType', 1),
+        MemberSpec_('sample4_bad', 'simpleOneType', 1),
+        MemberSpec_('sample2', 'simpleTwoType', 1),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None):
+        self.original_tagname_ = None
+        if sample1 is None:
+            self.sample1 = []
+        else:
+            self.sample1 = sample1
+        if sample2_bad is None:
+            self.sample2_bad = []
+        else:
+            self.sample2_bad = sample2_bad
+        if sample3_bad is None:
+            self.sample3_bad = []
+        else:
+            self.sample3_bad = sample3_bad
+        if sample4_bad is None:
+            self.sample4_bad = []
+        else:
+            self.sample4_bad = sample4_bad
+        if sample2 is None:
+            self.sample2 = []
+        else:
+            self.sample2 = sample2
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, containerType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if containerType.subclass:
+            return containerType.subclass(*args_, **kwargs_)
+        else:
+            return containerType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_sample1(self): return self.sample1
+    def set_sample1(self, sample1): self.sample1 = sample1
+    def add_sample1(self, value): self.sample1.append(value)
+    def insert_sample1_at(self, index, value): self.sample1.insert(index, value)
+    def replace_sample1_at(self, index, value): self.sample1[index] = value
+    def get_sample2_bad(self): return self.sample2_bad
+    def set_sample2_bad(self, sample2_bad): self.sample2_bad = sample2_bad
+    def add_sample2_bad(self, value): self.sample2_bad.append(value)
+    def insert_sample2_bad_at(self, index, value): self.sample2_bad.insert(index, value)
+    def replace_sample2_bad_at(self, index, value): self.sample2_bad[index] = value
+    def get_sample3_bad(self): return self.sample3_bad
+    def set_sample3_bad(self, sample3_bad): self.sample3_bad = sample3_bad
+    def add_sample3_bad(self, value): self.sample3_bad.append(value)
+    def insert_sample3_bad_at(self, index, value): self.sample3_bad.insert(index, value)
+    def replace_sample3_bad_at(self, index, value): self.sample3_bad[index] = value
+    def get_sample4_bad(self): return self.sample4_bad
+    def set_sample4_bad(self, sample4_bad): self.sample4_bad = sample4_bad
+    def add_sample4_bad(self, value): self.sample4_bad.append(value)
+    def insert_sample4_bad_at(self, index, value): self.sample4_bad.insert(index, value)
+    def replace_sample4_bad_at(self, index, value): self.sample4_bad[index] = value
+    def get_sample2(self): return self.sample2
+    def set_sample2(self, sample2): self.sample2 = sample2
+    def add_sample2(self, value): self.sample2.append(value)
+    def insert_sample2_at(self, index, value): self.sample2.insert(index, value)
+    def replace_sample2_at(self, index, value): self.sample2[index] = value
+    def hasContent_(self):
+        if (
+            self.sample1 or
+            self.sample2_bad or
+            self.sample3_bad or
+            self.sample4_bad or
+            self.sample2
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='containerType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for sample1_ in self.sample1:
+            sample1_.export(outfile, level, namespace_, name_='sample1', pretty_print=pretty_print)
+        for sample2_bad_ in self.sample2_bad:
+            sample2_bad_.export(outfile, level, namespace_, name_='sample2_bad', pretty_print=pretty_print)
+        for sample3_bad_ in self.sample3_bad:
+            sample3_bad_.export(outfile, level, namespace_, name_='sample3_bad', pretty_print=pretty_print)
+        for sample4_bad_ in self.sample4_bad:
+            sample4_bad_.export(outfile, level, namespace_, name_='sample4_bad', pretty_print=pretty_print)
+        for sample2_ in self.sample2:
+            sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'sample1':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample1.append(obj_)
+            obj_.original_tagname_ = 'sample1'
+        elif nodeName_ == 'sample2_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample2_bad.append(obj_)
+            obj_.original_tagname_ = 'sample2_bad'
+        elif nodeName_ == 'sample3_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample3_bad.append(obj_)
+            obj_.original_tagname_ = 'sample3_bad'
+        elif nodeName_ == 'sample4_bad':
+            obj_ = simpleOneType.factory()
+            obj_.build(child_)
+            self.sample4_bad.append(obj_)
+            obj_.original_tagname_ = 'sample4_bad'
+        elif nodeName_ == 'sample2':
+            obj_ = simpleTwoType.factory()
+            obj_.build(child_)
+            self.sample2.append(obj_)
+            obj_.original_tagname_ = 'sample2'
+# end class containerType
+
+
+class simpleOneType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('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),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, vbar_pattern_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None):
+        self.original_tagname_ = None
+        self.integer_range_1_value = integer_range_1_value
+        self.validate_integer_range_1_st(self.integer_range_1_value)
+        self.pattern_value = pattern_value
+        self.validate_pattern_st(self.pattern_value)
+        self.token_enum_value = token_enum_value
+        self.validate_token_enum_st(self.token_enum_value)
+        self.integer_range_incl_value = integer_range_incl_value
+        self.validate_integer_range_incl_st(self.integer_range_incl_value)
+        self.integer_range_excl_value = integer_range_excl_value
+        self.validate_integer_range_excl_st(self.integer_range_excl_value)
+        self.min_max_length_value = min_max_length_value
+        self.validate_min_max_length_st(self.min_max_length_value)
+        self.length_value = length_value
+        self.validate_length_st(self.length_value)
+        self.totalDigits_value = totalDigits_value
+        self.validate_totalDigits_st(self.totalDigits_value)
+        if isinstance(date_minincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(date_minincl_value, '%Y-%m-%d').date()
+        else:
+            initvalue_ = date_minincl_value
+        self.date_minincl_value = initvalue_
+        if isinstance(date_maxincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(date_maxincl_value, '%Y-%m-%d').date()
+        else:
+            initvalue_ = date_maxincl_value
+        self.date_maxincl_value = initvalue_
+        if isinstance(date_minexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(date_minexcl_value, '%Y-%m-%d').date()
+        else:
+            initvalue_ = date_minexcl_value
+        self.date_minexcl_value = initvalue_
+        if isinstance(date_maxexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(date_maxexcl_value, '%Y-%m-%d').date()
+        else:
+            initvalue_ = date_maxexcl_value
+        self.date_maxexcl_value = initvalue_
+        if isinstance(time_minincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(time_minincl_value, '%H:%M:%S').time()
+        else:
+            initvalue_ = time_minincl_value
+        self.time_minincl_value = initvalue_
+        if isinstance(time_maxincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(time_maxincl_value, '%H:%M:%S').time()
+        else:
+            initvalue_ = time_maxincl_value
+        self.time_maxincl_value = initvalue_
+        if isinstance(time_minexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(time_minexcl_value, '%H:%M:%S').time()
+        else:
+            initvalue_ = time_minexcl_value
+        self.time_minexcl_value = initvalue_
+        if isinstance(time_maxexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(time_maxexcl_value, '%H:%M:%S').time()
+        else:
+            initvalue_ = time_maxexcl_value
+        self.time_maxexcl_value = initvalue_
+        if isinstance(datetime_minincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(datetime_minincl_value, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = datetime_minincl_value
+        self.datetime_minincl_value = initvalue_
+        if isinstance(datetime_maxincl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(datetime_maxincl_value, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = datetime_maxincl_value
+        self.datetime_maxincl_value = initvalue_
+        if isinstance(datetime_minexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(datetime_minexcl_value, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = datetime_minexcl_value
+        self.datetime_minexcl_value = initvalue_
+        if isinstance(datetime_maxexcl_value, BaseStrType_):
+            initvalue_ = datetime_.datetime.strptime(datetime_maxexcl_value, '%Y-%m-%dT%H:%M:%S')
+        else:
+            initvalue_ = datetime_maxexcl_value
+        self.datetime_maxexcl_value = initvalue_
+        self.vbar_pattern_value = vbar_pattern_value
+        self.validate_vbar_pattern_st(self.vbar_pattern_value)
+        self.anonymous_float_value = anonymous_float_value
+        self.validate_anonymous_float_valueType(self.anonymous_float_value)
+        self.primative_integer = primative_integer
+        self.primative_float = primative_float
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleOneType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if simpleOneType.subclass:
+            return simpleOneType.subclass(*args_, **kwargs_)
+        else:
+            return simpleOneType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_integer_range_1_value(self): return self.integer_range_1_value
+    def set_integer_range_1_value(self, integer_range_1_value): self.integer_range_1_value = integer_range_1_value
+    def get_pattern_value(self): return self.pattern_value
+    def set_pattern_value(self, pattern_value): self.pattern_value = pattern_value
+    def get_token_enum_value(self): return self.token_enum_value
+    def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value
+    def get_integer_range_incl_value(self): return self.integer_range_incl_value
+    def set_integer_range_incl_value(self, integer_range_incl_value): self.integer_range_incl_value = integer_range_incl_value
+    def get_integer_range_excl_value(self): return self.integer_range_excl_value
+    def set_integer_range_excl_value(self, integer_range_excl_value): self.integer_range_excl_value = integer_range_excl_value
+    def get_min_max_length_value(self): return self.min_max_length_value
+    def set_min_max_length_value(self, min_max_length_value): self.min_max_length_value = min_max_length_value
+    def get_length_value(self): return self.length_value
+    def set_length_value(self, length_value): self.length_value = length_value
+    def get_totalDigits_value(self): return self.totalDigits_value
+    def set_totalDigits_value(self, totalDigits_value): self.totalDigits_value = totalDigits_value
+    def get_date_minincl_value(self): return self.date_minincl_value
+    def set_date_minincl_value(self, date_minincl_value): self.date_minincl_value = date_minincl_value
+    def get_date_maxincl_value(self): return self.date_maxincl_value
+    def set_date_maxincl_value(self, date_maxincl_value): self.date_maxincl_value = date_maxincl_value
+    def get_date_minexcl_value(self): return self.date_minexcl_value
+    def set_date_minexcl_value(self, date_minexcl_value): self.date_minexcl_value = date_minexcl_value
+    def get_date_maxexcl_value(self): return self.date_maxexcl_value
+    def set_date_maxexcl_value(self, date_maxexcl_value): self.date_maxexcl_value = date_maxexcl_value
+    def get_time_minincl_value(self): return self.time_minincl_value
+    def set_time_minincl_value(self, time_minincl_value): self.time_minincl_value = time_minincl_value
+    def get_time_maxincl_value(self): return self.time_maxincl_value
+    def set_time_maxincl_value(self, time_maxincl_value): self.time_maxincl_value = time_maxincl_value
+    def get_time_minexcl_value(self): return self.time_minexcl_value
+    def set_time_minexcl_value(self, time_minexcl_value): self.time_minexcl_value = time_minexcl_value
+    def get_time_maxexcl_value(self): return self.time_maxexcl_value
+    def set_time_maxexcl_value(self, time_maxexcl_value): self.time_maxexcl_value = time_maxexcl_value
+    def get_datetime_minincl_value(self): return self.datetime_minincl_value
+    def set_datetime_minincl_value(self, datetime_minincl_value): self.datetime_minincl_value = datetime_minincl_value
+    def get_datetime_maxincl_value(self): return self.datetime_maxincl_value
+    def set_datetime_maxincl_value(self, datetime_maxincl_value): self.datetime_maxincl_value = datetime_maxincl_value
+    def get_datetime_minexcl_value(self): return self.datetime_minexcl_value
+    def set_datetime_minexcl_value(self, datetime_minexcl_value): self.datetime_minexcl_value = datetime_minexcl_value
+    def get_datetime_maxexcl_value(self): return self.datetime_maxexcl_value
+    def set_datetime_maxexcl_value(self, datetime_maxexcl_value): self.datetime_maxexcl_value = datetime_maxexcl_value
+    def get_vbar_pattern_value(self): return self.vbar_pattern_value
+    def set_vbar_pattern_value(self, vbar_pattern_value): self.vbar_pattern_value = vbar_pattern_value
+    def get_anonymous_float_value(self): return self.anonymous_float_value
+    def set_anonymous_float_value(self, anonymous_float_value): self.anonymous_float_value = anonymous_float_value
+    def get_primative_integer(self): return self.primative_integer
+    def set_primative_integer(self, primative_integer): self.primative_integer = primative_integer
+    def get_primative_float(self): return self.primative_float
+    def set_primative_float(self, primative_float): self.primative_float = primative_float
+    def validate_integer_range_1_st(self, value):
+        # Validate type integer_range_1_st, a restriction on integer_range_2_st.
+        if value is not None and Validate_simpletypes_:
+            if value <= 4:
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} )
+            if value >= 8:
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} )
+    def validate_pattern_st(self, value):
+        # Validate type pattern_st, a restriction on pattern_1_st.
+        if value is not None and Validate_simpletypes_:
+            if len(str(value)) < 10:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} )
+            if not self.gds_validate_simple_patterns(
+                    self.validate_pattern_st_patterns_, value):
+                warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
+    validate_pattern_st_patterns_ = [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+    def validate_token_enum_st(self, value):
+        # Validate type token_enum_st, a restriction on xs:NMTOKEN.
+        if value is not None and Validate_simpletypes_:
+            value = str(value)
+            enumerations = ['float', 'int', 'Name', 'token']
+            enumeration_respectee = False
+            for enum in enumerations:
+                if value == enum:
+                    enumeration_respectee = True
+                    break
+            if not enumeration_respectee:
+                warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
+    def validate_integer_range_incl_st(self, value):
+        # Validate type integer_range_incl_st, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+            if value < -5:
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
+            if value > 10:
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
+    def validate_integer_range_excl_st(self, value):
+        # Validate type integer_range_excl_st, a restriction on xs:integer.
+        if value is not None and Validate_simpletypes_:
+            if value <= -5:
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
+            if value >= 10:
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_excl_st' % {"value" : value} )
+    def validate_min_max_length_st(self, value):
+        # Validate type min_max_length_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+            if len(value) > 20:
+                warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+            if len(value) < 10:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
+    def validate_length_st(self, value):
+        # Validate type length_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+            if len(value) != 10:
+                warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
+    def validate_totalDigits_st(self, value):
+        # Validate type totalDigits_st, a restriction on xs:decimal.
+        if value is not None and Validate_simpletypes_:
+            if len(str(value)) >= 15:
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on totalDigits_st' % {"value" : value} )
+    def validate_date_minincl_st(self, value):
+        # Validate type date_minincl_st, a restriction on xs:date.
+        if value is not None and Validate_simpletypes_:
+            if value < self.gds_parse_date('2015-06-01'):
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} )
+    def validate_date_maxincl_st(self, value):
+        # Validate type date_maxincl_st, a restriction on xs:date.
+        if value is not None and Validate_simpletypes_:
+            if value > self.gds_parse_date('2015-10-31'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} )
+    def validate_date_minexcl_st(self, value):
+        # Validate type date_minexcl_st, a restriction on xs:date.
+        if value is not None and Validate_simpletypes_:
+            if value <= self.gds_parse_date('2015-06-01'):
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} )
+    def validate_date_maxexcl_st(self, value):
+        # Validate type date_maxexcl_st, a restriction on xs:date.
+        if value is not None and Validate_simpletypes_:
+            if value >= self.gds_parse_date('2015-10-31'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} )
+    def validate_time_minincl_st(self, value):
+        # Validate type time_minincl_st, a restriction on xs:time.
+        if value is not None and Validate_simpletypes_:
+            if value < self.gds_parse_time('14:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} )
+    def validate_time_maxincl_st(self, value):
+        # Validate type time_maxincl_st, a restriction on xs:time.
+        if value is not None and Validate_simpletypes_:
+            if value > self.gds_parse_time('16:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} )
+    def validate_time_minexcl_st(self, value):
+        # Validate type time_minexcl_st, a restriction on xs:time.
+        if value is not None and Validate_simpletypes_:
+            if value <= self.gds_parse_time('14:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} )
+    def validate_time_maxexcl_st(self, value):
+        # Validate type time_maxexcl_st, a restriction on xs:time.
+        if value is not None and Validate_simpletypes_:
+            if value >= self.gds_parse_time('16:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} )
+    def validate_datetime_minincl_st(self, value):
+        # Validate type datetime_minincl_st, a restriction on xs:dateTime.
+        if value is not None and Validate_simpletypes_:
+            if value < self.gds_parse_datetime('2015-06-01T14:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} )
+    def validate_datetime_maxincl_st(self, value):
+        # Validate type datetime_maxincl_st, a restriction on xs:dateTime.
+        if value is not None and Validate_simpletypes_:
+            if value > self.gds_parse_datetime('2015-10-31T16:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} )
+    def validate_datetime_minexcl_st(self, value):
+        # Validate type datetime_minexcl_st, a restriction on xs:dateTime.
+        if value is not None and Validate_simpletypes_:
+            if value <= self.gds_parse_datetime('2015-06-01T14:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} )
+    def validate_datetime_maxexcl_st(self, value):
+        # Validate type datetime_maxexcl_st, a restriction on xs:dateTime.
+        if value is not None and Validate_simpletypes_:
+            if value >= self.gds_parse_datetime('2015-10-31T16:20:10'):
+                warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} )
+    def validate_vbar_pattern_st(self, value):
+        # Validate type vbar_pattern_st, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+            if not self.gds_validate_simple_patterns(
+                    self.validate_vbar_pattern_st_patterns_, value):
+                warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_vbar_pattern_st_patterns_, ))
+    validate_vbar_pattern_st_patterns_ = [['^abcd$|^ef\\|gh$']]
+    def validate_anonymous_float_valueType(self, value):
+        # Validate type anonymous_float_valueType, a restriction on xs:float.
+        if value is not None and Validate_simpletypes_:
+            if value < 1.1:
+                warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+            if value > 4.4:
+                warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
+    def hasContent_(self):
+        if (
+            self.integer_range_1_value is not None or
+            self.pattern_value is not None or
+            self.token_enum_value is not None or
+            self.integer_range_incl_value is not None or
+            self.integer_range_excl_value is not None or
+            self.min_max_length_value is not None or
+            self.length_value is not None or
+            self.totalDigits_value is not None or
+            self.date_minincl_value is not None or
+            self.date_maxincl_value is not None or
+            self.date_minexcl_value is not None or
+            self.date_maxexcl_value is not None or
+            self.time_minincl_value is not None or
+            self.time_maxincl_value is not None or
+            self.time_minexcl_value is not None or
+            self.time_maxexcl_value is not None or
+            self.datetime_minincl_value is not None or
+            self.datetime_maxincl_value is not None or
+            self.datetime_minexcl_value is not None or
+            self.datetime_maxexcl_value is not None or
+            self.vbar_pattern_value is not None or
+            self.anonymous_float_value is not None or
+            self.primative_integer is not None or
+            self.primative_float is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleOneType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleOneType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleOneType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleOneType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleOneType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.integer_range_1_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_1_value>%s</%sinteger_range_1_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_1_value, input_name='integer_range_1_value'), namespace_, eol_))
+        if self.pattern_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%spattern_value>%s</%spattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.pattern_value), input_name='pattern_value')), namespace_, eol_))
+        if self.token_enum_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.token_enum_value), input_name='token_enum_value')), namespace_, eol_))
+        if self.integer_range_incl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_incl_value>%s</%sinteger_range_incl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_incl_value, input_name='integer_range_incl_value'), namespace_, eol_))
+        if self.integer_range_excl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sinteger_range_excl_value>%s</%sinteger_range_excl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_excl_value, input_name='integer_range_excl_value'), namespace_, eol_))
+        if self.min_max_length_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%smin_max_length_value>%s</%smin_max_length_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.min_max_length_value), input_name='min_max_length_value')), namespace_, eol_))
+        if self.length_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%slength_value>%s</%slength_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.length_value), input_name='length_value')), namespace_, eol_))
+        if self.totalDigits_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stotalDigits_value>%s</%stotalDigits_value>%s' % (namespace_, self.gds_format_float(self.totalDigits_value, input_name='totalDigits_value'), namespace_, eol_))
+        if self.date_minincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdate_minincl_value>%s</%sdate_minincl_value>%s' % (namespace_, self.gds_format_date(self.date_minincl_value, input_name='date_minincl_value'), namespace_, eol_))
+        if self.date_maxincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdate_maxincl_value>%s</%sdate_maxincl_value>%s' % (namespace_, self.gds_format_date(self.date_maxincl_value, input_name='date_maxincl_value'), namespace_, eol_))
+        if self.date_minexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdate_minexcl_value>%s</%sdate_minexcl_value>%s' % (namespace_, self.gds_format_date(self.date_minexcl_value, input_name='date_minexcl_value'), namespace_, eol_))
+        if self.date_maxexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdate_maxexcl_value>%s</%sdate_maxexcl_value>%s' % (namespace_, self.gds_format_date(self.date_maxexcl_value, input_name='date_maxexcl_value'), namespace_, eol_))
+        if self.time_minincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stime_minincl_value>%s</%stime_minincl_value>%s' % (namespace_, self.gds_format_time(self.time_minincl_value, input_name='time_minincl_value'), namespace_, eol_))
+        if self.time_maxincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stime_maxincl_value>%s</%stime_maxincl_value>%s' % (namespace_, self.gds_format_time(self.time_maxincl_value, input_name='time_maxincl_value'), namespace_, eol_))
+        if self.time_minexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stime_minexcl_value>%s</%stime_minexcl_value>%s' % (namespace_, self.gds_format_time(self.time_minexcl_value, input_name='time_minexcl_value'), namespace_, eol_))
+        if self.time_maxexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%stime_maxexcl_value>%s</%stime_maxexcl_value>%s' % (namespace_, self.gds_format_time(self.time_maxexcl_value, input_name='time_maxexcl_value'), namespace_, eol_))
+        if self.datetime_minincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdatetime_minincl_value>%s</%sdatetime_minincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minincl_value, input_name='datetime_minincl_value'), namespace_, eol_))
+        if self.datetime_maxincl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdatetime_maxincl_value>%s</%sdatetime_maxincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxincl_value, input_name='datetime_maxincl_value'), namespace_, eol_))
+        if self.datetime_minexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdatetime_minexcl_value>%s</%sdatetime_minexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minexcl_value, input_name='datetime_minexcl_value'), namespace_, eol_))
+        if self.datetime_maxexcl_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sdatetime_maxexcl_value>%s</%sdatetime_maxexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxexcl_value, input_name='datetime_maxexcl_value'), namespace_, eol_))
+        if self.vbar_pattern_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%svbar_pattern_value>%s</%svbar_pattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.vbar_pattern_value), input_name='vbar_pattern_value')), namespace_, eol_))
+        if self.anonymous_float_value is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sanonymous_float_value>%s</%sanonymous_float_value>%s' % (namespace_, self.gds_format_float(self.anonymous_float_value, input_name='anonymous_float_value'), namespace_, eol_))
+        if self.primative_integer is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sprimative_integer>%s</%sprimative_integer>%s' % (namespace_, self.gds_format_integer(self.primative_integer, input_name='primative_integer'), namespace_, eol_))
+        if self.primative_float is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%sprimative_float>%s</%sprimative_float>%s' % (namespace_, self.gds_format_float(self.primative_float, input_name='primative_float'), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'integer_range_1_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_1_value')
+            self.integer_range_1_value = ival_
+            # validate type integer_range_1_st
+            self.validate_integer_range_1_st(self.integer_range_1_value)
+        elif nodeName_ == 'pattern_value':
+            pattern_value_ = child_.text
+            pattern_value_ = self.gds_validate_string(pattern_value_, node, 'pattern_value')
+            self.pattern_value = pattern_value_
+            # validate type pattern_st
+            self.validate_pattern_st(self.pattern_value)
+        elif nodeName_ == 'token_enum_value':
+            token_enum_value_ = child_.text
+            token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value')
+            self.token_enum_value = token_enum_value_
+            # validate type token_enum_st
+            self.validate_token_enum_st(self.token_enum_value)
+        elif nodeName_ == 'integer_range_incl_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value')
+            self.integer_range_incl_value = ival_
+            # validate type integer_range_incl_st
+            self.validate_integer_range_incl_st(self.integer_range_incl_value)
+        elif nodeName_ == 'integer_range_excl_value':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value')
+            self.integer_range_excl_value = ival_
+            # validate type integer_range_excl_st
+            self.validate_integer_range_excl_st(self.integer_range_excl_value)
+        elif nodeName_ == 'min_max_length_value':
+            min_max_length_value_ = child_.text
+            min_max_length_value_ = self.gds_validate_string(min_max_length_value_, node, 'min_max_length_value')
+            self.min_max_length_value = min_max_length_value_
+            # validate type min_max_length_st
+            self.validate_min_max_length_st(self.min_max_length_value)
+        elif nodeName_ == 'length_value':
+            length_value_ = child_.text
+            length_value_ = self.gds_validate_string(length_value_, node, 'length_value')
+            self.length_value = length_value_
+            # validate type length_st
+            self.validate_length_st(self.length_value)
+        elif nodeName_ == 'totalDigits_value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'totalDigits_value')
+            self.totalDigits_value = fval_
+            # validate type totalDigits_st
+            self.validate_totalDigits_st(self.totalDigits_value)
+        elif nodeName_ == 'date_minincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.date_minincl_value = dval_
+            # validate type date_minincl_st
+            self.validate_date_minincl_st(self.date_minincl_value)
+        elif nodeName_ == 'date_maxincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.date_maxincl_value = dval_
+            # validate type date_maxincl_st
+            self.validate_date_maxincl_st(self.date_maxincl_value)
+        elif nodeName_ == 'date_minexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.date_minexcl_value = dval_
+            # validate type date_minexcl_st
+            self.validate_date_minexcl_st(self.date_minexcl_value)
+        elif nodeName_ == 'date_maxexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_date(sval_)
+            self.date_maxexcl_value = dval_
+            # validate type date_maxexcl_st
+            self.validate_date_maxexcl_st(self.date_maxexcl_value)
+        elif nodeName_ == 'time_minincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.time_minincl_value = dval_
+            # validate type time_minincl_st
+            self.validate_time_minincl_st(self.time_minincl_value)
+        elif nodeName_ == 'time_maxincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.time_maxincl_value = dval_
+            # validate type time_maxincl_st
+            self.validate_time_maxincl_st(self.time_maxincl_value)
+        elif nodeName_ == 'time_minexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.time_minexcl_value = dval_
+            # validate type time_minexcl_st
+            self.validate_time_minexcl_st(self.time_minexcl_value)
+        elif nodeName_ == 'time_maxexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_time(sval_)
+            self.time_maxexcl_value = dval_
+            # validate type time_maxexcl_st
+            self.validate_time_maxexcl_st(self.time_maxexcl_value)
+        elif nodeName_ == 'datetime_minincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.datetime_minincl_value = dval_
+            # validate type datetime_minincl_st
+            self.validate_datetime_minincl_st(self.datetime_minincl_value)
+        elif nodeName_ == 'datetime_maxincl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.datetime_maxincl_value = dval_
+            # validate type datetime_maxincl_st
+            self.validate_datetime_maxincl_st(self.datetime_maxincl_value)
+        elif nodeName_ == 'datetime_minexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.datetime_minexcl_value = dval_
+            # validate type datetime_minexcl_st
+            self.validate_datetime_minexcl_st(self.datetime_minexcl_value)
+        elif nodeName_ == 'datetime_maxexcl_value':
+            sval_ = child_.text
+            dval_ = self.gds_parse_datetime(sval_)
+            self.datetime_maxexcl_value = dval_
+            # validate type datetime_maxexcl_st
+            self.validate_datetime_maxexcl_st(self.datetime_maxexcl_value)
+        elif nodeName_ == 'vbar_pattern_value':
+            vbar_pattern_value_ = child_.text
+            vbar_pattern_value_ = self.gds_validate_string(vbar_pattern_value_, node, 'vbar_pattern_value')
+            self.vbar_pattern_value = vbar_pattern_value_
+            # validate type vbar_pattern_st
+            self.validate_vbar_pattern_st(self.vbar_pattern_value)
+        elif nodeName_ == 'anonymous_float_value':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value')
+            self.anonymous_float_value = fval_
+            # validate type anonymous_float_valueType
+            self.validate_anonymous_float_valueType(self.anonymous_float_value)
+        elif nodeName_ == 'primative_integer':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'primative_integer')
+            self.primative_integer = ival_
+        elif nodeName_ == 'primative_float':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'primative_float')
+            self.primative_float = fval_
+# end class simpleOneType
+
+
+class simpleTwoType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, simpleTwoElementOne=None):
+        self.original_tagname_ = None
+        self.simpleTwoElementOne = simpleTwoElementOne
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleTwoType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if simpleTwoType.subclass:
+            return simpleTwoType.subclass(*args_, **kwargs_)
+        else:
+            return simpleTwoType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_simpleTwoElementOne(self): return self.simpleTwoElementOne
+    def set_simpleTwoElementOne(self, simpleTwoElementOne): self.simpleTwoElementOne = simpleTwoElementOne
+    def hasContent_(self):
+        if (
+            self.simpleTwoElementOne is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleTwoType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.simpleTwoElementOne is not None:
+            self.simpleTwoElementOne.export(outfile, level, namespace_, name_='simpleTwoElementOne', pretty_print=pretty_print)
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'simpleTwoElementOne':
+            obj_ = simpleTwoElementOneType.factory()
+            obj_.build(child_)
+            self.simpleTwoElementOne = obj_
+            obj_.original_tagname_ = 'simpleTwoElementOne'
+# end class simpleTwoType
+
+
+class simpleTwoElementOneType(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, simpleTwoElementTwo=None):
+        self.original_tagname_ = None
+        self.simpleTwoElementTwo = simpleTwoElementTwo
+        self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo)
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, simpleTwoElementOneType)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if simpleTwoElementOneType.subclass:
+            return simpleTwoElementOneType.subclass(*args_, **kwargs_)
+        else:
+            return simpleTwoElementOneType(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_simpleTwoElementTwo(self): return self.simpleTwoElementTwo
+    def set_simpleTwoElementTwo(self, simpleTwoElementTwo): self.simpleTwoElementTwo = simpleTwoElementTwo
+    def validate_simpleTwoElementTwoType(self, value):
+        # Validate type simpleTwoElementTwoType, a restriction on xs:string.
+        if value is not None and Validate_simpletypes_:
+            if len(value) > 24:
+                warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
+            if len(value) < 12:
+                warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
+    def hasContent_(self):
+        if (
+            self.simpleTwoElementTwo is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', namespacedef_='', pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoElementOneType')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoElementOneType', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoElementOneType'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.simpleTwoElementTwo is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<%ssimpleTwoElementTwo>%s</%ssimpleTwoElementTwo>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.simpleTwoElementTwo), input_name='simpleTwoElementTwo')), namespace_, eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'simpleTwoElementTwo':
+            simpleTwoElementTwo_ = child_.text
+            simpleTwoElementTwo_ = self.gds_validate_string(simpleTwoElementTwo_, node, 'simpleTwoElementTwo')
+            self.simpleTwoElementTwo = simpleTwoElementTwo_
+            # validate type simpleTwoElementTwoType
+            self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo)
+# end class simpleTwoElementOneType
+
+
+GDSClassesMapping = {
+    'container': containerType,
+    'sample1': simpleOneType,
+    'sample2': simpleTwoType,
+    'sample2_bad': simpleOneType,
+    'sample3_bad': simpleOneType,
+    'sample4_bad': simpleOneType,
+    'simpleTwoElementOne': simpleTwoElementOneType,
+    'simpleTypeData': simpleTwoType,
+}
+
+
+USAGE_TEXT = """
+Usage: python <Parser>.py [ -s ] <in_xml_file>
+"""
+
+
+def usage():
+    print(USAGE_TEXT)
+    sys.exit(1)
+
+
+def get_root_tag(node):
+    tag = Tag_pattern_.match(node.tag).groups()[-1]
+    rootClass = GDSClassesMapping.get(tag)
+    if rootClass is None:
+        rootClass = globals().get(tag)
+    return tag, rootClass
+
+
+def parse(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
+    return rootObj
+
+
+def parseEtree(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    mapping = {}
+    rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping)
+    reverse_mapping = rootObj.gds_reverse_node_mapping(mapping)
+    if not silence:
+        content = etree_.tostring(
+            rootElement, pretty_print=True,
+            xml_declaration=True, encoding="utf-8")
+        sys.stdout.write(content)
+        sys.stdout.write('\n')
+    return rootObj, rootElement, mapping, reverse_mapping
+
+
+def parseString(inString, silence=False):
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+    parser = None
+    doc = parsexml_(IOBuffer(inString), parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
+    return rootObj
+
+
+def parseLiteral(inFileName, silence=False):
+    parser = None
+    doc = parsexml_(inFileName, parser)
+    rootNode = doc.getroot()
+    rootTag, rootClass = get_root_tag(rootNode)
+    if rootClass is None:
+        rootTag = 'containerType'
+        rootClass = containerType
+    rootObj = rootClass.factory()
+    rootObj.build(rootNode)
+    # Enable Python to collect the space used by the DOM.
+    doc = None
+    if not silence:
+        sys.stdout.write('#from validate_simpletypes2_sup import *\n\n')
+        sys.stdout.write('import validate_simpletypes2_sup as model_\n\n')
+        sys.stdout.write('rootObj = model_.rootClass(\n')
+        rootObj.exportLiteral(sys.stdout, 0, name_=rootTag)
+        sys.stdout.write(')\n')
+    return rootObj
+
+
+def main():
+    args = sys.argv[1:]
+    if len(args) == 1:
+        parse(args[0])
+    else:
+        usage()
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
+
+
+__all__ = [
+    "containerType",
+    "simpleOneType",
+    "simpleTwoElementOneType",
+    "simpleTwoType"
+]
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index e2ffb83..d4945ec 100644
--- a/tutorial/generateds_tutorial.html
+++ b/tutorial/generateds_tutorial.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.12: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" />
 <title>generateDS -- Introduction and Tutorial</title>
 <meta name="author" content="Dave Kuhlman" />
 <style type="text/css">
@@ -187,9 +187,12 @@ div.warning p.admonition-title {
   font-family: sans-serif }
 
 tt.docutils {
-  background-color: #eeeeee;
+  background-color: #dddddd;
 }
 
+ul.auto-toc {
+  list-style-type: none }
+
 </style>
 </head>
 <body>
@@ -203,8 +206,8 @@ tt.docutils {
 <td>Dave Kuhlman</td></tr>
 <tr><th class="docinfo-name">Address:</th>
 <td><pre class="address">
-<a class="first reference external" href="mailto:dkuhlman&#64;rexx.com">dkuhlman&#64;rexx.com</a>
-<a class="last reference external" href="http://www.rexx.com/~dkuhlman">http://www.rexx.com/~dkuhlman</a>
+dkuhlman (at) davekuhlman (dot) org
+<a class="last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a>
 </pre>
 </td></tr>
 </tbody>
@@ -216,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.11a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td>
 </tr>
 </tbody>
 </table>
@@ -225,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">August 16, 2013</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">January 16, 2017</td>
 </tr>
 </tbody>
 </table>
@@ -298,7 +301,7 @@ tutorial/Code/
 </li>
 <li><p class="first">You can find additional information about <tt class="docutils literal">generateDS.py</tt> here:</p>
 <blockquote>
-<p><a class="reference external" href="http://www.rexx.com/~dkuhlman/generateDS.html">http://www.rexx.com/~dkuhlman/generateDS.html</a></p>
+<p><a class="reference external" href="http://www.davekuhlman.org/generateDS.html">http://www.davekuhlman.org/generateDS.html</a></p>
 </blockquote>
 <p>That documentation is also included in the distribution.</p>
 </li>
@@ -465,7 +468,7 @@ more command line options used by <tt class="docutils literal">generateDS.py</tt
 $ python generateDS.py --help
 </pre>
 <p>and by reading the document
-<a class="reference external" href="http://www.rexx.com/~dkuhlman/generateDS.html">http://www.rexx.com/~dkuhlman/generateDS.html</a></p>
+<a class="reference external" href="http://www.davekuhlman.org/generateDS.html">http://www.davekuhlman.org/generateDS.html</a></p>
 <dl class="docutils">
 <dt>o</dt>
 <dd>Generate the superclass module.  This is the module that
@@ -1207,6 +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-01-17 00:01 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 0ad7680..560634e 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -3,15 +3,15 @@ generateDS -- Introduction and Tutorial
 ======================================================
 
 :author: Dave Kuhlman
-:address: dkuhlman@rexx.com
-    http://www.rexx.com/~dkuhlman
+:address: dkuhlman (at) davekuhlman (dot) org
+    http://www.davekuhlman.org
 
 .. Do not modify the following version comments.
    They are used by updateversion.py.
 
 .. version
 
-:revision: 2.11b
+:revision: 2.24b
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 724d78077fb3ad5b7e3ff90edf6a1b6dd48e5125..09649363daf7cb1b00b3b67705d890bd0aac6ec8 100644
GIT binary patch
delta 22964
zcmZ6SV{m2Py7hOkW81cE+qP}HqaE9J$F^<T=-77BourfQ`#<Nr_dQkj!<x0~H|JRO
zRINFm53|Nt{sjN~2~MaY4*`h*003YBUbbGcViz<_df)&65)c5u1`wnUbYX%#d^|KY
zU;z+GtsFYQb`Bj+A9w&5<OKu(@b4jCUC?=l1!4D#z7tX=D31w-4R><c3N{A-%qhzE
z<%<@APnQ%Y?!uW&WTyR|x+)%N)1;8BoS3NG(eYh(4h%vn|M3pmfy;&1jY40+3qu4N
zUYSze;|KS5u>r>%t;`*ey2GK8Fu6Z{AF;<lWgDux-O!(GahLjMppKF+yv`BKm^ei5
zN8W^2k04Rvm3T_Zu@r45IZT=<$#plZTjFB!FAtAHzyeO{i@6OB%SkEZL)8SVhXf5Q
z;|(=Ui6yR5mtCI5nBbQ?G3xhx2mMa14esA-Rjcg}bl*38Ih>0?<N7?m!L5Iy%?EPk
z+1un5^S^Y3H_Two&jAgL4R=3FQq6Lhf+^L*x-yzHI4wAqEsB|l%iuGI%-EK0S-~=K
z%$(fKcW4Fngoi@eanRcBd2LTv(rr{$cRqL-9icP1D~KuGcPa?lOqc(<q|Er}I63C|
zvmsejE9jp2vU)axw)=7u!uM_uHu+aZ&=em6%oZR~l_B=08^d?O&k4uiLYRGV1dT!-
z`B<@U3|!niyMvgPN#X*9ghbc`kv`&Us?CK_bwi~I-pL7J4PSKnhT|Dc;HM1&(0b??
zfcG1;oePBl#mI>9d{jT-tgpKEQrqoKP*q2Z!|c7{rUYt1b&5vwSV3V3GY^Zri2|-%
zFf)S@%9h6As8ec8ep=xb5+xY+_Z4~rNiEfUVdv;W7ryWalMD`eR=>a!PYZ2ai6Dp*
zlMx1vbEpuitptuW?Vru%Y}{zX`Slyyc+UF6bIZ3Tt7+lK|GF8l^y_@nauzJzkKJ#b
zX6~~61Fj;E`M>*<Du_j{Sefx%k{JNVNF4yD08JVN=$w{0{oftAD)8mLE#)<E+_1^k
z7waLORBXZD&aiU)!>M>(Rv>;yzI^48A-XIIJxH=Kh^D;nZ{NK+woVX<B-^~g0(**#
z*{|E}Utf~OeStFQt_^VL*Eee>Y<&1I>2sbK)*TH{nq4s8kw>p>K`yV#_ksR?&odLh
z%yfq%62JdB9eLGfg_$@WFzO{t+~4g*7Y2Dhe?fzxj4G0{qh|tCsg56i6GNFbGR%Cs
z2^iIBm8^})V0Rqn{>2d{sfBfFXC7JJ=8c)Q0Z^|52U%Jfy#{6X`aFhsBfBhFlA*e$
zBT9V1nbP16eb-1=1Chk3eCdt-YJhU~)T*vUa9;1ii{c&d<D^*==atH09`mP#FPYZP
zz%YlVOs(?e?9|Mrv#5f1e&!c!nC4+Ua^UE~$)AxoZA!QaO<vMu)rJ=_j%U+Mz;(dQ
zjLy-Ey4qDHLm2ba!s4qwlR+hIk=fC3(P2ofVP$qUC9iSY0!c~k(Ldg=vB_GFM`pR@
z)2I%6-ZGw#1A;>yjUju{K)BFD3extE!oeu;0C!rWyf0b*ucDlZWQ=`qKeE?XmCp(~
zvh1m%H>}0J$bnuHnmrOX@yC3*J5Ah$Lv#oN#CW=+G5H|g)aRaUF>PHB+J3!7;ZL7>
zbVGv}UGT(5Pyk)*Hct=6Io()CSDXsT?e78T;LirjBCNlPHb44|1-pEH9_3o!ii`bD
zI-$!1s)YYaloLdDB@7~^k%?nbb4MJ7HZzV<u#Q=0q8=7@ni+;l9P{Vm<=@6ehCrBi
zviFUo$J}QMzG2UoXr)kkuOf#PUzaR}^M#Oq`WdpM4oZ(<XC2z_<cVg-WMbTb6&f?_
zO8WW*=AjwvcT+v{8%IM;QmE;<dJ?^DgAg?Y5)4ZA1%N^K!@i@}z^+lLM>h>#nj(>j
zF$NVs((D_OF!sYUWMIMYLQ4i@e!k(Pb&KGGTQ`{hpOon(v!?X-#?`LVs?>2kErriq
zaEgNbFHqGM;k<|LRqNi7jT%U3ia2aZmVh(m<Cn>|ez4c6CY7=@$R{(1lQE~H9!l4D
z3y8h2!`G|1r_1rD7Q>nEo|(e?O?;JTU^^>QMtm3&r(RzX*7_!^P&8(1*XqZJW=geL
z6mSHv_uFP}_PIYMv3yEf?d=baN#vvg5(RMXbU+=;dp?-br%!4+{mf{LV6PI4(~iqX
z_jzAO`)vl36#e02K%?)sW*ORL=N0{pOkRS^<&rv#Lv%;vjmj{jt~}+g7?iVoyt$a-
zq~|8b8<#3^tKtQdJkNFW3FzH>M;oNI>(4#L^oGTp;fW+_>f*`R)ya+F3da_RHWvyb
zcc3oct)<Z9*J@P<K<+CggyZuw1L)x^u3~S2xj?zV_=Ws4U5!!OXFL#vk%tB3NlPNO
z#JGo^X@41gFU<ztOAAf_=WA?6qdt%i5%z)T@>2`*Qx7woDFV_A*P0T9Q_;mFce!UJ
z!WF1F&O4wpMHbuA9tnJc`TJBAb3}*P4Wc7O!7%K?#*d2K@k3Y38;>M43qTIVs@Lxz
z|IqIkiT5pd-6ni&rl*g;+1POP*pErD9Mg)+;@9s$A8B{;^51eRql&S)bDKn*aXTq~
zOo*?Q<ShoR|43AE8NytsqvR@7z>$r_k!`7xYScFWz&N^Tn&V-~iV$|8WK}K=24O%g
zC<eDeph|m!7m=Zl8`Tnryu-=kU#o+&yZ(-b3H^EwJB4(I=Y^Q&#2MWZLmn+IY&|rZ
zSQ5d|EIuGL0wP1Qd8|ifS-4;=JujXSaHSU!92MM<n$)_7>0qt=bHd?0J|fsM<tObj
zI@xkQvf=&l6c4o@agu20(pZVoK=d4OUUerGL9!kbE@ROQ%94=OYs3<GLczTZoheSl
zpG=~QSa7os2Cxs3)j>BNBrKFRmZd}#3X0Gxw+r>-XyK5HBf@j9<7JpxtgZ;pP6v1V
zh-g|NqKQXidTH{&;`|^%NnleIzl}tUnx)jxoLU`_2T>JQC2>nn;~QiM$P7E-=@o`z
zT+FNIGPFLa(U-w2U4k^`a}Rt(-*+sW_>j_DPR{;)(7FrSPme}Hkwl9u0b;~YDZ3zX
z{`+jy_>dCWU-MLO-riJ%zf>)9SoV`x5l5d6PjloL?~&w#2Iuy0NZx9Pb^4S_XB8rm
zE!4vu9OSMoaq%uxIpB`~&>Zbm-cqbvxG!cVnVOZ+D7z&j!*_H4k!q-J>i&U#RN|wq
z>A3Efn@J-oiSx$zYH^JnIh;7$3Rm18+>9;F6TTdrC0HH5D68^tqeRYoXn&C5s6ouy
z?7T|Nr$(!x(+;r#eM#%5-NZ-HV5;F?zQu<^qyll$)Z;qO<qwH)K##77M&uCiMsi@4
z!@-zYKCa-jGKEAIIp(#Z(0~yvR%z5T3<>RusPlz=5Q<g5Mpdmd3)-Z(NCSMUib*Zv
z9x8Jon&diG{S|;0CO8!l4aQ)HfE{fk>5fv$FLSb~Uk68rb_T#!S_zLb6>YI1<=FuD
zaNr*$NlS%vkPPku0$_1qu3`JLS>Rt#DR7dDk$h9ooeP2+q|bM+;?#xqBw-^Xg+dBW
zlL<irW62}Joe)IEGWZ^H0w6jKF9;1SqvXO1LdV*@jw5Okm?@@5cOdLVsg6M6A}eqw
zITaGmP2Oli6Y4NMCSw|OP;?yI2zm}r*K~}#0xXQuaKli6qALQf;BRcI?zQ_n+1Xq<
za22RQ^Hx-#%fCNII96xq7dIi0ngxoh7uCYEes?|34=p(s{BrCYa-&p}CeX+AHe;ml
z;7X#WxGb~5RMVd{KCpaCqB7;5jxUKFdND&EP#!PR5~re2U4~)PMUL1>FCk|#^N7)q
zS0BxsrmY2ls0^;@6qcC7=qCps%)GOWcu&3~lq+*3|Aj4tg^!P6*UFCr*n||qhDBtG
z+DMZqa4=i+mp*}KF%BwPCXZZSntXVmGi&VordDzjy7tzIObb98i_NoebmdIIt5j#}
zP5;K}L5!Pe8G6~GVseHFxd<g8fE063M@3#1(a^;J!AW=<Wvf+~nwJs8>;qy-gz8?r
z;P-B~I+;sZ*b<Y2X=C&bQ&&xY5j0&d9SRY?vugzz^}qYfF>e-;ntWfLU?FHThboSH
z3lYqGE)%~87H^acJBMwP?O@#>xTYW6kF;U{AxC#dEh%*cRgLKrQ&aybC6_4vB)@n|
z_Gbym&EPXYOzK418=O{{;yO8GlYaQD$kTtY98Z|#@BT~lj}8QLnr;yZh!gliJGu18
zRJ{)wj9}@?SVY7H*a;y9P{^%Wh$j#__+&wpXZ(pw?3@%QEztg`r+ErUzFq<!w#iEt
zVJh38$-6v(8iIXT9rVDSMha<ViG#@s`STE@hJ}lTMBuB8(??`T^1_577(!ku!ebsm
z&X8xG?1zS>DV0ZY;>$33LTkQ$UW3v?9fb=ZwIWMmTp!l{QG$W9%dpOepA+ou(?1rv
zJj_h;{A`&g@xV~3Ld>v9$CPPGNBrV%gbDRo2`<VM6oOK$U^hERD{#LO+<}$XcmN3s
zK?mGPgHto`AZ)X<@`hA>y}7;MTA>{A=&z_e@*e#t!TRcCqcIgt9^;jIlQ~+{y97dc
zb3MZ<Mx~-A5rWHJ|M))k3_RK@A;!rjp~=P6Q8C6>4RwniVSRygSB_3*+B5|mxdyMM
zYpO;3VynVaEBH<tBN+3v9!lnLMvM&_7DGj_?5GzhZZ^g<Py5dHCJTw_-)HYP0;f3J
z;+-IhdEoCmRsy9%)rQUm9$O(f{UudvxZ<9PtNUYPDowGl9vfr-4AupOY&)IlE=VT4
z-YN3|J4G(@2ALNr!(OH@D9M#JgKi32Gi1uF_%%N%PXT{=)$ssXw=u~*iq;L3JvQAc
zD(3YkwjO*|o^Up6P8S2>=VKf{+G;@GiJuRqiM}38)h>|3OJ!oNrXy&ilXi9;e3KH~
zgw&3~f>|^?@3LB;bG!-iy}gpVPv~slw5(KV?AuMg<cb=9^~!D=gH+UVXXpxIbB!ib
z2^xwP&yhoc1}aVo5mGz@hq5E+AP`#3u7NMf#k25Wkq;$37{<y)0axbDvanDeicg2Z
z3nLy9D?Y?LR;rj54;YCRFQL3dvpHZx(T))xvRAC?1e{+8WjLO4)9IbF>}X!0yXf7j
zgoaB&lhG&Owr92jb{y&-6dfy!;5WLkYV$hgbyTv|`=hxh5wLH^imHK3Hi0UkUPC3o
zr0kh(ZP%2b#a9hr7ml6C<!lHdWf7i^DAm>(=iBJ8f$WN9P5@hl&$vn(|HilUq&!hb
zeVR2GWM8L3SK6UB71xIJOsE9nS(|&ceSK4a9BNfItO&CHwkQh{6Q_C8cEZA=6g7if
zk7oo}a&unu@f|c0u{@}QzOrqrY_l&zLI*NL5an&q88=aNVz@8U=>3P*ihY;kuUDe<
zBPyk)94aLtkW})Y&vy@-P|fuDpq5`~2HOm(V6eRkNBe_rFAotvO-}a(tn#N9kgxY^
z4X23?V;{9Qs>dsVNSykML7we}MX^Ouy4`#oBJd}XT|L=umL#A!m&D+WP+P*GfuoXY
zhX_Xy=A(X8h{;6SBH=pM4bC!xxB1zMWhXwJj=J+@2?n&Tnj{24-rN-OK?8Gm{7&P0
zNSI)f3#pcgSiS`54q8c|IOqo?L?<qxm=`=&y9^EsZ0g%x@`~y4LZnQVz5w6r?Zv!d
z3!EF3(9o6g_b!lEMpBR7dRXID3m9+$g-jfKRCUnLi=5krM|4m4AV^S8b${I255EP=
zOG2}ru{G`oESjv9eR8lL7(c>1SMA&j?Y4m1o$pU>89qoKuop@m9d8z`{&0SnuApRe
zKN9P?MnT+S<WY~2ymoUiY?D?!<AV~mK|rFwE#IHQb}5j>oxSm(DMKAm(fr#IJOng)
z7&se(%+3rVb@wINmkb<nvG_)8(0a-J<yKP7uoG{aqiuQ-7)O0*%%ge`Y|ynbw{=pV
zS*X+>Kgv{od)+!Aq;O&a_h(mqhy|di&o3wMMPzvhr*#xDT8kN0D^JF0T>NB>%`H@&
zn^L4YC3TRAw7aEVtc<3J+yD=AQ%>+6pfTnMXesJ>i4lUG-xa3T7D`#m=fi4IW9j&O
z%4Ld-ym+`QV-<qNf{}}fpVt?BvZ%H#b!%0n4Gx-)2niICUu|7THfpscx0}t48EKyu
zGv06+03Qif98<~<&QmhfB<X6(7K#N=q^6DX_5tb9mZSlqI#OS5HS%qV$HIqYYz$l8
zQdRSLX^Yu1Nr)N{K3i;Db;3yRYOcZGUq0*`JsUA4qHx_SJ4f@_xhg}8j*yg?W=?4U
zJ*k%|@-!s0n&6k=P`8JoOgja%7`_CT!8K)131@02c{wmRw@qwxgTOi|#q4_xQ7DD(
z50HuS(=`kv5h<RUB)E4W16Tf>o<;uL(6a#g3Bz;%!4|@58}cA24=?EX@gofZ6%!_B
zHBX%xFc?KR#Nx6mH}WbpBT$YU_Z#3ciu|^FF(g5xf7#C(DO>Lu+h$XHF-v<qrux0n
z)ooWJP0fa-K0SRv+`KlNSg9>{CRQQ^0|e2<0%iLkVvf9}MlxrZ%0nPlGj>mgUD%oi
z%xHjLJEo7f0uHGWD)O{s1LvV>vkY6GC(!6A5}QKJP8vr2xO$95q6EksYB}eA2xK=d
zk$f6)vV2s%kt;RYv#uPp<i^k>Q7C11^<^Jssz!t+Q)ZNmr__N9m$Yb+-@)AIfhO~a
zL*f)|<TwIT<fl<&#x$hHj|{t(x!|5yJQ&@zG%{--r5+n$;b|%U29b<Gr_~Wmg2A7>
zUT@&cEnBMXhQ6Z>i{#y$dK@FGfYq-B@2lv#Z2#O&L@A#?IXm&c+A`;u=5$nniIc+;
z;QS?RN^H9g4O4rtHb0wwNQ+Q62b#RkuFby7DiBqNe(H~Mu0k6h5jwF(oKFIuOv~>U
zC5}s%#2*KzyoQ+vwM&DQP<sFvI=B0*C~xpZ!6QEH*&)9v44OashXZF?rY8GeB{rA#
zG&y?64O%#V=2RsRtmsfm&~4&ENexR^Y7Px~F`hRT?bB66N9OO9{B40<0O5@oMS%?K
z@nuWfH|$9t#3_d5*5Y50a4916xOfI5M2z~&nH?Iz9=1(x<1f&)a3#K_l#nY_lbBPa
z6kQBD#ff%-wdp@MiUhdX(Yxdyd8Cj8-l@|q3aB|1X>5dSOW)fDoV&<RDBf|895yGl
zbh5|4ql)5Y_#)_EqlqgUg8r!YH5buC5>^Uoe7Kg~7KC^$(k`{rZGDfE3`kUqCinfJ
zF%W%|3$0EK8K)6sd5^vqFwKd#qq0H8Rc|2*<gDzLDR!KDH?4n4G2pWM9%Z`|Wluo;
z=vWS4UA>%%d$}D_A)etPB_;_*36mExtASo1Lj^%$-oe@~q<@P?3JP3quXe%TXQzf-
z*C}1n852=1c3i-@jWqILK0EDTT5O%NQXKCaYef|x#{J+TB0%`2xOl?JKoEv-wZD!_
zE>+aLjM5r@6Nc}c8&9XbxJB>!*U-J=x8)mXRi~a2_!)ExUy2UR{|g^*EtA3~0mGI?
zi0@KB8Pr>JDmz)&4tfh2);jI-B5D_sw-Rkg_mOa!d{bWh&<Dvo_1v|%9?S$7eAa7f
z9nX{=I#?eoB$~NIqc3~;gu{XC&OP<!A0G-qk?wgO{@LHp(W?F&06d}$dXTc{*(VJn
zxiY334`whNE#p0ZtY82`(d)4|ST)h}wE|8HWc<2TpJd3|L1ZCZxWr3)p^<aHRyLV=
zW1ZSwu=&f6u}V=mLc_VdU8m~@_hMTyx%8i?IsQtqdWkUVZ{lU9**DghI@{qHG|p;+
zSd%*@bQkj<zCjFqq8$7fH?CW$G}9U0&T4{HGj!<c`we$e#L5-uZk<m|#h&<26X9;P
zkdvD4UN^@50R3h8flg@%S0o{Isu5b6`NozLc%2C0_v%}JqQZf*qJ329Do^Z&vS{bF
zK^bsH8WqirzL-A_Q|YnrC~=D;l6$Yy+nCaYNcUl>WT*c+(LHtpr|MCDKXO$MT|n6B
z^z5)JQLz38!jg<CWlOG9H&S9?6)w8Y&o`JdNI|qx5_AP_@8A`rORvo4QkK|iXD`8q
zz~xCe0cloS6Ut9V^Xi>}xw^aq7C%G9P^5t+?cKdk;R1#%Qx39h|GfJ#>YLl-4xjTL
zLOW)qJtGSpPa9max4Wd2>t&<v-+0XHIN`bsiIZl)-XcEpvJ%m51N1(ei0@}eS`y@Y
zl6u?R0C9Ma@uJ(!I+}%sCbVO$f_`f`b`3EW-}^!5r{<Vp!om|0j0q^NqOzZ{HKFoX
zv?7%vzF!AK=cztV^LjSxUhSBB6nS2r1>UZP<$_Bcbq&E%!{CpkeCMLoqQgUeK&0}9
zVkF-&F+7+v(>-;cgR{4M^N?7&YTLC_SNBKh1Pw9u01YDOhBd_ZT*0{!(LEbdR(wC{
z=k=y67j=LOXpP1mEB+hVDzQKx*<Aj^S01$&GzhDB`{3>s2k!+uR*8;42~B<kx~f;*
ziNv@1@u@PIHt!Uf$I#qNN*NI)<4TN<^lPx+lP2l?#mq5oKyaLGZsrZnBr%UH;@VD2
z5YvorIi8<xcj=ziu1^&@1$_tsd{Q5K!^7|MzxZR%&B?r(fVX)31uHJt-2D5-{nH}&
z<f4|3lQUlZuTy>(0;p!U308tq=N-f>$0X>D<36>^*1d0>5#GDO%mjlHk`pA*ts7SP
zbd4iRJIY-ZAzluXvIm;3M`-Xi25-m7pkO`(IG@$c+}b05xV!J|(sy~WKj~_~mMpc9
z-QB+L<}-e+C|@=1@KYA5v+1LCs$Z{sOwP|ex-@7o|Ar!c{D93O<rY#b8?m3R8&uGW
zW{A-D`lS*Z)1;^q48bOZzO`?9xv6!~Tclzi>GQ1Q`SB^Z1U}#=HGNWavaJq{3OYu_
zhvztQ{CgiQRj{Ac6KbwyttAVcRB;Dt9bC_~4QbI^)_QHsu=gCUQt*lv$2?eBUeAMB
zq_xomBFu+jN(EI<z`By~Y;k9Bq7)t_%>6}56)M}OIX=F#CD<eCBP8EjF&%uy^LN%(
zvYxq_l+q-d))Jv4Xc<?1^114019dfOM|h8R_&Sn#AM3p`tdeb@7^x=PAQkNp?qo&)
z8`b(MT)OD)IeAq110)DL{@UM9=WO#NJpBF>6R(K`076%hD`gdHa!5{9tE9+>F;rM!
z+sQIic@7#{VUt7)ymeTA<k%|*rMYS7SjO&{mseDHmnSy(AuPCvTiU~~f>P>k>O>0J
zk~yW~w(_K{&F-9~x@hsh>`2~^6<oq*Sl(PIY=m{Y>rq!BuwuD7Iwx9+SV>*;*$QAM
zon7PB6pPuP&AghxClYRFdCx~_5fntR1(Zr!-2A7H!0O{`3EdqgV*Vn&s~_y5p&^W#
zY0vUUylRhl=4?HQwMnVhf--h7yNaf`xhJf`(Zh&EyVkg7<aUyZ#}W<X=otc!StBwU
zO@4Si<WYukikeeTieYG_plF2CH;LcdcZDA0(5@7qaQ!AZ%?V9(KW1GaRw=}ecDg%L
z+WNDb(a4Vlu_)8rV+C0x6<j=<^u|FB5%rr`?PmY2)wQU~%OSF#7$j2Dxo^!~_;q-W
zHJAYQXB)`W);wZhVHbAIKv~I9#gSQ<s8e<Iqx(1$JpM5f7&?u%Da9KTIxd8_w!KMz
z22mYXvszBZrL7J?^;x9@_oi(x%#k)xh{>joxrycc;e@5a_H+|C|Aulexrov+Wr0*p
z$Z6Ag-7xh^oQA5a4>~kt+KB1Z)4+sOG$EMVE6|Fo_88tyR!5Ki#a*|X#4m#O)23De
zKXDt%sU0~RM;1}U@-=nM)>wqayjx%sUhK7`ze;6U>!a}m$&<9_i(412Ofj7+qwGn#
zpz2g{ci|Ge9ZdKnB>(-_h;hmF<iNDyNTT#=X9PykFqMhU9cU#9LfB{nLU8YyMo`~9
zDC<KNkK1LPEUqDLDdP5*(x_kL{S){a{>6l;J|&u|v9ttIY4KuN{~FU1Ttk8*TUgMb
zb<`iapSza`L?k3dX2lSKzZd1lZbnW&wgwU~4;ww7APdfGET#s`O)dTy)~Ub1TUq!m
z2dzE4^Qw>?i-B@@LdPg(Ha@LAz?c{r^)uy+A1Gs&d0e5Ll88=hc2#^Z1OSEkQ(i!*
zN-juzy=(>X!$qnqCAU}bv1rQ3j=m)r+Aa72Cf~yiq;S2)gWx|VIDFut0xpo_DF9`Y
z8-BuL+g!}G%XZm-@*MtNP@f#H$dIRNtq#FB6)J)uKIpnm_UrnF=GP+zCB+OWRn6N4
zb|dQa0+IM&xYO0S;RXQXm}*|e6#fjIoQ<@CyHIak+=HQt5XsG*1P1(&9~vG#{H649
z%N0P2varf)4KM11A{AQ6oxeMg-=oPlDn8Zt6r8F2!nXdX>U{UU0@$CU?MyeJHp-Bo
zV7W+B1JQu(GNZ0`FTyZ!tC?=|>gKl>&E+D)kRP$Zo#WkTk+V-=O*2e0>+qk9I`F5q
z?%!M<y~d|HjHzS0q{PTFx3!!)kTy>iqN-69DPSRJGN}FbHGWXPuyBwk=<VyH3~iA=
zDijdl2$Uv5oRICkSs5lq`oN?_tcUPbitc-f2HmUucGyn7RdGQzenV+7xCLtC(sn%6
zs-K=FTsGKh{<ubbOAg`q{0cw%<1~kWrV>+O)nMOjDPK)5M04t(Fl_JcgJR65qvi?Q
zNXo(16vc~*sYF~9Rc-toV$qm@hEgA1a3ee4PeGHR3DvOGN{q<S8Tbw20LHc3<)i^T
z6hsq^Y><aQ&|2RG?b=PF$nz^ro3D{$Y#{T>GxNn;0f(NMCcWB!A`K60xB>osE#w#i
z=9&(cL?Du-PRQzKbFt_GEh2zbMvwO<wHjOvlu>7bKX{KD0@NvyQN81U5S}vNT>0%=
z&yn1i=o}7$@fLk_Y17@!roq}=7OK&B27OsL4Fp#+T4=U}%*s_se(Jnbda^QQxKq-M
zxLBh=@~kKJ*%XbMZQ)1st@!BH9%9p&w#ppsF+<Fx`E{USlH}|62%q5Xp#QM{2Fqpi
z@H>2#EwGgbtvg}|3~TY_ep&c~^cxC9*A-bjLcPLCij#v_9jEt0Wf_FUCgBgz4rp0u
zLEI1dlRFUi!CRWMwOYcA+tU3QE~Zv${Y0IQGRniQYP7DE%511ZhMl%@ULKl#PqEFw
zFkezKt{MbJrVYY2b+1pv!>*4)A9ZVsFgh+GIEjtTA04tHEUhM9mgZ})xnnC&b?^3J
zJb3adfM>GXx|r)s#V)x=5t7h%1equ-H`9+4RnD~>rjpRJxC|AborFpL;7Wk4=u43Y
zhkEPUL7Q9g!`>JT=%kRVhq>VDi?aTNw%QYS05{ui;UjH|Fh)y3B8p|~!w{=hw$$bo
zo1z_kK6och8y(z)qI8zf)#7@VF*wZGR#T1P^fc;oGAXLj9IgJEB<N;?26^k$6zMIT
zYI8B*9<G6nAjuPC78kh`sDD*S=$EZkjo6uiixBY1W7|_F6vz6*7BANSl%#6FAb^L|
z`<5EsZn$B_-4zR7^%ha7O@z@1;qFtfxSP``pI!yW1|A_V{s^rw6LC<a_UCYwW;W5<
z-pbF7aj6&D4P=NZ&*ELr2@*peaF~@=!`@_A?G$PX0;_=ft_#EX;gz^a$+M&t6*E$~
z+wn5z?LH$!dkJMxZooLHRCL6^p7Vz<6o>&Q4e_=k1@C2ZFT0J$^sU$6G^I;~ynIxc
zEKZL3Hgaw}b|!%?VF^8}Z}~Tp3iqQ?!<fqtPX>Btzm6RI*Wt*+6%gTXG&B5e50ph6
zZlmtp0pd)sK(=g+-?p*?3=P~+`f}02A%r^)xQzzoH|B~Ne<Gu!h49YPV|jh6xcs*b
zonriLFsSsZlQ0K@S+8<o7>F}i&-E(tb*l^+*ZAz4+gs>j*Y0b_?RGmG=&sl9Yt}>R
zuID-|r1AekzT^iKM1%Nv{@h*czQ8N4dP}dQ4g?fM^L_p~*nO-ixuu?V=WV4-<IIa)
zM9gS8ZGwfIuw`Igb7K(WhMwA0Rz%5!1tVSBPck4oF-oe>Vv-^1m^JCF!+2wvffyhu
z%#jjU<LZfVw?cVKWTiu4-YDdYuE2TNM;&Ba8wjg~Qn3)VTma4NS;IFQ(%F%oR!gXA
z*R;egpIsq8cVdX(ZTY-IwGqMLuvmXuq{h#v9YiCnb-LD+vb>FfF(<fS*gx?70uCv!
zCTQ}N*coI&i*Uot=khRS{n>S^EQLYU=wmU|Xm%pTE5bho*BggUgm#I@<6J<=#joy;
zY$1!Pjjj^Qbq96fYK@NAGy!VSwG7L<4brSg?7Ro<ysM(HDMvW$H!q4xT<2U2f_Sc~
ztw)Mq5$tr>nDn&%JR*HPDfp>7#|lzO3l?Dg(+Mn^mr<RG%(0G2^7D76lp7M2AHLbw
zA=;#CD8i}{znUg6gc9U4N?RQz%ikGx!rGw;vpnX6PlKLf->?cQZGHr7>2{iWJPK<C
zS$AN4_?j`^OJ{4@AXsk~E${K;@v89q*dH*4JJm6{>R00tt)R-<%#};XO1I8F-HE3f
z)xvJt*xlLcv3O2R>)VqAELVw6c6KlP9Bo^l-@0Spp;5aTthqss>WXsz{-=(DD!aq`
zP}b5=eHz3!`(&Z3$WFvQpz7{(!k)3-3GKSxTU0i;{%ptDQ+}Ky;_bUr&%gV~LA?e%
zl8bv@USp_ThTA@4y08lsrvDiaIWK~rl2$XQAMOYLOE@4^e&n6`c`hX|XydESnVmU!
z4xRp&;$mkpD|YdhO$KWTI6tq+@dsWR>Xr)POa;hBy$Y|Y=FaLI+FAX+q>}L!6(^r9
zVp;<L^ZYz%2<g6@^3#wOINzC%?u|E4-`+C87ijs*g98`jsPt_u#^5Jo7kev-Ej}a(
z6impGjOeUvr8^)@{5Fhoy@u;s>ygMf1(X5F5;#W?)r2vDTqmE4J+};zKy|Z2#Co*T
zWh)34Lft_(l<3o`neHiC?~%&YcW$qm#0N#7(#Up|u=ibULaw}q$3N9D^6>k}ZiS!n
z_Zz`?D5a&nCI&X6eG0#ar8iZMhzJJZwofCy-aH-;gz+JU9c0oF>`$EY3SHEN3(d|?
zGCdmivWA}=Wg_OXtp<1HI4}%`Ml=C=jpLv){aO@}%(p=i&!D32KgXgfPBgr8Lxtu)
zGTw9irI5ugLIh3$vEc)de=$<))EAjs?AR1W(npWwr+c5XObzZXnC{#e0ri;S#mLTy
zP1f}Q)KLwTTTCw3v~%3weJ>_9BGz8GAOehY3_(2MuTa<56&z1$^K(w`#ayJF?>QhY
zB95n_BKi1Xyf_x9y#{loXwlJ9C4uS_b@tr5P))<lwaI2D0{de<%JV2cTAom>yH%HV
z+e=$3lUSc!>ih1ehU7@DKB0|nm--ApB<LQNMYCegBP2JUeSzJuhWK7bQ%CKe!^%XI
zk`BV-Uwu(2K+SQJ^>iVh%|Bo)--kiLLDo4a2*PH1WgjQjUy-VTst6;I$bSPN23%#-
zT#Jks)^h3qhl66?iSxS`reMhwi1}x-5+@V@{|zeQL>vRLDu3R-Q2BJ^5g&h6B0a~j
zLS)mrS)I_{@ed)-4^^9YNm$6}r8gVjsQimymtJ*R_cKyDjZ61Qq|53FU1E@~MTOln
zblp)DJsm-r95qDpCbFNZYX*g&?@ON=R(ddklOr|vKs^U^t1JmYSwz$)*4NF8_8FDL
zU|B&_H=h+D6kX8lfv;(_i(5h>nFKVk4%sL6S!>1ZWdVH*j@Eu;v-6Us@qi+LSi7;I
zWUSs7tx)a?9s-S)M))D~PbmlmWKX<@Tl|fS1_Z{_`pzhpN7Pjm;L~t~NP1l2i+F}_
zgn^OL(@(2e_vw3>nqYX3M}V#bYyy`aC;fbj=z{zk_lzUl73d5}`l-8+j2p;BV(Vk%
zJ*XHrEWs6d4(|Ejy4UBMM9>4YN44Kk;pD4R5QQxszx6v{3tW;+6$Ql-#m%NV^<JA`
zqShXZV0PIO*F+&-(KZ~XA_~zX&x;mn?);=GcT&rtmN2l)`5VjdJ(%#k1apa%uf-+i
zV6*kF(=g+@qUA0JoF<njBs+(N4u%E<Qb+a;-I?aB+6Y4SR&ar+M4{5U1FqrAAqoqX
z$XAu#N}pm$>=vfR)--5k>y1sXAYeFh;;L!rjch?nTN3o(+A0qquz5&=6%&ueZdFzd
zzK-DF4|A$T-M*iCx)8EwM!mW(`bOFK^CmDwY!}J?vWRfT;bI*k=ZO1&U^7zsa3q*M
zz}@}IL+S;0eCiqkx9S@kZ4&T~q+)WnfDrjg)2--kWYwcj@C$_LMflCqpXkt50PFNB
zn$-&Dn+Dx=<n*5=(;!)iSRh8Lq&Cv(^7^av;q-Gy!vq%l>nI*YYUycv_>Ndy*H_+8
z1G*YFEgMkw?F@kplPL~{jYf;m_WdiAW@%HY3v_!_-T_hlNl+jvC76a-_tRC~Mck8j
z8OfC5%JN^}6$m6-ctshtfcp7Y@A)1x9{O!ALm=hzR_K#=O-(hhV<<nmY{xp@89!rj
zWVi#DrQVo4j*K&%?Q%5M8j4aydT7w&DE9JqYG|f(%jJ@?x+HOAe%)W_``8PzJ@kX)
z7VCw<U+~{`QwmyI(U^)q>9%wq`f1W3y*Lf++>W;`wxB^C_OSEtQe=~PzA|6FU#{Nw
z*vZywe#DNG58l5I>&uW;GhedG(L^Rq`tNYo#QXdEzro4Kh;&FuEi9(w&IJ{2#UXY<
zrx<Yxf5CquuW)AY>d>s7bHVH)<Af9fC?Hz(4xZ}QHy&YhIofLN{&K%@0zJo@qr0m}
zDXvz2k79x#IHDZP(Jm>ldg9MEvm{wX=1IsytK-c~X)0Gpg0t{HV;`&;dso`ONd|^b
zz+B5{j`B@0T&nLU$Abr{%_Ij4h+0@XR<N{|L7QaT((#H^R7lu@iFAWU+nuHIQ^<L4
z3i!TdCH%mbB$ojYEs5TjD61BXOP<4gp~nzvSp<R1ZXQ@ik*cg5!+6)wg_H|=T*)G#
z01*=v52^T&2#1{c4#DNjqjtYx5QsO|T7Hm!8kX4alwqS^qoLLKMyR;fDx<))Dy6gN
znr>fXG*4-d!qYSS`g=k6mz^fm^PyMkHfg)v(AqMDmH8x*-?L)?p==Fq_&PN+{bOih
zXo?RsS07VKA}VnB(S?N-0?+M|k>~AOt!wiIV7DhK<xX<Y2(Vm78t6hQmeSM`?N5U;
z6S9(jw^<Tw*I=A)u6c#}-R@V4Q8{-?Uen0olxI8vW`?KIvNmHs;gkhd#vo1iVuu~}
zoqBAIOi!M&czPwl#SiM0>>`6T%D9*U=bI-eiLaDCLt9*qKdezys6s+)30_Q^dGR;j
zC0?$>^$df^@Jv^<q1P|!6906v3nXvvfjFJWx-VMCTTSTa!Sz3o?OwdZDBL%0Q!McV
z?A8ja!FQ#FwUPBdNK|Xw#$1@hHp@K#X0^zCFWp|M3U*_CdW^!zyt`b?{<B6Wo(9Dr
zNSTG>ZT+@zW2L~{XI5TJ5_9~Sy7~d5YdVV^+2Bg$d)6;LVGIAq)v<Y>^UH*fr6dN?
zqNgtd@^AVx9Xgd(GVwEO!?LgzcZlbN5C#zxjAi<zZxQZW-$cn%*AQQuj3(fN#)kQS
z5}sosGW7?&F#4?a7vplE8uT#D9^EX0wkg|mFC7_=9=<$2LeV0TiG||!3BO)e-X3nR
zr<@o5e*F1;yaDaZ7d5g!e5_5q@^Bmb@Nk=ZIdu4P;vO~9Q*yo?Ju=jDT*57#8$HtG
zYYE|+)zAO-c=5KDn`taZz%~C|CK;{tJ@lBt8II5OH-@{0v_<wX6h9iIu@_Mm2twP$
zaO4ZL=l@jMa_upD9U6Lcz%o5=>ks<8+7@2R1B<+Uiv-vC4YM~f+lhcoo9%Ar=Sx@t
zEAo!0f!-R+PGbX*oMe7gjn7(YSOsf4s)_HGNn_ksL2r`pv#m;EIU4pN59)|xD%nP8
z!Iv@^b%m59knS-|g&j~;s16wc$$Rp4#1+h!J;+IQ0|ko^2*RW4$ir)ooh4w8IVyi1
z=WqXG+L9$i`ow#_@pz5MU=Qljtxt18WZOJt=)AZ=Nc?lyorD1w$!Iul71Yq6&-i{t
zTbAe+b^$k!bE~K1|4W%AAG7oN>hgqu?=ITyk}FGYb@w(i-LYI_xzffH#O2B*pQ#s_
zQa!v-J>}qMu+?1Qp9elKSX{2yPI8)CZTg}eYw1=+<<mqIR)NZ(m(^gGD1)@N_$r)2
zMzfj$(=V7|;U%c@J`@~~!b!*+7H9jDmy#B_A={OU_~=x3;@MTzJTmU!h9F@eoqZ|>
z)nc(`mn`BIJz-Jb3$s}m6q=;Tb5ZV(MS>Nw%1PoUS?LGYMJ+wq53w;4->5r-iz(?k
z=D4Cs))g-at8-S<>FWyEsCj{VBWB5-Kk*^od=T0qTeW^X$cE}7C56>PmsAPaD_Gd+
z#^|=Qd!yB#g*Va^h#)OMR;Ga~8B=VP3R!F|c`iAWDn^DqZVl}O9VcUHIqJ)0Xj4$U
zM=2BGlWrMm7fSP!5MWa66|F@RkR_jd_^@A%CdWd^B&zzWK=D?{`Gos4-Kkf3v6ovw
zF4x-z+2x;APG&uoXylKcfDeH=r?6C9Cl(T9sW&NYT+k*N?l2)TOjzse%5goxt3&z9
zNSBN3YR;3m&gry(c>icq5*afd6z*NM9uptzHFd4A9^x4PPE_L5lK1cEU7S~>3r9Dp
z`Wr{T9ASLnXUr7I8;pmh67(cr%Bqd{pwtqW$UBh>vzR#xzDG5cv2s=GImyQ{t_<1{
zs__(fe9~)qAe&AXk)@;mIxWks_T($;es7mrEc%mg#AGJ`YT;-s6qiRzuXRuVh0qr%
z4P>tpAJWN!epg1JDChsh#Z(nE$9i(X`V%@`QM9vhM@q5EDhXxxptNX5NjIElp)ioL
z8rbE{nCHKJ+30lL%N5Z4{-kwTBuw=f&#M-bzy!H#LXc%K!mt~9GVCnH-&3;dJe;53
zm%sb)^|BZUf|}pF4z%f%5xuM(ZRih}?+Ai{v)hsG>0-mUq<JDJ43P`}$3SRSoih}8
z@#tzob;yz1aA@pvxqV>#uh<FPKd}=4;Ko5x_TMl6ZvX-a0OHOTmdyVSoqSrnYX9r`
zKcSO<r&eJ9QNa9LpK8TM4fDTCThiIExgr1c+0;f`+W+E1TVgPze_`LIum0tKw7Oua
z4G}o0j6HDh|HNDVSN@L^<N7~pItRx8s*N4kG5>=zf|>q{XM=IU|AQ|>>HdrH!(_nz
zgRR5=i&L}1RsKV7!<qm8;(sVns#t{ae`d-e{yWpM6QPBK_^*<$z6ja}$N_-JRN-`r
ze=C1lziOx2r>la91O>ke?zWzL>0;k~waO$5@*uxceEWIhA*B2WogK|#jB%=V)NyRR
zAdwO``Yz@W+oog5hOJ4;CHalIdb?R?e`k203Tv&KZd$`i+^!={ze(n~ONQRHrg_aQ
zpAwwkO460u0vM3C=+-rzmWAmK+&?VJn~OP>JF8lLEHnp^2GXvx3?r0x9GCOPvnhLO
zmalM%(XYQ7q)$x1a*QS3f^`1=fjScy^&DypRN0CFC#@LkM%&onrqeE~UFFU^Ui<lh
zhowcwz2>M{mw=4Sojd2lbicOy!KFX#Z;-|vDLSximu;FzZ*bR}RhLQE;De=8KkEU;
zzR>(?Ft-g_=T=H7g^m2GAN#d^g%y!ABL{Z@<nLoTbR}LVTZJg{%bI1YYRjV6VXM>n
z#{tcd0p9rV+yh@^-C;*d=wcqEX)9??HI!ARHzd3m6r_<oJdPL4b-W2?LM0dq9E>U7
zhQ$A^Yhs)`L(1^RS!YqDS(Po;EH<C|0cndA280K3t3c5c$3E}eUa1T!!$pLerb^1C
zK~F+6oN$XZRD@xVX4J2%i@-U^G?}?gwj&ktl1kKql|#ZpOJU0cTNc_#STuOB3QK5$
zDIO~{b!XGoS0SyX{3*wZ6PP#6^9JXvxzjgCMQRh1y_6*b=z)%{dAmOl5BCLFzpX-`
zLa~F6Oyp&Axv`(w`k<4ruk$E?=0qEOWu6PR`Eo1sBP>K}kV^>TJ>!Plwi#f3lixx)
zxH@PDtAoK_Lb3})!bA}<(M;XwKj-4Qle_zg&oXfpAPR>7ok^Nade#yWY8qu~1#FN9
zgo`>;1nrOm8l=-jJ(7I)<cwGOTb6@pMOmO^<W3djnqmu~M)R1eyj@rf{0IJq$^{K@
z$c5X6253l&3BZF+3_~4&3?n~bH%X_-l)h$L7VWUS>wwgROJ@{!nD7R>Zg3d`v4^I)
zc5{#-V^~CJ@j^t$3hZkNa>|hn7s1rNM&GAD5B%<)GHTs6f<p9!rsbt!uoLyJG62Ms
z8RTK{Y4_ClMc?e7;InksLvBulC)FAnOVoM+rj95%-J_LDxV4TZI4@PHGaZTCvemsx
z-RFt4Owc;o>m4BIk++Ssk;KQ}81Vqy+zm7>1aqzCKorS)-N#PnYrjJ41g;T@d<zi7
z8|qL^o|9$~x|xz$5#~YTn5+_Xg#&#O3<1emEOdP<aC*O+*Dh^526^9n_;xF`@P0b|
ztced`v?h_}OEKpXVU+h6lKZE2Z=KrjO)6btS|NnpJ~~#T+OyB!M1Cyov{oy^hT)|8
z5Mz@(*G-CMp=<=75b(AWuplRuGL;Wh;o`vLoJf}uRe$6q%zx+LJj$Tjx8|@Laf_f8
zRV5(^jp%JZG7jT|3R6H@IbsOyUR5IKLg(h!vhE4eOH3{n+Z_&ts5?$TLN89e$tDCT
zrIS}Q4eF$3F{6oui`il=i2ARQZ}lW^87`pxR0*Skz13VUCuYRxyzVq>@Q*GgS0^13
z<TPQ}&`mFP#XXeA*98As!U}plIx%r)GDZIst6~IigMuUrk|*~L#$Bgy091eL)(QH8
zmYW?!)T@}RGpsQa)OOU4xqu8;H)#hYaT1X?&yj=xNq<%v4&TOI)~yLH7mt-TrMx&c
zp}rZPHlgRBhS5IrABFI7uKGMN3OC_J`WA2qUkD_vLTDdO=f1|dpz){!`6Oi)l`X!n
zu+=x1n-i?_D$9q*Siz_Mt<<bd^kKYF)PeZ>T_TK*74NV?)-4cVfQ%38bJhmpbj@k5
zx;lsaBY|oF4z1Z?o(vc`l^okcIB?GoHiQgBj*Fm~_|rA)n7N24qA!;;N882nz#_>x
zc~WV04c7%+e<56i&wdy24J*cS$Jg@8S%^H*H__jrbgNv>)gO>vXChsO*_?Y?3gF{z
zf57;}8zge+X~l5)_<9f8OzZ{0-$OOV!$7de<jX+a7Qq2PWZJZXi$B3cLXh9K-$WPY
z%+%H+@Uv3|DNK)-+H#Uj4FP=8MiLvhM$N0DMzx5dL1c!5e@Iu3j@VUR%#vk`k##Vt
zS%pbrh*^fws_qv{FZGs=%&~yayVGt$KLEhCC@Vvj%c7EQ3E-Fk(j-VZWAK&6B!n_v
z=7VEh5=}Xe)t&t9_pJ=T-rnzayP=u<i~#&#G!dQg4I)cl<ZA`Iw99)B?89S9rhY3y
znL0m!lysH+5v{=v7z2*M>j7m~>?66cx}?DTGixf#1(U7)q!UOpk!FT@fufx&_D{R<
z8&;|2JVC3&V5PYi)&X4t5M=||PV`u<a{2?m@DPzgkSoW)+~I%Vm8P&BdnF_J)sr-6
z6zq(;^<vsshs?{Y4wYV-*^dT?;=9&sw&TE~y(B6MF)I*Iv*JUsEspEUxbs7iKvbvI
z=%>Nj_?)f5tiHWMb|JL;B=04yNFCdy)avc2pHt4b#;aiynt)2WO*xfX!UvipcUPfV
z5{;^GnQ~}qECo%%qB|tBX%-T0<tAsnLxi55OPb!VHk<;^bEYv@>S#82!^xN7ToI}z
zv29on$tiM5L+7*@wzkUvQh71WJx!*)jo(r}J$hb$OCR=ch#iO<3`&s}I?5+i?#3OA
zS1wfhBEmG?seo`kWBH4HwoVGwC~GKN4+j~_PLJwEomVdj%E%*`=6*xGVAzYsFo?t4
ztUwY{d!$S<j3Xs@T*~qU={nwk6UUGJ+EiiJEFAU{l0Xsq#)>7}Efr`<a+BORN!&sj
zl`#l$CqGA9ku;KNrD5ga<!-YiPaIun$qilZf{v5L!vT^a{n+svyhH!#Y9s|=$ByUa
z31N0~U|Oz)Ib}p4_vU!#pBCtwicQ(IZ(<4&&~T!F7@;5_!1?BFao0%8sc94~V???c
z!c7}tRAQ2ak{SMp?6mAB)g(eJdj;NylBOCCD^9MD8T;WD$2r6IkD&_59n8{44u%?h
zy+m{fNgmWoIL<GJPPzpJ?m4PPkq<PzZQB~9D3240WXKH`x^|$nfzq!sH0Rhc2{UL+
zm(?r5GPG}5`}K!n%I^gk#a~O{7a~d?7L_<UM+Dmti2fL@F@P*v>WEYf`|jSijjp!R
z%Y90~){<+76-`5$rb@*nHOw1Tf(xFfGcNGk9SO+Hqe*cchjWlDXp4F;cmVAn9}J(T
ziR7-?+Y9E19ILKKRDph1I};hz?;O_L8cynNk!FHm1ikle65P`(`<Fwi5dL2yS>N;l
zr{~TyNt2u1I|I8?sf1dhE(z78as`Nn@eiOkFU!^n>?^kWo<*c?$Tg%Jn8F`Qc#=jm
zLl+Q1ISc*7gEnjkWba#8aoZwi-K3cr*u=1|U(`}CB{i0JTu;R}HQ`D=;EWZ_aZYC`
zxqYdqhY3El`~h+rA&=Spx9y{W;SswYyX_>eOq@t5BMmnv%9vDiW!`Q&n`Y-aV!YH$
zlZ6Nm2EI*(&3Donmm7kyTtokGRB#?-vun`n3c{6A6NVPN(k8%i?=i5*Z<n)KwXGQY
z+c=Iwdp+(P&a?`4(6DY*OFW};#~wxF6V;OAX7;+vb1b=kT-6G(&C0o4Q;(Dc^ljWy
z+8Kcky#hh1O^f<5f^8I)vnhe_*e1M8e~JMZJyFo$D<MheQ+4Ecl0V6G4Z>MV3?ir#
zK|3y2`POzO{&Ydqbq|_jC}&7Q9@E1MdYDMMv)}3$^yKz$g0llUEXRO`7=<tbFV9jx
zh(s<7s-Cm+H(F(e^Iw%n0-{X}FV{otcro9&Ob;39YtPsFr)iE3O(8Gg_?5|5tzL{M
zmVjU^%JkC1oYhBjrTN2I9Bsg(VMdTgK^_~48z|D)+D&^5?q>@FoJ(JptCH_oBI;42
zG$F{rtX$2*233v_sRgfeyX7z{V0ouGF+K>_c1aw@w>_10;}O@hV<M-VRYqAeAp?jL
z7!U+XtMW@n^sf<U-oyn=Y=Kd?<TOezpLhLZL8C!5A3OrzYA!?-xMh8E)BtVG+l5q1
zA&_3&QM*mJB5+926yMw+eV+aEha*VwiVon~9W|4KK`re|PcBFZ^mWOzwG3c%jGk*=
zBnFwr@w;WDT>h;jRW%0IVg498_%&N9<ABlH2N{CPRED)R(EJLnb8g$?FpUYxTyK>_
zLY2+dEaPk;O&|jPra~wU6bJ-8Y!I4h-T^4}MCsuU!Q}ceKJ&e+enHQG*-T~iXwY^1
z!1{=_ih<yFPerFnwQRz%8mlJ2&?|xb!8T^)wHIlc0#=D@%L__^;n@7tl|gxloAWpA
zR5_9u9}yI;*pl~|F$?-cmP`B2KbPuu{4VMnEWsj>OU##J$}6~2BA~cU1zb3zywov7
zGUxm$w@&jgECe-)iCln>1kPQpwla<c+hZ6B?C>NZ(ZPrBQv!+$?6zBgVXi=0U_0>-
zFezPX*reF@9`EXVJ)LDakz&UkqLpy6fgjsqs9=se(f?D&RR+bebz9us!(bu7g2Uj!
zEx1b{xWf=6=s;*BXpjWgU<rZX?(Xh`yGw8gGLT2^t^3ux->cVM-PKk5tiAT`Q+0l=
zy-K6PJ7*(B!_gJ9>=VbIq;U0UZDQHK)Z}RIG#&sylL0i-#3<b;*@S&_dMRgp^Gu6C
zd?PyDYJ0z5eF?oBN0SaU!A_5gEKjdIc!r)bWJV|Lru%qaFENU`bKB5YC7A2@OL7I)
z%k!2A93dbH8@1bNg?UG8r0a!?hJBSN4vo_e;?CB1??EvhE-D*`IBWYh0b8gNPjm3F
z>Dbb%3>!G!2-+bn?LxmRduPziLCf-$Ew@j*E<an~AY7w~HKgC=^T)ABv60J7>!=6D
z>tyT;704pV9SEa2*rMY*;zgIc!l(?ZPmjVTyMXzV%F?0(<d4k~Up$zgWr?+8sAE`>
z4cmf*K4<UtZQEzQxMyfI)R;wo-Rbz=%%6mTEHn!cU#R^WHxA~uuj;s-m5neR`^v7a
zf;??&x0C1dRp{4<{+c}p#0`2R>MU;@zJX<#jPj1d#dD$PrU1!6;iD^Oj8|!uMC^1`
zHlqs@=j==HJN%p3j^2bY#Q7j4T=Bj+f)!Gbc7=>R<^XzRl4Vzq?w3W9vIfV`?_$wd
zKQbr+-Wj?Md!5MX&FvXPN#P&T%V4C8-%*S)9Y2Uf{Hlqn{q^!QUrfVjr-dJHgSeiG
zT%)+c+0*ZvJQU~FN<DVYCmaqV9~EvZT68L&LG|@fsvF}s0YQ3c^n7oQh7AcweQ?2n
zO&Z0O^q5CuN_xI2x<r5V3DYyxS)re8N1-YZ;OD7tGqYA(M?dQZnO@c*=gee_C_3nT
zqrJSpp21UU)~!mcLiGE)Rlm$8PFDm}=sta|$pDf*p&#c>04NmVx*n_09CfX-Ja{{a
zfa1|hkI+j^_u5uUB4pS*l%A4GoR0#H5Q%Jc5i)#=poZarLSK#c&0Cmpun};!dxkg#
zteo7m)9nXprklxKO4tC&)V(pc)u))@7lVQ*{YY_DW&`7A3Qapx*Vw}7_Ss>{+Ri;>
zn(e)f3R}kQ=IZ-t8OHGkRXjkhyHRrMWc|&Cv9-grl(4PJLXE9BvtwvV_ABOr;+q#v
zW2GKlbtrr=xrlTgl^5HDuFoKz?1M!>9~;_?St1wY5LD8Je7wd_=VKfC)HyR4Z-waQ
z$qU|jYcPFSbocRP!1a4%1NpGod~u2hG#5f+`gN@QufcU4CL$w7&{c{HLDmWyVjpEm
zFlmqX+rR`?3AS5fF-v)F&w)8RA-lGsUOH7>@dK=hgcWrx)B7?)+?KLwR5?}PrrhC)
z2o39r0<>}goEFr$SSdu1T>C|xDkvYh8LUp3yb&g;f@3Qm`gx-2!nh?I$s(`D1(BR_
znuwT{C2QfGU887O776NNHoy@Lx#(bsz~?d?rlz0b9~mRLb=Pv^(1_ECx>td>n?6$)
z+>VGsekT!W@G@G0a-rH*qs;<%shpI+>W8>E!C{ONx>nJ|Ef>M^6l1dFZnc9FtvB7}
z0Ma?Hf|WU1gE#5jd#M0T_r&RwxrWaB9V~2EMqsM@opyF2*AH-XCez?F=Q>&Qw|5(0
z)m&-C-M!^?{b}}69V<${)z!q}Rb_pcYGD@r6CBmi2qKw@AEt%<{P<cx(+0|MI#Hv*
zuD-cPsTV_ZPfj$pSQ{U<_?6J4^xY0f`h;;jji`MubTXpQCBCK~#UQ2W=Y?@f*!yM=
z47HeG+|EiuCB!6pWiuwc1hDek4eC&;u&0$nB2J93#aKsEtwHAvE{qhIicKWO;7h)_
zm5{YD`&vJ*BZ^FRfq`29LgZuGB|8_$KVw(eSt=PpN`qKB(S;VYmsO{B^D`iE^@^@$
z4`tf!p=IWAK&sL_sv@+HOj=*)gg|PJBAPCx(;2-rGf0^5{XWYBU3AfQ*f6<3`7{=I
zJ$(H0d7PW^v1|<v42@#2PoK6LHLBQkalgD|TjGiIsc%~y-AgzCrQ^-|uy4wYm-l1B
z5N_eYI>@Gj4g@5M7Zoq}?F0<8DOWO4tLrIME$q!H1s&?)%_gB?*G(;J9P3oUlEQ-Z
zaJC1fZ`Va=Tt}m`jjQlv4}8~OnbbsE5>)%J!9xz-2OkM29<cNi7KSc>y^~j|rm-7}
z96&B^l+Oj-t)qaP`puzwA(yjrC|{hxXTIE@EpD}0ogP>h1T%_pfI;9;T~Z(6;Zz|r
zA4S!x1&S;U`y$Z!4>idyMjt_&>+20_uq%&M&7|F(rF=0hyXh;~W*cZ+#fd#|Ut^~j
zO^(@|0JO$IAZJhKS2Rc(wXhFa3;ex|H?y(un?-eI#~G-i93fRrTgeZ<ks^Ig!P=D@
z($7JUH8w_<BkEfgb5YM$=l&{F(MIO={H;1)3|2nojG*mhVXE5&$qE(&%S<Wd-AE!<
zHk$)4n9_`$7>l2AJrTu}Zcl;&eXCXyEkcD_dakGYJ=Ie5fI?^Z!FJO}N#euRpOy>E
z{`*+|j$(kUKITwM5W8GRzoT`39ziy0G@0wrpsB4UrXM?T2S;xfjD!eF&)R?%B@bMn
zp|31sMMS}hUXLG_r>$cixjeELn6YTnumW412{`pWj+G2MW6>d{xnM4CgW`KZqGgzz
zld}v$%E(ZlDqgL5qfIXs%tH7{=nQiUhthK22m%6TLq`=#8a{H+6I#2piOp=12kpBm
z?dgW9eqS0;y7kY1E#WER@&#4LoI>2f7E%U78s8}S`2A~B{Ir{VGyPiTR@2?_058TC
zs4<}2Yk8;os+fXS!6*XpvX?b-BHWQZ58?_*PVIP|$0(lN4v`e>mNA_eu;y#*+?;@-
z14?63x&C&(qA5!AbiIg5+LSGlQN@B3jvh?lUI*hK@A;oX>Os`Y$oI=-cc4yKGln>%
zkg0qp-#w-yW`0elD(0XW8-CT5PuD;>8?|?Ko^^Y%eo#qUA|~>qRjjcAzEzofJM8&g
z{7rhMDCu;v^$;1<%imUt4*Kh+puklHu#r||e`2Q7si<KWB&ve)+k5o7WY~r-hRsOR
zI(hg!i^}0@2s<-{Wa>v)j`BX~U70lwL%^EkoEU1tXKC8Vssj6u5mP<UU)rIW3{%8f
zG+_4c3?!t_X;HWIYbsy{;&d$QY|pev`1H)`-jU?_x>MM#Gkpw%Mpz7f=Ii++0-U7;
zHX3jtg$OCTZBnrHZs|;X=8hqr3Y=d3MpC`}i6?h5KQoiBWi_yxmPy4<+?kq?X||Od
zc6XaR-#4qHO=f|oB=82LCRqJ_I`o0&(}Xr5rHEo5TW79yLsiINn9#!TyqdzWUo3w+
z5gQ{G16L7oAnB-Y5JB7EjMujy1>gj+oX2n3$FYME|8_PKS;h4|JWCBKxqiK^G(ZlV
z!f(dcMvpl-3Rt)r%=8Z5YSs1W?v4A6{2=^^#NIC2DW880T_3CT;UX|5N+>{w5aDkN
zqiG_o>HaR)^&eEv0V86)VZ+A1Vo;X<bofTik)<gTb|ByJ)P$xcFud{=2yo&*w?xgq
z$XP_Ck0PUEnGaUod=Fk{ZjIOa0Ft0SI>L(XmcObpeuqs%)9rC^^<+ha0{?rRhSl-L
z6-!1f4(U&CB_=NAk37Xv%w(^h7Rrl^L=-X0GiQnia(U@=mFFvSvQ`txGyizoQABLW
z`5FGRTrC#9DSD%ChcYeOSP9I%v3khFJ$&YK)fqSl)2+{Rhx3Ma<OdX7mEaSBZEewi
z85&uJTmf}3x+PfNpuU5QVfVJW83Dqh)s(G1Dh#1Z2BD)sqM$2y(Tu^Lg=w-{kq1Xu
zu)3%$iwxiM;F8)U2cLS}*rb*|sm&bf9dIGF-^gmU>(X#~L2MK-4ro4%V~%nOj=l#6
zg0qlSh><lJbA6(pDC$#dk2ed7@h*jMGpj`jI><04inK+plXrX}dG6v8%Z~B184?Ne
zq6H;=zS)2dGMd1ToQnsgSNo(BRzR)8aLaY4;%jd9oRF1<wwY;z@L%1{1ixQIw+KJ%
z$Mgbl^3(O3@$)t!01UC?^*4z$>2ndZCGfy(74Rx?Da#rgN(mzlSkr}`G3lscJ4<_G
z!1s!Wz`tRkzuWq<1`a1``dFX~Ug-h#>yt*5;vjba$woQk<Vf?PdrqPFF)DCIqHR3d
ziS8Dx5n_Uo4nzOIWrLEb|ADz?zv{K8fR|qmEVw?}v<(IjkjW=Aua6(kX}&SXr7~4U
zxbRAeU~L+;^RKL6Lt+9O&~Unt8KcW7fxYuMdra=1MmwGUSn}P-cOb@9la*ayJPJzS
z7?N3S4-9m_^mVo)Z!pm4v0VT;6es&oxnyE{-_e(0hx@EK)4udrk3CJv4NB|wu_ih+
z^r479k_-egL1}93w&c3fWe#48<Vhl@;k2QX?==*$d1Hr50X2i_%+YWwq+QJ9p3!IE
z#Xt!B@S`(4o@e?6Wd680!LG;M5e>lI^WR3>uG;eYb%xXKJnpSHg+9);Cmy#IMH68&
zdc=RNM^KK=cG1YakgcoS6Zf0yq&g5?`&ZI-4mW`7*FtbL!B6?@4W`k-o3&!wt3auD
zqA>OR(_t@tkbIVqoL&TT5<6G)JQqT%LEQtAOvfglSR+(Au09yG7xCPD8+6u9>pnEC
zCX=N!Y&;ObLP4KB{q72(#g?P8l4?lyYX-3k-6fj}{(6bHt{vJ4wH!QW{%gruqcfh^
zI4Tg=KhbhTKDiP|-6qXsD38$^88sZN0}%U`IBaHe<O^loXy!%`6@6mFOF#A+du}Z}
zF5G^HyZPf-ZdGf8@#Es)A%?-mYe8q$z#$v+;Y5s>8jVu1D^P6fRP4!Wq6m;xc|m@P
z3A*~ZYbAM0+CV>SYU4At6#vciaTp}`U=Vo96%Eg>U*M4=E*2D&)dB^{!foEXSU-Gd
z$50z*M8~BB|BOpcZP{yJ)t2pgvUqxcY^kv>_p^3s4#WtbN>MaJJ5Wutm73_w;CeSz
zL8IJjor)YiAG@NyL1s_Lmt|q_@-+GkG6Z%E=bsX!PvW2onIjxVO~bulA!1iC;0H<_
zHfUDBAYE6Vc+xEtqXp;>+~6}t$yi*p-HzkN*tZ^zo-?|JeNtJ1@;yOB660Uk&kIn-
zL&g%ReJy{jXGp*LlwJk~H2c%UjB}|FP-09i1<n(iQi{szT8Ef6z7<*5PMP5hqiv*B
z=$E<yCkMNInZ+AzPB{J}nBDjo6WE3Y3Sx6>p@K%ZptzlKT7co0d&D(x_%r6Ig7{l!
zQk4-dpUwHFXiv#}544FRQZedsj07=8>G6cir@9Xb(`oZsvpuSodaxC0A5Smj;+}Yw
zWh5c5FyHC0(`06cmxCv<Oc5W}rtOc+>3q+ILp?VrJDvregyYn#=WQj+H~C%ez_T!|
z410JEn)<_+k^l?~w^t!tNLI?KczF9TJ(SdJHs046Upe~G5L4I0r7Y0dE&QMl?WrSI
zK1`=`XntM4nL2(u$ke5+4>6qm<{W(Z^=X{^IW{Gs^)uox_d+quKjr}Wu+$Q8`b*(J
zc~Z|Z!3;XhI}wa|O+!|rUmY6I#%<aztt!Inn56G3UsQmS5x*8BW*<?Xgt#V+UjBoF
zKZDZqK*~0@^t7*iSaCCYgpt%_GVdPzgfMykY4L5c@XqbbIp+A5oc)KMlb!og`Cb6C
zfM#_!PLIRSlRnxWMisQ4CQ`>OO%#MYYGKiT_I9PVD(jmqH}O2v=5JL-j9p8jx>l3f
z{ji&h72pJj7cxrNt@WmupFjq3cp1d*z$s#>6;{#~Q_Vv`a9N+iEx8o(FgG*|Q{QA3
zRK^BAofwX^d@HOLY5_<>nCXa3@+e$+%m_;#-yXk){~~HKoWPBo`oz1RZ#Qt}jXLzB
ztiO*MQSr!j6UHVqb0;v=Y=Nt~&M8r<JH~ejC?4Y5=CeypCL=`XR_HmhJX3m^vN@Rd
zT<0})>MzjJ0FNFt<{aYlVvpB;_s45q<$Eq7U;|=##&zmet#*?fbdnbuBRasF8%pEn
zQ*u7STU+9hE<wU9JL13a4gbAk+jmyE!VCjEPLZZviTsCAJ)O+{^>D54SNy(1eV4X+
z0I~8w;=|5PV=6q?^ay5k%+YG4)5AiUw9ur#r|q-f1fH=*4ad#Ps=l9oVho**X+*Z#
zyQCpj06Czg?uKKLz@|#X9glx=T<&#CWC;yFk6{_X%MfJMU1;dQDp{9HEAfsJSUUYS
z;3LCkrT(dXs|z9+A216WIf>F=EB<&6XqWQTSI;0+8S|?QIP`osmdwEBCiu2F!$DaV
z%%fr^yT!FOh){g>(LHk#Qlw!~t-H3=2yW~@vAn;MpK`hq_R~~e>n6Fg<6k83{As5b
zo7hZRn8-PmPit!xvHSFkzzOPjJQc*4NgX7hih$%&VW5}ELw@Cu)CSjL&VG{&h$y?T
zPj@2kW^b*nY;Q+wavAZ2>9j&?-SrHTH7*A`%L0zA{eC^2Up_xQFa6T_oyk{oMWM8d
zss{#zWcuAGCbnhlZ<(Dizdbl(H^~UJA2gx4MR$<~S-(dm@h&y}<z!6LVB?|%3VnaM
zzLkBqz<DxOG^T43YWpzzBHW-Ekm-fJ_jJD$g)FIw--9344tFwpoy3|%;0pr3A2vM6
zk5yMZ-!5^kufxw2eZ5$heZ2tp+wJ``t=gl|N++6?hDlnEk>$*vweI9&ZZXA;w`&(_
zHsm|Ut@n2jqh_=Sq4?6g?*gCf{7lB;Uxdm*7IG<Q<}SFQy&qcd$>!1l?Y5?KQIK!O
z%a%CFnPn4S(r|WrNh=CeqjO;aKJT060j;5>%Ny@}3~PPt@R?ioB_-Va9)hpJeRQ9?
zg;A3%dzZM6XoP$mU-^oM556ifvN)e|2$H*?r?XQn4s84+vT|l`;yHPWq+C+rESn-J
z(j?C1&nLuli3j)N^;E$HXfw0JY6R@)UEC}>wAsd9I|^?M1T&efapQb?O@N2bPh+cD
zK&+X^NSMY6EuWjd#wC!%Z+n}u&XD*aWmU(~?U=3grPN2U79(fOzWy3y?u1w6+KI#?
z4yE|+vZV#8;64Vom|^}WYC)W4Pd*%vtT_Z=!o^z5NhCj@3fk)M0iaosUIA&V-0bRx
z1U8!ivhJ3l#HmVzn#|dZZL`xM64jUb3w}8P0+rh=i6)&bgD0s{waXqI()Lwm)>m(h
zp*N;s3oY$wl8E&2<w?#oylcmu=0w_(w=>PlWOIv6ycI3hiWb?1Ucp2Bu1Z?5eBDm*
z*+~cu2SqA@r8#Lrz{>SqQdKh+FZ&YiEXw%uhmW3#*39z~`g)8ybsqi1I>iD<r#bPP
zU8?)&t3IKML`4s}bS1psx}2My`7WGKfBWDLgrB)7=@tX!xvh|aWo%02#OF?(p6>SV
zl4^&OqjBXpp>V@l&v?>swGuWW$7!nT)Z4nMT_0apN&Iz9;EPwXwL6Y`(R7b~zTtp{
zLA$r6oyGx1R)&?l_ki)eB&PY<xJd#l74+cC;p^Pz!h<F<dZ;+d-y2>{kC-!zzfP>M
z(6Vm>;3J0`J{K3%_u#LhHQh_I5eHuRA@ruORk3+!LEljhRlo!6x=c4kD-47=0(pz=
zat$Ky^>-csLXSvupKgx@cu-AmOYzzsH9L+|<=>=sj1-_03`@Bo+!X4SLcUJMkUqT1
zK^k3!E8|Jf(qe{`yTHnT-fm+LlSThf?IQT2v<VT32KoQ<)TQ`K=7jk8t_t|`X=C-)
z%GJ!x$}$d8PmJ=%V>hn62}JiVv(p{~1d7M|&-FL35Gl^Ao($L4%@Lxbjf#N$#|SlU
ztseB3gebOwg5+LOiU;8z8P(&0KjNl8c}4$-i8^me@gDdQ5JV`D5QzSjH{c(Tvz3!G
z#LC3X*^a~6`!9-rGSL3XprR#nf%aGm)uUA~$-goT#<et1q5QM>Z%NaA0|iP|0IfsZ
z=O&UzwH5Avg^e2jgk>Rrg`*m={}ZPBL$#d!%>dz%Mgau@;mN<K$^-sF95mwm8v(W6
z66Jg>uISOBnDk!=ln;*xVq6Zdcb5ORr$wbH1cAptEcy8SZ`gf6VBDuB>i=;3-P2eT
z1<HK@M#!HMVw?ZFC9dW_Ew%j>jWhix?9wcRC?8kYEdEzx|B-YB{rB!_Bs}geX&h|}
R*59P;Esu_|^?!E%e*k`bM85z4

delta 22910
zcmZ5{V~izCwC!ozwr$(CZQJH)+nTm*+qP{@W7?YLbieQ3yyPXXl2t!;C42o@mD*Lc
z*UuN|@)sz9vK$yVIsgEG2FR!jiGIT}!)t*80N>yM02Tm0HL(j92m=74?SfUY`41l6
zZ~zeS3oroSf2TY(h1eZt<i1a>S&BwDJPVz_%J9L<XQ<t9;kQKs95L((5*G1GQm7-#
z2m8tRcacZ}wTu~MSzJ#0{B;{dI%^;VzBn#VU>S0o-4`-c7zjK`iX&<<r}3?8k&7D|
z8Z+p6j~w>EQ<Nh;TL&tF0^1vwFx=;Yhl`epCmrfPw1;csn;SK2m+q)5?|<&lbu~l>
zBL-E%5?XB_qZmZR)|aO`!SI(NcL7!&7pBNKPgP?erBc!$9M@3NeP{hlO~pjwLw#Rt
zE{Rg99UQySO17R^YIff91?R3Djzzf}jc=fE0bsE}Ba8{!KTuAH4z)*Dt>JVY2woi>
zuXpY!v&-O%rK*&SPuMYpKImN&!V3JqDdoZAMSNN&0J+6cUGV`fCHI{HAy6fY5Vhwa
zstXfoy`m!Djm>7-+8&gQOhTj!4n)PjVq^wR(qd(xEFIIlSzyI!<#m3mX5wz%7%GhO
z-g!C$ZR2fCcoFUcj1xQQ^TF$<8>9C?v=H7wL#(!5Fr9>Ta5CXI$FuZ#^~FxAX5s<`
z1%;IvJRiersMQ9LvqJr@-&6Uf-Iq+8V7WMh6{yYrN?aE^D|$0f8RLm;3p?TdDMPx(
zNJum5r>Hs~)ETA6gvf0%lRqo+uz9p>1%R6awId?OwNIm4M6@CQ`bmG1%4g7zwpwX;
z%dVcA+uSHWQn~7)N8bDMQ|nX<N6v~y+ITwMYa>45PO#j2+{rxjFqmYCEX7&z+d25l
zfoQl_)kwju<9=?gI~!@t^vX_#Jq%!<q$%(U)%+qHzMFDV9d)a%2L3-;qS^hY%SWLg
zBO)dMAblJF!2VxdVx;bY!T|qAlqXFv|GzL-`R&|x#yt-n=-TC-NcTvjmzoLmGA>+h
z*j=v3^Cd6)vJ@v;z%!0D0hmK#=qvl*fAc388v!CQ>bY5l3(};~do5NApAts>{Yq#q
z6)~zg*S73Ax$$Asq-a;yXSV8EGxuZCz4=hUUqAP^6CE1^{$G-{w43)2=fIEq?>g-8
zl}n@f1I3EF`h)0!K(BxQpg@pEJxE$qwE!xVE0<hCaii868t-H7-G&WRS5MJ2j^!Ia
zoPAQ-Y`gYG5$PRns9F!uisfJ+Gqt_A05-q(M~XYbqvBX`(qme@=rfFAW!4Cxs_Igp
zFm};L+q#!lNe5+(x@P!Bj()uO=v}>JdUr!P^iz72W;3;hhlLD_hcatcb<I-zv^oi$
zns?4YR%N}rYD~+Ny(bC%bkjd~)$H!5Ra9rKRCx`x2%Sq>6*oA=zE7F3BJTo?@aQY(
zDH3zc*ehJcW!A3T$45lk=6X#7{?j}l>W^+iin^u0w2lKR1#M?dpQ(C=aGvpp6-dKq
zL4`;o^MmA<7x5_SpnlXZD<G;-KqVQ0+ylcsrKVB**gy?wMizdo6UZLl+YH?JF#;(U
z=0Vk|q6Tk>lB}_ncC{#z5y)(KoTC%0n$<)2o2kst{mCSGc_(r#IN`~sIwlv8w+C5C
zJ;uomr-Xg`6$l6VPE;ex@RPdO>Nnu+`~CHMW1%N9>@Nw71|wV{>|KF6C9DfU5DB$(
z9J6LJ$T3(Glei_Tgq;@K5mASkN$dox?(F<L;#dhdq!kxJ-$>gs7aj5EFgXju5{-}t
zxyfXCl!l0tvCO^!vroCI3#BFS4G)WoSM6weIPXYpHyw`0pGa5>qjRFZyK|*5k@jzN
z-iAbeW$0}bGC4G}bTL$+@`Fgv@3HA1o9%^SeQr`8_e<rtO>WE@s(Uv?A*G{poG<=6
z>BX(BF8_XR08<6t;Q2xoJ^`j)77|^mUOumly?NQ{0FChR`&PmB-qA2nJzXY;A%Sx4
zyyeR<jdIC_t_ldJsnlL57(lO1LlMk>0P53EbQ&n5FR&NFW#%2~+v3~a_GN$Yc>eD<
z)8AUeKjMH_dDkRF2$wd!fuk)%?0AqEotKDJ@7PQ>I?8BJso_u0%-!+w_GSn|nwuTm
zH}0s^sYNoR2)^~YRxU%}Ri~~2^vtV;DS2UjrA3?E_EBDo(N|A0T-F7iw*KME7Nez)
zfluHcwky*EG6%h|7uZ@-LD0`IWYkEr>Jx60^{KI9Y&e|Y_=8e27L`{YQjaseJOQfb
zzOe=~ZHM9=BRjPsj_^ccc{Q_Stm^c}GI@_?5O#S>W3N)fmuF+3X`gMa+@Ph~kZ{iz
z|IA&0&`H&6>=RZC*7*oDut<FZBfp7A91d~T$Ot-0Sw8Z0^tYt%^Pc#45LY<ROyrIZ
z-XgmLMc8^DVCAGf)S#h~X(~^w$y@U#mUmWOS?ZSqvh}7><`&qLAyM8^9|`dY{qtBA
z<B<oeriBa<)4vOhWf+yX?Sr9FJQ+c5DvA_=+Q{2M`IonIBnh?<ag*S^_A6cUZ_X8W
z_nr7evniG2Y+l|@v<V*<U;lNdDxO5E7tdLQ28YX%_k!d{vHUW84O0a=r`Q{Rn-2K+
z<UJHKh6<^iv>dWNEIJ+x0hdg0%#5-hi9fU^O|3n&lFSrv_NJmI9uetBi%lNq6cl>d
zw6LWNC)z?}YcOx=K^ono_>hDbjUU-@LyySxc5rHFP%KAw6Fyuul#kUdsA&qtRAZK@
zW{r699Zy!8kyuCPXxjUhiu~S&KhkJSO!&A{+2T^9OWe<DLpCrbQ~GsF70Uu*xJliZ
zmyBW%SP2STo=P5M{<ck%%~L-k?Y9u`|2lqO(F*S#C=jP4n1d4P&z1cFf9tygFiCj;
z%73m76VCjIo@CTINxyAm*z0N+6{4>)6GOv#*^sH!jjzo5cB5>|g#Vy1w^j0SmO)v_
zsIbn+IQOaIfqaXvQdrNMlKtU_G--jOdbb2swITub>^+MZEo!@E=u)_3UNrM+UwF?H
zPCk(Jo*LR*(G$I!o($z<!M0#Rmq^<RTSF>l31#(0MU4&_;{F7vf#UT3g8d<F(Z$4b
zL4;XOZP|JULx1lf6E=TD2#@!xx?itDrCOp{Ji4yBk6#nlZ*Zr{O|L)}5RQ$b)ylSL
zlWYSnr$=evVE7ivg3OS``D?ETzl^@#HH<+KRMo0u<+JciCS>BbtL#PD8p4FqR8-ZA
zewLeQBWfpRSS}y^Eh0~kMKxWq7Lwot7qgv|zvvfpn^#tkkcNq%VU}~z(a<B!5biW6
z+_4WJ*QOsV%r>JZtPAr~j!DFG=Fb9b{Q?ClhlAPOqaK5&qzdoNuuo8jAp#;8I3}=u
z(?r$Fpezgo{)nV4$(A*D4T%#Yf%FM3iU!v)J|uX9q*JrDJ8M8qia_VuCkY=O|ILi{
zMv698#l1u2$smYD)tsgc+NHS#6L%%ulCS#Eg79`06t6;OfV!6k;Re8E$NYhFBzOcO
zKciao5sMQ0OjjEMFoLuw&tdJGVY0O?MMdH9L1~h~2}I4f1sDll`L&$`U<<&!)37K(
zi4^4Qg+Zw3KR2@YjeRsFj3_sGy;Zcq2<*cWxG~)dismMBoZ$*~f>MSdS^>R?{!F#C
zcxGWda@twaX}G^3hsb>eOZx{C5<Y-|N3nclB_~_ff}gB<Y43DD9YmK!hK3>Igf2<H
zQPyHLX-8`p^IpNfcK`YuaN^NxnZ87sT`lKrLc`=CoWjcZ(j11DVzJ_R<Lp<+Y$Bw2
z_zPwiIGwz@T`JoVqoq*WfM?Z0iQUdDkuj=fqgQ2=M=@dOYJ*HWoBd&y7(fQrlW>j1
z?pa#iBmsG|h4v)Bse&l!*=cvQJ!m0>(ZCgm*?Zwd{lJICpG42-X!(P-KzG$K`Fiu?
z&lcJrL|+^@qb*m+5<1#svd$0XCUGJx>Ph>+%XBN#dsj9ijrH>r&lWmde8iAPk-?9M
zkxh4Eywf0yr;C+|yHyM{DG`8rbib9qaFui6ZOS_I?j0A#11Q6jyCfmYscplRR3rD`
zMjeGCBi&EsY7zQ;pB@ATj3Xn00%V0Ejw%V@kS#{BuDjwi5&M2c?FYdQpg6`l>-C0K
zc!UfjuBf6TBfqL@wVA(&2h<5D&d*CeH9)bac*S^9Z6$8IJiNl-BohJmrYN<N?j~SO
z8?gOi)*nD}aK8q>fCA*U2dr^T7hot1Nee-?I#v9+9LrM0(EOqX_BL-}&iKQRRGW;J
z+S$&?(%<-D6WWI27c$V07Ms~`_4c0gQ3w~HB!9tCMjFi*tNE8FP(sd+x`Xc7(n!E9
zHL$U8K|h@-V&UzO5c_}?ar;4x$iC-MghME*#JMyhD46qR$$q$)9+J7_r;zlM*EnXJ
zr!~ke6;U_<5=+t~g7smoZ7CY&Zk^hYc6PA4d(%j$vhV_tvyya0Q*TVwN+eACx*Cnl
zX+Jax50wxi4dO`%Wn|GbolqR^a4a$2`}Ghs%v@n-(7}Jwhhad7NE1Iw%S7Wp%>DQQ
z5jbJo^XskZ{=uDym1E5H@Uq&<<}QR}{^Ty!b+f3Ud^zu77ExemNd%xWIgdqSPZY;I
zg+$m{#MC($+R8@h#UQ^?BPSNoW(6oD%Z(#JqOL%z=&nj(@61&@O8s3Us1d2B^^js3
zvj!N$!b!2G0}X(|;=dc&%hdy?52;Yp+5Xnw#Iv-rEDZ5LVkAGkQy`HTm#rc0L)Q*q
z(s+?JeJLy$Sen}$kgIV9`wo=8aViCcB5&0zxWN5)=?G{E8Awv^HV4kSH0}!jfe2eo
z*RCQrT8E*Gjb`Z(b!9bBEq4S1PKJcX5tmO|lxu83z-$5EnaUBFnLL;|a$2;({`wB}
z!Ty;sycg&tZDwEyTZIP0<*QuzyQVj2vb}DB2Xc)D(uj<J>6%n1$|!F@U~r-x?60@F
z!$|ye*QvVfIp_0-K*~-1Q*QO&Z+iKt&DO{*4%Rv~_7YL#bsl$23J-Wnn;<1LxH&b#
z&fm$;yp^~>a(xbJ?si=9G2##${&H;cFH_}3CP)GXd_P$!P&ug~GdZbZ1_FqQjD%6)
zOKR?3cXH3Pgpi?S6-S8qg$VkSsX*=Cnb^R93bl2g77Yw^a*Cv0Zb#1kRanQFjzO^r
zoG32ibM_5hht`f-wt66{TM|CpPLhbK@jZlcsN)u}1S~0QW@m#}M)(5KHdG&#LF96p
zB1cY?qcKFjdCu-WI=m~xqQK^_jJS$|49DH>sfVa5q>Fu#IvxMTK=61vIGQ*`zoI8D
zcOY{~pIm@bI0&^wsU;;qz&;#mh`V#OcFd7qZ~`x{k@{u>2U2|6b^6v1o7<m$ufA}}
z@|QIbNf*@w1sYNK5NyDLpHcwsHU2qfv%P$O(xId4wGh2yDQ1n`<?#|N=D9+t!VIsu
z+8rdfFZJ*cGa6R<(4rU!Hp4QAw;lTO^GI@~9?*U8WqG6e7hog{^eC~7(>+vfu|Uwa
zn!zo{hMQYn>w(ZE7TVlfNSi?ofqBLD7RUy2xqM*|X;{JG!zr^2glj{4&cf`un2ivM
zWj_SY`gg~@ib2@@VF*Y%CYGzV4i0VMc?bD=32%JBYd216ltN`3<(0Qi;SSR?y*64d
zU>pKCN=7E_g@hBJLdp+|9|$`0+J9ZKpq^nWDF*O$du<d)%tk9Uez2L>=TV&QXK(;X
z?El&e53z(zE<(7V-y`%S+p*^o-w`=~5Y|;XowS6;>p<}p(`sS!O5T7+leffA4)z5R
zKw9B(T7INC5b}7nyfH}&fO~^HQ*e8Gv1|5+^TBonC8I$RTg^2J;1nZ`y3gc#nt@;$
zyW<)kmaq;268UfVz6+Zq&2RCH22FtUb@_$!Z%c4sP-tPGtccRPH4IeUH>CfhVTp>x
zxMqUZOYU$slWK+?dD`Y|(u+Xo4TvyKDgY~hjWWjtV!tuS_^(%8%8vDB-2i+zA?`EG
z(|XQ)xRCqXe}qLu8IZfpBw?zPSsZ7c1k>r9q*YA=WR0gX0lKN>g9(49TQPyj)xl|j
z(T1i9V0|FQ7*`a(MHN6WLa<W1T2(zlDQX40S<EY399qs8O%jn7kCvq^Lr|H~bMSs~
z2Z7NPm$k=l&!p?XeO2kget<BjtO!c^E|u3+vN&BK_WXep>l+!FhL>u`^jm{;<yCM9
zJ{>>%q=)4%DJ9-NN-m321tkXV8!mgHd6oy%!i6U<mYX~*l>I@FLrL#KesB&rB$9|6
zA%%A_QX`l=zZ(G6gVGZT%Ve2|i9O40k|2P`cy)2rsiOqh%$rr$mj;okLX&2Kw?<NO
zJNheMw0L5Sq|cDv!JbD-W=mn*Ix$@dz-q-su;^EVz+t|u4g;HNAVUUvhk46;!0ZM$
zZ~o=NOZMP|T6mIAYN7VxZO5s!BMlOBcKtp(`BY;SS0}bsb5raC0LcDAM+9GKLe{^^
zoMj7A??DBT1rFX(zFJ&2rQg=@$h#uw*GiiiP!-2vK?M%4PrazA$QBKCu4{fL#5ZLG
za<4hCFrmq)!k-RfmyQ9!;swm*g6W-hMvt&{8Gu+_fU<P@#wdeI5F;I2O=SAbC2;l}
zokRbmkSz(mA8pg{Q<lHVabM|g5p%az$fSwTdUi9O4*9d2*2sZc3~?s3-%)6{lJxLz
z*X@k3<V!ScUd(J?{L{|t&7-cX+RYk=R`TmM69S+;h^$HpBI7_xb_`shsc;MEQg)2g
zCU32}`1lZhc!QH%jJ4miB30g}Vd3a0K;figuxZVN(;$e)j~BZ*%S+ZOoI!sG6XJwd
z*X{?XO2EdSL8nUk&dZM*DCiY)R}`KCO8`#1s~8@7h$@9#e%@zEV`BUbB)H~1uGLx0
z19}9f<>~9}#w_r4cCoMu%*W^tUUk^RB+~m9DwPa~`Ltr6I8j`>1l~9(MGo{l&{G)1
zjMyDO-+A6=LV=Gf4jS?0#s~YJ88mV16Am%cvNhWOBEGq_ufhHqsvnEsnOl`mYtxBJ
zigAquMs`HDT778Uli{|>Y@fa|Ix>&H2(cYu6@NrLIsmNYtRq)_x@tpyBSAH(%l_+|
z2#+epfQN4^M%-Yy!X>l`c$;gym3)S|f-mNuT0)`JNMb>qQg%1y8ZX?9*lzIAE)?Wx
z!{{`0;gvxadZodzCZz6AuC^N@D1L42_v$P=;e6deanYF!znwD=6j!E@6Nso&h&Cx?
z{Bdh(E(6km6I2SQf4G$01c!Jo(k*$?ZVCOud;ycCNVu@k`$yUAL?oYw%&ZEM(Wm77
zO0!|@ET)#T*_{G`!Csh68r{Tk{we(%qsx9(u*l{j$_}6EgOUwGL*sHL;n`t$g+-2=
ztmrrh6<kpSvl>B(JQXCR2`?UDQL#rdsvxe8b{BZTcNR8?8%vL%$+DP=y~88<X_E0T
z*5|zrj@_YoE9t?Q#Q|bLDx$v*3QEint<?ts4vHl7qr+`EN~N-n9o&F~?`V9-vt$~>
z9Z_}{xbb{rg7Zzpk!vRhB4qpydO12YzlS+UnNkXm5&~}#36*OFL+o_njmla{&|lcN
z<^y!hjdYk#(P6fxAVkJz{bp<ZUO!0Las05ye{&_m8gNeMcw@EU-r3?^DZ$o14r?Va
zEE+D@uF6Yr;}^U*IKj6PFgiQ$60a8G1`v>K>_g3_L!8!|;mKKO-&@3ZHjh)@*u;hm
z!Dzv4XI956UKP12+4t((zDSdLl7=wi5CIqWOQhzJRyG%Sk{#QgvG{6FFiVlyL&F)J
zJf`ah_hVZzIQ1T>*de4?JcSwbHmm8TIX2fCxft~H8)rBC`I0-X=r0!DdxMPw;hh~$
z8kTI-S?G@(6t=;uXgqiK1CSm!vGE25TBZ_Hv!G-nqVRNCDa@=4a+nbR{ove3rve4@
zlo?NK9fkMl{BafrUZg_%ss%ROs3}*UU$|`#mLu_D-F5dAObU2lhL05>pRHIyX%F4h
zmpY*qFZD24YprfWV)nDtb`&w1ZP<HU(ep0-n#*5<t)S}9dpBDjDqcW^vofRAZ^@U7
zrHYMk+eRS;`vygY%ZU$3%Yr#LrGSIG>E}3|`%>L)Y>YTiJGhA>ptv<xhiS010PauN
zX`Ox0_!>^`qA*M-?~emoXA`8!3ZO;%&+Yc8Z%&6BS@wHK^q8m9j0_Y4U2xC-!G_{a
zxwT$MqZqHjtIKi(PMRrOi`dNbN=Cai-0RWAO+S6o13~wb=G*2;tJjzf8qjvZ!7NlP
zv7MOR|5Gu%YmA}1ArPuBbvp$E295yVE}!O4G>%)=X4F45U8v=Vua|zM`AQ#&Jj&m-
z^0zGA%;m0ZgPxwl3gBc9yKiA=VRb`O1syb+G`OhubCj=83}n0B28RmfI=|f*;Os2k
z+{KsvwC&lVsrw^$J}~w`-~%IRhgXIFx`1*apm|iJtXM+JTjim%S=WVF!EEw%XZ62k
zDbG;6$>xY0y>J^oFN0ae+l6(n*e5RFvWR#1h_~^<GgN_WizmO;4^2_X#wVsoKa}WY
zVn_=s8r7q7wOxUKP8!$smovq?5`g~TMFdxM^#`LDPkb5A#k=WnJOS4>msl}8I<x=E
zrBdpkoJIv*8~B7DNc<FNOKH%#F(TaWaOKb0uW<7HHW}Cu!y*;4dYMx2@a&%LIOLX{
zoFkZUuI%^VGHw?k)US9|Eqk&&|Bb%?GSTl0kA^`YMzCm@<5xY1DC?&6J7Ideo17|G
zYphF-zQpA{5eh2Xm>PK4WaiW#(?Z(`+$QLCW8AK3fE52F!L~fL=jqk{tR!R;;&zu7
zq&Q`7a;WK`m_z2rH8Ii`(ua>5IeJB99I;Eyfq{IW76D<|tZ2@%-{cphtDfR80*jye
zkTv;@2shb|cpe|2%Qu?yTD?+n7mfKQz^+P(L~)SM8-?w(sSPZ|aQggFZhibJ?-k&6
z^{`BL2l)K?_JXq?Om}czm)`Ei*>Xit;!dApbZG_k*WJ#-1mT6q+ZK*aHIbk}{~n+l
z4L&?wjA{?V#_+QLsmOY!`6r1}@K@;s`gLiC<ye3Kiob2>)l<TweKx^fovt_+LVcLU
z4wnjvDu_=H9t!x|C-E(!LE*gKU?e|W_Y`uNjut}#d3x{L$WQBIx7}lO;G{wLN=Bxe
zoZ?+t*8@G#bS9yqd9Nvxn}BL0SX^3C7KBz<)>P=(>2BxBpp#}xpgdcK{>Xcxf6UMC
z%TsF(iv-NL;dWBr^eUhZQDvOC=wNOU9!Y(@OPGF3_6i6K&WxtxCcZG|<4!3H97xUq
zM<s?#(U|X)=B5a}QwaH+nr=rd!eiWJ&z9iFj)y0K`buL~5TuPIWpQ&-qJ#bv%aQ42
zpE}P2rBdVv+kNPRo0Z<Dj)~yxWPX_`z@LHTJX-)-kb!JT?At@S&vHG0+qxp3@vE9c
z*R<`XehP@KfY}YfNtZ^94)a*IuCs0$hfWiCoX{$I$K`2e4YN}10JW?W?1o0}3CbvL
z@*6pXwt~X*B7nimSii-5n{e2cD9oq@&ei1F@&gR^nR03FVwdJ|U<cE4VibU@<hjvF
zoJO6Lj)PrbSqgCZF%tz~&u}`jubtg2c7R!<yaGS3Axnk6c0svW24i|g>ogTJW98?Z
zQ_H|JDU#1nPf_UX4eY$WR11^88%>mBK=o*(JQty*$$aqw#{7lT_tUo<N6%(q2SF2c
zbq*P$vDBZS6J=Pw#SuPDL%VYze#P<k6`Tl;`l7IVJF)77+KM62-hSA*-auLCuWMHR
zngPb+8ZxxQ>QgZ%TG}bmscP^ZolH(8j-KaaI8NddoA|M7;o>dqL^!o8WkJgz2tU50
zzFaC7GOKm-ZzGAml=N3AhiFAK{!Z{v><R7AfrU{{XU`~ml*+HVQP^9!1Z@WqGLOpp
zd>t_=xtbi9HW*3ds<fF?Hb?&p82>Fe=L|fYxbiJM_aiK`!t+E^6OuiKoYn<9p;KEm
zi3~+++CS>)6+w{vaN*XpiE^$dV}t@#y;xqf#j*+4s`$%n4hU94{-=T8IfKJ5tSvew
z3g!D!^ebj9a^|H5NKg|zvNQ$fo!^j(@sn_w`tH@Hw8Vs+cjE$fHhX?992Ey=a}0#%
zOr<}#FIa-eY-M*cp!FF#r-wZoMe7XqODgtIJJPuaH@@b#|7BvlYB^|G%P-G1+$2!R
z_pl~sPIZPa_?Hq5e=6`zg9UoPRk9KXju1Oxyl8}38Z6R;9`PP~ynkh>W}RtBu|w<+
z+wX&;rz?+XMA-RcGoRB%vFM}=-9(_10>IcxtShma`ba0=Y%(S>7=)nc>zajI|Drr_
zp94X7+Oar}yvvxEg%OR^4{X|7KyoC7_lQ^&Dwp_h)D4+MMOq0rhk!2$v`IeCZ5CM^
zx`->vcZDTzw=1Vfj6MyXk;q3yqQUfr;$=Nw2%&K=H$(?U@mM2T0yI>GrVEI=_=PI6
z4;O#pDuB_RpSmW4r`z`)WK619<y=qV#KG@oZ!%Z>6;dXKxX^wg6FHZ`xPQRCs!8tw
z5?P%|tj1?KZ%Jy0%`O&0l{OYq6(ebDL<AcH8z1Lz6xz|zQR?goLzEUdF@8JQVj>ic
z6{`ETBGOX~KH@RBNYnmH@BwIGTj0UBOaME74o75~QPXlrOLnB0@4?!?%L2_=2OHQ2
z!l#-PG0>yDdQhVy5+e7oeC>tMWe?*$21U^p598<HiF7O%NjJ>`!W%YDg~<|GA{vkS
zSozV#3jiBWP+e|Ybj{mBnM_+k#an{0_na)gxgmA}AtjN-`un9pi~^+i3Pwv04qn%I
z9aO?9gOMtHRD{Yd-+Wc=yG!{>Ffsd$P^Ox8hpkQK{H8!Mpj+r4WNJVG(s_<t%Q5<9
zh{=AzLjgjJDgzfOhN=;Cwb0Cg5B4Sy+5&jOs7mIW8&qmmo`dh#rIsPbKh`_C8xcU}
z*SFF1q6~p(cON8OI|dT#Y&sQM!!@nZ6SpYaA_UU9u9jzF)`Xj;xpeZug63XLh_tHP
zH{r&O4B7P3a^Az0vguMj9R5l!o9;7;g-&9uT_GYxyoGsc>jo!adfQXg#1YcXg)tEO
z1Awu9f4w03m&6~Hpzo1v3903In&N05scUz8s3Hd?-N@Ja(+MmKFpT_5_~!J*dU%&$
zYOT>d>Nsq9XCFf^xh}53dl}^(RP|QZN^Tn5Da}ely(0(3v5(NHZ<Hq?5myWZq1OUp
z4Y}3F<8swUjf}dsMH-r2A~uhWDZUxEz^kqyO_Ak!v3udIknkGRVmkZq%|K9f+P7Nn
zPQ|deLkdb7H~`Jnmz!xua8z<EMu<YL2ZbU0WRg(V7u#9nxo^_tQJIGpEHbPO_j@ua
zZ%4>gSS5rzE+zQSg_yqy{m~A0@;6wbIsT!hx;JXu+mt00eUw~JOHJ~GYZLPGg&kvO
z?o^t`Q$NWH#g1a!b}{&rX{(;^T|sho>x$HFC(PE<sR2huwh`6>83&q8r=S}Ur9C%~
zxk(VZo^tV(%bGN7^S0|KX#sCVE$&?|U(~#7zldRPa*awKWw)Dz3)8uDtgk#6d{cX9
zlA@d-U$#R*J&6$;+NKQAJf}D`SmJ_2R+2zLLtBP?D#L)44B;w|wR84D`mr2$CY=NI
zu^5$n8$jHmXd_NZiYmBTOk4c|>%kzk&;|N1%z!?rXH<Rb8Hq8+)mtgwpOxKZCD~?>
zDjF@hWi@JvncR#4MH7(V;beed$8re4w$*Zbj2vOZde<n^VjRs^BBUftCgQN=?=cD~
zjIj%tI1?OysLC8~;9@cN4NrEuSFhfj0_4%iJ@B$V0Hz7SfEU`jzOUo<>~4Z0h)9)^
z2dEpuJo6bpl%e{TXbkn~0G2V8=1@B|{lm<%D|OQAsv^a-7VMNWqfm_$KP;|*VS3_6
zUD6*j_+>)lRv)n~CwEg_wQiHzmZxD;8)(I$Yj@XQ-KsUvpo`F6&t;UF_xufW!S~4z
z2lVj%+FSbE!qTn0OR%H@{u70J`T87rooGmGH=<rRUBuK}S0*dMqqmwtg$19mk!M{~
zB`wMcKE1_2A2k;hmTu)D{{`KJRZ0hmkTS-=hV4j)EI9i(s03G;fns-HspT>c4*JRB
z3vs*#DNfad4))Cls$Kr^D`^c7Lr)Fi3*7p!7ipKPVj#CkhyG*h<*Blr3ucP)3tt)y
zkLiGTT?`kjJdVhInU4oT)2ebjUN1U)h!N4-C9Fg{b)$(1I<VNY793aOX_y<(E#kaC
zYBThFM=3!e5>@yo{IWR39cmGJkGf)smD9WS9LM#VU(DW-`jxOghPc^No^d-j6*%8W
zOei@+VVuYO%4%_5%nXLo1BTfnSJg|6U9K}M2}dwzm+%BSs-ne%$605UG?n7A)cmC6
zb@|I`JKI<9`pJ3q#HI;Ir$|Xh`f$dAS?AZ<)6?;^l5>LQzrSq<woRd-7P2bklPNGW
zC}mX>t>ayq;)mrJk~xZW?L8-&0erXchf`8#zv;iW-(~K3yR#c?(ZdV)XUuRV<x{(e
zUEj_o`+03$DtvQV7u`|X)7Cv|R%PqUpCGMo_g5O-OT32uPLShrOgG3-&P{11q)1M4
zS9fI5i<bi$MeB7dKXZMXW+xyVPbUV!JN@5~G2`(r(T^s6D*blPeP?q$4X}*B(x<ta
zkPWlsZVewZVjLXrb#OkLv$bu@)v(TdL%kcuykg>}d4+(EuZj^_%QWs+y}1d6_9myN
z$T|L(PO=lJGbC>kxedfV?XI5p_hn8l@jNigDdQBZ_m(K&UoAMNLhUA($Vtqoe$;b`
z%y<~=^<mJy4yP<za}jQa0&t12%(j$qB8PyeS7AM|nDa==*nArMQ4NH6Hj&H=WmZOR
z(~AO&`^mHVjy=%8!DEs)(Bf6SJZ^xKYRXoE{xf40M=z<B5HSiRq;OLW*$w#*DBviG
z&m>%@MghMLJBcL<giCrAfKWKqgcW&QkGQ*wfC`mZOkY#vQL9(Y12i#?VenfFJ-Duo
z^_RNw=5z6#TdyYeM&_^Fw^=3VeV6@|wY=i?&oPKRA{yzd_*5#m7J7%IwY}5D#kq4r
z6?n7$pw1Q*%gECWWO6V}AmWAmZA?fQb~pqV827YN8+HCns~?ENklxLzZk3H%$ikw_
z=%wZkp25hJ&abF_0$gUmgf5ixH!kHB*4n#&pr+<Z%RMVxeAv`{kFb|S61@na{|$%@
z9{~SBPpwy5WP18zk{Lk<mB>W%GEWx4(pA#sJ=q1|HbZX~>=hWx=K&K(R?}_W*c?^K
zx3Yg-PA!7T+nV}vQN>q#w*Gj29bZ*)Tg{Wt+t`(P&FdUs2Rg7@mxi)2a=_WKieh^Y
zBydxJq9pS!Ri-G;nRg?pdXQ+5O?9i(#@nW+k^Lz%hS%+u8(AtZtH=ssxb`S$y^<Y}
z#N9r5sag+rZCiDt-V6`IM5)8^Ivn{dw;}50Ty76<HJE}E@<~H)`iK4c$|{?Yh7&5I
z^>KLg1~upp3mgMkcots#7iE(EC$#{HNb+5R1(8VbYX{+LoKZ$1+(babE&((QY^D=R
zJ-{poMm&YxJ(~(M*%$CuFW^tl)fp1@t~wHmmXSE(?aM--=MYAWWHLUh9ok#|A?Wd;
zGX5BA3T;|)xpd9rSxhzjtw=GO6-jMSrbMz+Rzqmz12oUds~#aLjUk(_bWWqqg4aGK
z#up#cNrAsuB1&tlL^o%)<7;~NsNyM906n5+5r6BzwyYRn<ro5Ed>3C`qnTk&0x?J2
zfQt=Jb@N9j;e8u~JsM~%2dh&;($^I4_y8dX#@0uCIDo!&#sv^CysoAKG*peS;gfS8
z$$(c%K-i`Z#G^cxYO9h*tROYLUDDCZ<g4w-SK9p~6MyxFA>WbM5K-4xE{f`OBc`t+
zvkgDUi7+{l(!s1IIH7(M+99D8{&6Ko?#v)KprEsNL;*q+p5bbGS9Efg^!dGfA)?@X
zj}}sjS&K1)X*^!FWJS7^a!94iCt+utk^7SQe+Lp2*;6Op9j~?o_!YOZgyZ%E?Qy8@
z)YXM~=)!cW8?rS<M_+iAUfLN1idt6r59`c%;l#VO1bf^(LoO*c=gmNlbF7D)PDdOo
zt)DPB8~aG3q%s2cu4PkAlva~00-d=glrJP^Fu%@|hC54`sxd#{rNUO>l{1#{Oe@I(
zNT+nZGGp!W7ltUmdO~s~mS4{ZV`OP!iV(!PaOj+$SiRL->=PZM(@DC;>|#8->0iEm
z;%&=c%%X3?94*kRSwc#h)0@V2Lf)p?U`K&MsV~epFsOTKe{N?BYsdNAd29a&=f@9e
zOWS;TSn^=LDI8TV<IhmYboI(l=9kWWVBR-uMM5vDKw=|hB8ThCC^}hOuL|u=<nniu
zX^@Ec3`J?1gc_px>bj2f(R8erQ#mHf%P=l^YS{1gu3gdRu7A0RyDFMvwTthpLP;Ep
z>Y`lKaVm8mU&hSX8VK<`;e3rcr{D|DV^Ghr&@jZP%jp|;;+AOxbT~4O*%{vpK;<7f
zc#Q=SeTDlUzqx^59E68ldd<?09iR8->TVM6dysCFl<oyw{SMNiNN{^+!ks1vY_J>Z
zkEJI}`FLr<d(e{QXax#DZXSOR_5y-`>}n@w9W5_EhmoY+QLhkhZ`WIFjsJ$NGD^>9
z>%wBG2V{LQdznNjf(;aY`F1`y0Gn|^yW7CeAt+G16$MHI`@TCneq!%i{sctvn!n|Q
zIxnO|R?7LxC!z{Z7WUubE{XN`7x}<OBn8<=hvk=0autjOow;eA5=wio9X~7G3&C$_
z|1K<2F4!S<7b=7c!B2u;v<;r=Q8k(nZLYM{;rVg8w}btYW^v-7rY5~w0ep>SgS1B0
zxg${(!0d^)JjmoQ4ayY}hqS;O8&yuK5W#2Rdc!(e(6z4cc#3(0O+?l-(HP~OqP^U{
zla>S#uDY2N&L3=PX%fTU9tLBcV=u!m#HCfy1tirEig2t<<)Mc2KEDzQmWTMIT7!ZN
zqS3wzzN7!P(Rcs5C`58#0+ax!{y-!Oy-RXkm&8`<8`1dPg*V}54KUUg4==brVh-DI
zZ-l7sKdd1jW%f6>TCjb+_j;*!`IWC!8!K1)2S;?QiC=_zkym9{JlugvZIZ<3h^cmQ
z_oqbZYk?SkedtNIOw4hIGcO$~&V|J2Zhh~Ym8=dEc|W(eIt?ih5va&%<EcRo!Ey|9
zzR=c)oZA^(a@vbqZCUa{FiY=~v@6`J@{+DY<qyOWpR1-1@uz_q^`FhSUn2Fhr_s%|
z(8?h^Z`ad?9X)eBqLq)wJKt~#%7jd_fBC!Jghwe%Go6guw+(ZICF9Z-$C(mc*?fjV
zxIk<OzDElAAeROp12Q40Mmmo@I!c>F9&%1%p-WS{id;-WeCSi@lq@v$PlMun^KdrJ
zTz;FUG^l~^9bMj5pj<h(3YC@gRr4d^-zXhg|Dp}{HvXj+Ve^$&#i9b$of_6m*j+7E
zsQEkLNFTgIp$gu#c80*$pof~W?ZmK7tH6qT50S}#cK@`^2v`g*&Gc)s3V^et?db7u
zPST3xL=jdzz&G)7<DJATwt~^KqDRSVEiu9z1~&cf9CvCbyMIiSL(E#go>LK)*v*Oi
z4*QT5+=gb0bc`!^W*!bVtJbkH@rBnAlpb@x>5jX>+W7$@%xS3PFNQ)P!BE@PDE&N4
zpMi1?#{T*+BJg0r5~y;0e>4(#`B_pBm@No=wLC9i`u_T_26jR`@HCDbh?r<lvOMbf
zb@b%rWEHt!MO6?=uus&tnLvPeKt$9h@Mi*X;!ir^HM1Y^?PTfUs-vMFo$oo}sZ1f-
zc2PuSCMV>NV}WVhpD=bcZeyyD!<l(7HD`#w9Q;36bHEp=JhcileWJA3(3G^ik+=Tu
zn+{-Q6?o*$n*>O$8~B}>xqgI%EGGVTzTt!osB$3K8u;ZgJSwg*>Z6=NBMR9^I(MO`
zzlSnb^zv^!S5nU@E(RP_%G^yy(EE%j3-=ro_mQwvZbjng6Y~Z;<|D2cX$@!ZDaP~i
zrIjXhL*TSDR}ocdFd0^phUz3OkW3UiQlt&b$5CnV9KwV9-Y%|XWeZQ27R0S3mu4^9
zym3Osd1(tL<NK&L=@d4S%)pjyaASkvm;X!3vJ{VqJA_o6rvg>~E0p#;?5@X)t1CRg
zt9X;UKnALX*QZ5U4oxyUt!}&m{@gOfMp0PxJ+Q@=Wrt9!`<mvL+F+a1YHKuRska(O
z{E=^$EaMs|6IaPSdx!$uiN+0%j0!^D4;f8}C_%LGj+vt63RoEt{?<!vRWCAX`PNxl
zDSw~k@Roa&mK8zGY4Io`%Fq@M`cQhd`4~9q#hMMu$O8<;v!+4Tb>g5o24pwR2I#2x
ze@#zNr-jfSN+hqR%v)Z@zMUwnc7i3P)QmkZdlV@<+F?N&{RuT(P|SU@4M9I3>6h};
zctgRjQ<g;}El>^Y_XsR9i@4Mw_|Lcgw`XOGI%*?ITdpei^~Wgi5B}Ok)NvVHOOQ}u
z)dU*J5qQyzsN*J3E)yx3nvQy~8Cqh}k3bkL!koj#o?GEW&tM)}_1<$$DphgPDGwjE
zKch#nV$g{y?#i${k+R;=-Yj=&G+t~G=HScqHbJg=XVjCK&n0PjqobfA!CWwzEALWC
zNb(xBD+s!<r|2DOU~=#9HG0vKfi}y+iB;yXrv|^FQMKYZB2R!ChYxG0(=VEl1i&AN
zTY?-t0<eUKwx0`Sv$ip>Sh$<rQdDk`jE}@lQv0{E{@358nP`(FATZPe;@EC$;CHQm
zUa{SFBZK?R(eF7$+VM55Zp1W~u!X){J}cKR6R<Y2!?9HAv1LVdE}58i)o)g4e$RDK
zgdo1(J$tH{WtBxk5a_x}PO)me&jJ^%yw#bLdCB9#J(7OFMNGThoK7-eH}To<1tyLv
zn`xY}GIlCu*5L7r@pf&bJJc{q=Gi8VqD@6^4dA@`Z`7N2syE87avB`d@juK^4>D6!
z)w_|+Lv8M-J>Q?H;TY-kt3%&*oQ&=nE`sneUzZ%~(}b(p^TFViqoM4|ILKzz**1{`
z1QFnam0HFizr%m^BYZ>rPwzhLf0hye047gRC{>vimm)bJLh;HxRq_8bko><c|0HiN
zq0~fHDrjfW0LAG4(9+L}#RWd+A|RByWkUnqbP%T4{~ualZHYj@A=OL-QW@-+pnG2D
z<p&S9<WtS<uE5XK|6^0LXMi634p&_H4=qvlY#88_xi$i+1Hp{Y-l*I1K6`ueEib`1
zpeX;7!`Je+022rRQ2U>w1tZni9vy|z+s#}<{Xfgg|73pO-;!?;50n1Cgh}DF|4WE`
z@E@T<1Yzo7I4k(^|BzxvFhO_xM>y~w{#ywEpVRm+I{#nP6%e85_8(dxA~g{a!rTRf
zSQi@5ddL8P_*Cn3a_Gs^FvaQrkeZgR0xYliZy2oz_~mO^uox{=w@#*}9;T8n<mb(w
z(|i-NC7;C>>&t$5eqCotrzCS5ML9HK*2td~(~g!?--&zZVP56vy>YD->uO14P1{S~
zWVq5{+6ZFVP&jI|>(;i28&A|y--gu|CZg&xYGt9enARWi@u#)uH0e+AYw$t>c`=WF
znIa%tGWUk(oPk^9|EZR*up8B^ed?l3OhmJeA=>$A{Qid!=M(h=+DKSwPZ6B7Vrme5
zb%mE+qpJBQXXe4yF8~3JE*<Yrd$s07WMs~qrG9l}B+KmSz0*_Ai$i<byUF59yRPNt
zC9D-cljT*}G#w$dB|V$L;9-kBP(bUcohBib+@{!c!0zE+dpCr#n~n@fpK;R$1^?}c
zdzdeA3{t8NWgDg&L`yl$Rj_v2m@0rIFwl$S`C60Vzfu9dleP}p5_OP%4fZ=2GOTnO
zopU{^HP{SfP}&y~EeJ=U1BUZ&$>1_)g_!!io9>iqjVfEJd3Y|>3&=7)&>N1@u@T-<
z5c9lCZ?h<<06hq-af+1U4D1*T;}NfDL#-H2RZi=Q1{nggRGUT0TrYAl7n*cENG+rn
zY;jC==)#Qw8UbS%)D@k=nc};ZHa2THJNs}_x}j8i^%BA^4y^Oxx_DWU1^dd({6I~`
zNLB=n!K%Yk<c(`VKL2?T7&a6IZBJwKaAs;){u=aXnwQ#WJbj{H!G6axr)Hz;12|!k
zKu2IU<hbpYX@P%}n8&Ma>Qea641_1l<b8k^16Xw?VWI38K7e11UwwID9+)-87DfOZ
ziffM9=Aod;sHDsK%p(hX5t~uCX`_CrhLcC$W?b|puvd9mrU%Oc#Z4*y>kt;GjY)Y8
z4yP%1^`ugE9lYZ&5p;uL=I<EjCqzym030@<>*#_=QVZ;Pidl|D)amUZra*JeLWBk_
z8KYW7c{LicgUzUcd#af0GzE*$M+W;7Ukqwng8rKV-*RBZfj6<K(ev)l1--eWklwI~
zpclEOZh3BKbRpXYs(k7*248eO)J%>1ZRq^%RvPPhK!C?)9b_FGOW1lbRE`^yrd7wu
z>!>&L%#E9DN<$<#Yk8$w@Vw3g?XHaewEyz5c(d!-8?m}o#1Y2SxOamki3?pJy8;;1
z`3X>|GOJ-R=_ot{qi<-CB75VcZGMM79LbJj{}-B6D57`+w5b?eKrsXav&<~>ja~f1
zSBvjYfa*2f*jVw%o;&htF?873xP{+MPWbJOS6EEZZ(K&~n#M=JzMx&Hf20|L(e15m
z+1lW}a1LT8WwuhwNx^J7dmNA(G}}Q6Wg^;xNPa%)FavT2lCnDX%*6qQCzASAxhkeX
zwDRzt8X>vOy?poy@6evRl~zcNoG2n@sQ17mN&qHG8EN8@CSqVqm9S^S)l)a`3DQPL
zCKcWt9t_rS5`&0#oQjf70F+NZQ8Wu~qGT~57lsXArY8*jtC47aCu!*=FtaI!l1<*K
zDU%b}s(n~}64&=gk&qxC4!*Hk*racz5%bqVoXJ5Q=2=P)a26XH+SDE<agSEk9<_=K
z9R<x8zZ*W+NNED5J-0FjDle>T3hA`SE8(c1hjG<q+oL*4MV$-U0t|<L%uI5CM3INC
zlDa{4w5oNgyG_PopomW|b&8E2{GnCKTZ|)?%{oZNT&*e^Pjz~aUgKVUDt#CE2`(k{
zhSS<_whBod%%WYS5e*3>MawI92_V=xVP5djrB!Fw!~T-0GYuGZGl?ADe)}OORgGSP
z1}daHfo;AtCJ9^R1NBnNX>zIq<u?ncL*zC^)^4=P8xJ0fO(P*My5<KNK{ucZNv4{B
z_0C%q?hvaPsOE06hVcCIDhRB6)mz=ed!TL~h;QMu{>B2NDzRM%Y<zR)Vy;Y$4E3n*
z>X&nMMr3xsknO;C=59+q-5u?ZXgWEC1vYP%T?a2;&%w3>fu{!ETtN=vfI(^xRGijG
zTEM?({jz7_9jG7}!9%ALC;_fi867-FbH%?&Vc}ADwvrJZAgA~~C<YyVQ>sutO`Px`
zG43E&kvW)D1;NEwvGS<E!BXXTpCIbML1?+sezDYYJIUC@Ec7@px|w%tF#J{0Y>%PZ
z$o@a580dGdK;ppWFoQ%;%FN}cQYAA(@`q6zCr5GM00xY+gF{2Wr-tV!UnDa3gL5$q
z5a0&a3DgZ@fBoh&E?~@><k)$*tZiYU6!$eZ+^*3LE(S;-<^|_an=f&=voFUANU~Du
zhvVtFUVx^V$sWPFN7X2h_zq19m~gM*x<+fpa8fq_g|sh&5M%;bPjzW5v-<=8;UXXo
zBXy3ExWR4XmZq?rcs3#W)e|?U=kJcX_F~vrh0IH@4i#RS+KmQ};Mvq`v}41eJ|`jw
zGRad@vA{vHE=K4}yY(OlL#oqgbx@-%-p|&cR6bn6+_GvPOZbW@;tj2l>$LS&%*$n*
z;Fd80c?TsuM(lGf;eckb-Bn1&_<gEux$G{QGya3nXil-LDuI0MbR=y1Fdvf(iQ{KA
z1wAi$cC=dZ9mV?R=n2wvr7V@028Cl`iAgpo2@dV1Q~Qh%%*X0!d+~GQa5+>{N*#Iw
zf#?r@4B&#JF!t!A+nf;5+jG#4aUZqS8^XxIE5z`JfljiRUkZq{8qK<*c!;yA*^KqL
z&ysob!Mv^)%e_LvN==xhldPkIf(nZ+qEykdrq_qszw*NXv-W0KZ`Snv6A{^6pcw5>
zBq8@xu}yDF9FJ^ZCW&zp-<b#^t>A>t2DXYk;rRXR%04A6Ibx}XAJX6oJusQW3dY7j
zQtP<?9#md~_NcB;dgCD1A#puD04$#O%xX0;=1i;<Uz}covO;}Ru_?Pwjg7$rTCU}g
zVwQx2xL<s%UYlvzv<>3q3&{3EIp`$~D$MdxGsACCT$ci=+J%Ya9>Ipt)0M;G#V&dn
zu^;Yn95cK-nN10<AXeUr&`=?DQo=((M7dsqaXMKrk{w7;k5N_fJc#6*Hl0!OvpB&>
z`kY|FD|-rSNWCh99qZ1)s4io=)K*D`?sdzWyMHn%|9$ikf7E*4;!$%m$VX6G!&@Bx
zXpU1De~PolkBW&i>L0w=YG|w6jHmc4cW*h5Nh=c+m5L52pzcc`Z_ytfvVQyqc8x?$
zjdALL*$PVtw<!5Reajl(!EX*mL%96vYY{^xYO+Q^FwMT~@Ai*c<x|S!RbzIIl;k<X
z&Oh{#!mMnW>9xvv-g<kLU9S1^$eG|^0yVqyJXa^<a5aCKq=<>(w7~V|SZC^-F-aB3
zQvtF_DPqo|>Qg1b89y@V0D{wj7a=FiVOcy81G32EhhtReb>a0k5}0Uk+?ey*W^su0
zJWZXZy8?5mA3AF^+MHrRcE>3Rb;(dm!4CM0!9vQOi&1^&4zWM5NHsUr4kFtIrr_~@
zDpOtQ)QXDy56{(w5B+WR*0Uxdd3dTV7iKN?=aKZ|O>XF}o+Oy%Fi8SH=!Oj>_Da5R
zHElL-AFx@U3AqSDPb~8i2MH$E1eSdJJ~mty^b$tM@Df!kJi~m)J`H0D#p0bxwz{P=
ztcg!-%?hE#+J$t}#P~PFZJZvOIi7aSOl8U@tBPeD)Tpz+!^(j%M_9;#6h2^@qJYFJ
zK4RzJZAe2&{`Au=@Z&AOZUj!;d2FnL?UfX~lY*1uUPS9~j+5vNx{Ei&QvuP=eoG{1
z?%f`OvuoN6$AE@-`6PTzk5WG{CC)Uep7C>JS|s}O*Gd$Au_o^4ry(<3SU*meBMQ3O
zr***@>Wd>6a1b~;C1hJNU#XP05ai5?bh9H|tq0R(SrhH-ZBRGh5h|~hA`W`jKuJSO
zca15;l@2C^w^6T)qVHKE%5tL=0nlExT-DtX1(q<O6}Ncj<jDH7v};e06WX#=0*U2f
zOL5$E!fJId-#&YsSXhHc7t{Fj1>{Gi{8oeWzV30-+6sJk9?_H44%Ux0ARn$xJ7}Mo
zlU^|?9xmk2Covl61UBQTj;6(73a#QLlq{9NyhvD7*vuwypEKf+n~AU#1*z3&UlU{h
zmD7fh8EIy0ZWC{BX#wMGQ&rQ>cGUf4Tgw={d4CyFTJM^N@}OeuQ0pp&1BTr)Pv%mp
z)U2-c!=q%?Yrj4V2NoR6{<PlAQ&nv9<amS-b39=WmSYb@4nMjR&a`uOzeWveMI3&W
zY#bKdNqT47c+rV{mB2&C;JM~Ddt!Ua48uhH*;BKoUL&7ysm^2wGUSUyeG?w5^2>+%
zoeCbAV=o9slJPM0$emGfk)QpN_TLk<3PEBheA5LV95Z(Gh&;EhV{QXq8$oB0U79d?
z2q5$MxZ)C+Xih9?-w!{=G(U9#ncOjN&a(?r6dr=U`alWDM~$GnT0<L8mX{`(4E=B8
zf#@44?W2G&n&{Lw{GU3`Iw+3jPvfvyAZW0~EqHL(K!A|ogs?zx*TvlicVFB!5ZnnG
zJh($}4Fn00#YvEZ{Oao7_pWZL=CAJW(@#&;Oiguv`mqiSof^N866s_*c#h~g>3Xho
zt~;Du|18d(Eaj_n-g?zVqe`y?ncJ>)&n7~~Cq}pe`ukCCVFvtu_lP#h=;9%I!3Fs=
zz)bp$)wFDeQlM(6@|k82e-5*sOF@5g=@s)W)xv2tHk8x(tYKhb9Xu=~^715pkQS9+
z8fc)4`v#p=BX)Z6N}d^l0!F3-d+{Q9ZDDifA`xK<1}7G)jCmx@*S(3D^%Q-}2WBOm
zH4ml8nh)e9$&KEDG{^BA&^1Jj9VmqWXkKt}X?H!if_EE^NU{3Q^Y~Xo+!#v1FjCLq
zZ2pMLeoh(olV|CO1I^jX<&)dU0#5!%;aFKlKww^zy#g{{XSS>E6c6HXHXPq$Fj})8
z`NhF)rwNC>a;ubB>ag}M$Rs$rWk&^1<kV^3V)C2sfpCE{l#b%<xQvPyR1Xj6cdTaI
z%{iKG$LN`{2!;<v5+F_#vOyI6tlH|GCdDQ*L(R+W`G_C>S}v778&~xnVk~o_o9S)t
zH)@@#p|m9sZR;t)_0s&Gmsv_G9x3Tndsy^So(u-#uuY;`#B%W6P@7A6YuKm^J}aYV
zqT)13nB;Ff`To&w0UDWk%Bu-zy-*!GsQ(~OMYE2KeU$jw<oPnXwXUJB+<MZ)tIyN!
zc1!MF<2+iY^?yV~_XH+xC#|>_A3ps!Lfa{bBN=QY#a#=n<w6_`$HTuNgE0t3hUha#
z?-K4eQZXrVcP4jZcxtwZLMo~3jK1TjE*+XVRtBK>C0K9Z$YxeME&8tjI2lWeTX0X+
zTE9M+c|TjF#Dachv5yx4|IXJyW0;5hQBXCBrO)z3=A{3D&q>DsBH`|*$Yo#Vr}GiN
zyasW|$!iBKQxx{0y>=&hb2+F?)gnYRf=3dAM)<VcHZdXuc=k6l_F!pbO+TkPK1O6w
z>Uq33Go;Bod#Nvu@4AYBXk-<jZX5?yl{j%Til-D!_^t<8$akiyi;;GUV+)r)Qeo;f
z^VeZUc)Hpa$1YPzFr5*k3r|}Uh3eQW$qNN0`N<CAsaiQbbQ3-2VtA+YV<*-ttwR0j
zK`tM3DgQRN9)(9LUL{fcRDCs9|1i}7-KspAP{=y{{RrL9*E2^zdU9HP8s=D!g5kWT
zK&HR!>K0VxVjf%SyZBS84*Clo9kcpT3u!P#<k|re{10kl3|@^Yz)66$L)#)fLTLZ?
zsZ;P5SMv6=POe=CBNH)(i_`!MmZ;NZWL6Cc&9ipzftc>2#KvjIdB5;j$;@)!WkQn|
zU-Djb{`R0F^)@U6o<?P!7=Pn-6@{$B&di!D`O(~(&8Mk3UBvPPQ611cEpvG}NAUvF
z!P7BgbVZhX?cVq({U*>Y5W7Mn{SM@vMAHv$H!lN8=7?sgdmZwH-QZzDDueEH5!n*9
z%njzVgO9s9`3z;G2N_p&U9WTPM`Xy*cA~%y?&SWwjn<PuzTa2(Y<5-+5K?`SdfSt+
z9#aqFC;~MZTr<7Pu3$bg^6CDHIxHsvEpPD+;gMa6Z)kfC`&_vA@B_;~6?V#r%n$4R
z{Wv%{-&tCp8+&q|#dMG?AQM|_%`f689<?eCHT-~gG9$<OZg=#@nK|KQK_p$c!I{~F
z^kIeST@V-mr8M*SDzqxJ?P@ns(~GPRmm`ms$s+O&v1ai7IsGy8Vq73(L$Oj|J75~8
zn2`886Z90lp8M0%UOPA5A5RoKO6sR%A?9?+Aa<G5J|&U&&mPX*i(m`kN|~j(ttyl^
z({FT|rEGK?;&NAHjDhizJ*=K}j)q8;t^D3-Ub?aYnpHQ=VGBrf>~i4xJtb`lU#!~l
zUj*(+4E$gP^FALr2b_B3CbSyG&=RH7%k~b*ximuSM6upRaQBcQ4oxzaeb69zC&i8L
zLngr4r{b$X!P;~>e*NW62rF(cegWMN#=W-HNE?zDIGoAxHR4wIq}tn`XN`47{dqz*
zul+0mN$0C`3A0Z0*)A1w1@)q)tFJ#H$y%k@cOW)EQ@cHW94X0v&`eplpfcH_X}T^Y
zWWI{LmII5>zO=nywalWDBOap)Jem@E*5@YrJ)0s|uRb8(LmY1^r6LY9&$Xx9PH;_Q
z*SDZPJAu5$^Rpr>RA@|fHdnr_5l^;QG9VBzpJPfd8_UeV|M9X)gXa^W7SCd(yxUV@
zyJ88P!w;74ROI7GE}yv}i=49zVWYB5p(63hK@a-9X3c4gU}Bj(-ZyY;QlT{NrM-He
z+Jd=Q2F~Z!j_c98ADf5_&r41rQgj4dZ=&r9!)W;kUe0YttTzg43vPUA>N&qU0V1Y>
zb0PAI5U1dt9RVw&4i!A~ehhetVQpkMh?_Un0*C4+oez7YEyZ;435i2;qxk#L0+4OD
z5cY@LQU)rqzNS}ihv>`uJL+a%F%2(bM!(h^4ho14|4fevej|+AFNtCs=WkT^Ri)9v
zhf21oAY#gXy+!EQXd+0&U1WhDBe#VVFvw8GBSNY>HaLhkw9nA0WtO(^F9;?-Hs$2~
zg!?5K-LTmBjkOhea2am}l0S{2E5RJTY7uh(kmONME;C^=xS+}DvjP1j$x##Em5YJ*
zYO4wEruPse7)?x$wR#naGJ|d!9T}fs1a~$-q6+=^+gX~1smRDg2*||RImyEbNVNXJ
zps=9p%4{|M2Ir0rszxfB*qvjQlU({Cg+FIpEs&=|tX3z&lh$?VlcHmT>TFZK_i$hp
zJnS6>)lWknDn85uqHSV7N{TS^&9WcoU!4^ikNsvM_Tp!X!1jP>4^zQ>vhmPP43?Uj
z;N;AAMqYkxTqQ2N)cV@+(Id`gpnkRMS^WglJa0$g2t71z%TJvJYc032LJ$mvF!Fx2
z)(iAlJQPxS*nC2|U9J8@W^kYvgtoN*_9uG7k*a$Mg`SLv&av)#6XR=?$=OcZk(8X!
znPOu7oLl?zg}1lo3$xoCIaxDy9U`|In>Rl{74|C_H%{~*N#lbiTgR0ZfjnzrvUgU4
zPo9!NB1*}ATGC#Pd-c0P#gRNr_7b>zY_idcwCc?Du0{%Tbz}%k-*GI43K=t@W8w^5
zFqb5d|28O8RM&oA$nScF`EblGFFW-l*HV}*uY~%VsbrwGuVL;t;#)j(lC+kRW{jS!
z0?zHSo;Ua}wVutWk!#14a{(dC@#6$K-vaPBM-21nz8VO#S0%(mktnHPLwZu)&3H=5
z#V8f{`p#U%Je~8+<Si0g7p76F1~^_^pK~?D*OZlT_md~veiqHPuu?9=xmBkwVt&r+
zni!`QB0K7Aho$k%sWGD=Cn5dzIW&M?Q-MIvK!-7iHTxQs#xJD`4gt_$>qthXH*J@T
zL5h@THU3D7jy^ZJ%AS%(S3AQFs;lH3?sqr4zkaw8r_2!Ww=7i7uY9zRub3)0&s3-T
zfRY~I6%wlgKkv<3J3^#xV_{LlnSYMDBaHeE1c%($KqQ7$@_F$vbY4W_T+qwOrvA)S
zhO&r8&yl@(6~}?2Jqh%x7DfwXIMjmPd#WD2iqA!nj)3IB+^G}=hd8zgHc;P%wzdWs
z!{fy&zAe8BmHo8R;@y9Vy}p4fQ2NtnS-9wwNM$m;$r;pB&os@_YZOmd>sh~5J`mv;
zbaG7x4m6h$AxhdaErM)5k(pIYbul`iPxvBs@irl+jgg8qIv41)aO2Nl9lNjV@-Z3r
z)wEwYVY#e}0T@)le4Hq2F4U5NA+GjcW@XGQ?n9lhrl8Q4sD{_|>NYV1Aqbq(sgWVU
z23XPx$kgN*iE=u_6cA8q1h+0LLr-p?+AxN-72Li_Zw-&}_XOVIxeKcUI@?YP@c>6*
zN9(%~${%FoFM&xmFxxg&))i*p>9Q={8zkWgUM^}=?v@{^c|o(1gu2mNJkwBc;K_`I
zdGtW9BU-BJ&8vA>z;kw`S`?bXl;}y)D&sA2Za~MbX^{Afh|a+YuIu-_q2uT^Ghc3a
z6XbU)k!p{f?)rgMMem<Yy)b}KR-Xbm|GM?^F47%-1MGSjpr=DEdHnRF^amWC@IGk`
zS|jtSbg0gq7)cAm_uqhco-nE_J++r2LB2bKn56>;J%E9Uii4}A_IHAIsOVUy4t$S2
zIwzW_b3?ZP5%V?I++7N}oCQd+n4Yu<u|vK2oPCKH6nc(GGeXkEm`oi}Aq?GFiO!}f
zaWSd{=)l!{0eyH35$<PRjif1!s30&tNG$u~Chf5k$R3g`vmW$%dW(6io2<(sf?@ou
z@2c!&FPtsAfy|EF1)8w&sn9~Z*QaDkChdt>stRXSHV*qCtp@90s*RUgMUrDI{*e=&
zoj%AF&w+#VNb0N72W~MZXZt$$QH1~>YaA(HN=);YliDdW!C}5tm}_**pD9O1G5D56
z3&&eaqt~_9*T;ip7pFp>6rPCrPhEKgg=&XI=lGz<<h=X%Az1NGdlUEQ=gQHEDjJH3
z<<87Tayx@;8d7#)<?!Fsqzt#_wQZA9@Sh7SsP`DO7ZSm~0;VD}5rgh0IY=E^zx?*^
zfGHi`kgjp!?$xE&oZV>?+hc@!QD(<XyaFaz!K7<Zp?rd%QLYws>1G>$hnWz(tJ%$S
zVuNR9Rq%ybGSU&n7lPQS#5`+p$9E-amA<qfU8{?C5QQ#W^or~{v|ln#X<6F_?6k+3
zVMw3MEj@AFZfoRt?2kA%iDwyHlGcKafnVY5sS3%LE?-jbh{_Qtg%^ZhU76b0u$TYN
zSa;GjzIT=!-5W_ERZlbs7Ij$n{u;=@GaWvMuIE6l;e+O{9G#*4UC&H*f^@vwu!(la
zn_<o-{K|steBbyB&9yumI*x72DVnf6fR|HkxE7;FRHUEBdV=ZND7&Jlg|TBM0)TaM
zu=5<g<BYB(aHU!FcQL0gf>}0SZoQivJEDsEMF4f2SeKj@4{zSfs62S3-kaIQ_eETS
zh~9R_cPXpguv<Cn69KBG+oCi+?DbI)NkQ_tfiV9xIj)twuN1UNC9(vOVtO;&Ez#UK
z#8SRKuOF|~d6IJ^#zJZSMXqwZ1z<T<>#qCs@+yC!IzhXjoQZLFaZU}&lqi6nV8bav
z?7NoaTxZ?fn!IR4MB69CO__ucd0~^LY#PQN&{)1sS4Lb#ZWQn{sOTCdw|WL=*hZjn
zM~+(=&^R%x?cTiO&WTE?O<#Ez%Ee0-WjAEhK6TqwRX_(c#`vv)k+bk4u&Hnho8G~^
zYu7^sb)rdO=(SV;!!g&GW5B4x!w!M(@;VD?ro%;V12rlQq4&Xi{P1+-&-v<tPsVAn
zg+I+SEYOL*Q~;z7En1_A6WCKLMo~XRGiS7+IQ_!CF2&p8Qk`>8-VjqJK<`<aU0#v6
z`ksMv+|L&vi@AYMV$-KM%oXc?yFY#{i9g&JWjf~p!*68=@cMS+FddM`QZvcPXDX_m
z@bze!RSV1OCSZX?dw`&R><|4nXE%X-S%;TOJ9Sv1z4zwb_tpxZGqy&=PVPB|?=Gt+
ziJw0u#WSPB&%PCk6)ar<WW&;J`7%W@x?m9^n(0b$CASoq(B_JyDleME)k-)T92bgt
zx3#_3WDWz$>T;?OhV{nvwx8S0)QtZ2y#37=a-sk6y4#*Fht$aW*xx8+f_Fzj7)Sh-
znpmMamD&%TdrxtimgRxy3GiLp{rT<{2hBGmN}rRVzGJ0c)zNh0_ufvS0%mWF?AJYP
zUM#dPU9z!RF@G45zCgeJ0z;=2PD4IACT<iq62BDyZm3L^H0XarDMK62I&*dv!pFrG
zKgNEvS(pI39G_AHlX^DIsyh_4S%@G%9J-?Fa9hRMf?)<Lk^qhYENyyP@F~d-&r5vg
z6wqAYVqgW9&z3W-^ok6cx1J+b>$)Ow;;Iq)x?YlWU7ZjI$gO?csjH_Nn)+c`KrL@m
zwgV18c1Tatd9f5=PvSP88@q8|(`PH3n5rd|mSc~y#@L#sv9^EpXcS92BjIyiDo0d%
zh^1Q-Buf)j5Y;_Y6W^h3+uJaXJ;6Mi=&>7jS@qbNn~lK_0~HOB*teeLRbgE@_gOTk
z4R4r+5>q^xy}vHq=g|^%*q>PqiS^fsb>#yl3vKoQ-;T1uml!{6buW%iv>~RM`3}va
zkx5DoKgQ&pppdwE1B?$#YuOt`8n>TCRFd_MxnT9sQ3-r8RsZhH#q;9B+qEL`cJLG4
zVv_G%eG7T`=6zP$8k$|uWs7M(yOWP19q&D2gNiUQxIaIvvPqIeK@Tz4!U$Je1eJkv
z7MQjdmc)V2bYYvB_delF^8{*s;?1HAQlrX8=JFD925+j|S>Ku?r}St(tMWOPHm{V|
z0wmexYj<J4M^^`wBbeJ#jb4t1Jl(7mJCvKMZ8DlY2_`*9s>q=A4EurQEz3)fmLY&K
zv)+#`L9GNi*jMZC_C0)-3SiJDK6L^vUG-wgKgy%l>}wo19?3mLQvV`~Np@ws<3^Q#
zC`R@2eqYGjvzzfe>r8IM(5B++#a>F433{tqyC^1QA5^zvyG%_5dOa+4Pi<?_Q(omq
zcT8A*H##hJ`NGy}tGY_BP1G6qgHD-FvbcW`H$tUNuUeL}tJ!i~S=kX<^k)w!&gp-d
zd3$quH5%#`3jEnw18$BsSN8sl75$OX$<)^i$Fb{sc#W%+)^v1z_or^{FGjcI-G2A<
zE&QpwO+EspAJsT(yv)4Y`?+~@+XUnkm3@<dV{b3*?a`a0>yz*n4dvl2T`+~n^7};T
z@od<A>4Pe<7_45GVs)re>JJ0C)^=PS5xqnWx!h3!l^$6c>1{W9+sr#hzi&j}BlDC8
z_gX&;(~kPy_{lp86Wjr#tN{7its}5oY-T(E^NyTe)92qRYdrQFB<Vbf<9Lf9UAhBV
z9G(q!ZF}x$3>sRW^G9+YSTgW>I(eEWnr~lP>&KATaTV#M4BmL57G}VZg=n{&Kg(ge
z8&>iQj56@zNmpPrTKfC_pu|sadv_xBY+U(#kzP$8RcjZ!htsPvxNDQGhzuXcPUOdO
zfOS9)wTBW4^o}o*wu81752SP_txNH-9MM;d>lFH@*X1=)Hx8VxJ{Y|E5^F~yLtqHP
z)>a=yz35lB>a%;se<lb_fFkD%%1+pFuekddpIuwmuL`(=V#ahl$zWuu3_dE<tEG+=
zn96zDb|M=ze2bhsUIHBL0B0d|ZDKSI0exsjUNAOo_tKCHy_EWvOy4fj##WC^D~G43
zW`eEll^I!c5zS!wX3Efn7s86m97C7J<Y=bd&8_^RUT|9S5h`HQZDH5nCnC>70HrQx
zg|X<geh)95BfE50m2)&gJ4d)$%}YQo`$8CYpuo&Ue*9$Z!rO&ebwxj4bR|LkVC`_1
zBct{*05y<)aOsyz*5dLul;@*y;AAA_J^KZPsmvyfHBwre53QqIoSp4AWsc57;O9g}
z)amk=yqJbXa3tU&@1ejdtjxk@6^yW`<(gRhbCxQRnt|$8y}3KD>1Z&UPcFaiM#fpa
zbKR#j^8Mip$g?a{W)Y&IkejbnBa{uY%KDSabc@FF%Ze4BV?wQ%0!B%fWwkj77jzTp
zCe}!)=2)CC9O$~zMxiv=z}6-hSLu49-ITYGTzJA(w!y4<A}Za>MVlAZs^ep|6N{u3
z4<3cV-To{q+1^=oH`Uws>m->}gEYHabckRwbF4pZIzLUn^&yHD8g1W$ROAsslt}+y
zG%olr-}HbEAr!(Qn`w|A6LMiSEo9XHH?8y^UHwZyu$X2dEDL9-jrw~O1f<9O(uXoa
zjDPS_Y%O4dLrD^D1OzEN6H|`A{T}(LM|rVFPO9g+3j2;90YL-|LU{HNhx&N^b>gr2
z-$nMOcJ?-=`iAzF?Digi6&|^&M}_|&RTC{>q(c9E*g*?9@*`UH*h2G{h^o2mn0nCD
zdJrW2m-dAf0!-AJ0`0-|BOCQtLG?&n!9(U_NeK}UbetZeS^w#V99Gmyjr<5>{gr>@
zuvYVmJ|H~g3%`BH7bf{v=P-W+*qA^0qx>VM^*@IGiD><+Vkr;-MiT`7m!ZcgEX&Uz
z2s}(d^5G`@N5!GP7OcIE0{Oq){|DW=Z3818`mY7UNZM(T9~rL4k^jSQ>9&JW3jI?;
z5MV1If9L%Ob3Hc0n%gN6DPi;NFKPZobOrwJC%}}10JBXZd$jlndci()P@(cQKlnoU
EFEtIb$N&HU

diff --git a/tutorial/generateds_tutoriala.txt b/tutorial/generateds_tutoriala.txt
index 450aa1d..c1e5792 100644
--- a/tutorial/generateds_tutoriala.txt
+++ b/tutorial/generateds_tutoriala.txt
@@ -12,7 +12,7 @@ Introduction
 
 - You can find additional information about ``generateDS.py`` here:
 
-      http://www.rexx.com/~dkuhlman/generateDS.html
+      http://www.davekuhlman.org/generateDS.html
 
   That documentation is also included in the distribution.
 
@@ -204,7 +204,7 @@ more command line options used by ``generateDS.py`` by typing::
     $ python generateDS.py --help
 
 and by reading the document
-http://www.rexx.com/~dkuhlman/generateDS.html
+http://www.davekuhlman.org/generateDS.html
 
 o
     Generate the superclass module.  This is the module that
diff --git a/updateversion.py b/updateversion.py
new file mode 100755
index 0000000..0ec2618
--- /dev/null
+++ b/updateversion.py
@@ -0,0 +1,139 @@
+#!/usr/bin/env python
+
+"""
+Usage:
+    python updateversion.py [options]
+Options:
+    -h, --help          Display this help message.
+    -v x.xx, --version=x.xx
+                        New version.  Required.
+    --verbose           Print extra info.
+Example:
+    python updateversion.py -v 1.17c
+"""
+
+
+#
+# Imports
+
+import sys
+import getopt
+import re
+import shutil
+
+
+#
+# Globals and constants
+
+VERBOSE = False
+
+REPL_SPEC = [
+    {
+        'filename': 'setup.py',
+        'pattern': r'(##VERSION##\s*version=")([\w\.\-]*)(",\s*##VERSION##)',
+    },
+    {
+        'filename': 'generateDS.py',
+        'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)",
+    },
+    {
+        'filename': 'process_includes.py',
+        'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)",
+    },
+    {
+        'filename': 'generateDS.txt',
+        'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)",
+    },
+    {
+        'filename': 'generateds_gui_notes.txt',
+        'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)",
+    },
+    {
+        'filename': 'librarytemplate_howto.txt',
+        'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)",
+    },
+    {
+        'filename': 'tutorial/generateds_tutorial.txt',
+        'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)",
+    },
+    {
+        'filename': 'gui/generateds_gui.py',
+        'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)",
+    },
+]
+
+
+#
+# Functions for external use
+
+def updateversion(version):
+    replfunc = replfuncmaker(version)
+    for spec in REPL_SPEC:
+        targetfilename = spec['filename']
+        if VERBOSE:
+            print 'updating: "%s"' % (targetfilename, )
+        targetfile = open(targetfilename, 'r')
+        content = targetfile.read()
+        targetfile.close()
+        content1 = re.sub(
+            spec['pattern'],
+            replfunc,
+            content)
+        update1file(targetfilename, content1)
+
+
+# Classes
+
+
+#
+# Functions for internal use and testing
+
+def update1file(targetfilename, content):
+    backupfilename = targetfilename + '.bak'
+    shutil.copy2(targetfilename, backupfilename)
+    targetfile = open(targetfilename, 'w')
+    targetfile.write(content)
+    targetfile.close()
+    #shutil.copymode(backupfilename, targetfilename)
+
+
+def replfuncmaker(version):
+    def replfunc(matchobj):
+        if VERBOSE:
+            print '(replfunc) matchobj.groups()', matchobj.groups()
+        return matchobj.group(1) + version + matchobj.group(3)
+    return replfunc
+
+
+USAGE_TEXT = __doc__
+
+
+def usage():
+    print USAGE_TEXT
+    sys.exit(1)
+
+
+def main():
+    global VERBOSE
+    args = sys.argv[1:]
+    try:
+        opts, args = getopt.getopt(args, 'hv:', [
+            'help', 'version=', 'verbose', ])
+    except:
+        usage()
+    version = None
+    for opt, val in opts:
+        if opt in ('-h', '--help'):
+            usage()
+        elif opt in ('-v', '--version'):
+            version = val
+        elif opt in ('--verbose', ):
+            VERBOSE = True
+    if len(args) != 0 or version is None:
+        usage()
+    updateversion(version)
+
+
+if __name__ == '__main__':
+    #import pdb; pdb.set_trace()
+    main()
diff --git a/upload_pypi b/upload_pypi
new file mode 100755
index 0000000..37a8a71
--- /dev/null
+++ b/upload_pypi
@@ -0,0 +1,4 @@
+#!/bin/bash -v
+# python setup.py sdist --formats=gztar upload
+# python setup.py bdist_egg upload
+python setup.py register sdist --formats=gztar bdist_egg upload
-- 
GitLab