From c6333c0b95b3cad014e2201580a2c066cb26d763 Mon Sep 17 00:00:00 2001
From: Dave Kuhlman <dkuhlman@davekuhlman.org>
Date: Mon, 15 Feb 2016 15:34:09 -0800
Subject: [PATCH] Modified code generation so that generated code will run
 under Py 2 and Py 3.

---
 README                                   |   7 ++
 generateDS.html                          |  15 +--
 generateDS.py                            | 146 ++++++++++-------------
 generateDS.txt                           |  13 +-
 librarytemplate_howto.html               |   6 +-
 tests/OnePer/oneperType00_1One.py        |  14 ++-
 tests/OnePer/oneperType00_2One.py        |  14 ++-
 tests/OnePer/oneperType01_1One.py        |  18 ++-
 tests/OnePer/oneperType01_2One.py        |  18 ++-
 tests/OnePer/oneperType02_1One.py        |  18 ++-
 tests/OnePer/oneperType02_2One.py        |  18 ++-
 tests/OnePer/oneperType03_1One.py        |  18 ++-
 tests/OnePer/oneperType03_2One.py        |  18 ++-
 tests/abstract_type1_sup.py              |  14 ++-
 tests/abstract_type2_sup.py              |  14 ++-
 tests/annotations1_sup.py                |  20 +++-
 tests/annotations2_sup.py                |  20 +++-
 tests/anonymous_type1_sup.py             |  20 +++-
 tests/anonymous_type2_sup.py             |  20 +++-
 tests/anysimpletype1_sup.py              |  16 ++-
 tests/anysimpletype2_sup.py              |  16 ++-
 tests/anywildcard1_sup.py                |  24 ++--
 tests/anywildcard2_sup.py                |  24 ++--
 tests/attr_groups1_sup.py                |  22 +++-
 tests/attr_groups2_sup.py                |  22 +++-
 tests/cdata1_sup.py                      |  16 ++-
 tests/cdata2_sup.py                      |  16 ++-
 tests/cleanupname1_sup.py                |  24 ++--
 tests/cleanupname2_sup.py                |  24 ++--
 tests/defaults_cases1_out.xml            |  16 +++
 tests/defaults_cases1_sub.py             |  49 ++++----
 tests/defaults_cases1_sup.py             |  71 ++++++-----
 tests/defaults_cases2_out.xml            |  16 +++
 tests/defaults_cases2_sub.py             |  49 ++++----
 tests/defaults_cases2_sup.py             |  71 ++++++-----
 tests/defaults_coverage1_sup.py          |  46 ++++---
 tests/defaults_coverage2_sup.py          |  46 ++++---
 tests/extensions1_sup.py                 |  56 +++++----
 tests/extensions2_sup.py                 |  56 +++++----
 tests/mapcleanname1_sup.py               |  28 +++--
 tests/mapcleanname2_sup.py               |  28 +++--
 tests/nested_def1_sup.py                 |  22 +++-
 tests/nested_def2_sup.py                 |  22 +++-
 tests/out1_sup.py                        | 104 ++++++++--------
 tests/out2_sup.py                        | 104 ++++++++--------
 tests/people_procincl1_sup.py            |  78 ++++++------
 tests/people_procincl2_sup.py            |  78 ++++++------
 tests/prefix_classname1_sup.py           |  74 +++++++-----
 tests/prefix_classname2_sup.py           |  74 +++++++-----
 tests/recursive_simpletype1_sup.py       |  18 ++-
 tests/recursive_simpletype2_sup.py       |  18 ++-
 tests/reference_simpletype1_sup.py       |  14 ++-
 tests/reference_simpletype2_sup.py       |  14 ++-
 tests/simplecontent_restriction1_sup.py  |  34 ++++--
 tests/simplecontent_restriction2_sup.py  |  34 ++++--
 tests/simpletype_memberspecs1_sup.py     |  22 +++-
 tests/simpletype_memberspecs2_sup.py     |  22 +++-
 tests/simpletypes_other1_sup.py          |  34 ++++--
 tests/simpletypes_other2_sup.py          |  34 ++++--
 tests/test.py                            |   2 +-
 tests/to_etree1_sup.py                   |  22 +++-
 tests/to_etree2_sup.py                   |  22 +++-
 tests/validate_simpletypes1_sup.py       |  26 ++--
 tests/validate_simpletypes1_warnings.txt |  34 +++---
 tests/validate_simpletypes2_sup.py       |  26 ++--
 tests/validate_simpletypes2_warnings.txt |  34 +++---
 tutorial/generateds_tutorial.html        |   6 +-
 tutorial/generateds_tutorial.zip         | Bin 48764 -> 48769 bytes
 68 files changed, 1342 insertions(+), 797 deletions(-)

diff --git a/README b/README
index f3dd65e..0cbb735 100644
--- a/README
+++ b/README
@@ -141,6 +141,13 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+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.
diff --git a/generateDS.html b/generateDS.html
index b85250c..f956893 100644
--- a/generateDS.html
+++ b/generateDS.html
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">February 06, 2016</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">February 15, 2016</td>
 </tr>
 </tbody>
 </table>
@@ -437,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>
@@ -634,7 +637,6 @@ Options:
                              distribution.
     --fix-type-names=&quot;oldname1:newname1;oldname2:newname2;...&quot;
                              Fix up (replace) complex type names.
-    --py3                    Generate code for Python 3.
     --version                Print version and exit.
 
 Usage example:
@@ -915,13 +917,6 @@ $ generateDS.py --fix-type-names=&quot;type1:type1Aux&quot;
 $ generateDS.py --fix-type-names=&quot;type1;type2:type2Repl&quot;
 </pre>
 </dd>
-<dt>py3</dt>
-<dd>Generate code for Python 3; the default is to generate code for
-Python 2.  Generate code that will run under (and will have the
-same behavior under) Python 3.  You can, later, determine
-whether a file was generated for Python 2 or Python 3 by looking
-at the comments containing command line options near the top of
-the file.</dd>
 <dt>version</dt>
 <dd>Print out the current version of <tt class="docutils literal">generateDS.py</tt> and
 immediately exit.</dd>
@@ -3176,7 +3171,7 @@ following among others:</p>
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateDS.txt">View document source</a>.
-Generated on: 2016-02-07 01:15 UTC.
+Generated on: 2016-02-15 23:30 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 1237b5b..2fe477f 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -107,7 +107,6 @@ Options:
                              distribution.
     --fix-type-names="oldname1:newname1;oldname2:newname2;..."
                              Fix up (replace) complex type names.
-    --py3                    Generate code for Python 3.
     --version                Print version and exit.
 
 Usage example:
@@ -206,6 +205,11 @@ logging.disable(logging.INFO)
 VERSION = '2.19a'
 ##VERSION##
 
+if sys.version_info.major == 2:
+    BaseStrType = basestring
+else:
+    BaseStrType = str
+
 GenerateProperties = 0
 UseGetterSetter = 'new'
 UseOldSimpleTypeValidators = False
@@ -270,7 +274,6 @@ SingleFileOutput = True
 OutputDirectory = None
 ModuleSuffix = ""
 PreserveCdataTags = False
-GeneratePy3 = False
 
 SchemaToPythonTypeMap = {}
 
@@ -1964,24 +1967,25 @@ def generateExportFn_1(wrt, child, name, namespace, fill):
                 fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         # fixlist
-        encoding = '' if GeneratePy3 else '.encode(ExternalEncoding)'
         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))%s, " \
-                "input_name='%s'), namespace_, eol_))\n" % \
-                (fill, name, name, mappedName, encoding, name, )
+                "(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' %% " \
-                "(%s, self.gds_format_string(quote_xml(self.%s)%s, " \
-                "input_name='%s'), " \
+                "(%s, self.gds_encode(self.gds_format_string(" \
+                "quote_xml(self.%s), " \
+                "input_name='%s')), " \
                 "%s, eol_))\n" % \
                 (fill, name, name, namespace, mappedName,
-                    encoding, name, namespace, )
+                    name, namespace, )
         wrt(s1)
     elif (child_type in IntegerType or
             child_type == PositiveIntegerType or
@@ -2127,11 +2131,11 @@ def generateExportFn_2(wrt, child, name, namespace, fill):
             child_type == TokenType or
             child_type in DateTimeGroupType):
         wrt('%s        showIndent(outfile, level, pretty_print)\n' % fill)
-        encoding = '' if GeneratePy3 else '.encode(ExternalEncoding)'
         wrt("%s        outfile.write('<%%s%s>%%s</%%s%s>%%s' %% "
-            "(namespace_, self.gds_format_string(quote_xml(%s_)"
-            "%s, input_name='%s'), namespace_, eol_))\n" %
-            (fill, name, name, cleanName, encoding, name,))
+            "(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
             child_type == NonPositiveIntegerType or
@@ -2269,20 +2273,19 @@ def generateExportFn_3(wrt, child, name, namespace, fill):
                 fill, mappedName, default, ))
         wrt('%s            showIndent(outfile, level, pretty_print)\n' % fill)
         # fixlist
-        encoding = '' if GeneratePy3 else '.encode(ExternalEncoding)'
         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))%s, " \
-                "input_name='%s'), namespace_, eol_))\n" % \
-                (fill, name, name, mappedName, encoding, name, )
+                "(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)%s, " \
-                "input_name='%s'), namespace_, eol_))\n" % \
-                (fill, name, name, mappedName, encoding, name, )
+                "(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
             child_type == PositiveIntegerType or
@@ -2648,12 +2651,11 @@ def generateExportAttributes(wrt, element, hasAttributes):
                     attrDefType in IDTypes or
                     attrDefType == TokenType or
                     attrDefType in DateTimeGroupType):
-                encoding = '' if GeneratePy3 else '.encode(ExternalEncoding)'
                 s1 = '''%s        outfile.write(' %s=%%s' %% ''' \
-                    '''(self.gds_format_string(quote_attrib(''' \
-                    '''self.%s)%s, ''' \
-                    '''input_name='%s'), ))\n''' % \
-                    (indent, orig_name, cleanName, encoding, name, )
+                    '''(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
                     attrDefType == NonPositiveIntegerType or
@@ -2820,11 +2822,10 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
         if element.getSimpleContent():
             wrt("            outfile.write('>')\n")
             if not element.isMixed():
-                encoding = '' if GeneratePy3 else '.encode(ExternalEncoding)'
                 wrt("            outfile.write((quote_xml(self.valueOf_) "
                     "if type(self.valueOf_) is str else "
-                    "str(self.valueOf_))%s)\n" % (
-                        encoding, ))
+                    "self.gds_encode(str(self.valueOf_))))\n"
+                    )
         else:
             wrt("            outfile.write('>%s' % (eol_, ))\n")
         wrt("            self.exportChildren(outfile, level + 1, "
@@ -2945,21 +2946,20 @@ def generateExportLiteralFn_1(wrt, child, name, fill):
                 childType == TokenType or
                 childType in DateTimeGroupType):
             wrt('%s            showIndent(outfile, level)\n' % fill)
-            encoding = '' if GeneratePy3 else '.encode(ExternalEncoding)'
             if (child.getSimpleType() in SimpleTypeDict and
                     SimpleTypeDict[child.getSimpleType()].isListType()):
                 wrt("%s            if self.%s:\n" % (fill, mappedName, ))
                 wrt("%s                outfile.write('%s=%%s,\\n' %% "
-                    "quote_python(' '.join(self.%s))"
-                    "%s) \n" %
+                    "self.gds_encode(quote_python(' '.join(self.%s)))"
+                    ") \n" %
                     (fill, mappedName, mappedName, encoding, ))
                 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)%s)\n" %
-                    (fill, mappedName, mappedName, encoding, ))
+                    "self.gds_encode(quote_python(self.%s)))\n" %
+                    (fill, mappedName, mappedName, ))
         elif (childType in IntegerType or
                 childType == PositiveIntegerType or
                 childType == NonPositiveIntegerType or
@@ -3020,10 +3020,9 @@ def generateExportLiteralFn_2(wrt, child, name, fill):
     elif (childType in StringType or
             childType == TokenType or
             childType in DateTimeGroupType):
-        encoding = '' if GeneratePy3 else '.encode(ExternalEncoding)'
         wrt('%s        showIndent(outfile, level)\n' % fill)
-        wrt("%s        outfile.write('%%s,\\n' %% quote_python(%s_)"
-            "%s)\n" % (fill, name, encoding, ))
+        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
@@ -4105,30 +4104,21 @@ def generateCtor(wrt, prefix, element):
             mbrname = name
         attrType = attrDef.getType()
         if attrType == DateTimeType:
-            if GeneratePy3:
-                wrt("        if isinstance(%s, str):\n" % (mbrname, ))
-            else:
-                wrt("        if isinstance(%s, basestring):\n" % (mbrname, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
                 "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (mbrname, ))
             wrt("        else:\n")
             wrt("            initvalue_ = %s\n" % (mbrname, ))
             wrt("        self.%s = initvalue_\n" % (name, ))
         elif attrType == DateType:
-            if GeneratePy3:
-                wrt("        if isinstance(%s, str):\n" % (mbrname, ))
-            else:
-                wrt("        if isinstance(%s, basestring):\n" % (mbrname, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
                 "%s, '%%Y-%%m-%%d').date()\n" % (mbrname, ))
             wrt("        else:\n")
             wrt("            initvalue_ = %s\n" % (mbrname, ))
             wrt("        self.%s = initvalue_\n" % (name, ))
         elif attrType == TimeType:
-            if GeneratePy3:
-                wrt("        if isinstance(%s, str):\n" % (mbrname, ))
-            else:
-                wrt("        if isinstance(%s, basestring):\n" % (mbrname, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
                 "%s, '%%H:%%M:%%S').time()\n" % (mbrname, ))
             wrt("        else:\n")
@@ -4157,10 +4147,7 @@ def generateCtor(wrt, prefix, element):
             else:
                 wrt('        self.anytypeobjs_ = anytypeobjs_\n')
         elif childType == DateTimeType and child.getMaxOccurs() <= 1:
-            if GeneratePy3:
-                wrt("        if isinstance(%s, str):\n" % (mbrname, ))
-            else:
-                wrt("        if isinstance(%s, basestring):\n" % (mbrname, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
                 "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (mbrname, ))
             wrt("        else:\n")
@@ -4170,10 +4157,7 @@ def generateCtor(wrt, prefix, element):
             else:
                 wrt("        self.%s = initvalue_\n" % (name, ))
         elif childType == DateType and child.getMaxOccurs() <= 1:
-            if GeneratePy3:
-                wrt("        if isinstance(%s, str):\n" % (mbrname, ))
-            else:
-                wrt("        if isinstance(%s, basestring):\n" % (mbrname, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
                 "%s, '%%Y-%%m-%%d').date()\n" % (mbrname, ))
             wrt("        else:\n")
@@ -4183,10 +4167,7 @@ def generateCtor(wrt, prefix, element):
             else:
                 wrt("        self.%s = initvalue_\n" % (name, ))
         elif childType == TimeType and child.getMaxOccurs() <= 1:
-            if GeneratePy3:
-                wrt("        if isinstance(%s, str):\n" % (mbrname, ))
-            else:
-                wrt("        if isinstance(%s, basestring):\n" % (mbrname, ))
+            wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
             wrt("            initvalue_ = datetime_.datetime.strptime("
                 "%s, '%%H:%%M:%%S').time()\n" % (mbrname, ))
             wrt("        else:\n")
@@ -4936,6 +4917,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -5255,6 +5240,12 @@ except ImportError as exp:
         @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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -5600,20 +5591,12 @@ def generateHeader(wrt, prefix, options, args, externalImports):
     else:
         preserve_cdata_tags_pat = ""
         preserve_cdata_get_text = Preserve_cdata_get_all_text2
-    if GeneratePy3:
-        gds_reverse_node_mapping_text = \
-            "return dict(((v, k) for k, v in mapping.items()))"
-        quote_xml_text = \
-            "s1 = (isinstance(inStr, str) and inStr or '%s' % inStr)"
-        quote_attrib_text = \
-            "s1 = (isinstance(inStr, str) and inStr or '%s' % inStr)"
-    else:
-        gds_reverse_node_mapping_text = \
-            "return dict(((v, k) for k, v in mapping.iteritems()))"
-        quote_xml_text = \
-            "s1 = (isinstance(inStr, basestring) and inStr or '%s' % inStr)"
-        quote_attrib_text = \
-            "s1 = (isinstance(inStr, basestring) and inStr or '%s' % inStr)"
+    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)"
     s1 = TEMPLATE_HEADER.format(
         tstamp=tstamp,
         version=version,
@@ -6808,7 +6791,7 @@ def main():
         ExportWrite, ExportEtree, ExportLiteral, \
         FixTypeNames, SingleFileOutput, OutputDirectory, \
         ModuleSuffix, UseOldSimpleTypeValidators, \
-        PreserveCdataTags, CleanupNameList, GeneratePy3
+        PreserveCdataTags, CleanupNameList
     outputText = True
     args = sys.argv[1:]
     try:
@@ -6826,7 +6809,6 @@ def main():
                 'one-file-per-xsd', 'output-directory=',
                 'module-suffix=', 'use-old-simpletype-validators',
                 'preserve-cdata-tags', 'cleanup-name-list=',
-                'py3',
             ])
     except getopt.GetoptError:
         usage()
@@ -7003,8 +6985,8 @@ def main():
                 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], basestring) or
-                            not isinstance(cleanup_pair[1], basestring)):
+                            not isinstance(cleanup_pair[0], BaseStrType) or
+                            not isinstance(cleanup_pair[1], BaseStrType)):
                         raise RuntimeError(
                             'Option --cleanup-name-list contains '
                             'invalid element.')
@@ -7024,8 +7006,6 @@ def main():
                         'Option --cleanup-name-list contains invalid '
                         'pattern "%s".'
                         % cleanup_pair[0])
-        elif option[0] == '--py3':
-            GeneratePy3 = True
 
     if showVersion:
         print('generateDS.py version %s' % VERSION)
diff --git a/generateDS.txt b/generateDS.txt
index bba23bb..9845a81 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -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.
@@ -325,7 +329,6 @@ Here is the usage message displayed by ``generateDS.py``::
                                  distribution.
         --fix-type-names="oldname1:newname1;oldname2:newname2;..."
                                  Fix up (replace) complex type names.
-        --py3                    Generate code for Python 3.
         --version                Print version and exit.
 
     Usage example:
@@ -633,14 +636,6 @@ fix-type-names="oldname1:newname1;oldname2:newname2;..." Fix up
         $ generateDS.py --fix-type-names="type1:type1Aux"
         $ generateDS.py --fix-type-names="type1;type2:type2Repl"
 
-py3
-    Generate code for Python 3.  Generate code that will run under
-    (and will have the same behavior under) Python 3 (instead of
-    Python 2).  You can, later, determine whether a file was
-    generated for Python 2 or Python 3 by looking at the comments
-    containing command line options near the top of the file.  The
-    default is to generate code for Python 2.  
-
 version
     Print out the current version of ``generateDS.py`` and
     immediately exit.
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 7b71469..ce78796 100644
--- a/librarytemplate_howto.html
+++ b/librarytemplate_howto.html
@@ -217,7 +217,7 @@ dkuhlman (at) davekuhlman (dot) org
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.18a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.19a</td>
 </tr>
 </tbody>
 </table>
@@ -226,7 +226,7 @@ dkuhlman (at) davekuhlman (dot) org
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">December 16, 2015</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">February 08, 2016</td>
 </tr>
 </tbody>
 </table>
@@ -380,7 +380,7 @@ this command for your needs.  For example, you may need to use
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="librarytemplate_howto.txt">View document source</a>.
-Generated on: 2015-12-16 20:55 UTC.
+Generated on: 2016-02-08 18:02 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/tests/OnePer/oneperType00_1One.py b/tests/OnePer/oneperType00_1One.py
index d504860..3a361bb 100644
--- a/tests/OnePer/oneperType00_1One.py
+++ b/tests/OnePer/oneperType00_1One.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py
index d504860..3a361bb 100644
--- a/tests/OnePer/oneperType00_2One.py
+++ b/tests/OnePer/oneperType00_2One.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
diff --git a/tests/OnePer/oneperType01_1One.py b/tests/OnePer/oneperType01_1One.py
index 93f9e63..73c443d 100644
--- a/tests/OnePer/oneperType01_1One.py
+++ b/tests/OnePer/oneperType01_1One.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -695,7 +705,7 @@ class oneperType01_1(GeneratedsSuper):
             eol_ = ''
         if self.username is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%susername>%s</%susername>%s' % (namespace_, self.gds_format_string(quote_xml(self.username).encode(ExternalEncoding), input_name='username'), namespace_, eol_))
+            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):
@@ -776,7 +786,7 @@ class oneperType01_2(GeneratedsSuper):
             eol_ = ''
         if self.userdescription is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%suserdescription>%s</%suserdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.userdescription).encode(ExternalEncoding), input_name='userdescription'), namespace_, eol_))
+            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)
diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py
index 93f9e63..73c443d 100644
--- a/tests/OnePer/oneperType01_2One.py
+++ b/tests/OnePer/oneperType01_2One.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -695,7 +705,7 @@ class oneperType01_1(GeneratedsSuper):
             eol_ = ''
         if self.username is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%susername>%s</%susername>%s' % (namespace_, self.gds_format_string(quote_xml(self.username).encode(ExternalEncoding), input_name='username'), namespace_, eol_))
+            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):
@@ -776,7 +786,7 @@ class oneperType01_2(GeneratedsSuper):
             eol_ = ''
         if self.userdescription is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%suserdescription>%s</%suserdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.userdescription).encode(ExternalEncoding), input_name='userdescription'), namespace_, eol_))
+            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)
diff --git a/tests/OnePer/oneperType02_1One.py b/tests/OnePer/oneperType02_1One.py
index d477ece..339dabe 100644
--- a/tests/OnePer/oneperType02_1One.py
+++ b/tests/OnePer/oneperType02_1One.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -695,7 +705,7 @@ class oneperType02_1(GeneratedsSuper):
             eol_ = ''
         if self.clientname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sclientname>%s</%sclientname>%s' % (namespace_, self.gds_format_string(quote_xml(self.clientname).encode(ExternalEncoding), input_name='clientname'), namespace_, eol_))
+            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):
@@ -776,7 +786,7 @@ class oneperType02_2(GeneratedsSuper):
             eol_ = ''
         if self.clientdescription is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sclientdescription>%s</%sclientdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.clientdescription).encode(ExternalEncoding), input_name='clientdescription'), namespace_, eol_))
+            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)
diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py
index d477ece..339dabe 100644
--- a/tests/OnePer/oneperType02_2One.py
+++ b/tests/OnePer/oneperType02_2One.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -695,7 +705,7 @@ class oneperType02_1(GeneratedsSuper):
             eol_ = ''
         if self.clientname is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sclientname>%s</%sclientname>%s' % (namespace_, self.gds_format_string(quote_xml(self.clientname).encode(ExternalEncoding), input_name='clientname'), namespace_, eol_))
+            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):
@@ -776,7 +786,7 @@ class oneperType02_2(GeneratedsSuper):
             eol_ = ''
         if self.clientdescription is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sclientdescription>%s</%sclientdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.clientdescription).encode(ExternalEncoding), input_name='clientdescription'), namespace_, eol_))
+            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)
diff --git a/tests/OnePer/oneperType03_1One.py b/tests/OnePer/oneperType03_1One.py
index 3dc877e..809e00c 100644
--- a/tests/OnePer/oneperType03_1One.py
+++ b/tests/OnePer/oneperType03_1One.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -695,7 +705,7 @@ class oneperType03_1(GeneratedsSuper):
             eol_ = ''
         if self.helpername is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%shelpername>%s</%shelpername>%s' % (namespace_, self.gds_format_string(quote_xml(self.helpername).encode(ExternalEncoding), input_name='helpername'), namespace_, eol_))
+            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):
@@ -776,7 +786,7 @@ class oneperType03_2(GeneratedsSuper):
             eol_ = ''
         if self.helperdescription is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%shelperdescription>%s</%shelperdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.helperdescription).encode(ExternalEncoding), input_name='helperdescription'), namespace_, eol_))
+            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)
diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py
index 3dc877e..809e00c 100644
--- a/tests/OnePer/oneperType03_2One.py
+++ b/tests/OnePer/oneperType03_2One.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -695,7 +705,7 @@ class oneperType03_1(GeneratedsSuper):
             eol_ = ''
         if self.helpername is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%shelpername>%s</%shelpername>%s' % (namespace_, self.gds_format_string(quote_xml(self.helpername).encode(ExternalEncoding), input_name='helpername'), namespace_, eol_))
+            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):
@@ -776,7 +786,7 @@ class oneperType03_2(GeneratedsSuper):
             eol_ = ''
         if self.helperdescription is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%shelperdescription>%s</%shelperdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.helperdescription).encode(ExternalEncoding), input_name='helperdescription'), namespace_, eol_))
+            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)
diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py
index d4fc7d3..d8510ae 100644
--- a/tests/abstract_type1_sup.py
+++ b/tests/abstract_type1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
diff --git a/tests/abstract_type2_sup.py b/tests/abstract_type2_sup.py
index d4fc7d3..d8510ae 100644
--- a/tests/abstract_type2_sup.py
+++ b/tests/abstract_type2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py
index 5069103..6071f59 100644
--- a/tests/annotations1_sup.py
+++ b/tests/annotations1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -697,7 +707,7 @@ 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 build(self, node):
@@ -791,7 +801,7 @@ 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_))
@@ -889,7 +899,7 @@ 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_))
diff --git a/tests/annotations2_sup.py b/tests/annotations2_sup.py
index 5069103..6071f59 100644
--- a/tests/annotations2_sup.py
+++ b/tests/annotations2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -697,7 +707,7 @@ 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 build(self, node):
@@ -791,7 +801,7 @@ 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_))
@@ -889,7 +899,7 @@ 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_))
diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py
index 107e6d6..9aed0df 100644
--- a/tests/anonymous_type1_sup.py
+++ b/tests/anonymous_type1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -795,7 +805,7 @@ 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_))
+            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)
@@ -879,7 +889,7 @@ 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_))
+            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)
@@ -963,7 +973,7 @@ 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_))
+            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)
diff --git a/tests/anonymous_type2_sup.py b/tests/anonymous_type2_sup.py
index 107e6d6..9aed0df 100644
--- a/tests/anonymous_type2_sup.py
+++ b/tests/anonymous_type2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -795,7 +805,7 @@ 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_))
+            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)
@@ -879,7 +889,7 @@ 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_))
+            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)
@@ -963,7 +973,7 @@ 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_))
+            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)
diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py
index 2499ac8..4dd47d7 100644
--- a/tests/anysimpletype1_sup.py
+++ b/tests/anysimpletype1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -761,7 +771,7 @@ class cimAnySimpleType(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='cimAnySimpleType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='cimAnySimpleType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
diff --git a/tests/anysimpletype2_sup.py b/tests/anysimpletype2_sup.py
index 2499ac8..4dd47d7 100644
--- a/tests/anysimpletype2_sup.py
+++ b/tests/anysimpletype2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -761,7 +771,7 @@ class cimAnySimpleType(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='cimAnySimpleType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='cimAnySimpleType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py
index 6a3fd36..a67df98 100644
--- a/tests/anywildcard1_sup.py
+++ b/tests/anywildcard1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -699,7 +709,7 @@ 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:
@@ -801,7 +811,7 @@ 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_:
@@ -894,10 +904,10 @@ 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_))
+            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)
@@ -981,7 +991,7 @@ 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_))
diff --git a/tests/anywildcard2_sup.py b/tests/anywildcard2_sup.py
index 6a3fd36..a67df98 100644
--- a/tests/anywildcard2_sup.py
+++ b/tests/anywildcard2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -699,7 +709,7 @@ 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:
@@ -801,7 +811,7 @@ 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_:
@@ -894,10 +904,10 @@ 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_))
+            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)
@@ -981,7 +991,7 @@ 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_))
diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py
index d038363..3a65b3f 100644
--- a/tests/attr_groups1_sup.py
+++ b/tests/attr_groups1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -718,19 +728,19 @@ class GetUserReq(GeneratedsSuper):
             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_format_string(quote_attrib(self.value01).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.value03).encode(ExternalEncoding), input_name='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'))
@@ -744,7 +754,7 @@ 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_))
+            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)
diff --git a/tests/attr_groups2_sup.py b/tests/attr_groups2_sup.py
index d038363..3a65b3f 100644
--- a/tests/attr_groups2_sup.py
+++ b/tests/attr_groups2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -718,19 +728,19 @@ class GetUserReq(GeneratedsSuper):
             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_format_string(quote_attrib(self.value01).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.value03).encode(ExternalEncoding), input_name='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'))
@@ -744,7 +754,7 @@ 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_))
+            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)
diff --git a/tests/cdata1_sup.py b/tests/cdata1_sup.py
index fb1228a..4815129 100644
--- a/tests/cdata1_sup.py
+++ b/tests/cdata1_sup.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -770,7 +780,7 @@ class cdataType(GeneratedsSuper):
             eol_ = ''
         if self.script is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sscript>%s</%sscript>%s' % (namespace_, self.gds_format_string(quote_xml(self.script).encode(ExternalEncoding), input_name='script'), namespace_, eol_))
+            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)
diff --git a/tests/cdata2_sup.py b/tests/cdata2_sup.py
index fb1228a..4815129 100644
--- a/tests/cdata2_sup.py
+++ b/tests/cdata2_sup.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -770,7 +780,7 @@ class cdataType(GeneratedsSuper):
             eol_ = ''
         if self.script is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sscript>%s</%sscript>%s' % (namespace_, self.gds_format_string(quote_xml(self.script).encode(ExternalEncoding), input_name='script'), namespace_, eol_))
+            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)
diff --git a/tests/cleanupname1_sup.py b/tests/cleanupname1_sup.py
index 38b495b..9d3b8c8 100644
--- a/tests/cleanupname1_sup.py
+++ b/tests/cleanupname1_sup.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -812,7 +822,7 @@ class data1Kind(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
@@ -886,7 +896,7 @@ class MlassData2(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
@@ -960,7 +970,7 @@ class RealTypeData3(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
@@ -1034,7 +1044,7 @@ class MMMMMMdataKind(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
@@ -1108,7 +1118,7 @@ class dataTypeNNNMNNN(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
diff --git a/tests/cleanupname2_sup.py b/tests/cleanupname2_sup.py
index 38b495b..9d3b8c8 100644
--- a/tests/cleanupname2_sup.py
+++ b/tests/cleanupname2_sup.py
@@ -34,6 +34,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -353,6 +357,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -407,7 +417,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -429,7 +439,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -812,7 +822,7 @@ class data1Kind(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
@@ -886,7 +896,7 @@ class MlassData2(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
@@ -960,7 +970,7 @@ class RealTypeData3(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
@@ -1034,7 +1044,7 @@ class MMMMMMdataKind(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
@@ -1108,7 +1118,7 @@ class dataTypeNNNMNNN(GeneratedsSuper):
             eol_ = ''
         if self.content1 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_format_string(quote_xml(self.content1).encode(ExternalEncoding), input_name='content1'), namespace_, eol_))
+            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)
diff --git a/tests/defaults_cases1_out.xml b/tests/defaults_cases1_out.xml
index e69de29..58064fb 100644
--- a/tests/defaults_cases1_out.xml
+++ 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
index ad19fc6..3e60267 100644
--- a/tests/defaults_cases1_sub.py
+++ b/tests/defaults_cases1_sub.py
@@ -6,7 +6,6 @@
 # Command line options:
 #   ('--no-dates', '')
 #   ('--no-versions', '')
-#   ('--silence', '')
 #   ('--member-specs', 'list')
 #   ('-f', '')
 #   ('-o', 'tests/defaults_cases2_sup.py')
@@ -17,7 +16,7 @@
 #   tests/defaults_cases.xsd
 #
 # Command line:
-#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/defaults_cases2_sup.py" -s "tests/defaults_cases2_sub.py" --super="defaults_cases2_sup" tests/defaults_cases.xsd
+#   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
@@ -89,12 +88,12 @@ def parse(inFilename, silence=False):
     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)
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
     return rootObj
 
 
@@ -113,12 +112,12 @@ def parseEtree(inFilename, silence=False):
     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')
+    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
 
 
@@ -135,11 +134,11 @@ def parseString(inString, silence=False):
     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_='')
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
     return rootObj
 
 
@@ -155,12 +154,12 @@ def parseLiteral(inFilename, silence=False):
     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')
+    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
 
 
diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py
index 3f73c5d..d9f5a13 100644
--- a/tests/defaults_cases1_sup.py
+++ b/tests/defaults_cases1_sup.py
@@ -7,7 +7,6 @@
 # Command line options:
 #   ('--no-dates', '')
 #   ('--no-versions', '')
-#   ('--silence', '')
 #   ('--member-specs', 'list')
 #   ('-f', '')
 #   ('-o', 'tests/defaults_cases2_sup.py')
@@ -18,7 +17,7 @@
 #   tests/defaults_cases.xsd
 #
 # Command line:
-#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/defaults_cases2_sup.py" -s "tests/defaults_cases2_sub.py" --super="defaults_cases2_sup" tests/defaults_cases.xsd
+#   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
@@ -33,6 +32,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +355,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +415,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +437,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -825,13 +834,13 @@ class DefaultType1(GeneratedsSuper):
             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_format_string(quote_xml(self.normal02).encode(ExternalEncoding), input_name='normal02'), namespace_, eol_))
+            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_format_string(quote_xml(self.default02).encode(ExternalEncoding), input_name='default02'), namespace_, eol_))
+            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_))
@@ -974,13 +983,13 @@ class DefaultType2(GeneratedsSuper):
     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_format_string(quote_attrib(self.attrdefault01).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.attrnormal01).encode(ExternalEncoding), input_name='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'))
@@ -1058,12 +1067,12 @@ def parse(inFileName, silence=False):
     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)
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
     return rootObj
 
 
@@ -1082,12 +1091,12 @@ def parseEtree(inFileName, silence=False):
     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')
+    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
 
 
@@ -1104,11 +1113,11 @@ def parseString(inString, silence=False):
     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_='')
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
     return rootObj
 
 
@@ -1124,12 +1133,12 @@ def parseLiteral(inFileName, silence=False):
     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')
+    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
 
 
diff --git a/tests/defaults_cases2_out.xml b/tests/defaults_cases2_out.xml
index e69de29..58064fb 100644
--- a/tests/defaults_cases2_out.xml
+++ b/tests/defaults_cases2_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_cases2_sub.py b/tests/defaults_cases2_sub.py
index ad19fc6..3e60267 100644
--- a/tests/defaults_cases2_sub.py
+++ b/tests/defaults_cases2_sub.py
@@ -6,7 +6,6 @@
 # Command line options:
 #   ('--no-dates', '')
 #   ('--no-versions', '')
-#   ('--silence', '')
 #   ('--member-specs', 'list')
 #   ('-f', '')
 #   ('-o', 'tests/defaults_cases2_sup.py')
@@ -17,7 +16,7 @@
 #   tests/defaults_cases.xsd
 #
 # Command line:
-#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/defaults_cases2_sup.py" -s "tests/defaults_cases2_sub.py" --super="defaults_cases2_sup" tests/defaults_cases.xsd
+#   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
@@ -89,12 +88,12 @@ def parse(inFilename, silence=False):
     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)
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
     return rootObj
 
 
@@ -113,12 +112,12 @@ def parseEtree(inFilename, silence=False):
     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')
+    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
 
 
@@ -135,11 +134,11 @@ def parseString(inString, silence=False):
     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_='')
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
     return rootObj
 
 
@@ -155,12 +154,12 @@ def parseLiteral(inFilename, silence=False):
     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')
+    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
 
 
diff --git a/tests/defaults_cases2_sup.py b/tests/defaults_cases2_sup.py
index 3f73c5d..d9f5a13 100644
--- a/tests/defaults_cases2_sup.py
+++ b/tests/defaults_cases2_sup.py
@@ -7,7 +7,6 @@
 # Command line options:
 #   ('--no-dates', '')
 #   ('--no-versions', '')
-#   ('--silence', '')
 #   ('--member-specs', 'list')
 #   ('-f', '')
 #   ('-o', 'tests/defaults_cases2_sup.py')
@@ -18,7 +17,7 @@
 #   tests/defaults_cases.xsd
 #
 # Command line:
-#   generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/defaults_cases2_sup.py" -s "tests/defaults_cases2_sub.py" --super="defaults_cases2_sup" tests/defaults_cases.xsd
+#   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
@@ -33,6 +32,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +355,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +415,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +437,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -825,13 +834,13 @@ class DefaultType1(GeneratedsSuper):
             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_format_string(quote_xml(self.normal02).encode(ExternalEncoding), input_name='normal02'), namespace_, eol_))
+            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_format_string(quote_xml(self.default02).encode(ExternalEncoding), input_name='default02'), namespace_, eol_))
+            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_))
@@ -974,13 +983,13 @@ class DefaultType2(GeneratedsSuper):
     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_format_string(quote_attrib(self.attrdefault01).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.attrnormal01).encode(ExternalEncoding), input_name='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'))
@@ -1058,12 +1067,12 @@ def parse(inFileName, silence=False):
     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)
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='',
+            pretty_print=True)
     return rootObj
 
 
@@ -1082,12 +1091,12 @@ def parseEtree(inFileName, silence=False):
     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')
+    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
 
 
@@ -1104,11 +1113,11 @@ def parseString(inString, silence=False):
     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_='')
+    if not silence:
+        sys.stdout.write('<?xml version="1.0" ?>\n')
+        rootObj.export(
+            sys.stdout, 0, name_=rootTag,
+            namespacedef_='')
     return rootObj
 
 
@@ -1124,12 +1133,12 @@ def parseLiteral(inFileName, silence=False):
     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')
+    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
 
 
diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py
index 8dac990..4cb45d6 100644
--- a/tests/defaults_coverage1_sup.py
+++ b/tests/defaults_coverage1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -754,32 +764,32 @@ class DefaultType1(GeneratedsSuper):
         self.default05a = default05a
         self.default05b = default05b
         self.normal05 = normal05
-        if isinstance(default06, basestring):
+        if isinstance(default06, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default06, '%Y-%m-%d').date()
         else:
             initvalue_ = default06
         self.default06 = initvalue_
-        if isinstance(normal06, basestring):
+        if isinstance(normal06, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal06, '%Y-%m-%d').date()
         else:
             initvalue_ = normal06
         self.normal06 = initvalue_
-        if isinstance(default07, basestring):
+        if isinstance(default07, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default07, '%H:%M:%S').time()
         else:
             initvalue_ = default07
         self.default07 = initvalue_
-        if isinstance(normal07, basestring):
+        if isinstance(normal07, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal07, '%Y-%m-%d').date()
         else:
             initvalue_ = normal07
         self.normal07 = initvalue_
-        if isinstance(default08, basestring):
+        if isinstance(default08, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default08, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = default08
         self.default08 = initvalue_
-        if isinstance(normal08, basestring):
+        if isinstance(normal08, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal08, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = normal08
@@ -885,10 +895,10 @@ class DefaultType1(GeneratedsSuper):
             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_format_string(quote_xml(self.default02).encode(ExternalEncoding), input_name='default02'), namespace_, eol_))
+            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_format_string(quote_xml(self.normal02).encode(ExternalEncoding), input_name='normal02'), namespace_, eol_))
+            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_))
@@ -1086,32 +1096,32 @@ class DefaultType2(GeneratedsSuper):
         self.default05a = default05a
         self.default05b = default05b
         self.normal05 = normal05
-        if isinstance(default06, basestring):
+        if isinstance(default06, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default06, '%Y-%m-%d').date()
         else:
             initvalue_ = default06
         self.default06 = initvalue_
-        if isinstance(normal06, basestring):
+        if isinstance(normal06, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal06, '%Y-%m-%d').date()
         else:
             initvalue_ = normal06
         self.normal06 = initvalue_
-        if isinstance(default07, basestring):
+        if isinstance(default07, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default07, '%H:%M:%S').time()
         else:
             initvalue_ = default07
         self.default07 = initvalue_
-        if isinstance(normal07, basestring):
+        if isinstance(normal07, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal07, '%Y-%m-%d').date()
         else:
             initvalue_ = normal07
         self.normal07 = initvalue_
-        if isinstance(default08, basestring):
+        if isinstance(default08, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default08, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = default08
         self.default08 = initvalue_
-        if isinstance(normal08, basestring):
+        if isinstance(normal08, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal08, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = normal08
@@ -1217,10 +1227,10 @@ class DefaultType2(GeneratedsSuper):
             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_format_string(quote_xml(self.default02).encode(ExternalEncoding), input_name='default02'), namespace_, eol_))
+            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_format_string(quote_xml(self.normal02).encode(ExternalEncoding), input_name='normal02'), namespace_, eol_))
+            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_))
diff --git a/tests/defaults_coverage2_sup.py b/tests/defaults_coverage2_sup.py
index 8dac990..4cb45d6 100644
--- a/tests/defaults_coverage2_sup.py
+++ b/tests/defaults_coverage2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -754,32 +764,32 @@ class DefaultType1(GeneratedsSuper):
         self.default05a = default05a
         self.default05b = default05b
         self.normal05 = normal05
-        if isinstance(default06, basestring):
+        if isinstance(default06, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default06, '%Y-%m-%d').date()
         else:
             initvalue_ = default06
         self.default06 = initvalue_
-        if isinstance(normal06, basestring):
+        if isinstance(normal06, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal06, '%Y-%m-%d').date()
         else:
             initvalue_ = normal06
         self.normal06 = initvalue_
-        if isinstance(default07, basestring):
+        if isinstance(default07, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default07, '%H:%M:%S').time()
         else:
             initvalue_ = default07
         self.default07 = initvalue_
-        if isinstance(normal07, basestring):
+        if isinstance(normal07, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal07, '%Y-%m-%d').date()
         else:
             initvalue_ = normal07
         self.normal07 = initvalue_
-        if isinstance(default08, basestring):
+        if isinstance(default08, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default08, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = default08
         self.default08 = initvalue_
-        if isinstance(normal08, basestring):
+        if isinstance(normal08, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal08, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = normal08
@@ -885,10 +895,10 @@ class DefaultType1(GeneratedsSuper):
             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_format_string(quote_xml(self.default02).encode(ExternalEncoding), input_name='default02'), namespace_, eol_))
+            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_format_string(quote_xml(self.normal02).encode(ExternalEncoding), input_name='normal02'), namespace_, eol_))
+            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_))
@@ -1086,32 +1096,32 @@ class DefaultType2(GeneratedsSuper):
         self.default05a = default05a
         self.default05b = default05b
         self.normal05 = normal05
-        if isinstance(default06, basestring):
+        if isinstance(default06, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default06, '%Y-%m-%d').date()
         else:
             initvalue_ = default06
         self.default06 = initvalue_
-        if isinstance(normal06, basestring):
+        if isinstance(normal06, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal06, '%Y-%m-%d').date()
         else:
             initvalue_ = normal06
         self.normal06 = initvalue_
-        if isinstance(default07, basestring):
+        if isinstance(default07, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default07, '%H:%M:%S').time()
         else:
             initvalue_ = default07
         self.default07 = initvalue_
-        if isinstance(normal07, basestring):
+        if isinstance(normal07, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal07, '%Y-%m-%d').date()
         else:
             initvalue_ = normal07
         self.normal07 = initvalue_
-        if isinstance(default08, basestring):
+        if isinstance(default08, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(default08, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = default08
         self.default08 = initvalue_
-        if isinstance(normal08, basestring):
+        if isinstance(normal08, BaseStrType_):
             initvalue_ = datetime_.datetime.strptime(normal08, '%Y-%m-%dT%H:%M:%S')
         else:
             initvalue_ = normal08
@@ -1217,10 +1227,10 @@ class DefaultType2(GeneratedsSuper):
             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_format_string(quote_xml(self.default02).encode(ExternalEncoding), input_name='default02'), namespace_, eol_))
+            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_format_string(quote_xml(self.normal02).encode(ExternalEncoding), input_name='normal02'), namespace_, eol_))
+            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_))
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index 896e1b3..1521f63 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -679,7 +689,7 @@ class SpecialDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='SpecialDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='SpecialDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -687,7 +697,7 @@ class SpecialDate(GeneratedsSuper):
     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 build(self, node):
@@ -754,7 +764,7 @@ class ExtremeDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='ExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='ExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -762,7 +772,7 @@ class ExtremeDate(GeneratedsSuper):
     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 build(self, node):
@@ -829,7 +839,7 @@ class singleExtremeDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='singleExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='singleExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -837,7 +847,7 @@ class singleExtremeDate(GeneratedsSuper):
     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 build(self, node):
@@ -1037,7 +1047,7 @@ 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_))
+            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)
@@ -1235,7 +1245,7 @@ class BaseType(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BaseType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='BaseType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1243,10 +1253,10 @@ class BaseType(GeneratedsSuper):
     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"')
@@ -1331,7 +1341,7 @@ class DerivedType(BaseType):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='DerivedType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='DerivedType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1340,10 +1350,10 @@ 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
@@ -1416,7 +1426,7 @@ class MyInteger(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyInteger')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='MyInteger', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1424,7 +1434,7 @@ class MyInteger(GeneratedsSuper):
     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 build(self, node):
@@ -1491,7 +1501,7 @@ class MyBoolean(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyBoolean')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='MyBoolean', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1499,7 +1509,7 @@ class MyBoolean(GeneratedsSuper):
     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 build(self, node):
@@ -1566,7 +1576,7 @@ class MyFloat(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyFloat')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='MyFloat', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1574,7 +1584,7 @@ class MyFloat(GeneratedsSuper):
     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 build(self, node):
@@ -1641,7 +1651,7 @@ class MyDouble(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyDouble')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='MyDouble', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1649,7 +1659,7 @@ class MyDouble(GeneratedsSuper):
     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 build(self, node):
diff --git a/tests/extensions2_sup.py b/tests/extensions2_sup.py
index 896e1b3..1521f63 100644
--- a/tests/extensions2_sup.py
+++ b/tests/extensions2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -679,7 +689,7 @@ class SpecialDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='SpecialDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='SpecialDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -687,7 +697,7 @@ class SpecialDate(GeneratedsSuper):
     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 build(self, node):
@@ -754,7 +764,7 @@ class ExtremeDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='ExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='ExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -762,7 +772,7 @@ class ExtremeDate(GeneratedsSuper):
     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 build(self, node):
@@ -829,7 +839,7 @@ class singleExtremeDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='singleExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='singleExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -837,7 +847,7 @@ class singleExtremeDate(GeneratedsSuper):
     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 build(self, node):
@@ -1037,7 +1047,7 @@ 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_))
+            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)
@@ -1235,7 +1245,7 @@ class BaseType(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BaseType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='BaseType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1243,10 +1253,10 @@ class BaseType(GeneratedsSuper):
     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"')
@@ -1331,7 +1341,7 @@ class DerivedType(BaseType):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='DerivedType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='DerivedType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1340,10 +1350,10 @@ 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
@@ -1416,7 +1426,7 @@ class MyInteger(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyInteger')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='MyInteger', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1424,7 +1434,7 @@ class MyInteger(GeneratedsSuper):
     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 build(self, node):
@@ -1491,7 +1501,7 @@ class MyBoolean(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyBoolean')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='MyBoolean', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1499,7 +1509,7 @@ class MyBoolean(GeneratedsSuper):
     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 build(self, node):
@@ -1566,7 +1576,7 @@ class MyFloat(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyFloat')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='MyFloat', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1574,7 +1584,7 @@ class MyFloat(GeneratedsSuper):
     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 build(self, node):
@@ -1641,7 +1651,7 @@ class MyDouble(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyDouble')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='MyDouble', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1649,7 +1659,7 @@ class MyDouble(GeneratedsSuper):
     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 build(self, node):
diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py
index 1903d38..f156ff5 100644
--- a/tests/mapcleanname1_sup.py
+++ b/tests/mapcleanname1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -710,7 +720,7 @@ class complex_type01(GeneratedsSuper):
             eol_ = ''
         if self.string_value01 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value01>%s</%sstring_value01>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value01).encode(ExternalEncoding), input_name='string_value01'), namespace_, eol_))
+            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_))
@@ -836,7 +846,7 @@ class complex_type02(GeneratedsSuper):
             eol_ = ''
         if self.string_value02 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_))
+            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_))
@@ -954,7 +964,7 @@ class complex_type03(complex_type02):
             eol_ = ''
         if self.string_value03 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_))
+            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_))
@@ -1074,7 +1084,7 @@ class type_(GeneratedsSuper):
             eol_ = ''
         if self.string_value02 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_))
+            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_))
@@ -1192,7 +1202,7 @@ class complex_type04(type_):
             eol_ = ''
         if self.string_value03 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_))
+            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_))
@@ -1312,7 +1322,7 @@ class build_(GeneratedsSuper):
             eol_ = ''
         if self.string_value02 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_))
+            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_))
@@ -1430,7 +1440,7 @@ class complex_type05(build_):
             eol_ = ''
         if self.string_value03 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_))
+            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_))
diff --git a/tests/mapcleanname2_sup.py b/tests/mapcleanname2_sup.py
index 1903d38..f156ff5 100644
--- a/tests/mapcleanname2_sup.py
+++ b/tests/mapcleanname2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -710,7 +720,7 @@ class complex_type01(GeneratedsSuper):
             eol_ = ''
         if self.string_value01 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value01>%s</%sstring_value01>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value01).encode(ExternalEncoding), input_name='string_value01'), namespace_, eol_))
+            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_))
@@ -836,7 +846,7 @@ class complex_type02(GeneratedsSuper):
             eol_ = ''
         if self.string_value02 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_))
+            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_))
@@ -954,7 +964,7 @@ class complex_type03(complex_type02):
             eol_ = ''
         if self.string_value03 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_))
+            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_))
@@ -1074,7 +1084,7 @@ class type_(GeneratedsSuper):
             eol_ = ''
         if self.string_value02 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_))
+            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_))
@@ -1192,7 +1202,7 @@ class complex_type04(type_):
             eol_ = ''
         if self.string_value03 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_))
+            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_))
@@ -1312,7 +1322,7 @@ class build_(GeneratedsSuper):
             eol_ = ''
         if self.string_value02 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_))
+            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_))
@@ -1430,7 +1440,7 @@ class complex_type05(build_):
             eol_ = ''
         if self.string_value03 is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_))
+            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_))
diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py
index 901d61a..a5060b8 100644
--- a/tests/nested_def1_sup.py
+++ b/tests/nested_def1_sup.py
@@ -32,6 +32,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -351,6 +355,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -405,7 +415,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -427,7 +437,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -919,10 +929,10 @@ class inner_001(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='inner_001'):
         if self.attrA1 is not None and 'attrA1' not in already_processed:
             already_processed.add('attrA1')
-            outfile.write(' attrA1=%s' % (self.gds_format_string(quote_attrib(self.attrA1).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.attrA2).encode(ExternalEncoding), input_name='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_='inner_001', fromsubclass_=False, pretty_print=True):
         pass
     def build(self, node):
@@ -999,10 +1009,10 @@ class inner_002(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='inner_002'):
         if self.attrB1 is not None and 'attrB1' not in already_processed:
             already_processed.add('attrB1')
-            outfile.write(' attrB1=%s' % (self.gds_format_string(quote_attrib(self.attrB1).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.attrB2).encode(ExternalEncoding), input_name='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_='inner_002', fromsubclass_=False, pretty_print=True):
         pass
     def build(self, node):
diff --git a/tests/nested_def2_sup.py b/tests/nested_def2_sup.py
index 901d61a..a5060b8 100644
--- a/tests/nested_def2_sup.py
+++ b/tests/nested_def2_sup.py
@@ -32,6 +32,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -351,6 +355,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -405,7 +415,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -427,7 +437,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -919,10 +929,10 @@ class inner_001(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='inner_001'):
         if self.attrA1 is not None and 'attrA1' not in already_processed:
             already_processed.add('attrA1')
-            outfile.write(' attrA1=%s' % (self.gds_format_string(quote_attrib(self.attrA1).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.attrA2).encode(ExternalEncoding), input_name='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_='inner_001', fromsubclass_=False, pretty_print=True):
         pass
     def build(self, node):
@@ -999,10 +1009,10 @@ class inner_002(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='inner_002'):
         if self.attrB1 is not None and 'attrB1' not in already_processed:
             already_processed.add('attrB1')
-            outfile.write(' attrB1=%s' % (self.gds_format_string(quote_attrib(self.attrB1).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.attrB2).encode(ExternalEncoding), input_name='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_='inner_002', fromsubclass_=False, pretty_print=True):
         pass
     def build(self, node):
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index 6f52bae..c3ecddf 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -1187,7 +1197,7 @@ class person(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
         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'), ))
+            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'))
@@ -1196,10 +1206,10 @@ class person(GeneratedsSuper):
             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_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='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"')
@@ -1211,10 +1221,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_))
@@ -1224,7 +1234,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()
@@ -1255,13 +1265,13 @@ class person(GeneratedsSuper):
     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')
@@ -1294,7 +1304,7 @@ 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)
@@ -1450,12 +1460,12 @@ class programmer(person):
         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
@@ -1569,10 +1579,10 @@ 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'), ))
+            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'))
@@ -1597,7 +1607,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_))
@@ -1618,7 +1628,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_))
@@ -1629,7 +1639,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()
@@ -1666,7 +1676,7 @@ class programmer(person):
         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)
@@ -1687,7 +1697,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)
@@ -1702,7 +1712,7 @@ 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)
@@ -1963,7 +1973,7 @@ class param(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1971,7 +1981,7 @@ class param(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
         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(' 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), ))
@@ -1983,10 +1993,10 @@ class param(GeneratedsSuper):
             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_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='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'), ))
+            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'):
@@ -2166,7 +2176,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:
@@ -2175,7 +2185,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()
@@ -2192,7 +2202,7 @@ 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)
@@ -2322,10 +2332,10 @@ class java_programmer(programmer):
         super(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_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='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:
@@ -2334,7 +2344,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()
@@ -2355,7 +2365,7 @@ class java_programmer(programmer):
         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)
@@ -2499,10 +2509,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_))
@@ -2519,10 +2529,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)
@@ -2683,10 +2693,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_))
@@ -2703,10 +2713,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)
@@ -2900,10 +2910,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_))
@@ -2929,10 +2939,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)
@@ -3130,7 +3140,7 @@ class info(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
         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'), ))
+            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'))
@@ -3298,7 +3308,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_))
@@ -3313,7 +3323,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)
diff --git a/tests/out2_sup.py b/tests/out2_sup.py
index 6f52bae..c3ecddf 100644
--- a/tests/out2_sup.py
+++ b/tests/out2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -1187,7 +1197,7 @@ class person(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
         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'), ))
+            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'))
@@ -1196,10 +1206,10 @@ class person(GeneratedsSuper):
             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_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='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"')
@@ -1211,10 +1221,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_))
@@ -1224,7 +1234,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()
@@ -1255,13 +1265,13 @@ class person(GeneratedsSuper):
     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')
@@ -1294,7 +1304,7 @@ 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)
@@ -1450,12 +1460,12 @@ class programmer(person):
         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
@@ -1569,10 +1579,10 @@ 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'), ))
+            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'))
@@ -1597,7 +1607,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_))
@@ -1618,7 +1628,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_))
@@ -1629,7 +1639,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()
@@ -1666,7 +1676,7 @@ class programmer(person):
         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)
@@ -1687,7 +1697,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)
@@ -1702,7 +1712,7 @@ 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)
@@ -1963,7 +1973,7 @@ class param(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1971,7 +1981,7 @@ class param(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
         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(' 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), ))
@@ -1983,10 +1993,10 @@ class param(GeneratedsSuper):
             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_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='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'), ))
+            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'):
@@ -2166,7 +2176,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:
@@ -2175,7 +2185,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()
@@ -2192,7 +2202,7 @@ 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)
@@ -2322,10 +2332,10 @@ class java_programmer(programmer):
         super(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_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='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:
@@ -2334,7 +2344,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()
@@ -2355,7 +2365,7 @@ class java_programmer(programmer):
         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)
@@ -2499,10 +2509,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_))
@@ -2519,10 +2529,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)
@@ -2683,10 +2693,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_))
@@ -2703,10 +2713,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)
@@ -2900,10 +2910,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_))
@@ -2929,10 +2939,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)
@@ -3130,7 +3140,7 @@ class info(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
         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'), ))
+            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'))
@@ -3298,7 +3308,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_))
@@ -3313,7 +3323,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)
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index c07c2f4..979c550 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -1041,7 +1051,7 @@ class person(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
         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'), ))
+            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'))
@@ -1050,10 +1060,10 @@ class person(GeneratedsSuper):
             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_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='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"')
@@ -1065,10 +1075,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_))
@@ -1078,7 +1088,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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1282,7 +1292,7 @@ class param(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1290,7 +1300,7 @@ class param(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
         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(' 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), ))
@@ -1302,10 +1312,10 @@ class param(GeneratedsSuper):
             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_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='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'), ))
+            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):
@@ -1429,10 +1439,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_))
@@ -1566,10 +1576,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_))
@@ -1711,7 +1721,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'
@@ -1719,10 +1729,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_))
@@ -1855,7 +1865,7 @@ class info(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
         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'), ))
+            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'))
@@ -2042,7 +2052,7 @@ 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_))
+            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)
@@ -2120,7 +2130,7 @@ 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_))
+            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)
@@ -2177,7 +2187,7 @@ class programmer(person):
         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
@@ -2288,10 +2298,10 @@ 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'), ))
+            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'))
@@ -2316,7 +2326,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_))
@@ -2334,7 +2344,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_))
@@ -2345,7 +2355,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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -2549,7 +2559,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_))
@@ -2642,10 +2652,10 @@ class java_programmer(programmer):
         super(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_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='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:
@@ -2654,7 +2664,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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -2740,7 +2750,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:
@@ -2749,7 +2759,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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
diff --git a/tests/people_procincl2_sup.py b/tests/people_procincl2_sup.py
index c07c2f4..979c550 100644
--- a/tests/people_procincl2_sup.py
+++ b/tests/people_procincl2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -1041,7 +1051,7 @@ class person(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
         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'), ))
+            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'))
@@ -1050,10 +1060,10 @@ class person(GeneratedsSuper):
             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_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='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"')
@@ -1065,10 +1075,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_))
@@ -1078,7 +1088,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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1282,7 +1292,7 @@ class param(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1290,7 +1300,7 @@ class param(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
         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(' 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), ))
@@ -1302,10 +1312,10 @@ class param(GeneratedsSuper):
             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_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='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'), ))
+            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):
@@ -1429,10 +1439,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_))
@@ -1566,10 +1576,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_))
@@ -1711,7 +1721,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'
@@ -1719,10 +1729,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_))
@@ -1855,7 +1865,7 @@ class info(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
         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'), ))
+            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'))
@@ -2042,7 +2052,7 @@ 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_))
+            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)
@@ -2120,7 +2130,7 @@ 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_))
+            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)
@@ -2177,7 +2187,7 @@ class programmer(person):
         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
@@ -2288,10 +2298,10 @@ 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'), ))
+            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'))
@@ -2316,7 +2326,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_))
@@ -2334,7 +2344,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_))
@@ -2345,7 +2355,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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -2549,7 +2559,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_))
@@ -2642,10 +2652,10 @@ class java_programmer(programmer):
         super(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_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='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:
@@ -2654,7 +2664,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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -2740,7 +2750,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:
@@ -2749,7 +2759,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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py
index d607f86..8c09004 100644
--- a/tests/prefix_classname1_sup.py
+++ b/tests/prefix_classname1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -1003,7 +1013,7 @@ class tomato_person(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
         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'), ))
+            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'))
@@ -1012,10 +1022,10 @@ class tomato_person(GeneratedsSuper):
             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_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='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"')
@@ -1027,10 +1037,10 @@ class tomato_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_))
@@ -1040,7 +1050,7 @@ class tomato_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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1150,12 +1160,12 @@ class tomato_programmer(tomato_person):
         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
@@ -1269,10 +1279,10 @@ class tomato_programmer(tomato_person):
         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'), ))
+            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'))
@@ -1297,7 +1307,7 @@ class tomato_programmer(tomato_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_))
@@ -1318,7 +1328,7 @@ class tomato_programmer(tomato_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_))
@@ -1329,7 +1339,7 @@ class tomato_programmer(tomato_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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1544,7 +1554,7 @@ class tomato_param(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1552,7 +1562,7 @@ class tomato_param(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
         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(' 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), ))
@@ -1564,10 +1574,10 @@ class tomato_param(GeneratedsSuper):
             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_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='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'), ))
+            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):
@@ -1666,7 +1676,7 @@ class tomato_python_programmer(tomato_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(tomato_python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
@@ -1675,7 +1685,7 @@ class tomato_python_programmer(tomato_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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1759,10 +1769,10 @@ class tomato_java_programmer(tomato_programmer):
         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_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='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(tomato_java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
@@ -1771,7 +1781,7 @@ class tomato_java_programmer(tomato_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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1869,10 +1879,10 @@ class tomato_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_))
@@ -1983,10 +1993,10 @@ class tomato_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_))
@@ -2130,10 +2140,10 @@ class tomato_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_))
@@ -2263,7 +2273,7 @@ class tomato_info(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
         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'), ))
+            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'))
@@ -2364,7 +2374,7 @@ class tomato_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_))
diff --git a/tests/prefix_classname2_sup.py b/tests/prefix_classname2_sup.py
index d607f86..8c09004 100644
--- a/tests/prefix_classname2_sup.py
+++ b/tests/prefix_classname2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -1003,7 +1013,7 @@ class tomato_person(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'):
         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'), ))
+            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'))
@@ -1012,10 +1022,10 @@ class tomato_person(GeneratedsSuper):
             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_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='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"')
@@ -1027,10 +1037,10 @@ class tomato_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_))
@@ -1040,7 +1050,7 @@ class tomato_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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1150,12 +1160,12 @@ class tomato_programmer(tomato_person):
         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
@@ -1269,10 +1279,10 @@ class tomato_programmer(tomato_person):
         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'), ))
+            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'))
@@ -1297,7 +1307,7 @@ class tomato_programmer(tomato_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_))
@@ -1318,7 +1328,7 @@ class tomato_programmer(tomato_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_))
@@ -1329,7 +1339,7 @@ class tomato_programmer(tomato_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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1544,7 +1554,7 @@ class tomato_param(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='param')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='param', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -1552,7 +1562,7 @@ class tomato_param(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'):
         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(' 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), ))
@@ -1564,10 +1574,10 @@ class tomato_param(GeneratedsSuper):
             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_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='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'), ))
+            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):
@@ -1666,7 +1676,7 @@ class tomato_python_programmer(tomato_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(tomato_python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
@@ -1675,7 +1685,7 @@ class tomato_python_programmer(tomato_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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1759,10 +1769,10 @@ class tomato_java_programmer(tomato_programmer):
         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_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='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(tomato_java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print)
         if pretty_print:
@@ -1771,7 +1781,7 @@ class tomato_java_programmer(tomato_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 build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -1869,10 +1879,10 @@ class tomato_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_))
@@ -1983,10 +1993,10 @@ class tomato_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_))
@@ -2130,10 +2140,10 @@ class tomato_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_))
@@ -2263,7 +2273,7 @@ class tomato_info(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'):
         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'), ))
+            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'))
@@ -2364,7 +2374,7 @@ class tomato_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_))
diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py
index f1a56ef..4929b8e 100644
--- a/tests/recursive_simpletype1_sup.py
+++ b/tests/recursive_simpletype1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -702,10 +712,10 @@ 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_))
+            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)
diff --git a/tests/recursive_simpletype2_sup.py b/tests/recursive_simpletype2_sup.py
index f1a56ef..4929b8e 100644
--- a/tests/recursive_simpletype2_sup.py
+++ b/tests/recursive_simpletype2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -702,10 +712,10 @@ 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_))
+            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)
diff --git a/tests/reference_simpletype1_sup.py b/tests/reference_simpletype1_sup.py
index bf3d907..ab1f084 100644
--- a/tests/reference_simpletype1_sup.py
+++ b/tests/reference_simpletype1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
diff --git a/tests/reference_simpletype2_sup.py b/tests/reference_simpletype2_sup.py
index bf3d907..ab1f084 100644
--- a/tests/reference_simpletype2_sup.py
+++ b/tests/reference_simpletype2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py
index f069bc6..5cd34d3 100644
--- a/tests/simplecontent_restriction1_sup.py
+++ b/tests/simplecontent_restriction1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -706,7 +716,7 @@ class IdentifierType(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='IdentifierType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='IdentifierType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -714,25 +724,25 @@ class IdentifierType(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='IdentifierType'):
         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'), ))
+            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_format_string(quote_attrib(self.schemeAgencyID).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.schemeAgencyName).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.schemeDataURI).encode(ExternalEncoding), input_name='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"')
@@ -829,7 +839,7 @@ class BillOfResourcesIDType(IdentifierType):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BillOfResourcesIDType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='BillOfResourcesIDType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -898,7 +908,7 @@ class BillOfMaterialIDType(IdentifierType):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BillOfMaterialIDType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='BillOfMaterialIDType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
diff --git a/tests/simplecontent_restriction2_sup.py b/tests/simplecontent_restriction2_sup.py
index f069bc6..5cd34d3 100644
--- a/tests/simplecontent_restriction2_sup.py
+++ b/tests/simplecontent_restriction2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -706,7 +716,7 @@ class IdentifierType(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='IdentifierType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='IdentifierType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -714,25 +724,25 @@ class IdentifierType(GeneratedsSuper):
     def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='IdentifierType'):
         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'), ))
+            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_format_string(quote_attrib(self.schemeAgencyID).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.schemeAgencyName).encode(ExternalEncoding), input_name='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_format_string(quote_attrib(self.schemeDataURI).encode(ExternalEncoding), input_name='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"')
@@ -829,7 +839,7 @@ class BillOfResourcesIDType(IdentifierType):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BillOfResourcesIDType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='BillOfResourcesIDType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -898,7 +908,7 @@ class BillOfMaterialIDType(IdentifierType):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='BillOfMaterialIDType')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='BillOfMaterialIDType', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index 85d473d..5fc9d99 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -679,7 +689,7 @@ class SpecialDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='SpecialDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='pl:', name_='SpecialDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -687,7 +697,7 @@ class SpecialDate(GeneratedsSuper):
     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 build(self, node):
@@ -754,7 +764,7 @@ class ExtremeDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='ExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='pl:', name_='ExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -762,7 +772,7 @@ class ExtremeDate(GeneratedsSuper):
     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 build(self, node):
diff --git a/tests/simpletype_memberspecs2_sup.py b/tests/simpletype_memberspecs2_sup.py
index 85d473d..5fc9d99 100644
--- a/tests/simpletype_memberspecs2_sup.py
+++ b/tests/simpletype_memberspecs2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -679,7 +689,7 @@ class SpecialDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='SpecialDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='pl:', name_='SpecialDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -687,7 +697,7 @@ class SpecialDate(GeneratedsSuper):
     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 build(self, node):
@@ -754,7 +764,7 @@ class ExtremeDate(GeneratedsSuper):
         self.exportAttributes(outfile, level, already_processed, namespace_, name_='ExtremeDate')
         if self.hasContent_():
             outfile.write('>')
-            outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else str(self.valueOf_)).encode(ExternalEncoding))
+            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_='pl:', name_='ExtremeDate', pretty_print=pretty_print)
             outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
         else:
@@ -762,7 +772,7 @@ class ExtremeDate(GeneratedsSuper):
     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 build(self, node):
diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py
index b12e1b9..0d25aff 100644
--- a/tests/simpletypes_other1_sup.py
+++ b/tests/simpletypes_other1_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -695,7 +705,7 @@ class simpleTypeTestsType(GeneratedsSuper):
             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_))
+            outfile.write('<%ssimpleTypeTest>%s</%ssimpleTypeTest>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(simpleTypeTest_), input_name='simpleTypeTest')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -776,7 +786,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
@@ -785,7 +795,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
@@ -925,19 +935,19 @@ class simpleTypeTest(GeneratedsSuper):
             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_))
@@ -946,10 +956,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_))
diff --git a/tests/simpletypes_other2_sup.py b/tests/simpletypes_other2_sup.py
index b12e1b9..0d25aff 100644
--- a/tests/simpletypes_other2_sup.py
+++ b/tests/simpletypes_other2_sup.py
@@ -33,6 +33,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -352,6 +356,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -406,7 +416,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -428,7 +438,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -695,7 +705,7 @@ class simpleTypeTestsType(GeneratedsSuper):
             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_))
+            outfile.write('<%ssimpleTypeTest>%s</%ssimpleTypeTest>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(simpleTypeTest_), input_name='simpleTypeTest')), namespace_, eol_))
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -776,7 +786,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
@@ -785,7 +795,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
@@ -925,19 +935,19 @@ class simpleTypeTest(GeneratedsSuper):
             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_))
@@ -946,10 +956,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_))
diff --git a/tests/test.py b/tests/test.py
index 2a91d75..64df9a0 100755
--- a/tests/test.py
+++ b/tests/test.py
@@ -657,7 +657,7 @@ class GenTest(unittest.TestCase):
     def test_029_defaults_cases(self):
         cmdTempl = (
             'python generateDS.py --no-dates --no-versions '
-            '--silence --member-specs=list -f '
+            '--member-specs=list -f '
             '-o tests/%s2_sup.py -s tests/%s2_sub.py '
             '--super=%s2_sup '
             'tests/%s.xsd'
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index b513bbb..c697e58 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -35,6 +35,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -354,6 +358,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -408,7 +418,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -430,7 +440,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -1215,17 +1225,17 @@ class programmerType(personType):
         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
@@ -2688,7 +2698,7 @@ class hot_agent(GeneratedsSuper):
         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
diff --git a/tests/to_etree2_sup.py b/tests/to_etree2_sup.py
index b513bbb..c697e58 100644
--- a/tests/to_etree2_sup.py
+++ b/tests/to_etree2_sup.py
@@ -35,6 +35,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -354,6 +358,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -408,7 +418,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -430,7 +440,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -1215,17 +1225,17 @@ class programmerType(personType):
         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
@@ -2688,7 +2698,7 @@ class hot_agent(GeneratedsSuper):
         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
diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py
index 03eb674..30547aa 100644
--- a/tests/validate_simpletypes1_sup.py
+++ b/tests/validate_simpletypes1_sup.py
@@ -32,6 +32,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -351,6 +355,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -405,7 +415,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -427,7 +437,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -974,13 +984,13 @@ class simpleOneType(GeneratedsSuper):
             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_format_string(quote_xml(self.pattern_value).encode(ExternalEncoding), input_name='pattern_value'), namespace_, eol_))
+            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_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), input_name='token_enum_value'), namespace_, eol_))
+            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.token_enum_value is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), input_name='token_enum_value'), namespace_, eol_))
+            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_))
@@ -989,10 +999,10 @@ class simpleOneType(GeneratedsSuper):
             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_format_string(quote_xml(self.min_max_length_value).encode(ExternalEncoding), input_name='min_max_length_value'), namespace_, eol_))
+            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_format_string(quote_xml(self.length_value).encode(ExternalEncoding), input_name='length_value'), namespace_, eol_))
+            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_))
@@ -1252,7 +1262,7 @@ class simpleTwoElementOneType(GeneratedsSuper):
             eol_ = ''
         if self.simpleTwoElementTwo is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%ssimpleTwoElementTwo>%s</%ssimpleTwoElementTwo>%s' % (namespace_, self.gds_format_string(quote_xml(self.simpleTwoElementTwo).encode(ExternalEncoding), input_name='simpleTwoElementTwo'), namespace_, eol_))
+            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)
diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt
index 243afed..a6a01c2 100644
--- a/tests/validate_simpletypes1_warnings.txt
+++ b/tests/validate_simpletypes1_warnings.txt
@@ -1,34 +1,34 @@
-tests/validate_simpletypes2_sup.py:867: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:877: 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:877: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:887: 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:890: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
+tests/validate_simpletypes2_sup.py:900: 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:897: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:907: 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:902: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
+tests/validate_simpletypes2_sup.py:912: 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:911: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:921: 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:916: UserWarning: Value "012345" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:926: 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:926: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:936: 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:869: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:879: 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:877: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:887: 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:895: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:905: 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:909: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:919: 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:916: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:926: 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:928: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:938: 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:874: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st
+tests/validate_simpletypes2_sup.py:884: 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:877: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:887: 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:1220: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
+tests/validate_simpletypes2_sup.py:1230: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py
index 03eb674..30547aa 100644
--- a/tests/validate_simpletypes2_sup.py
+++ b/tests/validate_simpletypes2_sup.py
@@ -32,6 +32,10 @@ from lxml import etree as etree_
 
 
 Validate_simpletypes_ = True
+if sys.version_info.major == 2:
+    BaseStrType_ = basestring
+else:
+    BaseStrType_ = str
 
 
 def parsexml_(infile, parser=None, **kwargs):
@@ -351,6 +355,12 @@ except ImportError as 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
 
     def getSubclassFromModule_(module, class_):
         '''Get the subclass of a class from a specific module.'''
@@ -405,7 +415,7 @@ 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 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)
     s2 = ''
     pos = 0
     matchobjects = CDATA_pattern_.finditer(s1)
@@ -427,7 +437,7 @@ def quote_xml_aux(inStr):
 
 
 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;')
@@ -974,13 +984,13 @@ class simpleOneType(GeneratedsSuper):
             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_format_string(quote_xml(self.pattern_value).encode(ExternalEncoding), input_name='pattern_value'), namespace_, eol_))
+            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_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), input_name='token_enum_value'), namespace_, eol_))
+            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.token_enum_value is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), input_name='token_enum_value'), namespace_, eol_))
+            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_))
@@ -989,10 +999,10 @@ class simpleOneType(GeneratedsSuper):
             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_format_string(quote_xml(self.min_max_length_value).encode(ExternalEncoding), input_name='min_max_length_value'), namespace_, eol_))
+            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_format_string(quote_xml(self.length_value).encode(ExternalEncoding), input_name='length_value'), namespace_, eol_))
+            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_))
@@ -1252,7 +1262,7 @@ class simpleTwoElementOneType(GeneratedsSuper):
             eol_ = ''
         if self.simpleTwoElementTwo is not None:
             showIndent(outfile, level, pretty_print)
-            outfile.write('<%ssimpleTwoElementTwo>%s</%ssimpleTwoElementTwo>%s' % (namespace_, self.gds_format_string(quote_xml(self.simpleTwoElementTwo).encode(ExternalEncoding), input_name='simpleTwoElementTwo'), namespace_, eol_))
+            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)
diff --git a/tests/validate_simpletypes2_warnings.txt b/tests/validate_simpletypes2_warnings.txt
index 243afed..a6a01c2 100644
--- a/tests/validate_simpletypes2_warnings.txt
+++ b/tests/validate_simpletypes2_warnings.txt
@@ -1,34 +1,34 @@
-tests/validate_simpletypes2_sup.py:867: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:877: 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:877: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:887: 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:890: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
+tests/validate_simpletypes2_sup.py:900: 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:897: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:907: 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:902: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
+tests/validate_simpletypes2_sup.py:912: 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:911: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:921: 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:916: UserWarning: Value "012345" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:926: 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:926: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:936: 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:869: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:879: 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:877: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:887: 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:895: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:905: 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:909: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:919: 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:916: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:926: 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:928: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:938: 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:874: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st
+tests/validate_simpletypes2_sup.py:884: 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:877: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']]
+tests/validate_simpletypes2_sup.py:887: 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:1220: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
+tests/validate_simpletypes2_sup.py:1230: 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/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index fc9f849..22ee4cc 100644
--- a/tutorial/generateds_tutorial.html
+++ b/tutorial/generateds_tutorial.html
@@ -219,7 +219,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.18a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.19a</td>
 </tr>
 </tbody>
 </table>
@@ -228,7 +228,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">December 16, 2015</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">February 08, 2016</td>
 </tr>
 </tbody>
 </table>
@@ -1210,7 +1210,7 @@ named <tt class="docutils literal">garden_api.py</tt>, you can create an instanc
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateds_tutorial.txt">View document source</a>.
-Generated on: 2015-12-16 20:55 UTC.
+Generated on: 2016-02-08 18:02 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.zip b/tutorial/generateds_tutorial.zip
index 7c6fdd6a07d61e2adbceea14687cf1481b23ffa9..4d95f7ed52838130fc7596ee8b3d3f2c351bf979 100644
GIT binary patch
delta 11980
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

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

-- 
GitLab