diff --git a/README.rst b/README.rst
index cc072c496afa7019105dd23e7881331d1599dc25..80b1b68681d50f7501615f37372edc00cc00010b 100644
--- a/README.rst
+++ b/README.rst
@@ -141,6 +141,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.29.2 (12/07/2017)
+
+- Fix for use of StringIO in generated subclass modules.  Thanks to
+  Rohan Dsa for alerting me on this.
+
 Version 2.29.1 (12/07/2017)
 
 - Fix to generation of code to export child elements that have
diff --git a/generateDS.py b/generateDS.py
index 2e7a2ff7fd61fcced02955e9b8dca10cad9d0856..748f6686901f15c40cbdbc0e2b76b21dd1f6a764 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -229,7 +229,7 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.1'
+VERSION = '2.29.2'
 ##VERSION##
 
 BaseStrTypes = six.string_types
@@ -6337,7 +6337,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
 %(preserve_cdata_tags)s    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
diff --git a/generateDS.txt b/generateDS.txt
index 46bbdf0be11fe600fae971c28c3815f8b34bfb7d..42c14936e959f65ae3c4b3821f0152a5e262b679 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.29.1
+:revision: 2.29.2
 
 .. version
 
diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt
index 0c0919db9a3ba009fd3f3e3f2deaa5587ea8caa7..d4a8e613b86fb68e3085c8810233d74ff0d5ef2f 100644
--- a/generateds_gui_notes.txt
+++ b/generateds_gui_notes.txt
@@ -12,7 +12,7 @@ GenerateDS GUI Notes
 
 .. version
 
-:revision: 2.29.1
+:revision: 2.29.2
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index 6d96b4accfe9ec24de7f9d33b569d8127bbeccd8..ff91ffd95e51d7e6623f95869783c5573860fbac 100644
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -41,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.1'
+VERSION = '2.29.2'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index 6caf9015b29445cbe975e75c290de99d4f75e01f..f10f55e332cec74a69cb9ebf780ea70b134e3e57 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.29.1
+:revision: 2.29.2
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 734d6a0af178123f320bdac3a8f8a0620e278c75..08ee2c88fb77d13fca04cb7f650113e2e16d76fa 100644
--- a/process_includes.py
+++ b/process_includes.py
@@ -40,7 +40,7 @@ except ImportError:
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.1'
+VERSION = '2.29.2'
 ##VERSION##
 
 CatalogDict = {}
diff --git a/setup.py b/setup.py
index 98670f662d4135640f5f1645c66bb5d79979e42f..1eb1c68004784fb0fe9facce2864dff93c492940 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ setup(name="generateDS",
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.29.1",
+    version="2.29.2",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/abstract_type1_sub.py b/tests/abstract_type1_sub.py
index 3a5a98a6d18a6a72bc6f2fccc63cf1748066eb01..51ec544b14b1f8f3e472efcfef0d5abcdc6bb2e3 100644
--- a/tests/abstract_type1_sub.py
+++ b/tests/abstract_type1_sub.py
@@ -131,7 +131,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/annotations1_sub.py b/tests/annotations1_sub.py
index a3b9f139d94f624aa73f20d404d301ab493cf035..fc1467f25b4c611c8682febc4572a508bd4867d5 100644
--- a/tests/annotations1_sub.py
+++ b/tests/annotations1_sub.py
@@ -124,7 +124,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/anonymous_type1_sub.py b/tests/anonymous_type1_sub.py
index 3785a39ef1649da098afaa5b42462b4b0893d252..cc15886f3d8fc3dd97acfd7bf709d85bda59870e 100644
--- a/tests/anonymous_type1_sub.py
+++ b/tests/anonymous_type1_sub.py
@@ -131,7 +131,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/anysimpletype1_sub.py b/tests/anysimpletype1_sub.py
index 172c67803990180213e7776af6c7449166d9c416..2f6bcb37bc2d9fa83d36ceee1ca2406b7fec2b84 100644
--- a/tests/anysimpletype1_sub.py
+++ b/tests/anysimpletype1_sub.py
@@ -117,7 +117,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/anywildcard1_sub.py b/tests/anywildcard1_sub.py
index 1c7ca20cf220081ebf2fc153428f7da0ff5ce049..84897dd49ea0ab380bd0b1ee47c932ea3aa1a25f 100644
--- a/tests/anywildcard1_sub.py
+++ b/tests/anywildcard1_sub.py
@@ -145,7 +145,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/attr_groups1_sub.py b/tests/attr_groups1_sub.py
index 1dbf96472d0a47248da0dfdfc5216399b2bdc689..b5627f9b9e48b947b6e00a2434855cd599353827 100644
--- a/tests/attr_groups1_sub.py
+++ b/tests/attr_groups1_sub.py
@@ -110,7 +110,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/catalogtest1_sub.py b/tests/catalogtest1_sub.py
index d72941cfec280f1f542a8f745f93c169a34b59de..5789ad737ede7e4ec463d3a18f61e9716ef349da 100644
--- a/tests/catalogtest1_sub.py
+++ b/tests/catalogtest1_sub.py
@@ -104,7 +104,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/cdata1_sub.py b/tests/cdata1_sub.py
index 3e89c4cd38c0accae8b3ca8c5c052ed93d70f143..e73b9d92994301c7372049a9884504b5c00b9b1a 100644
--- a/tests/cdata1_sub.py
+++ b/tests/cdata1_sub.py
@@ -118,7 +118,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/check_results.rb b/tests/check_results.rb
index 38f9fbe9094996bf7017df0925451edde01e985e..63ce8b780a24f95d6587495801671fa783e0ff2e 100755
--- a/tests/check_results.rb
+++ b/tests/check_results.rb
@@ -73,6 +73,8 @@ $commands = [
   "diff -u disable_xml_super1_sup.py disable_xml_super2_sup.py",
   "diff -u defaults_cases_export1_sub.py defaults_cases_export2_sub.py",
   "diff -u defaults_cases_export1_sup.py defaults_cases_export2_sup.py",
+  "diff -u mixedcontent1_sub.py mixedcontent2_sub.py",
+  "diff -u mixedcontent1_sup.py mixedcontent2_sup.py",
 ]
 
 def check
diff --git a/tests/cleanupname1_sub.py b/tests/cleanupname1_sub.py
index 95b76556ebf8120ecdb592e9395388ef468ac712..0bdd0ef8f4367af95a0622b51acd06cb62ae1eea 100644
--- a/tests/cleanupname1_sub.py
+++ b/tests/cleanupname1_sub.py
@@ -146,7 +146,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/copy_all b/tests/copy_all
index 4c9eeb6aac749b6b3f8c923069b49e445abe1acb..0ba8184c9c1db728091361091da41f331beb54fe 100755
--- a/tests/copy_all
+++ b/tests/copy_all
@@ -61,3 +61,5 @@ cp disable_xml_super2_sup.py disable_xml_super1_sup.py
 cp disable_xml_super2_sub.py disable_xml_super1_sub.py
 cp defaults_cases_export2_sub.py defaults_cases_export1_sub.py
 cp defaults_cases_export2_sup.py defaults_cases_export1_sup.py
+cp mixedcontent2_sub.py mixedcontent1_sub.py
+cp mixedcontent2_sup.py mixedcontent1_sup.py
diff --git a/tests/defaults_cases1_sub.py b/tests/defaults_cases1_sub.py
index 2e3a83a93422271d520edc71d12df0bff8a5f859..af45048b04eb5aa92c5b5c7fca309a5092d5ccc5 100644
--- a/tests/defaults_cases1_sub.py
+++ b/tests/defaults_cases1_sub.py
@@ -123,7 +123,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/defaults_coverage1_sub.py b/tests/defaults_coverage1_sub.py
index c1bdcc1b591c6d2e5aea8fff35812973cebf808c..63093d947a753d5e3b39777da305dad52b490c5a 100644
--- a/tests/defaults_coverage1_sub.py
+++ b/tests/defaults_coverage1_sub.py
@@ -124,7 +124,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/extensions1_sub.py b/tests/extensions1_sub.py
index 5dd0b4725f7c6690a7b6636b3ad26a02ad7e2d58..1d42391870309b9b11247b70fa1b9e2fe1b60c43 100644
--- a/tests/extensions1_sub.py
+++ b/tests/extensions1_sub.py
@@ -187,7 +187,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/ipo1_sub.py b/tests/ipo1_sub.py
index 3205173f3800778df6c9f2f46e75e376ce997315..f5b8efcde3eb4d9655d122e656a430de1854d791 100644
--- a/tests/ipo1_sub.py
+++ b/tests/ipo1_sub.py
@@ -144,7 +144,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/ipo2_sub.py b/tests/ipo2_sub.py
index 3205173f3800778df6c9f2f46e75e376ce997315..f5b8efcde3eb4d9655d122e656a430de1854d791 100644
--- a/tests/ipo2_sub.py
+++ b/tests/ipo2_sub.py
@@ -144,7 +144,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/mapcleanname1_sub.py b/tests/mapcleanname1_sub.py
index faf1c0392c4992cfd3b34916aead5f84d44f3762..ecdbfc4240731a5ebbcb25fd51d3f9feae6d958e 100644
--- a/tests/mapcleanname1_sub.py
+++ b/tests/mapcleanname1_sub.py
@@ -152,7 +152,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/mixedcontent1_sub.py b/tests/mixedcontent1_sub.py
index 1302fdc13495ffcbf6b2f1b82e965d77b326489e..3f6d05ff954e7238080e8911b1a75319ceebabd8 100644
--- a/tests/mixedcontent1_sub.py
+++ b/tests/mixedcontent1_sub.py
@@ -137,7 +137,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/mixedcontent2_sub.py b/tests/mixedcontent2_sub.py
index 1302fdc13495ffcbf6b2f1b82e965d77b326489e..3f6d05ff954e7238080e8911b1a75319ceebabd8 100644
--- a/tests/mixedcontent2_sub.py
+++ b/tests/mixedcontent2_sub.py
@@ -137,7 +137,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/nested_def1_sub.py b/tests/nested_def1_sub.py
index 7cb1b247feb2d9790b5331155d3c80640b7a5e3d..ad6412afbf7f4b96dd6c9b700fa06109506b1c01 100644
--- a/tests/nested_def1_sub.py
+++ b/tests/nested_def1_sub.py
@@ -137,7 +137,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/out1_sub.py b/tests/out1_sub.py
index c22e9ad1374de977d5061f0af163d66d0491e1ba..8738817204dfbaf59d61577bae43605ce7282671 100644
--- a/tests/out1_sub.py
+++ b/tests/out1_sub.py
@@ -187,7 +187,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/people_procincl1_sub.py b/tests/people_procincl1_sub.py
index ad55ab022d1507d469efcd04c32de7d699cdb83a..4cac6556acd71509fbeac69f2dcae914f91f71fc 100644
--- a/tests/people_procincl1_sub.py
+++ b/tests/people_procincl1_sub.py
@@ -215,7 +215,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/prefix_classname1_sub.py b/tests/prefix_classname1_sub.py
index f815091d8dda51c60b88e0d50a0277d74f5372cc..22001418265e39fafcbc07bbb2cf5762e1e33d80 100644
--- a/tests/prefix_classname1_sub.py
+++ b/tests/prefix_classname1_sub.py
@@ -187,7 +187,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/recursive_simpletype1_sub.py b/tests/recursive_simpletype1_sub.py
index 44c0271fbd37b31b9b66ea29db4e8c929a1240b4..acbf3a3a8237a2b05f97112fb07f9cdf1c85124f 100644
--- a/tests/recursive_simpletype1_sub.py
+++ b/tests/recursive_simpletype1_sub.py
@@ -110,7 +110,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/reference_simpletype1_sub.py b/tests/reference_simpletype1_sub.py
index 9866ae40e4d732cf803448ec2cf6a2f09f35ecbe..51aff83b3291e75847fef0f3ef0bb43c56d840ab 100644
--- a/tests/reference_simpletype1_sub.py
+++ b/tests/reference_simpletype1_sub.py
@@ -110,7 +110,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/rem_dup_elems1_sub.py b/tests/rem_dup_elems1_sub.py
index 4fec8a54a4bdf3b4a4bc28561e5b9218ffe323ef..a4b8c9e02b00e1e6342925a05fa3d2c9bb8bb0fb 100644
--- a/tests/rem_dup_elems1_sub.py
+++ b/tests/rem_dup_elems1_sub.py
@@ -118,7 +118,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/simplecontent_restriction1_sub.py b/tests/simplecontent_restriction1_sub.py
index 0e89a7960052d867ce1801cabe5e46d6db15181f..1ff34defc4cf86f4f597ea29a6f7ff716b352199 100644
--- a/tests/simplecontent_restriction1_sub.py
+++ b/tests/simplecontent_restriction1_sub.py
@@ -124,7 +124,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/simpletype_memberspecs1_sub.py b/tests/simpletype_memberspecs1_sub.py
index d0f58c095349cacf0dc96e8456d58f6dfe0a52dd..cce32760a9cc23b3ce8a1dc56cf2071d4cbbba03 100644
--- a/tests/simpletype_memberspecs1_sub.py
+++ b/tests/simpletype_memberspecs1_sub.py
@@ -117,7 +117,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/simpletypes_other1_sub.py b/tests/simpletypes_other1_sub.py
index d3758212d66f8438010eefbb79e8249bde77eaf5..721a1e4481515fb89f07ee0788fd71ec4efd7999 100644
--- a/tests/simpletypes_other1_sub.py
+++ b/tests/simpletypes_other1_sub.py
@@ -117,7 +117,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/to_etree1_sub.py b/tests/to_etree1_sub.py
index 34b23c3c0d2b73f5219dd0043fc8f4435cb4a57f..eebd733a6891fc0020e794ca1aefb2a5b8c922d7 100644
--- a/tests/to_etree1_sub.py
+++ b/tests/to_etree1_sub.py
@@ -231,7 +231,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/validate_simpletypes1_sub.py b/tests/validate_simpletypes1_sub.py
index a78dd6dcd71b166d5183c43c5d3d24ff14b3711b..de1aa851508320d1a87309de46ec689c2bf86bd4 100644
--- a/tests/validate_simpletypes1_sub.py
+++ b/tests/validate_simpletypes1_sub.py
@@ -130,7 +130,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/validate_simpletypes2_sub.py b/tests/validate_simpletypes2_sub.py
index a78dd6dcd71b166d5183c43c5d3d24ff14b3711b..de1aa851508320d1a87309de46ec689c2bf86bd4 100644
--- a/tests/validate_simpletypes2_sub.py
+++ b/tests/validate_simpletypes2_sub.py
@@ -130,7 +130,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index e3f298b70a6aec16b52cfe55429949b56f17f61e..0fb9cbf259f77157aa2bbdfe51ee2ffdb6e6c5c2 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.29.1
+:revision: 2.29.2
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 72796061feaf3b438d4142cfb29f8a3a26b7eb17..09298b890a24b88b384642a10cc2b5baa95ed2d9 100644
Binary files a/tutorial/generateds_tutorial.zip and b/tutorial/generateds_tutorial.zip differ