diff --git a/generateDS.py b/generateDS.py
index 391e240e8f515d2451f497f1bc37129af4626dc5..4e210ec70df9cbd56d61ea2c52cbc5b8b45bb99f 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -92,11 +92,12 @@ Options:
                              Example: "write etree"
                              Default: "write"
     --preserve-cdata-tags    Preserve CDATA tags.  Default: False
-    --cleanup-name-dict=<replacement-map>
-                             Specifies replacement pairs when cleaning up
-                             names.
-                             Example: "{':': 'colon', '-': 'dash', '.': 'dot'}"
-                             Default: "{':': '_', '-': '_', '.': '_'}"
+    --cleanup-name-list=<replacement-map>
+                             Specifies list of 2-tuples used for cleaning names.
+                             First element is a regular expression search 
+                             pattern and second is a replacement.
+                             Example: "[('[-:.]', '_'), ('^__', 'Special')]"
+                             Default: "[('[-:.]', '_')]"
     -q, --no-questions       Do not ask questions, for example,
                              force overwrite.
     --session=mysession.session
@@ -160,6 +161,7 @@ import StringIO
 import textwrap
 import hashlib
 import operator
+import re
 
 # Default logger configuration
 logging.basicConfig(
@@ -218,7 +220,7 @@ NoVersion = False
 Dirpath = []
 ExternalEncoding = sys.getdefaultencoding()
 Namespacedef = ''
-CleanupNameDict = {':': '_', '-': '_', '.': '_'}
+CleanupNameList = [(re.compile('[-:.]'), '_')]
 
 NamespacesDict = {}
 prefixToNamespaceMap = {}
@@ -6356,8 +6358,8 @@ def mapName(oldName):
 
 def cleanupName(oldName):
     newName = oldName
-    for o, n in CleanupNameDict.iteritems():
-        newName = newName.replace(o, n)
+    for pattern, repl in CleanupNameList:
+        newName = re.sub(pattern, repl, newName)
     return newName
 
 
@@ -6635,7 +6637,7 @@ def main():
         ExportWrite, ExportEtree, ExportLiteral, \
         FixTypeNames, SingleFileOutput, OutputDirectory, \
         ModuleSuffix, UseOldSimpleTypeValidators, \
-        PreserveCdataTags, CleanupNameDict
+        PreserveCdataTags, CleanupNameList
     outputText = True
     args = sys.argv[1:]
     try:
@@ -6652,7 +6654,7 @@ def main():
                 'version', 'export=',
                 'one-file-per-xsd', 'output-directory=',
                 'module-suffix=', 'use-old-simpletype-validators',
-                'preserve-cdata-tags', 'cleanup-name-dict=',
+                'preserve-cdata-tags', 'cleanup-name-list=',
             ])
     except getopt.GetoptError:
         usage()
@@ -6813,22 +6815,32 @@ def main():
             ModuleSuffix = option[1]
         elif option[0] == "--preserve-cdata-tags":
             PreserveCdataTags = True
-        elif option[0] == '--cleanup-name-dict':
+        elif option[0] == '--cleanup-name-list':
             cleanup_str = option[1]
             from ast import literal_eval
             try:
-                cleanup_dict = literal_eval(cleanup_str)
+                cleanup_list = literal_eval(cleanup_str)
             except ValueError:
                 raise RuntimeError(
-                    'Unable to parse option --cleanup-name-dict.')
-            if type(cleanup_dict) != dict:
+                    'Unable to parse option --cleanup-name-list.')
+            if type(cleanup_list) not in (list, tuple):
                 raise RuntimeError(
-                    'Option --cleanup-name-dict must be a dictionary.')
-            for k, v in cleanup_dict.iteritems():
-                if type(k) not in (str, unicode) or type(v) not in (str, unicode):
+                    'Option --cleanup-name-list must be a list or a tuple.')
+            CleanupNameList = []
+            for cleanup_pair in cleanup_list:
+                if type(cleanup_pair) not in (list, tuple) \
+                   or len(cleanup_pair) != 2 \
+                   or type(cleanup_pair[0]) not in (str, unicode) \
+                   or type(cleanup_pair[1]) not in (str, unicode):
                     raise RuntimeError(
-                        'Option --cleanup-name-dict containt invalid element.')
-            CleanupNameDict = cleanup_dict
+                        'Option --cleanup-name-list contains invalid element.')
+                try:
+                    CleanupNameList.append(
+                        (re.compile(cleanup_pair[0]), cleanup_pair[1]))
+                except Exception:
+                    raise RuntimeError(
+                        'Option --cleanup-name-list contains invalid pattern "%s".'
+                        % cleanup_pair[0])
 
     if showVersion:
         print('generateDS.py version %s' % VERSION)