diff --git a/README b/README
index bdd0179dd965b188353332db8e73fc882f720e64..bf1bb1606f29857cd914a54d01a78c226ad81adf 100644
--- a/README
+++ b/README
@@ -141,6 +141,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.24b (11/28/2016)
+
+- Added several fixes to generateDS.py and process_includes.py that
+  are needed for the support for Python 3.  Thank you Ian Glover for
+  catching this and for contributing the fixes.
+
 Version 2.24a (11/16/2016)
 
 - Added entry_points to setup.py so that distutils will generate
diff --git a/generateDS.html b/generateDS.html
index 5312fd5c4bf2b9fb84f840d66e6a2e9c022bbfb9..e11615d1f88fec0dc98a3556e8cfddc74bd8a950 100644
--- a/generateDS.html
+++ b/generateDS.html
@@ -220,7 +220,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td>
 </tr>
 </tbody>
 </table>
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">November 16, 2016</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">November 22, 2016</td>
 </tr>
 </tbody>
 </table>
@@ -3184,7 +3184,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-11-16 20:28 UTC.
+Generated on: 2016-11-22 21:17 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 465a61c85c3d6d261a4ffb3f5c235b03b85d1cd7..985d124adc6fc473cf065f1d1dff4d97574f6a16 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -204,7 +204,7 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.24a'
+VERSION = '2.24b'
 ##VERSION##
 
 if sys.version_info.major == 2:
@@ -5761,8 +5761,11 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
-%(preserve_cdata_tags)s    doc = parsexml_(StringIO(inString), parser)
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
+%(preserve_cdata_tags)s    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/generateDS.txt b/generateDS.txt
index 09a490ee11f6a8ffb531d73d65651456616cfa33..eebc6344efc40d2b13ba2a59759dde2204958b25 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.24a
+:revision: 2.24b
 
 .. version
 
diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html
index c3958eb09d0f2cd91ba23b089641a5531aab1638..43aca00097a3710a6221b275903dd9a1c8236e80 100644
--- a/generateds_gui_notes.html
+++ b/generateds_gui_notes.html
@@ -220,7 +220,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td>
 </tr>
 </tbody>
 </table>
@@ -229,7 +229,7 @@ They are used by updateversion.py. -->
 <col class="field-name" />
 <col class="field-body" />
 <tbody valign="top">
-<tr class="field"><th class="field-name">date:</th><td class="field-body">November 16, 2016</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">November 22, 2016</td>
 </tr>
 </tbody>
 </table>
@@ -401,7 +401,7 @@ $ mv generateds_gui.mo locale/ru/LC_MESSAGES/
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateds_gui_notes.txt">View document source</a>.
-Generated on: 2016-11-16 20:28 UTC.
+Generated on: 2016-11-22 21:17 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt
index 0086f3da97ada7ac4745f8eed6a9c7fb99b95346..25921ccd8217bc4be028236413d68d654087f937 100644
--- a/generateds_gui_notes.txt
+++ b/generateds_gui_notes.txt
@@ -12,7 +12,7 @@ GenerateDS GUI Notes
 
 .. version
 
-:revision: 2.24a
+:revision: 2.24b
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index 8c99e306b86d0f5b9a52ce461c031e5593c8fd16..41864be0c2a302bfb12318ba2ed9bedb2b78aa60 100755
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -41,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.24a'
+VERSION = '2.24b'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 785be91b932e99365a284857a8142d3150a52fc4..2093c8ec1d1b31f09887b2cf48560b082ba0473d 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.24a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</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">November 16, 2016</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">November 22, 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: 2016-11-16 20:28 UTC.
+Generated on: 2016-11-22 21:17 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index 4b30ec105915903c42baacd7e17ebc9057125ab5..6969b4d50bad613e00cf5535cdf32fe556ff5fd8 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.24a
+:revision: 2.24b
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 3325f9dc2dbec721f755aa3b9e5c9628168a8875..8fe549328ea4b044818d886a0a59f7da1daff7e4 100755
--- a/process_includes.py
+++ b/process_includes.py
@@ -40,7 +40,7 @@ except ImportError:
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.24a'
+VERSION = '2.24b'
 ##VERSION##
 
 CatalogDict = {}
@@ -208,7 +208,7 @@ def resolve_ref(node, params, options):
             else:
                 if os.path.exists(locn):
                     infile = open(locn)
-                    content = infile.read()
+                    content = infile.read().encode()
                     infile.close()
                     params.parent_url = locn
                     params.base_url = os.path.split(locn)[0]
@@ -240,11 +240,7 @@ def collect_inserts_aux(child, params, inserts, options):
     save_base_url = params.base_url
     string_content = resolve_ref(child, params, options)
     if string_content is not None:
-        if sys.version_info.major == 2:
-            root = etree.fromstring(string_content, base_url=params.base_url)
-        else:
-            root = etree.fromstring(
-                string_content.encode(), base_url=params.base_url)
+        root = etree.fromstring(string_content, base_url=params.base_url)
         roots.append(root)
         for child1 in root:
             if not isinstance(child1, etree._Comment):
diff --git a/setup.py b/setup.py
index 2bf1e4617db42cbabadc7484d2aeed3d0164768e..79638511d94d972e0b8cf5488ab7ee0429ace4ea 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.24a",
+    version="2.24b",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py
index bb1a48b883256b4f0e0ff35ef732f5cfdde5cc00..1f3eab9ffeb486240321d4d37459bc5c91862465 100644
--- a/tests/OnePer/oneperType00_2One.py
+++ b/tests/OnePer/oneperType00_2One.py
@@ -807,9 +807,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py
index af44b2c5e709b938e9dbc9d02e3596428f4b0c78..3c0ff827dbc0b77bd8aaa0fc8f59ed608dc30e0f 100644
--- a/tests/OnePer/oneperType01_2One.py
+++ b/tests/OnePer/oneperType01_2One.py
@@ -882,9 +882,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py
index 4c66103e4f17a40b6a0a4ff026cc2a7e82e06eef..d3cad9d74d2ebce350832ea2538bace20a4fcc17 100644
--- a/tests/OnePer/oneperType02_2One.py
+++ b/tests/OnePer/oneperType02_2One.py
@@ -882,9 +882,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py
index bc486fd969fc6832a51060f0a0ad986e4b16eb12..a1d363720e92e0814e00b33f83c148e994aee32e 100644
--- a/tests/OnePer/oneperType03_2One.py
+++ b/tests/OnePer/oneperType03_2One.py
@@ -881,9 +881,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py
index 26052273d6bb121f8265becae5545a8ae950d734..791999744a40a4d94e04a20603525754eb920847 100644
--- a/tests/abstract_type1_sup.py
+++ b/tests/abstract_type1_sup.py
@@ -1011,9 +1011,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py
index 5c615e2874ea8e8245881e34c552e7ea32651153..492423d9485e752b2c21fbec97958dfe1849dd9b 100644
--- a/tests/annotations1_sup.py
+++ b/tests/annotations1_sup.py
@@ -1007,9 +1007,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py
index 565f1d0ad0548a6b885d0f34c8b927a07d77e3d2..50667a54dd398879ed4f698c4d4771ac03ee38fd 100644
--- a/tests/anonymous_type1_sup.py
+++ b/tests/anonymous_type1_sup.py
@@ -1072,9 +1072,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py
index bc66620da5de4ebcb2e239ea5d3bf30c1b1d8bfd..fd90c17b39f6c86380ad916afca8321e0ffb5874 100644
--- a/tests/anysimpletype1_sup.py
+++ b/tests/anysimpletype1_sup.py
@@ -906,9 +906,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py
index 872cf51355ebeeae286017d6f8d601190c11ebc8..955f65665f5c5bc513bf12d5afc6fcd5af59f74d 100644
--- a/tests/anywildcard1_sup.py
+++ b/tests/anywildcard1_sup.py
@@ -1246,9 +1246,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py
index 2de44a58081922cf2d0624ff4ac50c1d4a2e3aa6..17fff17a10a18a74e34f309d7787b88f6c3df5be 100644
--- a/tests/attr_groups1_sup.py
+++ b/tests/attr_groups1_sup.py
@@ -906,9 +906,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py
index 8cd42d39321eb8504ea264deac6acad4a94a7970..3d948ca227b0b56bc9d80bba46ee7e8d7df7fcc8 100644
--- a/tests/catalogtest1_sup.py
+++ b/tests/catalogtest1_sup.py
@@ -720,9 +720,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/cdata1_sup.py b/tests/cdata1_sup.py
index b991443322748a974d798689db8d7c0a9da92f4c..408e2306b6e3725501ce46402ace8c406f623771 100644
--- a/tests/cdata1_sup.py
+++ b/tests/cdata1_sup.py
@@ -876,9 +876,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/cleanupname1_sup.py b/tests/cleanupname1_sup.py
index e1a5c88bcf088741efb12ad0e966724226a50928..9638243aaa348c3b09bc4ffa0f4d37d016675623 100644
--- a/tests/cleanupname1_sup.py
+++ b/tests/cleanupname1_sup.py
@@ -1218,9 +1218,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py
index 82d9b6d65cbcc22372aad2ed509a9ca68fe9f884..16925d850b166351927b9a67e210735444576bdd 100644
--- a/tests/defaults_cases1_sup.py
+++ b/tests/defaults_cases1_sup.py
@@ -1109,9 +1109,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py
index ddec7e9d02f81c15275bd29eb8e4e494fd63bf24..641b237fd0cf868def586bf5af1dddcbb1273a30 100644
--- a/tests/defaults_coverage1_sup.py
+++ b/tests/defaults_coverage1_sup.py
@@ -1472,9 +1472,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index 99264738d5987bb15ecfce258f32ada2353d471d..75907f8d9b5a2454be7f2ca0f9ebb7798bf71c25 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -1759,9 +1759,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py
index a828cbab1c17a3a7599b376fcfbbb7192d71764a..f5e8822bd61d42b4df88fad73a3da2d2b0b8a53d 100644
--- a/tests/ipo1_sup.py
+++ b/tests/ipo1_sup.py
@@ -1449,9 +1449,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py
index a828cbab1c17a3a7599b376fcfbbb7192d71764a..f5e8822bd61d42b4df88fad73a3da2d2b0b8a53d 100644
--- a/tests/ipo2_sup.py
+++ b/tests/ipo2_sup.py
@@ -1449,9 +1449,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py
index d7837d399a38584e23e66c9fcbd7e4789a0be8ab..a596dcfc41ee6ea545c110bdcb62a8aea898c14d 100644
--- a/tests/mapcleanname1_sup.py
+++ b/tests/mapcleanname1_sup.py
@@ -1558,9 +1558,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py
index fed05aa38314aa73addae7ea300fefab65510fe2..17b3c3956d53342a2e5e7afe2b406f7accc073e2 100644
--- a/tests/nested_def1_sup.py
+++ b/tests/nested_def1_sup.py
@@ -1118,9 +1118,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index e9dc161d34b042eee80b6ec9b03728e9cb98e129..f542a3852d80a1026aa1f96c5a2044ba1d89b38e 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -3480,9 +3480,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index 996caa34849f4df0af9b79c0d3aefc385115774f..159c8e8b5c74957d2f0ae95ac1dd49dc406100e2 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -2864,9 +2864,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py
index fa179c1cb400e574e86b2a5ece27e5ee817d1ce6..7e77a9707ec09d451ae76a7486a7aaf0a40053b1 100644
--- a/tests/prefix_classname1_sup.py
+++ b/tests/prefix_classname1_sup.py
@@ -2485,9 +2485,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py
index 06c6f8c9fc4a67b6e0c2e9dd101544bc459d0561..0b0a9e510df04963ec6764823044884e7d99d126 100644
--- a/tests/recursive_simpletype1_sup.py
+++ b/tests/recursive_simpletype1_sup.py
@@ -822,9 +822,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/reference_simpletype1_sup.py b/tests/reference_simpletype1_sup.py
index e27710fab4e28df6f91d7990485e114f2a1b2f82..7e784fedf5079b127431d241f9491be8da46c827 100644
--- a/tests/reference_simpletype1_sup.py
+++ b/tests/reference_simpletype1_sup.py
@@ -840,9 +840,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/rem_dup_elems1_sup.py b/tests/rem_dup_elems1_sup.py
index 1c364ed6ab963da16b4bcd15aab303901cf2ee91..2d38d44be8d9890f8876e1eb45bf37e0169152be 100644
--- a/tests/rem_dup_elems1_sup.py
+++ b/tests/rem_dup_elems1_sup.py
@@ -893,9 +893,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py
index e9e28c955d06b354bb6ef0993333f753e50bde0e..afb69f9ade182c3047a3fe646d420cab9cc3d60c 100644
--- a/tests/simplecontent_restriction1_sup.py
+++ b/tests/simplecontent_restriction1_sup.py
@@ -1009,9 +1009,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index fc9e39c126c9b0988372a03b85d12ad8188f2922..cc12dd5b2db3d0dbcb7efca46faac4a0668e50e4 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -869,9 +869,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py
index 2bceefac870e7de446e66478037f04d1bb7c83e6..e1a21b76e9ba60f0aa074a8e786d23c0440ff35a 100644
--- a/tests/simpletypes_other1_sup.py
+++ b/tests/simpletypes_other1_sup.py
@@ -1215,9 +1215,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index 6d0f7c6f3e76c24450a80a4dfdfe11b48b14f6dc..f6eb789c45217dbacdcce5749ec7c2ffd0f939c7 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -2959,9 +2959,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py
index 4e3ff4bc75155bec5e05ea87a5e4c77323d3cf9c..798aff9b3b1c24c1bb52b598d81a46c5d6d0fcd2 100644
--- a/tests/validate_simpletypes1_sup.py
+++ b/tests/validate_simpletypes1_sup.py
@@ -1627,9 +1627,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py
index 4e3ff4bc75155bec5e05ea87a5e4c77323d3cf9c..798aff9b3b1c24c1bb52b598d81a46c5d6d0fcd2 100644
--- a/tests/validate_simpletypes2_sup.py
+++ b/tests/validate_simpletypes2_sup.py
@@ -1627,9 +1627,12 @@ def parseEtree(inFileName, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO as IOBuffer
+    else:
+        from io import BytesIO as IOBuffer
     parser = None
-    doc = parsexml_(StringIO(inString), parser)
+    doc = parsexml_(IOBuffer(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index 212e6af8d1079e19a04b1fe4a257ead414cfee2f..949cc9d54660d7f08dab4a405e1ab12e27a265c5 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.24a</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</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">November 16, 2016</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">November 22, 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: 2016-11-16 20:28 UTC.
+Generated on: 2016-11-22 21:17 UTC.
 Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
 
 </div>
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index e334ec34f71201a689ee1ac3950451da1bdd3467..560634e328c156d83beb56c2bafcddeff6958f9d 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.24a
+:revision: 2.24b
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 31b243add61d581c179eadee276101e0113a622c..b491af4b3650151c5280fe52c817df891051cfde 100644
Binary files a/tutorial/generateds_tutorial.zip and b/tutorial/generateds_tutorial.zip differ