diff --git a/generateDS.py b/generateDS.py
index 4c94c9a2aa62013ddd87d1353de06a4a214350e6..c8eff6ceb842d122ad360b4c5afb5e1529301cf5 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -2636,9 +2636,9 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
     if parentName:
         hasAttributes += 1
         elName = element.getCleanName()
-        wrt("        super(%s, self).exportAttributes("
+        wrt("        super(%s%s, self).exportAttributes("
             "outfile, level, already_processed, namespace_, name_='%s')\n" %
-            (elName, name, ))
+            (prefix, elName, name, ))
     hasAttributes += generateExportAttributes(wrt, element, hasAttributes)
     if hasAttributes == 0:
         wrt("        pass\n")
@@ -2652,9 +2652,9 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
     if parentName and not element.getRestrictionBaseObj():
         hasChildren += 1
         elName = element.getCleanName()
-        wrt("        super(%s, self).exportChildren(outfile, level, "
+        wrt("        super(%s%s, self).exportChildren(outfile, level, "
             "namespace_, name_, True, pretty_print=pretty_print)\n" %
-            (elName, ))
+            (prefix, elName, ))
     hasChildren += generateExportChildren(wrt, element, hasChildren, namespace)
     if childCount == 0:   # and not element.isMixed():
         wrt("        pass\n")
@@ -2907,18 +2907,18 @@ def generateExportLiteralFn(wrt, prefix, element):
     if parentName:
         count += 1
         elName = element.getCleanName()
-        wrt("        super(%s, self).exportLiteralAttributes("
+        wrt("        super(%s%s, self).exportLiteralAttributes("
             "outfile, level, already_processed, name_)\n" %
-            (elName, ))
+            (prefix, elName, ))
     if count == 0:
         wrt("        pass\n")
     wrt("    def exportLiteralChildren(self, outfile, level, name_):\n")
     parentName, parent = getParentName(element)
     if parentName:
         elName = element.getCleanName()
-        wrt("        super(%s, self).exportLiteralChildren("
+        wrt("        super(%s%s, self).exportLiteralChildren("
             "outfile, level, name_)\n" %
-            (elName, ))
+            (prefix, elName, ))
     for child in element.getChildren():
         name = child.getName()
         name = cleanupName(name)
@@ -3620,9 +3620,9 @@ def generateBuildFn(wrt, prefix, element, delayed):
     if parentName:
         hasAttributes += 1
         elName = element.getCleanName()
-        wrt('        super(%s, self).buildAttributes('
+        wrt('        super(%s%s, self).buildAttributes('
             'node, attrs, already_processed)\n' %
-            (elName, ))
+            (prefix, elName, ))
     if hasAttributes == 0:
         wrt('        pass\n')
     wrt('    def buildChildren(self, child_, node, nodeName_, '
@@ -3640,8 +3640,8 @@ def generateBuildFn(wrt, prefix, element, delayed):
     base = element.getBase()
     if base and not element.getSimpleContent():
         elName = element.getCleanName()
-        wrt("        super(%s, self).buildChildren("
-            "child_, node, nodeName_, True)\n" % (elName, ))
+        wrt("        super(%s%s, self).buildChildren("
+            "child_, node, nodeName_, True)\n" % (prefix, elName, ))
     if hasChildren == 0:
         wrt("        pass\n")
 # end generateBuildFn
@@ -3812,7 +3812,7 @@ MixedCtorInitializers = '''\
 '''
 
 
-def generateCtor(wrt, element):
+def generateCtor(wrt, prefix, element):
     elName = element.getCleanName()
     childCount = countChildren(element, 0)
     s2 = buildCtorArgs_multilevel(element, childCount)
@@ -3829,10 +3829,10 @@ def generateCtor(wrt, element):
             s2 = ''.join(args)
             if len(args) > 254:
                 wrt('        arglist_ = (%s)\n' % (s2, ))
-                wrt('        super(%s, self).__init__(*arglist_)\n' %
-                    (elName, ))
+                wrt('        super(%s%s, self).__init__(*arglist_)\n' %
+                    (prefix, elName, ))
             else:
-                wrt('        super(%s, self).__init__(%s)\n' % (elName, s2, ))
+                wrt('        super(%s%s, self).__init__(%s)\n' % (prefix, elName, s2, ))
     attrDefs = element.getAttributeDefs()
     for key in attrDefs:
         attrDef = attrDefs[key]
@@ -4168,7 +4168,7 @@ def generateUserMethods(wrt, element):
             wrt(source)
 
 
-def generateHascontentMethod(wrt, element):
+def generateHascontentMethod(wrt, prefix, element):
     wrt('    def hasContent_(self):\n')
     wrt('        if (\n')
     firstTime = True
@@ -4195,7 +4195,7 @@ def generateHascontentMethod(wrt, element):
         if not firstTime:
             wrt(' or\n')
         firstTime = False
-        wrt('            super(%s, self).hasContent_()' % (elName, ))
+        wrt('            super(%s%s, self).hasContent_()' % (prefix, elName, ))
     wrt('\n        ):\n')
     wrt('            return True\n')
     wrt('        else:\n')
@@ -4229,7 +4229,7 @@ def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''):
     ElementsForSubclasses.append(element)
     name = element.getCleanName()
     if parentName:
-        s1 = 'class %s%s(%s):\n' % (prefix, name, parentName,)
+        s1 = 'class %s%s(%s%s):\n' % (prefix, name, prefix, parentName,)
     else:
         s1 = 'class %s%s(GeneratedsSuper):\n' % (prefix, name)
     wrt(s1)
@@ -4250,9 +4250,9 @@ def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''):
     parentName, parent = getParentName(element)
     superclass_name = 'None'
     if parentName and parentName in AlreadyGenerated:
-        superclass_name = parentName
+        superclass_name = prefix + parentName
     wrt('    superclass = %s\n' % (superclass_name, ))
-    generateCtor(wrt, element)
+    generateCtor(wrt, prefix, element)
     wrt('    def factory(*args_, **kwargs_):\n')
     wrt('        if %s%s.subclass:\n' % (prefix, name))
     wrt('            return %s%s.subclass(*args_, **kwargs_)\n' % (
@@ -4271,7 +4271,7 @@ def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''):
         namespace = NamespacesDict[Targetnamespace]
     else:
         namespace = ''
-    generateHascontentMethod(wrt, element)
+    generateHascontentMethod(wrt, prefix, element)
     if ExportWrite:
         generateExportFn(wrt, prefix, element, namespace, nameSpacesDef)
     if ExportEtree:
@@ -5083,8 +5083,8 @@ def generateMain(outfile, prefix, root):
     for classType in MappingTypes:
         mappedName = mapName(cleanupName(MappingTypes[classType]))
         if mappedName in AlreadyGenerated:
-            exportDictLine += "    '%s': %s,\n" % (
-                classType, mappedName, )
+            exportDictLine += "    '%s': %s%s,\n" % (
+                classType, prefix, mappedName, )
     exportDictLine += "}\n\n\n"
     outfile.write(exportDictLine)
     children = root.getChildren()
@@ -5308,7 +5308,7 @@ def generateSubclass(wrt, element, prefix, xmlbehavior, behaviors, baseUrl):
         return
     AlreadyGenerated_subclass.add(mappedName)
     name = element.getCleanName()
-    wrt('class %s%s%s(supermod.%s):\n' % (prefix, name, SubclassSuffix, name))
+    wrt('class %s%s%s(supermod.%s%s):\n' % (prefix, name, SubclassSuffix, prefix, name))
     childCount = countChildren(element, 0)
     s1 = buildCtorArgs_multilevel(element, childCount)
     wrt('    def __init__(self%s):\n' % s1)
@@ -5335,7 +5335,7 @@ def generateSubclass(wrt, element, prefix, xmlbehavior, behaviors, baseUrl):
             classBehaviors = None
         if classBehaviors:
             generateClassBehaviors(wrt, classBehaviors, baseUrl)
-    wrt('supermod.%s.subclass = %s%s\n' % (name, name, SubclassSuffix))
+    wrt('supermod.%s%s.subclass = %s%s%s\n' % (prefix, name, prefix, name, SubclassSuffix))
     wrt('# end class %s%s%s\n' % (prefix, name, SubclassSuffix))
     wrt('\n\n')
 
@@ -5447,7 +5447,7 @@ def parse(inFilename, silence=False):
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
         rootTag = '%(rootElement)s'
-        rootClass = supermod.%(rootClass)s
+        rootClass = supermod.%(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5467,7 +5467,7 @@ def parseEtree(inFilename, silence=False):
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
         rootTag = '%(rootElement)s'
-        rootClass = supermod.%(rootClass)s
+        rootClass = supermod.%(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5491,7 +5491,7 @@ def parseString(inString, silence=False):
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
         rootTag = '%(rootElement)s'
-        rootClass = supermod.%(rootClass)s
+        rootClass = supermod.%(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5510,7 +5510,7 @@ def parseLiteral(inFilename, silence=False):
     rootTag, rootClass = get_root_tag(rootNode)
     if rootClass is None:
         rootTag = '%(rootElement)s'
-        rootClass = supermod.%(rootClass)s
+        rootClass = supermod.%(prefix)s%(rootClass)s
     rootObj = rootClass.factory()
     rootObj.build(rootNode)
     # Enable Python to collect the space used by the DOM.
@@ -5693,6 +5693,7 @@ def generateSubclasses(root, subclassFilename, behaviorFilename,
         params = {
             'cap_name': make_gs_name(cleanupName(name)),
             'name': name,
+            'prefix': prefix,
             'cleanname': cleanupName(name),
             'module_name': os.path.splitext(
                 os.path.basename(subclassFilename))[0],
@@ -6339,3 +6340,4 @@ if __name__ == '__main__':
     #except:
     #    import pdb; pdb.post_mortem()
     main()
+