diff --git a/generateDS.py b/generateDS.py
index 0e34580c3f5ec1940c206d1bd3dea75a2db221a3..7538449fbfb9a770728d71f2c7652f5792d327bf 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -4192,7 +4192,8 @@ def generateCtor(wrt, prefix, element):
     # came from.
     wrt('        self.original_tagname_ = None\n')
     # if AddAttributes:
-    wrt("        self.troot = get_gs_troot('plots', '%s')\n" % cleanupName(elName))
+    if PreCtor is not None:
+        wrt("        %s\n" % PreCtor.format(classname=cleanupName(elName))) # self.troot = get_gs_troot('plots', '%classname')
     attrDefs = element.getAttributeDefs()
     attribNameList=[]
     for key in element.getAttributeDefsList():
@@ -4231,6 +4232,8 @@ def generateCtor(wrt, prefix, element):
             mbrname = name + '_member'
         else:
             mbrname = name
+        if GenerateProperties:
+            name = '_'+name
         attrType = attrDef.getType()
         if attrType == DateTimeType:
             wrt("        if isinstance(%s, BaseStrType_):\n" % (mbrname, ))
@@ -4272,6 +4275,8 @@ def generateCtor(wrt, prefix, element):
             mbrname = name + '_member'
         else:
             mbrname = name
+        if GenerateProperties:
+            name = '_'+name
         _log.debug("Constructor child: %s" % name)
         _log.debug("Dump: %s" % child.__dict__)
         childType = child.getType()
@@ -4347,9 +4352,9 @@ def generateCtor(wrt, prefix, element):
                     wrt('        else:\n')
                     wrt('            self.%s = %s\n' % (name, mbrname))
                 else:
-                    # wrt('        self.%s = %s\n' % (name, mbrname))
-                    wrt('        self.%s = None\n' % (name))
-                    wrt('        self.set%s(%s)\n' % (capName, mbrname))
+                    wrt('        self.%s = %s\n' % (name, mbrname))
+                    # wrt('        self.%s = None\n' % (name))
+                    # wrt('        self.set%s(%s)\n' % (capName, mbrname))
                     # validate if it is a simple type.  Validation shows
                     # a warning so no fear that an error would rise.
                     typeName = child.getSimpleType()
@@ -4368,8 +4373,8 @@ def generateCtor(wrt, prefix, element):
         wrt('        self.extensiontype_ = extensiontype_\n')
     if element.isMixed():
         wrt(MixedCtorInitializers)
-    if PostSetter is not None:
-        wrt('        %s\n' % (PostSetter))
+    if PostCtor is not None:
+        wrt('        %s\n' % (PostCtor))
 
 
 
@@ -4753,49 +4758,65 @@ def generateGettersAndSetters(wrt, element):
             name = cleanupName(child.getCleanName())
             unmappedName = cleanupName(child.getName())
             capName = make_gs_name(unmappedName)
-            wrt('    def get%s(self): return self.%s\n' % (capName, name))
-            wrt('    def set%s(self, %s):\n' % (capName, name))
-            wrt('        self.%s = %s\n' % (name, name))
-            wrt('        if %s is not None:\n' % (name))
+            varname = name
+            if GenerateProperties:
+                varname = '_'+varname
+            wrt('    def get%s(self): return self.%s\n' % (capName, varname))
+            wrt('    def set%s(self, value):\n' % (capName))
+            wrt('        if value is not None:\n')
             if child.getType() == SequenceType:
-                wrt('            for %s in self.%s\n' % (name, name))
-                wrt('                %s.parent = self\n' % (name))
+                wrt('            for v in value\n')
+                wrt('                v.parent = self\n')
             else:
-                wrt('            self.%s.parent = self\n' % (name))
+                wrt('            value.parent = self\n')
+            wrt('        self.%s = value\n' % (varname))
+
 
             if PostSetter is not None:
+                wrt('        if value is not None:\n')
                 wrt('            %s\n' % (PostSetter))
             if child.getMaxOccurs() > 1:
                 wrt('    def add%s(self, value):\n' % (capName))
                 wrt('        value.parent = self\n')
-                wrt('        self.%s.append(value)\n' % (name))
+                wrt('        self.%s.append(value)\n' % (varname))
                 if PostSetter is not None:
                     wrt('        %s\n' % (PostSetter))
                 suffix = make_gs_name('at')
                 wrt('    def insert%s%s(self, index, value):\n' % (capName, suffix))
                 wrt('        self.%s.insert(index, value)\n' % (name))
                 wrt('        value.parent = self\n')
+                if PostSetter is not None:
+                    wrt('        %s\n' % (PostSetter))
                 wrt('    def replace%s%s(self, index, value):\n' % (capName, suffix))
                 wrt('        value.parent = self\n')
                 wrt('        self.%s[index] = value\n' % (name))
+                if PostSetter is not None:
+                    wrt('        %s\n' % (PostSetter))
             if GenerateProperties:
-                wrt('    %sProp = property(get%s, set%s)\n' %
+                # wrt('    %sProp = property(get%s, set%s)\n' %
+                #     (unmappedName, capName, capName))
+                wrt('    %s = property(get%s, set%s)\n' %
                     (unmappedName, capName, capName))
     attrDefs = element.getAttributeDefs()
     for key in element.getAttributeDefsList():
         attrDef = attrDefs[key]
         name = cleanupName(attrDef.getName().replace(':', '_'))
         mappedName = mapName(name)
+        varname = mappedName
+        if GenerateProperties:
+            varname = '_'+varname
         wrt('    def get%s(self): return self.%s\n' %
-            (make_gs_name(name), mappedName))
+            (make_gs_name(name), varname))
         gsName = make_gs_name(name)
-        wrt('    def set%s(self, %s):\n' % (
-            gsName, mappedName))
-        wrt('        self.%s = %s\n' %(mappedName, mappedName))
+        wrt('    def set%s(self, value):\n' % (
+            gsName,))
+        wrt('        self.%s = value\n' %(varname))
         if PostSetter is not None:
             wrt('        %s\n' % (PostSetter))
         if GenerateProperties:
-            wrt('    %sProp = property(get%s, set%s)\n' %
+            # wrt('    %sProp = property(get%s, set%s)\n' %
+            #     (name, gsName, gsName))
+            wrt('    %s = property(get%s, set%s)\n' %
                 (name, gsName, gsName))
     if element.getSimpleContent() or element.isMixed():
         wrt('    def get%s_(self): return self.valueOf_\n' % (
@@ -5169,6 +5190,7 @@ import warnings as warnings_
 #xmldisable#    from lxml import etree as etree_
 #xmldisable#except ImportError:
 #xmldisable#    from xml.etree import ElementTree as etree_
+{HeadImports}
 
 
 Validate_simpletypes_ = True
@@ -5959,6 +5981,7 @@ except ImportError as exp:
         args1=args1,
         command_line=command_line,
         current_working_directory=current_working_directory,
+        HeadImports=HeadImports,
         ExternalEncoding=ExternalEncoding,
         preserve_cdata_tags_pat=preserve_cdata_tags_pat,
         preserve_cdata_get_text=preserve_cdata_get_text,
@@ -7245,7 +7268,6 @@ def load_config():
     except ImportError:
         pass
 
-
 def fixSilence(txt, silent):
     if silent:
         txt = txt.replace('#silence#', '## ')
@@ -7334,7 +7356,9 @@ def main():
         UseGeneratedssuperLookup, UseSourceFileAsModuleName, \
         PreserveCdataTags, CleanupNameList, \
         NoWarnings, AlwaysExportDefault, \
-        UppercaseEnums, CreateMandatoryChildren, PostSetter
+        UppercaseEnums, CreateMandatoryChildren, \
+        PostSetter, PreCtor, PostCtor, \
+        HeadImports
     outputText = True
     args = sys.argv[1:]
     try:
@@ -7357,7 +7381,8 @@ def main():
                 'no-warnings',
                 'no-collect-includes', 'no-redefine-groups',
                 'always-export-default', 'mixed-case-enums',
-                'create-mandatory-children', 'post-setter='
+                'create-mandatory-children', 'post-setter=',
+                'pre-ctor=', 'post-ctor=', 'imports='
             ])
     except getopt.GetoptError:
         usage()
@@ -7383,6 +7408,9 @@ def main():
     UppercaseEnums = True
     CreateMandatoryChildren = False
     PostSetter = None
+    PreCtor = None
+    PostCtor = None
+    HeadImports = ''
 
     for option in options:
         if option[0] == '--session':
@@ -7572,6 +7600,13 @@ def main():
             CreateMandatoryChildren = True
         elif option[0] == '--post-setter':
             PostSetter = option[1]
+        elif option[0] == '--pre-ctor':
+            PreCtor = option[1]
+        elif option[0] == '--post-ctor':
+            PostCtor = option[1]
+        elif option[0] == '--imports':
+            HeadImports = option[1]
+
     if showVersion:
         print('generateDS.py version %s' % VERSION)
         sys.exit(0)