diff --git a/Core/PythonAPI/inc/ICloneable.pypp.h b/Core/PythonAPI/inc/ICloneable.pypp.h
new file mode 100644
index 0000000000000000000000000000000000000000..0d8af5830ffae000b94fdb45a86ac56fe9d8c213
--- /dev/null
+++ b/Core/PythonAPI/inc/ICloneable.pypp.h
@@ -0,0 +1,8 @@
+// This file has been generated by Py++.
+
+#ifndef ICloneable_hpp__pyplusplus_wrapper
+#define ICloneable_hpp__pyplusplus_wrapper
+
+void register_ICloneable_class();
+
+#endif//ICloneable_hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/ISingleton_less__MaterialManager__greater_.pypp.h b/Core/PythonAPI/inc/ISingleton_less__MaterialManager__greater_.pypp.h
deleted file mode 100644
index 5d03ff9742f4071fde00ff2ea7cd11b11c490bf7..0000000000000000000000000000000000000000
--- a/Core/PythonAPI/inc/ISingleton_less__MaterialManager__greater_.pypp.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// This file has been generated by Py++.
-
-#ifndef ISingleton_less__MaterialManager__greater__hpp__pyplusplus_wrapper
-#define ISingleton_less__MaterialManager__greater__hpp__pyplusplus_wrapper
-
-void register_ISingleton_less__MaterialManager__greater__class();
-
-#endif//ISingleton_less__MaterialManager__greater__hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/MaterialManagerSingleton_t.pypp.h b/Core/PythonAPI/inc/MaterialManagerSingleton_t.pypp.h
new file mode 100644
index 0000000000000000000000000000000000000000..50562acf79d0f435bd669a6e1656029f22577a19
--- /dev/null
+++ b/Core/PythonAPI/inc/MaterialManagerSingleton_t.pypp.h
@@ -0,0 +1,8 @@
+// This file has been generated by Py++.
+
+#ifndef MaterialManagerSingleton_t_hpp__pyplusplus_wrapper
+#define MaterialManagerSingleton_t_hpp__pyplusplus_wrapper
+
+void register_MaterialManagerSingleton_t_class();
+
+#endif//MaterialManagerSingleton_t_hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/PythonPlusplusHelper.h b/Core/PythonAPI/inc/PythonPlusplusHelper.h
index a9205d3019621d2c8da2bcaf5e12abc6b626084f..4bde9fdd0b58b982dad6354dbb440a6d1d1b2528 100644
--- a/Core/PythonAPI/inc/PythonPlusplusHelper.h
+++ b/Core/PythonAPI/inc/PythonPlusplusHelper.h
@@ -16,16 +16,23 @@
 
 #include "Types.h"
 #include "BasicVector3D.h"
-
+#include "DiffuseParticleInfo.h"
+#include "IFormFactor.h"
+#include "MaterialManager.h"
 
 // there is some weared behavior of pyplusplus
 // without this definition it gets screwed up as soon as it sees in the code vector<kvector> like in LatticeBasis.h
 namespace pyplusplus {
     namespace aliases {
-        typedef Geometry::BasicVector3D<double > kvector_t;
+        using namespace Geometry;
+        //typedef Geometry::BasicVector3D<double > kvector_t;
+        typedef BasicVector3D<double > kvector_t;
         typedef std::vector<kvector_t > vector_kvector_t;
-//        typedef Geometry::BasicVector3D<std::complex<double> > cvector_t;
-//        typedef std::vector<cvector_t > vector_cvector_t;
+        typedef BasicVector3D<std::complex<double> > cvector_t;
+        typedef std::vector<cvector_t > vector_cvector_t;
+        typedef std::vector<DiffuseParticleInfo *> vector_DiffuseParticleInfoPtr_t;
+        typedef std::vector<IFormFactor *> vector_IFormFactorPtr_t;
+        typedef ISingleton<MaterialManager> MaterialManagerSingleton_t;
     }
 }
 
@@ -37,8 +44,8 @@ class PythonPlusplusHelper
 public:
     size_t pyplusplus_boost_kvector() { return sizeof(kvector_t); }
     size_t pyplusplus_boost_vectorof_kvector() { return sizeof(pyplusplus::aliases::vector_kvector_t); }
-//    size_t pyplusplus_boost_cvector() { return sizeof(cvector_t); }
-//    size_t pyplusplus_boost_vectorof_cvector() { return sizeof(pyplusplus::aliases::vector_cvector_t); }
+    size_t pyplusplus_boost_cvector() { return sizeof(cvector_t); }
+    size_t pyplusplus_boost_vectorof_cvector() { return sizeof(pyplusplus::aliases::vector_cvector_t); }
 };
 
 #endif // PYTHONPLUSPLUSHELPER_H
diff --git a/Core/PythonAPI/inc/cvector_t.pypp.h b/Core/PythonAPI/inc/cvector_t.pypp.h
new file mode 100644
index 0000000000000000000000000000000000000000..462c6b326ba8b7eeda352fb91adb6a77ef65d12d
--- /dev/null
+++ b/Core/PythonAPI/inc/cvector_t.pypp.h
@@ -0,0 +1,8 @@
+// This file has been generated by Py++.
+
+#ifndef cvector_t_hpp__pyplusplus_wrapper
+#define cvector_t_hpp__pyplusplus_wrapper
+
+void register_cvector_t_class();
+
+#endif//cvector_t_hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/vector_DiffuseParticleInfoPtr_t.pypp.h b/Core/PythonAPI/inc/vector_DiffuseParticleInfoPtr_t.pypp.h
new file mode 100644
index 0000000000000000000000000000000000000000..512803f258dd4fa2e6c7fee459d819eb84be9e5b
--- /dev/null
+++ b/Core/PythonAPI/inc/vector_DiffuseParticleInfoPtr_t.pypp.h
@@ -0,0 +1,8 @@
+// This file has been generated by Py++.
+
+#ifndef vector_DiffuseParticleInfoPtr_t_hpp__pyplusplus_wrapper
+#define vector_DiffuseParticleInfoPtr_t_hpp__pyplusplus_wrapper
+
+void register_vector_DiffuseParticleInfoPtr_t_class();
+
+#endif//vector_DiffuseParticleInfoPtr_t_hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/vector_IFormFactorPtr_t.pypp.h b/Core/PythonAPI/inc/vector_IFormFactorPtr_t.pypp.h
new file mode 100644
index 0000000000000000000000000000000000000000..b97febd4a31caafdd1a8e905f2f9652eb4957bbc
--- /dev/null
+++ b/Core/PythonAPI/inc/vector_IFormFactorPtr_t.pypp.h
@@ -0,0 +1,8 @@
+// This file has been generated by Py++.
+
+#ifndef vector_IFormFactorPtr_t_hpp__pyplusplus_wrapper
+#define vector_IFormFactorPtr_t_hpp__pyplusplus_wrapper
+
+void register_vector_IFormFactorPtr_t_class();
+
+#endif//vector_IFormFactorPtr_t_hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/vector_less__DiffuseParticleInfo_ptr___greater_.pypp.h b/Core/PythonAPI/inc/vector_less__DiffuseParticleInfo_ptr___greater_.pypp.h
deleted file mode 100644
index f0e33acb2a231afdad74a6f2a9597f6f1f33bf2f..0000000000000000000000000000000000000000
--- a/Core/PythonAPI/inc/vector_less__DiffuseParticleInfo_ptr___greater_.pypp.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// This file has been generated by Py++.
-
-#ifndef vector_less__DiffuseParticleInfo_ptr___greater__hpp__pyplusplus_wrapper
-#define vector_less__DiffuseParticleInfo_ptr___greater__hpp__pyplusplus_wrapper
-
-void register_vector_less__DiffuseParticleInfo_ptr___greater__class();
-
-#endif//vector_less__DiffuseParticleInfo_ptr___greater__hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/inc/vector_less__IFormFactor_ptr___greater_.pypp.h b/Core/PythonAPI/inc/vector_less__IFormFactor_ptr___greater_.pypp.h
deleted file mode 100644
index 92ce82e6ba02b2a23b55a19126fcf0f1ce0f451f..0000000000000000000000000000000000000000
--- a/Core/PythonAPI/inc/vector_less__IFormFactor_ptr___greater_.pypp.h
+++ /dev/null
@@ -1,8 +0,0 @@
-// This file has been generated by Py++.
-
-#ifndef vector_less__IFormFactor_ptr___greater__hpp__pyplusplus_wrapper
-#define vector_less__IFormFactor_ptr___greater__hpp__pyplusplus_wrapper
-
-void register_vector_less__IFormFactor_ptr___greater__class();
-
-#endif//vector_less__IFormFactor_ptr___greater__hpp__pyplusplus_wrapper
diff --git a/Core/PythonAPI/src/Crystal.pypp.cpp b/Core/PythonAPI/src/Crystal.pypp.cpp
index d0b9dd7d0bc93e03608163b2d61c7ba0d9b2f3ec..4d020365d79716b07debfd45889eec99f8a21713 100644
--- a/Core/PythonAPI/src/Crystal.pypp.cpp
+++ b/Core/PythonAPI/src/Crystal.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -61,13 +62,6 @@ namespace bp = boost::python;
 
 struct Crystal_wrapper : Crystal, bp::wrapper< Crystal > {
 
-    Crystal_wrapper(Crystal const & arg )
-    : Crystal( arg )
-      , bp::wrapper< Crystal >(){
-        // copy constructor
-        
-    }
-
     Crystal_wrapper(::LatticeBasis const & lattice_basis, ::Lattice const & lattice )
     : Crystal( boost::ref(lattice_basis), boost::ref(lattice) )
       , bp::wrapper< Crystal >(){
@@ -147,6 +141,30 @@ struct Crystal_wrapper : Crystal, bp::wrapper< Crystal > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -183,11 +201,23 @@ struct Crystal_wrapper : Crystal, bp::wrapper< Crystal > {
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_Crystal_class(){
 
-    bp::class_< Crystal_wrapper, bp::bases< IClusteredParticles > >( "Crystal", bp::init< LatticeBasis const &, Lattice const & >(( bp::arg("lattice_basis"), bp::arg("lattice") )) )    
+    bp::class_< Crystal_wrapper, bp::bases< IClusteredParticles >, boost::noncopyable >( "Crystal", bp::init< LatticeBasis const &, Lattice const & >(( bp::arg("lattice_basis"), bp::arg("lattice") )) )    
         .def( 
             "clone"
             , (::Crystal * ( ::Crystal::* )(  ) const)(&::Crystal::clone)
@@ -234,6 +264,16 @@ void register_Crystal_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( Crystal_wrapper::* )(  ) const)(&Crystal_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( Crystal_wrapper::* )(  ) )(&Crystal_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( Crystal_wrapper::* )(  ) const)(&Crystal_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -245,6 +285,10 @@ void register_Crystal_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( Crystal_wrapper::* )(  ) )(&Crystal_wrapper::default_setParametersAreChanged) );
+            , (void ( Crystal_wrapper::* )(  ) )(&Crystal_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( Crystal_wrapper::* )(  ) const)(&Crystal_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/DiffuseParticleInfo.pypp.cpp b/Core/PythonAPI/src/DiffuseParticleInfo.pypp.cpp
index d6ac777284dc93395adbc4fac81744bcba78657d..ccf1d172285c32fd55ff6220e491a9478d946cd5 100644
--- a/Core/PythonAPI/src/DiffuseParticleInfo.pypp.cpp
+++ b/Core/PythonAPI/src/DiffuseParticleInfo.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -61,28 +62,28 @@ namespace bp = boost::python;
 
 struct DiffuseParticleInfo_wrapper : DiffuseParticleInfo, bp::wrapper< DiffuseParticleInfo > {
 
-    virtual bool areParametersChanged(  ) {
-        if( bp::override func_areParametersChanged = this->get_override( "areParametersChanged" ) )
-            return func_areParametersChanged(  );
+    virtual ::DiffuseParticleInfo * clone(  ) const  {
+        if( bp::override func_clone = this->get_override( "clone" ) )
+            return func_clone(  );
         else{
-            return this->IParameterized::areParametersChanged(  );
+            return this->DiffuseParticleInfo::clone(  );
         }
     }
     
-    bool default_areParametersChanged(  ) {
-        return IParameterized::areParametersChanged( );
+    ::DiffuseParticleInfo * default_clone(  ) const  {
+        return DiffuseParticleInfo::clone( );
     }
 
-    virtual ::ParticleInfo * clone(  ) const  {
-        if( bp::override func_clone = this->get_override( "clone" ) )
-            return func_clone(  );
+    virtual bool areParametersChanged(  ) {
+        if( bp::override func_areParametersChanged = this->get_override( "areParametersChanged" ) )
+            return func_areParametersChanged(  );
         else{
-            return this->ParticleInfo::clone(  );
+            return this->IParameterized::areParametersChanged(  );
         }
     }
     
-    ::ParticleInfo * default_clone(  ) const  {
-        return ParticleInfo::clone( );
+    bool default_areParametersChanged(  ) {
+        return IParameterized::areParametersChanged( );
     }
 
     virtual ::ParameterPool * createParameterTree(  ) const  {
@@ -97,6 +98,30 @@ struct DiffuseParticleInfo_wrapper : DiffuseParticleInfo, bp::wrapper< DiffusePa
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -133,11 +158,28 @@ struct DiffuseParticleInfo_wrapper : DiffuseParticleInfo, bp::wrapper< DiffusePa
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_DiffuseParticleInfo_class(){
 
     bp::class_< DiffuseParticleInfo_wrapper, bp::bases< ParticleInfo >, boost::noncopyable >( "DiffuseParticleInfo", bp::no_init )    
+        .def( 
+            "clone"
+            , (::DiffuseParticleInfo * ( ::DiffuseParticleInfo::* )(  ) const)(&::DiffuseParticleInfo::clone)
+            , (::DiffuseParticleInfo * ( DiffuseParticleInfo_wrapper::* )(  ) const)(&DiffuseParticleInfo_wrapper::default_clone)
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "getHeightRange"
             , (double ( ::DiffuseParticleInfo::* )(  ) const)( &::DiffuseParticleInfo::getHeightRange ) )    
@@ -164,16 +206,21 @@ void register_DiffuseParticleInfo_class(){
             "areParametersChanged"
             , (bool ( ::IParameterized::* )(  ) )(&::IParameterized::areParametersChanged)
             , (bool ( DiffuseParticleInfo_wrapper::* )(  ) )(&DiffuseParticleInfo_wrapper::default_areParametersChanged) )    
-        .def( 
-            "clone"
-            , (::ParticleInfo * ( ::ParticleInfo::* )(  ) const)(&::ParticleInfo::clone)
-            , (::ParticleInfo * ( DiffuseParticleInfo_wrapper::* )(  ) const)(&DiffuseParticleInfo_wrapper::default_clone)
-            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "createParameterTree"
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( DiffuseParticleInfo_wrapper::* )(  ) const)(&DiffuseParticleInfo_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( DiffuseParticleInfo_wrapper::* )(  ) )(&DiffuseParticleInfo_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( DiffuseParticleInfo_wrapper::* )(  ) const)(&DiffuseParticleInfo_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -185,6 +232,10 @@ void register_DiffuseParticleInfo_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( DiffuseParticleInfo_wrapper::* )(  ) )(&DiffuseParticleInfo_wrapper::default_setParametersAreChanged) );
+            , (void ( DiffuseParticleInfo_wrapper::* )(  ) )(&DiffuseParticleInfo_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( DiffuseParticleInfo_wrapper::* )(  ) const)(&DiffuseParticleInfo_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/Experiment.pypp.cpp b/Core/PythonAPI/src/Experiment.pypp.cpp
index d5bcf915ddb46ce1eb190d33eb3fe0f5cd84c5db..2692c5a22eb6e44d9a7686a86e2d95ff107e2f1d 100644
--- a/Core/PythonAPI/src/Experiment.pypp.cpp
+++ b/Core/PythonAPI/src/Experiment.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -144,7 +145,7 @@ struct Experiment_wrapper : Experiment, bp::wrapper< Experiment > {
 
 void register_Experiment_class(){
 
-    bp::class_< Experiment_wrapper, bp::bases< IParameterized >, boost::noncopyable >( "Experiment", bp::init< >() )    
+    bp::class_< Experiment_wrapper, bp::bases< IParameterized, ICloneable >, boost::noncopyable >( "Experiment", bp::init< >() )    
         .def( 
             "normalize"
             , (void ( ::Experiment::* )(  ) )(&::Experiment::normalize)
diff --git a/Core/PythonAPI/src/FormFactorCrystal.pypp.cpp b/Core/PythonAPI/src/FormFactorCrystal.pypp.cpp
index 5dee429f09b9bdaa9bc2bfc30991f066711ca5af..2acbfa75158f148adf0908bded66ca7974bac74a 100644
--- a/Core/PythonAPI/src/FormFactorCrystal.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorCrystal.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -61,13 +62,6 @@ namespace bp = boost::python;
 
 struct FormFactorCrystal_wrapper : FormFactorCrystal, bp::wrapper< FormFactorCrystal > {
 
-    FormFactorCrystal_wrapper(FormFactorCrystal const & arg )
-    : FormFactorCrystal( arg )
-      , bp::wrapper< FormFactorCrystal >(){
-        // copy constructor
-        
-    }
-
     virtual ::FormFactorCrystal * clone(  ) const  {
         if( bp::override func_clone = this->get_override( "clone" ) )
             return func_clone(  );
@@ -104,16 +98,28 @@ struct FormFactorCrystal_wrapper : FormFactorCrystal, bp::wrapper< FormFactorCry
         return FormFactorCrystal::evaluate_for_q( boost::ref(q) );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->FormFactorCrystal::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return FormFactorCrystal::getVolume( );
+    }
+
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->FormFactorCrystal::setAmbientRefractiveIndex( refractive_index );
+            this->FormFactorCrystal::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        FormFactorCrystal::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        FormFactorCrystal::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual bool areParametersChanged(  ) {
@@ -240,7 +246,7 @@ struct FormFactorCrystal_wrapper : FormFactorCrystal, bp::wrapper< FormFactorCry
 
 void register_FormFactorCrystal_class(){
 
-    bp::class_< FormFactorCrystal_wrapper, bp::bases< IFormFactorBorn > >( "FormFactorCrystal", bp::no_init )    
+    bp::class_< FormFactorCrystal_wrapper, bp::bases< IFormFactorBorn >, boost::noncopyable >( "FormFactorCrystal", bp::no_init )    
         .def( 
             "clone"
             , (::FormFactorCrystal * ( ::FormFactorCrystal::* )(  ) const)(&::FormFactorCrystal::clone)
@@ -256,10 +262,14 @@ void register_FormFactorCrystal_class(){
             , (::complex_t ( ::FormFactorCrystal::* )( ::cvector_t const & ) const)(&::FormFactorCrystal::evaluate_for_q)
             , (::complex_t ( FormFactorCrystal_wrapper::* )( ::cvector_t const & ) const)(&FormFactorCrystal_wrapper::default_evaluate_for_q)
             , ( bp::arg("q") ) )    
+        .def( 
+            "getVolume"
+            , (double ( ::FormFactorCrystal::* )(  ) const)(&::FormFactorCrystal::getVolume)
+            , (double ( FormFactorCrystal_wrapper::* )(  ) const)(&FormFactorCrystal_wrapper::default_getVolume) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::FormFactorCrystal::* )( ::complex_t ) )(&::FormFactorCrystal::setAmbientRefractiveIndex)
-            , (void ( FormFactorCrystal_wrapper::* )( ::complex_t ) )(&FormFactorCrystal_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::FormFactorCrystal::* )( ::complex_t const & ) )(&::FormFactorCrystal::setAmbientRefractiveIndex)
+            , (void ( FormFactorCrystal_wrapper::* )( ::complex_t const & ) )(&FormFactorCrystal_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "areParametersChanged"
diff --git a/Core/PythonAPI/src/FormFactorCylinder.pypp.cpp b/Core/PythonAPI/src/FormFactorCylinder.pypp.cpp
index 247cbd399583d4f8ec0cb5296aa9f4a9c4415fb3..04bdb217f2d24606afec1e7d34c9a5cf603d819f 100644
--- a/Core/PythonAPI/src/FormFactorCylinder.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorCylinder.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -176,6 +177,18 @@ struct FormFactorCylinder_wrapper : FormFactorCylinder, bp::wrapper< FormFactorC
         return IFormFactor::getRadius( );
     }
 
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactorBorn::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactorBorn::getVolume( );
+    }
+
     virtual bool isDistributedFormFactor(  ) const  {
         if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
             return func_isDistributedFormFactor(  );
@@ -212,16 +225,16 @@ struct FormFactorCylinder_wrapper : FormFactorCylinder, bp::wrapper< FormFactorC
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -283,6 +296,10 @@ void register_FormFactorCylinder_class(){
             "getRadius"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getRadius)
             , (double ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_getRadius) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactorBorn::* )(  ) const)(&::IFormFactorBorn::getVolume)
+            , (double ( FormFactorCylinder_wrapper::* )(  ) const)(&FormFactorCylinder_wrapper::default_getVolume) )    
         .def( 
             "isDistributedFormFactor"
             , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
@@ -297,8 +314,8 @@ void register_FormFactorCylinder_class(){
             , (void ( FormFactorCylinder_wrapper::* )(  ) )(&FormFactorCylinder_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorCylinder_wrapper::* )( ::complex_t ) )(&FormFactorCylinder_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( FormFactorCylinder_wrapper::* )( ::complex_t const & ) )(&FormFactorCylinder_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/FormFactorDecoratorDebyeWaller.pypp.cpp b/Core/PythonAPI/src/FormFactorDecoratorDebyeWaller.pypp.cpp
index 5e8be80fb44ac44f5bb04a8139c5344c19e10442..3cff867d44bdd7a0158561c71ccb34d75b7ed90b 100644
--- a/Core/PythonAPI/src/FormFactorDecoratorDebyeWaller.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorDecoratorDebyeWaller.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -61,13 +62,6 @@ namespace bp = boost::python;
 
 struct FormFactorDecoratorDebyeWaller_wrapper : FormFactorDecoratorDebyeWaller, bp::wrapper< FormFactorDecoratorDebyeWaller > {
 
-    FormFactorDecoratorDebyeWaller_wrapper(FormFactorDecoratorDebyeWaller const & arg )
-    : FormFactorDecoratorDebyeWaller( arg )
-      , bp::wrapper< FormFactorDecoratorDebyeWaller >(){
-        // copy constructor
-        
-    }
-
     FormFactorDecoratorDebyeWaller_wrapper(::IFormFactor const & p_form_factor, double dw_h_factor, double dw_r_factor )
     : FormFactorDecoratorDebyeWaller( boost::ref(p_form_factor), dw_h_factor, dw_r_factor )
       , bp::wrapper< FormFactorDecoratorDebyeWaller >(){
@@ -219,16 +213,16 @@ struct FormFactorDecoratorDebyeWaller_wrapper : FormFactorDecoratorDebyeWaller,
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactorDecorator::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactorDecorator::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactorDecorator::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactorDecorator::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -247,7 +241,7 @@ struct FormFactorDecoratorDebyeWaller_wrapper : FormFactorDecoratorDebyeWaller,
 
 void register_FormFactorDecoratorDebyeWaller_class(){
 
-    bp::class_< FormFactorDecoratorDebyeWaller_wrapper, bp::bases< IFormFactorDecorator > >( "FormFactorDecoratorDebyeWaller", bp::init< IFormFactor const &, double, double >(( bp::arg("p_form_factor"), bp::arg("dw_h_factor"), bp::arg("dw_r_factor") )) )    
+    bp::class_< FormFactorDecoratorDebyeWaller_wrapper, bp::bases< IFormFactorDecorator >, boost::noncopyable >( "FormFactorDecoratorDebyeWaller", bp::init< IFormFactor const &, double, double >(( bp::arg("p_form_factor"), bp::arg("dw_h_factor"), bp::arg("dw_r_factor") )) )    
         .def( 
             "clone"
             , (::FormFactorDecoratorDebyeWaller * ( ::FormFactorDecoratorDebyeWaller::* )(  ) const)(&::FormFactorDecoratorDebyeWaller::clone)
@@ -303,8 +297,8 @@ void register_FormFactorDecoratorDebyeWaller_class(){
             , (void ( FormFactorDecoratorDebyeWaller_wrapper::* )(  ) )(&FormFactorDecoratorDebyeWaller_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactorDecorator::* )( ::complex_t ) )(&::IFormFactorDecorator::setAmbientRefractiveIndex)
-            , (void ( FormFactorDecoratorDebyeWaller_wrapper::* )( ::complex_t ) )(&FormFactorDecoratorDebyeWaller_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactorDecorator::* )( ::complex_t const & ) )(&::IFormFactorDecorator::setAmbientRefractiveIndex)
+            , (void ( FormFactorDecoratorDebyeWaller_wrapper::* )( ::complex_t const & ) )(&FormFactorDecoratorDebyeWaller_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/FormFactorFullSphere.pypp.cpp b/Core/PythonAPI/src/FormFactorFullSphere.pypp.cpp
index cc66d1d5598ac7b9aa3071c399c9e4982652e166..6109a58a3648809dcc9c332e896ade8081925d42 100644
--- a/Core/PythonAPI/src/FormFactorFullSphere.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorFullSphere.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -61,13 +62,6 @@ namespace bp = boost::python;
 
 struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFactorFullSphere > {
 
-    FormFactorFullSphere_wrapper(FormFactorFullSphere const & arg )
-    : FormFactorFullSphere( arg )
-      , bp::wrapper< FormFactorFullSphere >(){
-        // copy constructor
-        
-    }
-
     FormFactorFullSphere_wrapper(double radius )
     : FormFactorFullSphere( radius )
       , bp::wrapper< FormFactorFullSphere >(){
@@ -183,6 +177,18 @@ struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFac
         return IFormFactorBorn::evaluate( boost::ref(k_i), boost::ref(k_f_bin), alpha_i, alpha_f );
     }
 
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactorBorn::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactorBorn::getVolume( );
+    }
+
     virtual bool isDistributedFormFactor(  ) const  {
         if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
             return func_isDistributedFormFactor(  );
@@ -219,16 +225,16 @@ struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFac
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -247,7 +253,7 @@ struct FormFactorFullSphere_wrapper : FormFactorFullSphere, bp::wrapper< FormFac
 
 void register_FormFactorFullSphere_class(){
 
-    bp::class_< FormFactorFullSphere_wrapper, bp::bases< IFormFactorBorn > >( "FormFactorFullSphere", bp::init< double >(( bp::arg("radius") )) )    
+    bp::class_< FormFactorFullSphere_wrapper, bp::bases< IFormFactorBorn >, boost::noncopyable >( "FormFactorFullSphere", bp::init< double >(( bp::arg("radius") )) )    
         .def( 
             "clone"
             , (::FormFactorFullSphere * ( ::FormFactorFullSphere::* )(  ) const)(&::FormFactorFullSphere::clone)
@@ -290,6 +296,10 @@ void register_FormFactorFullSphere_class(){
             , (::complex_t ( ::IFormFactorBorn::* )( ::cvector_t const &,::Bin1DCVector const &,double,double ) const)(&::IFormFactorBorn::evaluate)
             , (::complex_t ( FormFactorFullSphere_wrapper::* )( ::cvector_t const &,::Bin1DCVector const &,double,double ) const)(&FormFactorFullSphere_wrapper::default_evaluate)
             , ( bp::arg("k_i"), bp::arg("k_f_bin"), bp::arg("alpha_i"), bp::arg("alpha_f") ) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactorBorn::* )(  ) const)(&::IFormFactorBorn::getVolume)
+            , (double ( FormFactorFullSphere_wrapper::* )(  ) const)(&FormFactorFullSphere_wrapper::default_getVolume) )    
         .def( 
             "isDistributedFormFactor"
             , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
@@ -304,8 +314,8 @@ void register_FormFactorFullSphere_class(){
             , (void ( FormFactorFullSphere_wrapper::* )(  ) )(&FormFactorFullSphere_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorFullSphere_wrapper::* )( ::complex_t ) )(&FormFactorFullSphere_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( FormFactorFullSphere_wrapper::* )( ::complex_t const & ) )(&FormFactorFullSphere_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/FormFactorGauss.pypp.cpp b/Core/PythonAPI/src/FormFactorGauss.pypp.cpp
index 6effa1aaaf9ccfc29ddbf61f6c4e0afe31b5552c..8415ba1bc9129054d8ec6a372d7f338187a71c65 100644
--- a/Core/PythonAPI/src/FormFactorGauss.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorGauss.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -183,6 +184,18 @@ struct FormFactorGauss_wrapper : FormFactorGauss, bp::wrapper< FormFactorGauss >
         return IFormFactor::getRadius( );
     }
 
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactorBorn::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactorBorn::getVolume( );
+    }
+
     virtual bool isDistributedFormFactor(  ) const  {
         if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
             return func_isDistributedFormFactor(  );
@@ -219,16 +232,16 @@ struct FormFactorGauss_wrapper : FormFactorGauss, bp::wrapper< FormFactorGauss >
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -291,6 +304,10 @@ void register_FormFactorGauss_class(){
             "getRadius"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getRadius)
             , (double ( FormFactorGauss_wrapper::* )(  ) const)(&FormFactorGauss_wrapper::default_getRadius) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactorBorn::* )(  ) const)(&::IFormFactorBorn::getVolume)
+            , (double ( FormFactorGauss_wrapper::* )(  ) const)(&FormFactorGauss_wrapper::default_getVolume) )    
         .def( 
             "isDistributedFormFactor"
             , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
@@ -305,8 +322,8 @@ void register_FormFactorGauss_class(){
             , (void ( FormFactorGauss_wrapper::* )(  ) )(&FormFactorGauss_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorGauss_wrapper::* )( ::complex_t ) )(&FormFactorGauss_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( FormFactorGauss_wrapper::* )( ::complex_t const & ) )(&FormFactorGauss_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/FormFactorLorentz.pypp.cpp b/Core/PythonAPI/src/FormFactorLorentz.pypp.cpp
index 07b4781225f1409fdf1c0484ce1526eeca52d2b1..8f841ab20e0387d931760f10f39d4f3e07ad3e11 100644
--- a/Core/PythonAPI/src/FormFactorLorentz.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorLorentz.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -183,6 +184,18 @@ struct FormFactorLorentz_wrapper : FormFactorLorentz, bp::wrapper< FormFactorLor
         return IFormFactor::getRadius( );
     }
 
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactorBorn::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactorBorn::getVolume( );
+    }
+
     virtual bool isDistributedFormFactor(  ) const  {
         if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
             return func_isDistributedFormFactor(  );
@@ -219,16 +232,16 @@ struct FormFactorLorentz_wrapper : FormFactorLorentz, bp::wrapper< FormFactorLor
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -291,6 +304,10 @@ void register_FormFactorLorentz_class(){
             "getRadius"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getRadius)
             , (double ( FormFactorLorentz_wrapper::* )(  ) const)(&FormFactorLorentz_wrapper::default_getRadius) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactorBorn::* )(  ) const)(&::IFormFactorBorn::getVolume)
+            , (double ( FormFactorLorentz_wrapper::* )(  ) const)(&FormFactorLorentz_wrapper::default_getVolume) )    
         .def( 
             "isDistributedFormFactor"
             , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
@@ -305,8 +322,8 @@ void register_FormFactorLorentz_class(){
             , (void ( FormFactorLorentz_wrapper::* )(  ) )(&FormFactorLorentz_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorLorentz_wrapper::* )( ::complex_t ) )(&FormFactorLorentz_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( FormFactorLorentz_wrapper::* )( ::complex_t const & ) )(&FormFactorLorentz_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/FormFactorPrism3.pypp.cpp b/Core/PythonAPI/src/FormFactorPrism3.pypp.cpp
index 3684a70454b09ea1ec538a857e89606db669cc72..da524a5bce1594e6de292483c2acb53f84c5b147 100644
--- a/Core/PythonAPI/src/FormFactorPrism3.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorPrism3.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -176,6 +177,18 @@ struct FormFactorPrism3_wrapper : FormFactorPrism3, bp::wrapper< FormFactorPrism
         return IFormFactor::getRadius( );
     }
 
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactorBorn::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactorBorn::getVolume( );
+    }
+
     virtual bool isDistributedFormFactor(  ) const  {
         if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
             return func_isDistributedFormFactor(  );
@@ -212,16 +225,16 @@ struct FormFactorPrism3_wrapper : FormFactorPrism3, bp::wrapper< FormFactorPrism
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -283,6 +296,10 @@ void register_FormFactorPrism3_class(){
             "getRadius"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getRadius)
             , (double ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_getRadius) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactorBorn::* )(  ) const)(&::IFormFactorBorn::getVolume)
+            , (double ( FormFactorPrism3_wrapper::* )(  ) const)(&FormFactorPrism3_wrapper::default_getVolume) )    
         .def( 
             "isDistributedFormFactor"
             , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
@@ -297,8 +314,8 @@ void register_FormFactorPrism3_class(){
             , (void ( FormFactorPrism3_wrapper::* )(  ) )(&FormFactorPrism3_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorPrism3_wrapper::* )( ::complex_t ) )(&FormFactorPrism3_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( FormFactorPrism3_wrapper::* )( ::complex_t const & ) )(&FormFactorPrism3_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/FormFactorPyramid.pypp.cpp b/Core/PythonAPI/src/FormFactorPyramid.pypp.cpp
index c2782c24dcc1ec42ac9e267c3b05b2c393c12f33..fd27ab33cce315187366d614c3a344fa484d46bd 100644
--- a/Core/PythonAPI/src/FormFactorPyramid.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorPyramid.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -176,6 +177,18 @@ struct FormFactorPyramid_wrapper : FormFactorPyramid, bp::wrapper< FormFactorPyr
         return IFormFactor::getRadius( );
     }
 
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactorBorn::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactorBorn::getVolume( );
+    }
+
     virtual bool isDistributedFormFactor(  ) const  {
         if( bp::override func_isDistributedFormFactor = this->get_override( "isDistributedFormFactor" ) )
             return func_isDistributedFormFactor(  );
@@ -212,16 +225,16 @@ struct FormFactorPyramid_wrapper : FormFactorPyramid, bp::wrapper< FormFactorPyr
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -283,6 +296,10 @@ void register_FormFactorPyramid_class(){
             "getRadius"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getRadius)
             , (double ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_getRadius) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactorBorn::* )(  ) const)(&::IFormFactorBorn::getVolume)
+            , (double ( FormFactorPyramid_wrapper::* )(  ) const)(&FormFactorPyramid_wrapper::default_getVolume) )    
         .def( 
             "isDistributedFormFactor"
             , (bool ( ::IFormFactor::* )(  ) const)(&::IFormFactor::isDistributedFormFactor)
@@ -297,8 +314,8 @@ void register_FormFactorPyramid_class(){
             , (void ( FormFactorPyramid_wrapper::* )(  ) )(&FormFactorPyramid_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorPyramid_wrapper::* )( ::complex_t ) )(&FormFactorPyramid_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( FormFactorPyramid_wrapper::* )( ::complex_t const & ) )(&FormFactorPyramid_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/FormFactorSphereGaussianRadius.pypp.cpp b/Core/PythonAPI/src/FormFactorSphereGaussianRadius.pypp.cpp
index ac6dc4676ee7450e6563d0fc2bedbccc84f8e8cf..7c6479de012bb948e88d6ad4d6df14568ef50280 100644
--- a/Core/PythonAPI/src/FormFactorSphereGaussianRadius.pypp.cpp
+++ b/Core/PythonAPI/src/FormFactorSphereGaussianRadius.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -61,13 +62,6 @@ namespace bp = boost::python;
 
 struct FormFactorSphereGaussianRadius_wrapper : FormFactorSphereGaussianRadius, bp::wrapper< FormFactorSphereGaussianRadius > {
 
-    FormFactorSphereGaussianRadius_wrapper(FormFactorSphereGaussianRadius const & arg )
-    : FormFactorSphereGaussianRadius( arg )
-      , bp::wrapper< FormFactorSphereGaussianRadius >(){
-        // copy constructor
-        
-    }
-
     FormFactorSphereGaussianRadius_wrapper(double mean, double sigma )
     : FormFactorSphereGaussianRadius( mean, sigma )
       , bp::wrapper< FormFactorSphereGaussianRadius >(){
@@ -183,6 +177,18 @@ struct FormFactorSphereGaussianRadius_wrapper : FormFactorSphereGaussianRadius,
         return IFormFactor::getRadius( );
     }
 
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactorBorn::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactorBorn::getVolume( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -207,16 +213,16 @@ struct FormFactorSphereGaussianRadius_wrapper : FormFactorSphereGaussianRadius,
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -235,7 +241,7 @@ struct FormFactorSphereGaussianRadius_wrapper : FormFactorSphereGaussianRadius,
 
 void register_FormFactorSphereGaussianRadius_class(){
 
-    bp::class_< FormFactorSphereGaussianRadius_wrapper, bp::bases< IFormFactorBorn > >( "FormFactorSphereGaussianRadius", bp::init< double, double >(( bp::arg("mean"), bp::arg("sigma") )) )    
+    bp::class_< FormFactorSphereGaussianRadius_wrapper, bp::bases< IFormFactorBorn >, boost::noncopyable >( "FormFactorSphereGaussianRadius", bp::init< double, double >(( bp::arg("mean"), bp::arg("sigma") )) )    
         .def( 
             "clone"
             , (::FormFactorSphereGaussianRadius * ( ::FormFactorSphereGaussianRadius::* )(  ) const)(&::FormFactorSphereGaussianRadius::clone)
@@ -276,6 +282,10 @@ void register_FormFactorSphereGaussianRadius_class(){
             "getRadius"
             , (double ( ::IFormFactor::* )(  ) const)(&::IFormFactor::getRadius)
             , (double ( FormFactorSphereGaussianRadius_wrapper::* )(  ) const)(&FormFactorSphereGaussianRadius_wrapper::default_getRadius) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactorBorn::* )(  ) const)(&::IFormFactorBorn::getVolume)
+            , (double ( FormFactorSphereGaussianRadius_wrapper::* )(  ) const)(&FormFactorSphereGaussianRadius_wrapper::default_getVolume) )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -286,8 +296,8 @@ void register_FormFactorSphereGaussianRadius_class(){
             , (void ( FormFactorSphereGaussianRadius_wrapper::* )(  ) )(&FormFactorSphereGaussianRadius_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( FormFactorSphereGaussianRadius_wrapper::* )( ::complex_t ) )(&FormFactorSphereGaussianRadius_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( FormFactorSphereGaussianRadius_wrapper::* )( ::complex_t const & ) )(&FormFactorSphereGaussianRadius_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/GISASExperiment.pypp.cpp b/Core/PythonAPI/src/GISASExperiment.pypp.cpp
index 71e0704c53ee9acd64c2ce808bb2592b0ee1fa61..4ce878d5d86d067e4af862ad56035be08171c028 100644
--- a/Core/PythonAPI/src/GISASExperiment.pypp.cpp
+++ b/Core/PythonAPI/src/GISASExperiment.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/HomogeneousMaterial.pypp.cpp b/Core/PythonAPI/src/HomogeneousMaterial.pypp.cpp
index 28ba920b4e32d1a243e8754cc5ec5a4298838c0f..1c72fc192777b309275bb55199d7da32d0d03649 100644
--- a/Core/PythonAPI/src/HomogeneousMaterial.pypp.cpp
+++ b/Core/PythonAPI/src/HomogeneousMaterial.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -65,8 +66,8 @@ void register_HomogeneousMaterial_class(){
         typedef bp::class_< HomogeneousMaterial, bp::bases< IMaterial > > HomogeneousMaterial_exposer_t;
         HomogeneousMaterial_exposer_t HomogeneousMaterial_exposer = HomogeneousMaterial_exposer_t( "HomogeneousMaterial", bp::init< >() );
         bp::scope HomogeneousMaterial_scope( HomogeneousMaterial_exposer );
-        HomogeneousMaterial_exposer.def( bp::init< complex_t >(( bp::arg("refractive_index") )) );
-        HomogeneousMaterial_exposer.def( bp::init< std::string const &, complex_t >(( bp::arg("name"), bp::arg("refractive_index") )) );
+        HomogeneousMaterial_exposer.def( bp::init< complex_t const & >(( bp::arg("refractive_index") )) );
+        HomogeneousMaterial_exposer.def( bp::init< std::string const &, complex_t const & >(( bp::arg("name"), bp::arg("refractive_index") )) );
         HomogeneousMaterial_exposer.def( bp::init< std::string const &, double, double >(( bp::arg("name"), bp::arg("refractive_index_real"), bp::arg("refractive_index_imag") )) );
         HomogeneousMaterial_exposer.def( bp::init< HomogeneousMaterial const & >(( bp::arg("other") )) );
         { //::HomogeneousMaterial::getRefractiveIndex
diff --git a/Core/PythonAPI/src/ICloneable.pypp.cpp b/Core/PythonAPI/src/ICloneable.pypp.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f6e81e52a37d06a4b2c0730a05a85bf6dafad0f9
--- /dev/null
+++ b/Core/PythonAPI/src/ICloneable.pypp.cpp
@@ -0,0 +1,87 @@
+// This file has been generated by Py++.
+
+#include "Macros.h"
+GCC_DIAG_OFF(unused-parameter);
+GCC_DIAG_OFF(missing-field-initializers);
+#include "boost/python.hpp"
+#include "boost/python/suite/indexing/vector_indexing_suite.hpp"
+GCC_DIAG_ON(unused-parameter);
+GCC_DIAG_ON(missing-field-initializers);
+#include "BasicVector3D.h"
+#include "Experiment.h"
+#include "FormFactorCrystal.h"
+#include "FormFactorCylinder.h"
+#include "FormFactorDecoratorDebyeWaller.h"
+#include "FormFactorFullSphere.h"
+#include "FormFactorGauss.h"
+#include "FormFactorLorentz.h"
+#include "FormFactorPrism3.h"
+#include "FormFactorPyramid.h"
+#include "FormFactorSphereGaussianRadius.h"
+#include "GISASExperiment.h"
+#include "HomogeneousMaterial.h"
+#include "ICloneable.h"
+#include "IClusteredParticles.h"
+#include "ICompositeSample.h"
+#include "IFormFactor.h"
+#include "IFormFactorBorn.h"
+#include "IFormFactorDecorator.h"
+#include "IInterferenceFunction.h"
+#include "InterferenceFunctionNone.h"
+#include "InterferenceFunction1DParaCrystal.h"
+#include "IMaterial.h"
+#include "IParameterized.h"
+#include "ISample.h"
+#include "ISampleBuilder.h"
+#include "ISelectionRule.h"
+#include "ISingleton.h"
+#include "Lattice.h"
+#include "LatticeBasis.h"
+#include "Layer.h"
+#include "LayerDecorator.h"
+#include "LayerRoughness.h"
+#include "MaterialManager.h"
+#include "MesoCrystal.h"
+#include "MultiLayer.h"
+#include "Particle.h"
+#include "Crystal.h"
+#include "ParticleDecoration.h"
+#include "OpticalFresnel.h"
+#include "ParameterPool.h"
+#include "ParticleInfo.h"
+#include "DiffuseParticleInfo.h"
+#include "PythonOutputData.h"
+#include "PythonPlusplusHelper.h"
+#include "RealParameterWrapper.h"
+#include "Transform3D.h"
+#include "Units.h"
+#include "Types.h"
+#include "ICloneable.pypp.h"
+
+namespace bp = boost::python;
+
+struct ICloneable_wrapper : ICloneable, bp::wrapper< ICloneable > {
+
+    ICloneable_wrapper( )
+    : ICloneable( )
+      , bp::wrapper< ICloneable >(){
+        // null constructor
+    
+    }
+
+    virtual ::ICloneable * clone(  ) const {
+        bp::override func_clone = this->get_override( "clone" );
+        return func_clone(  );
+    }
+
+};
+
+void register_ICloneable_class(){
+
+    bp::class_< ICloneable_wrapper, boost::noncopyable >( "ICloneable", bp::init< >() )    
+        .def( 
+            "clone"
+            , bp::pure_virtual( (::ICloneable * ( ::ICloneable::* )(  ) const)(&::ICloneable::clone) )
+            , bp::return_value_policy< bp::manage_new_object >() );
+
+}
diff --git a/Core/PythonAPI/src/IClusteredParticles.pypp.cpp b/Core/PythonAPI/src/IClusteredParticles.pypp.cpp
index acad203c63180bb5321239be3ff864ad1ffa8288..6c256bcccf8030339eda3c0f7bfe57d6aa287611 100644
--- a/Core/PythonAPI/src/IClusteredParticles.pypp.cpp
+++ b/Core/PythonAPI/src/IClusteredParticles.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -133,6 +134,30 @@ struct IClusteredParticles_wrapper : IClusteredParticles, bp::wrapper< IClustere
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -169,6 +194,18 @@ struct IClusteredParticles_wrapper : IClusteredParticles, bp::wrapper< IClustere
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_IClusteredParticles_class(){
@@ -204,6 +241,16 @@ void register_IClusteredParticles_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( IClusteredParticles_wrapper::* )(  ) const)(&IClusteredParticles_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( IClusteredParticles_wrapper::* )(  ) )(&IClusteredParticles_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( IClusteredParticles_wrapper::* )(  ) const)(&IClusteredParticles_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -215,6 +262,10 @@ void register_IClusteredParticles_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( IClusteredParticles_wrapper::* )(  ) )(&IClusteredParticles_wrapper::default_setParametersAreChanged) );
+            , (void ( IClusteredParticles_wrapper::* )(  ) )(&IClusteredParticles_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( IClusteredParticles_wrapper::* )(  ) const)(&IClusteredParticles_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/ICompositeSample.pypp.cpp b/Core/PythonAPI/src/ICompositeSample.pypp.cpp
index 2dc021e61f142719e5219177a33ab9646fadf302..0064cb8ae7f065bce14f119ca6e5672a6b34a9a8 100644
--- a/Core/PythonAPI/src/ICompositeSample.pypp.cpp
+++ b/Core/PythonAPI/src/ICompositeSample.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -68,28 +69,64 @@ struct ICompositeSample_wrapper : ICompositeSample, bp::wrapper< ICompositeSampl
     
     }
 
-    virtual bool areParametersChanged(  ) {
-        if( bp::override func_areParametersChanged = this->get_override( "areParametersChanged" ) )
-            return func_areParametersChanged(  );
+    virtual ::ICompositeSample * clone(  ) const  {
+        if( bp::override func_clone = this->get_override( "clone" ) )
+            return func_clone(  );
         else{
-            return this->IParameterized::areParametersChanged(  );
+            return this->ICompositeSample::clone(  );
         }
     }
     
-    bool default_areParametersChanged(  ) {
-        return IParameterized::areParametersChanged( );
+    ::ICompositeSample * default_clone(  ) const  {
+        return ICompositeSample::clone( );
     }
 
-    virtual ::ISample * clone(  ) const  {
-        if( bp::override func_clone = this->get_override( "clone" ) )
-            return func_clone(  );
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
         else{
-            return this->ISample::clone(  );
+            return this->ICompositeSample::size(  );
         }
     }
     
-    ::ISample * default_clone(  ) const  {
-        return ISample::clone( );
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
+    virtual bool areParametersChanged(  ) {
+        if( bp::override func_areParametersChanged = this->get_override( "areParametersChanged" ) )
+            return func_areParametersChanged(  );
+        else{
+            return this->IParameterized::areParametersChanged(  );
+        }
+    }
+    
+    bool default_areParametersChanged(  ) {
+        return IParameterized::areParametersChanged( );
     }
 
     virtual ::ParameterPool * createParameterTree(  ) const  {
@@ -146,14 +183,40 @@ void register_ICompositeSample_class(){
 
     bp::class_< ICompositeSample_wrapper, bp::bases< ISample >, boost::noncopyable >( "ICompositeSample", bp::init< >() )    
         .def( 
-            "areParametersChanged"
-            , (bool ( ::IParameterized::* )(  ) )(&::IParameterized::areParametersChanged)
-            , (bool ( ICompositeSample_wrapper::* )(  ) )(&ICompositeSample_wrapper::default_areParametersChanged) )    
+            "begin_shallow"
+            , (::std::_List_iterator< ISample* > ( ::ICompositeSample::* )(  ) )( &::ICompositeSample::begin_shallow ) )    
+        .def( 
+            "begin_shallow"
+            , (::std::_List_const_iterator< ISample* > ( ::ICompositeSample::* )(  ) const)( &::ICompositeSample::begin_shallow ) )    
         .def( 
             "clone"
-            , (::ISample * ( ::ISample::* )(  ) const)(&::ISample::clone)
-            , (::ISample * ( ICompositeSample_wrapper::* )(  ) const)(&ICompositeSample_wrapper::default_clone)
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::clone)
+            , (::ICompositeSample * ( ICompositeSample_wrapper::* )(  ) const)(&ICompositeSample_wrapper::default_clone)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "end_shallow"
+            , (::std::_List_iterator< ISample* > ( ::ICompositeSample::* )(  ) )( &::ICompositeSample::end_shallow ) )    
+        .def( 
+            "end_shallow"
+            , (::std::_List_const_iterator< ISample* > ( ::ICompositeSample::* )(  ) const)( &::ICompositeSample::end_shallow ) )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( ICompositeSample_wrapper::* )(  ) )(&ICompositeSample_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( ICompositeSample_wrapper::* )(  ) const)(&ICompositeSample_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( ICompositeSample_wrapper::* )(  ) const)(&ICompositeSample_wrapper::default_size) )    
+        .def( 
+            "areParametersChanged"
+            , (bool ( ::IParameterized::* )(  ) )(&::IParameterized::areParametersChanged)
+            , (bool ( ICompositeSample_wrapper::* )(  ) )(&ICompositeSample_wrapper::default_areParametersChanged) )    
         .def( 
             "createParameterTree"
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
diff --git a/Core/PythonAPI/src/IFormFactor.pypp.cpp b/Core/PythonAPI/src/IFormFactor.pypp.cpp
index 066917e36031a81578496354177a5e558389a474..e0ff2fb22b877ff6cd11d2b39de4414d0f412454 100644
--- a/Core/PythonAPI/src/IFormFactor.pypp.cpp
+++ b/Core/PythonAPI/src/IFormFactor.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -150,16 +151,16 @@ struct IFormFactor_wrapper : IFormFactor, bp::wrapper< IFormFactor > {
         return IFormFactor::isDistributedFormFactor( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual bool areParametersChanged(  ) {
@@ -263,8 +264,8 @@ void register_IFormFactor_class(){
             , (bool ( IFormFactor_wrapper::* )(  ) const)(&IFormFactor_wrapper::default_isDistributedFormFactor) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( IFormFactor_wrapper::* )( ::complex_t ) )(&IFormFactor_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( IFormFactor_wrapper::* )( ::complex_t const & ) )(&IFormFactor_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "areParametersChanged"
diff --git a/Core/PythonAPI/src/IFormFactorBorn.pypp.cpp b/Core/PythonAPI/src/IFormFactorBorn.pypp.cpp
index d07985e889d990b32002e05b44b6ffb9ca585f02..6584afbc3795c583d6135a91920e355c13257199 100644
--- a/Core/PythonAPI/src/IFormFactorBorn.pypp.cpp
+++ b/Core/PythonAPI/src/IFormFactorBorn.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -90,6 +91,18 @@ struct IFormFactorBorn_wrapper : IFormFactorBorn, bp::wrapper< IFormFactorBorn >
         return func_evaluate_for_q( boost::ref(q) );
     }
 
+    virtual double getVolume(  ) const  {
+        if( bp::override func_getVolume = this->get_override( "getVolume" ) )
+            return func_getVolume(  );
+        else{
+            return this->IFormFactorBorn::getVolume(  );
+        }
+    }
+    
+    double default_getVolume(  ) const  {
+        return IFormFactorBorn::getVolume( );
+    }
+
     virtual bool areParametersChanged(  ) {
         if( bp::override func_areParametersChanged = this->get_override( "areParametersChanged" ) )
             return func_areParametersChanged(  );
@@ -198,16 +211,16 @@ struct IFormFactorBorn_wrapper : IFormFactorBorn, bp::wrapper< IFormFactorBorn >
         ISample::print_structure( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactor::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactor::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactor::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual void setParametersAreChanged(  ) {
@@ -240,6 +253,10 @@ void register_IFormFactorBorn_class(){
             "evaluate_for_q"
             , bp::pure_virtual( (::complex_t ( ::IFormFactorBorn::* )( ::cvector_t const & ) const)(&::IFormFactorBorn::evaluate_for_q) )
             , ( bp::arg("q") ) )    
+        .def( 
+            "getVolume"
+            , (double ( ::IFormFactorBorn::* )(  ) const)(&::IFormFactorBorn::getVolume)
+            , (double ( IFormFactorBorn_wrapper::* )(  ) const)(&IFormFactorBorn_wrapper::default_getVolume) )    
         .def( 
             "areParametersChanged"
             , (bool ( ::IParameterized::* )(  ) )(&::IParameterized::areParametersChanged)
@@ -281,8 +298,8 @@ void register_IFormFactorBorn_class(){
             , (void ( IFormFactorBorn_wrapper::* )(  ) )(&IFormFactorBorn_wrapper::default_print_structure) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactor::* )( ::complex_t ) )(&::IFormFactor::setAmbientRefractiveIndex)
-            , (void ( IFormFactorBorn_wrapper::* )( ::complex_t ) )(&IFormFactorBorn_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactor::* )( ::complex_t const & ) )(&::IFormFactor::setAmbientRefractiveIndex)
+            , (void ( IFormFactorBorn_wrapper::* )( ::complex_t const & ) )(&IFormFactorBorn_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "setParametersAreChanged"
diff --git a/Core/PythonAPI/src/IFormFactorDecorator.pypp.cpp b/Core/PythonAPI/src/IFormFactorDecorator.pypp.cpp
index 49a13e94dc04d27467d3583ea7ae02c740c90294..af02eb6771c92fa8b85939d114b3d0ef2079ded5 100644
--- a/Core/PythonAPI/src/IFormFactorDecorator.pypp.cpp
+++ b/Core/PythonAPI/src/IFormFactorDecorator.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -102,16 +103,16 @@ struct IFormFactorDecorator_wrapper : IFormFactorDecorator, bp::wrapper< IFormFa
         return IFormFactorDecorator::getVolume( );
     }
 
-    virtual void setAmbientRefractiveIndex( ::complex_t refractive_index ) {
+    virtual void setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
         if( bp::override func_setAmbientRefractiveIndex = this->get_override( "setAmbientRefractiveIndex" ) )
-            func_setAmbientRefractiveIndex( refractive_index );
+            func_setAmbientRefractiveIndex( boost::ref(refractive_index) );
         else{
-            this->IFormFactorDecorator::setAmbientRefractiveIndex( refractive_index );
+            this->IFormFactorDecorator::setAmbientRefractiveIndex( boost::ref(refractive_index) );
         }
     }
     
-    void default_setAmbientRefractiveIndex( ::complex_t refractive_index ) {
-        IFormFactorDecorator::setAmbientRefractiveIndex( refractive_index );
+    void default_setAmbientRefractiveIndex( ::complex_t const & refractive_index ) {
+        IFormFactorDecorator::setAmbientRefractiveIndex( boost::ref(refractive_index) );
     }
 
     virtual bool areParametersChanged(  ) {
@@ -238,8 +239,8 @@ void register_IFormFactorDecorator_class(){
             , (double ( IFormFactorDecorator_wrapper::* )(  ) const)(&IFormFactorDecorator_wrapper::default_getVolume) )    
         .def( 
             "setAmbientRefractiveIndex"
-            , (void ( ::IFormFactorDecorator::* )( ::complex_t ) )(&::IFormFactorDecorator::setAmbientRefractiveIndex)
-            , (void ( IFormFactorDecorator_wrapper::* )( ::complex_t ) )(&IFormFactorDecorator_wrapper::default_setAmbientRefractiveIndex)
+            , (void ( ::IFormFactorDecorator::* )( ::complex_t const & ) )(&::IFormFactorDecorator::setAmbientRefractiveIndex)
+            , (void ( IFormFactorDecorator_wrapper::* )( ::complex_t const & ) )(&IFormFactorDecorator_wrapper::default_setAmbientRefractiveIndex)
             , ( bp::arg("refractive_index") ) )    
         .def( 
             "areParametersChanged"
diff --git a/Core/PythonAPI/src/IInterferenceFunction.pypp.cpp b/Core/PythonAPI/src/IInterferenceFunction.pypp.cpp
index ee58304bd4a397bdc1406cb5d706cd0470c054d6..b1cf7167e0894d74b948b11710b727f776be312c 100644
--- a/Core/PythonAPI/src/IInterferenceFunction.pypp.cpp
+++ b/Core/PythonAPI/src/IInterferenceFunction.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/IMaterial.pypp.cpp b/Core/PythonAPI/src/IMaterial.pypp.cpp
index cba84feb2d6e20cd25f51a6d54d67c6ba5120a00..013e593dc204e7cccfc510b104d92af14f3adc92 100644
--- a/Core/PythonAPI/src/IMaterial.pypp.cpp
+++ b/Core/PythonAPI/src/IMaterial.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/IParameterized.pypp.cpp b/Core/PythonAPI/src/IParameterized.pypp.cpp
index 9a7abefdaeab14ae36c6746a5d4177cf285b1e5b..6c311b5f98b384ab0ebbe75d2ecfb14865e45212 100644
--- a/Core/PythonAPI/src/IParameterized.pypp.cpp
+++ b/Core/PythonAPI/src/IParameterized.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -68,6 +69,13 @@ struct IParameterized_wrapper : IParameterized, bp::wrapper< IParameterized > {
     
     }
 
+    IParameterized_wrapper(::std::string const & name )
+    : IParameterized( name )
+      , bp::wrapper< IParameterized >(){
+        // constructor
+    
+    }
+
     IParameterized_wrapper(::IParameterized const & other )
     : IParameterized( boost::ref(other) )
       , bp::wrapper< IParameterized >(){
@@ -129,9 +137,9 @@ void register_IParameterized_class(){
 
     { //::IParameterized
         typedef bp::class_< IParameterized_wrapper > IParameterized_exposer_t;
-        IParameterized_exposer_t IParameterized_exposer = IParameterized_exposer_t( "IParameterized", bp::no_init );
+        IParameterized_exposer_t IParameterized_exposer = IParameterized_exposer_t( "IParameterized", bp::init< >() );
         bp::scope IParameterized_scope( IParameterized_exposer );
-        IParameterized_exposer.def( bp::init< >() );
+        IParameterized_exposer.def( bp::init< std::string const & >(( bp::arg("name") )) );
         IParameterized_exposer.def( bp::init< IParameterized const & >(( bp::arg("other") )) );
         { //::IParameterized::areParametersChanged
         
diff --git a/Core/PythonAPI/src/ISample.pypp.cpp b/Core/PythonAPI/src/ISample.pypp.cpp
index 3123d51fcaab29790ec6ca84469cd4b388741d8a..4003593654f3efa9ecbfbce18b4b36a4bd4562f4 100644
--- a/Core/PythonAPI/src/ISample.pypp.cpp
+++ b/Core/PythonAPI/src/ISample.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -68,13 +69,6 @@ struct ISample_wrapper : ISample, bp::wrapper< ISample > {
     
     }
 
-    ISample_wrapper(::ISample const & other )
-    : ISample( boost::ref(other) )
-      , bp::wrapper< ISample >(){
-        // copy constructor
-    
-    }
-
     virtual ::ISample * clone(  ) const  {
         if( bp::override func_clone = this->get_override( "clone" ) )
             return func_clone(  );
@@ -151,91 +145,33 @@ struct ISample_wrapper : ISample, bp::wrapper< ISample > {
 
 void register_ISample_class(){
 
-    { //::ISample
-        typedef bp::class_< ISample_wrapper, bp::bases< IParameterized > > ISample_exposer_t;
-        ISample_exposer_t ISample_exposer = ISample_exposer_t( "ISample", bp::init< >() );
-        bp::scope ISample_scope( ISample_exposer );
-        ISample_exposer.def( bp::init< ISample const & >(( bp::arg("other") )) );
-        { //::ISample::clone
-        
-            typedef ::ISample * ( ::ISample::*clone_function_type )(  ) const;
-            typedef ::ISample * ( ISample_wrapper::*default_clone_function_type )(  ) const;
-            
-            ISample_exposer.def( 
-                "clone"
-                , clone_function_type(&::ISample::clone)
-                , default_clone_function_type(&ISample_wrapper::default_clone)
-                , bp::return_value_policy< bp::manage_new_object >() );
-        
-        }
-        { //::ISample::operator=
-        
-            typedef ::ISample & ( ::ISample::*assign_function_type )( ::ISample const & ) ;
-            
-            ISample_exposer.def( 
-                "assign"
-                , assign_function_type( &::ISample::operator= )
-                , ( bp::arg("other") )
-                , bp::return_self< >() );
-        
-        }
-        { //::ISample::print_structure
-        
-            typedef void ( ::ISample::*print_structure_function_type )(  ) ;
-            typedef void ( ISample_wrapper::*default_print_structure_function_type )(  ) ;
-            
-            ISample_exposer.def( 
-                "print_structure"
-                , print_structure_function_type(&::ISample::print_structure)
-                , default_print_structure_function_type(&ISample_wrapper::default_print_structure) );
-        
-        }
-        { //::IParameterized::areParametersChanged
-        
-            typedef bool ( ::IParameterized::*areParametersChanged_function_type )(  ) ;
-            typedef bool ( ISample_wrapper::*default_areParametersChanged_function_type )(  ) ;
-            
-            ISample_exposer.def( 
-                "areParametersChanged"
-                , areParametersChanged_function_type(&::IParameterized::areParametersChanged)
-                , default_areParametersChanged_function_type(&ISample_wrapper::default_areParametersChanged) );
-        
-        }
-        { //::IParameterized::createParameterTree
-        
-            typedef ::ParameterPool * ( ::IParameterized::*createParameterTree_function_type )(  ) const;
-            typedef ::ParameterPool * ( ISample_wrapper::*default_createParameterTree_function_type )(  ) const;
-            
-            ISample_exposer.def( 
-                "createParameterTree"
-                , createParameterTree_function_type(&::IParameterized::createParameterTree)
-                , default_createParameterTree_function_type(&ISample_wrapper::default_createParameterTree)
-                , bp::return_value_policy< bp::manage_new_object >() );
-        
-        }
-        { //::IParameterized::printParameters
-        
-            typedef void ( ::IParameterized::*printParameters_function_type )(  ) const;
-            typedef void ( ISample_wrapper::*default_printParameters_function_type )(  ) const;
-            
-            ISample_exposer.def( 
-                "printParameters"
-                , printParameters_function_type(&::IParameterized::printParameters)
-                , default_printParameters_function_type(&ISample_wrapper::default_printParameters) );
-        
-        }
-        { //::IParameterized::setParametersAreChanged
-        
-            typedef void ( ::IParameterized::*setParametersAreChanged_function_type )(  ) ;
-            typedef void ( ISample_wrapper::*default_setParametersAreChanged_function_type )(  ) ;
-            
-            ISample_exposer.def( 
-                "setParametersAreChanged"
-                , setParametersAreChanged_function_type(&::IParameterized::setParametersAreChanged)
-                , default_setParametersAreChanged_function_type(&ISample_wrapper::default_setParametersAreChanged) );
-        
-        }
-        ISample_exposer.def( bp::self_ns::str( bp::self ) );
-    }
+    bp::class_< ISample_wrapper, bp::bases< IParameterized, ICloneable >, boost::noncopyable >( "ISample", bp::init< >() )    
+        .def( 
+            "clone"
+            , (::ISample * ( ::ISample::* )(  ) const)(&::ISample::clone)
+            , (::ISample * ( ISample_wrapper::* )(  ) const)(&ISample_wrapper::default_clone)
+            , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "print_structure"
+            , (void ( ::ISample::* )(  ) )(&::ISample::print_structure)
+            , (void ( ISample_wrapper::* )(  ) )(&ISample_wrapper::default_print_structure) )    
+        .def( 
+            "areParametersChanged"
+            , (bool ( ::IParameterized::* )(  ) )(&::IParameterized::areParametersChanged)
+            , (bool ( ISample_wrapper::* )(  ) )(&ISample_wrapper::default_areParametersChanged) )    
+        .def( 
+            "createParameterTree"
+            , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
+            , (::ParameterPool * ( ISample_wrapper::* )(  ) const)(&ISample_wrapper::default_createParameterTree)
+            , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "printParameters"
+            , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
+            , (void ( ISample_wrapper::* )(  ) const)(&ISample_wrapper::default_printParameters) )    
+        .def( 
+            "setParametersAreChanged"
+            , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
+            , (void ( ISample_wrapper::* )(  ) )(&ISample_wrapper::default_setParametersAreChanged) )    
+        .def( bp::self_ns::str( bp::self ) );
 
 }
diff --git a/Core/PythonAPI/src/ISampleBuilder.pypp.cpp b/Core/PythonAPI/src/ISampleBuilder.pypp.cpp
index cc73724f6dec49397cf151279c823c516306ec78..87fe751e9d2731f57b06d9fdf38ada3517141667 100644
--- a/Core/PythonAPI/src/ISampleBuilder.pypp.cpp
+++ b/Core/PythonAPI/src/ISampleBuilder.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -144,7 +145,7 @@ void register_ISampleBuilder_class(){
             "buildSample"
             , (::ISample * ( ::ISampleBuilder::* )(  ) const)(&::ISampleBuilder::buildSample)
             , (::ISample * ( ISampleBuilder_wrapper::* )(  ) const)(&ISampleBuilder_wrapper::default_buildSample)
-            , bp::return_value_policy< bp::reference_existing_object >() )    
+            , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "areParametersChanged"
             , (bool ( ::IParameterized::* )(  ) )(&::IParameterized::areParametersChanged)
diff --git a/Core/PythonAPI/src/ISelectionRule.pypp.cpp b/Core/PythonAPI/src/ISelectionRule.pypp.cpp
index 2d7d27d246237dfed73dedb5168f9c2b9aaa00f5..1f437d091b0e38440368fd77499fdba6defb4bfa 100644
--- a/Core/PythonAPI/src/ISelectionRule.pypp.cpp
+++ b/Core/PythonAPI/src/ISelectionRule.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/InterferenceFunction1DParaCrystal.pypp.cpp b/Core/PythonAPI/src/InterferenceFunction1DParaCrystal.pypp.cpp
index d2410854569cd67dceafb791fc18e46d3181af74..36610d474022f9b2d22b9eecce79a1aabb0f6dfe 100644
--- a/Core/PythonAPI/src/InterferenceFunction1DParaCrystal.pypp.cpp
+++ b/Core/PythonAPI/src/InterferenceFunction1DParaCrystal.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/InterferenceFunctionNone.pypp.cpp b/Core/PythonAPI/src/InterferenceFunctionNone.pypp.cpp
index b0cf2b74896e1ac8cb708cd9cfe28534894a8558..bf8a89f9165f4fdb8f7947ee145bb79134bdb3f6 100644
--- a/Core/PythonAPI/src/InterferenceFunctionNone.pypp.cpp
+++ b/Core/PythonAPI/src/InterferenceFunctionNone.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/Lattice.pypp.cpp b/Core/PythonAPI/src/Lattice.pypp.cpp
index 05f4a8c588a0fe4969a001928fa6366b3dea8bf3..5b663f727e509bea6a929cb2f8f8c5263bba429e 100644
--- a/Core/PythonAPI/src/Lattice.pypp.cpp
+++ b/Core/PythonAPI/src/Lattice.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/LatticeBasis.pypp.cpp b/Core/PythonAPI/src/LatticeBasis.pypp.cpp
index 876c18948f17c2be5a9af2ad2ace613c0fc5a380..a825d450c5c4dea7ef854bb226c9921430b51a4b 100644
--- a/Core/PythonAPI/src/LatticeBasis.pypp.cpp
+++ b/Core/PythonAPI/src/LatticeBasis.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -92,6 +93,30 @@ struct LatticeBasis_wrapper : LatticeBasis, bp::wrapper< LatticeBasis > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual ::complex_t const getRefractiveIndex(  ) const  {
         if( bp::override func_getRefractiveIndex = this->get_override( "getRefractiveIndex" ) )
             return func_getRefractiveIndex(  );
@@ -164,6 +189,18 @@ struct LatticeBasis_wrapper : LatticeBasis, bp::wrapper< LatticeBasis > {
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_LatticeBasis_class(){
@@ -182,6 +219,16 @@ void register_LatticeBasis_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( LatticeBasis_wrapper::* )(  ) const)(&LatticeBasis_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( LatticeBasis_wrapper::* )(  ) )(&LatticeBasis_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( LatticeBasis_wrapper::* )(  ) const)(&LatticeBasis_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "getRefractiveIndex"
             , (::complex_t const ( ::Particle::* )(  ) const)(&::Particle::getRefractiveIndex)
@@ -206,6 +253,10 @@ void register_LatticeBasis_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( LatticeBasis_wrapper::* )(  ) )(&LatticeBasis_wrapper::default_setParametersAreChanged) );
+            , (void ( LatticeBasis_wrapper::* )(  ) )(&LatticeBasis_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( LatticeBasis_wrapper::* )(  ) const)(&LatticeBasis_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/Layer.pypp.cpp b/Core/PythonAPI/src/Layer.pypp.cpp
index 9d4a5787afcfc88b3c7ddc753a97124ee0733ed2..014e43c6fbe2cc4abc0f0265c1f5d2a3f4fa71ef 100644
--- a/Core/PythonAPI/src/Layer.pypp.cpp
+++ b/Core/PythonAPI/src/Layer.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -202,6 +203,30 @@ struct Layer_wrapper : Layer, bp::wrapper< Layer > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -238,6 +263,18 @@ struct Layer_wrapper : Layer, bp::wrapper< Layer > {
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_Layer_class(){
@@ -291,6 +328,16 @@ void register_Layer_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( Layer_wrapper::* )(  ) const)(&Layer_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( Layer_wrapper::* )(  ) )(&Layer_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( Layer_wrapper::* )(  ) const)(&Layer_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -302,6 +349,10 @@ void register_Layer_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( Layer_wrapper::* )(  ) )(&Layer_wrapper::default_setParametersAreChanged) );
+            , (void ( Layer_wrapper::* )(  ) )(&Layer_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( Layer_wrapper::* )(  ) const)(&Layer_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/LayerDecorator.pypp.cpp b/Core/PythonAPI/src/LayerDecorator.pypp.cpp
index f3017f37400dadb7eab1b6328f1d3d2129ac55c6..ab33eb6246017668e82ba4aaf52adec6bbff2c7c 100644
--- a/Core/PythonAPI/src/LayerDecorator.pypp.cpp
+++ b/Core/PythonAPI/src/LayerDecorator.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -188,6 +189,30 @@ struct LayerDecorator_wrapper : LayerDecorator, bp::wrapper< LayerDecorator > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -224,6 +249,18 @@ struct LayerDecorator_wrapper : LayerDecorator, bp::wrapper< LayerDecorator > {
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_LayerDecorator_class(){
@@ -281,6 +318,16 @@ void register_LayerDecorator_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( LayerDecorator_wrapper::* )(  ) const)(&LayerDecorator_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( LayerDecorator_wrapper::* )(  ) )(&LayerDecorator_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( LayerDecorator_wrapper::* )(  ) const)(&LayerDecorator_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -292,6 +339,10 @@ void register_LayerDecorator_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( LayerDecorator_wrapper::* )(  ) )(&LayerDecorator_wrapper::default_setParametersAreChanged) );
+            , (void ( LayerDecorator_wrapper::* )(  ) )(&LayerDecorator_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( LayerDecorator_wrapper::* )(  ) const)(&LayerDecorator_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/LayerRoughness.pypp.cpp b/Core/PythonAPI/src/LayerRoughness.pypp.cpp
index fed2e5e39b1e7cc5616ee9d2797f2482e578eb8b..424a6277539c37a7208ca5bce8a9e97d8314ed7e 100644
--- a/Core/PythonAPI/src/LayerRoughness.pypp.cpp
+++ b/Core/PythonAPI/src/LayerRoughness.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -75,11 +76,16 @@ struct LayerRoughness_wrapper : LayerRoughness, bp::wrapper< LayerRoughness > {
     
     }
 
-    LayerRoughness_wrapper(::LayerRoughness const & other )
-    : LayerRoughness( boost::ref(other) )
-      , bp::wrapper< LayerRoughness >(){
-        // copy constructor
+    virtual ::LayerRoughness * clone(  ) const  {
+        if( bp::override func_clone = this->get_override( "clone" ) )
+            return func_clone(  );
+        else{
+            return this->LayerRoughness::clone(  );
+        }
+    }
     
+    ::LayerRoughness * default_clone(  ) const  {
+        return LayerRoughness::clone( );
     }
 
     virtual bool areParametersChanged(  ) {
@@ -94,18 +100,6 @@ struct LayerRoughness_wrapper : LayerRoughness, bp::wrapper< LayerRoughness > {
         return IParameterized::areParametersChanged( );
     }
 
-    virtual ::ISample * clone(  ) const  {
-        if( bp::override func_clone = this->get_override( "clone" ) )
-            return func_clone(  );
-        else{
-            return this->ISample::clone(  );
-        }
-    }
-    
-    ::ISample * default_clone(  ) const  {
-        return ISample::clone( );
-    }
-
     virtual ::ParameterPool * createParameterTree(  ) const  {
         if( bp::override func_createParameterTree = this->get_override( "createParameterTree" ) )
             return func_createParameterTree(  );
@@ -158,149 +152,55 @@ struct LayerRoughness_wrapper : LayerRoughness, bp::wrapper< LayerRoughness > {
 
 void register_LayerRoughness_class(){
 
-    { //::LayerRoughness
-        typedef bp::class_< LayerRoughness_wrapper > LayerRoughness_exposer_t;
-        LayerRoughness_exposer_t LayerRoughness_exposer = LayerRoughness_exposer_t( "LayerRoughness", bp::init< >() );
-        bp::scope LayerRoughness_scope( LayerRoughness_exposer );
-        LayerRoughness_exposer.def( bp::init< double, double, double >(( bp::arg("sigma"), bp::arg("hurstParameter"), bp::arg("latteralCorrLength") )) );
-        LayerRoughness_exposer.def( bp::init< LayerRoughness const & >(( bp::arg("other") )) );
-        { //::LayerRoughness::getHurstParameter
-        
-            typedef double ( ::LayerRoughness::*getHurstParameter_function_type )(  ) const;
-            
-            LayerRoughness_exposer.def( 
-                "getHurstParameter"
-                , getHurstParameter_function_type( &::LayerRoughness::getHurstParameter ) );
-        
-        }
-        { //::LayerRoughness::getLatteralCorrLength
-        
-            typedef double ( ::LayerRoughness::*getLatteralCorrLength_function_type )(  ) const;
-            
-            LayerRoughness_exposer.def( 
-                "getLatteralCorrLength"
-                , getLatteralCorrLength_function_type( &::LayerRoughness::getLatteralCorrLength ) );
-        
-        }
-        { //::LayerRoughness::getSigma
-        
-            typedef double ( ::LayerRoughness::*getSigma_function_type )(  ) const;
-            
-            LayerRoughness_exposer.def( 
-                "getSigma"
-                , getSigma_function_type( &::LayerRoughness::getSigma ) );
-        
-        }
-        { //::LayerRoughness::operator=
-        
-            typedef ::LayerRoughness & ( ::LayerRoughness::*assign_function_type )( ::LayerRoughness const & ) ;
-            
-            LayerRoughness_exposer.def( 
-                "assign"
-                , assign_function_type( &::LayerRoughness::operator= )
-                , ( bp::arg("other") )
-                , bp::return_self< >() );
-        
-        }
-        { //::LayerRoughness::setHurstParameter
-        
-            typedef void ( ::LayerRoughness::*setHurstParameter_function_type )( double ) ;
-            
-            LayerRoughness_exposer.def( 
-                "setHurstParameter"
-                , setHurstParameter_function_type( &::LayerRoughness::setHurstParameter )
-                , ( bp::arg("hurstParameter") ) );
-        
-        }
-        { //::LayerRoughness::setLatteralCorrLength
-        
-            typedef void ( ::LayerRoughness::*setLatteralCorrLength_function_type )( double ) ;
-            
-            LayerRoughness_exposer.def( 
-                "setLatteralCorrLength"
-                , setLatteralCorrLength_function_type( &::LayerRoughness::setLatteralCorrLength )
-                , ( bp::arg("latteralCorrLength") ) );
-        
-        }
-        { //::LayerRoughness::setSigma
-        
-            typedef void ( ::LayerRoughness::*setSigma_function_type )( double ) ;
-            
-            LayerRoughness_exposer.def( 
-                "setSigma"
-                , setSigma_function_type( &::LayerRoughness::setSigma )
-                , ( bp::arg("sigma") ) );
-        
-        }
-        { //::IParameterized::areParametersChanged
-        
-            typedef bool ( ::IParameterized::*areParametersChanged_function_type )(  ) ;
-            typedef bool ( LayerRoughness_wrapper::*default_areParametersChanged_function_type )(  ) ;
-            
-            LayerRoughness_exposer.def( 
-                "areParametersChanged"
-                , areParametersChanged_function_type(&::IParameterized::areParametersChanged)
-                , default_areParametersChanged_function_type(&LayerRoughness_wrapper::default_areParametersChanged) );
-        
-        }
-        { //::ISample::clone
-        
-            typedef ::ISample * ( ::ISample::*clone_function_type )(  ) const;
-            typedef ::ISample * ( LayerRoughness_wrapper::*default_clone_function_type )(  ) const;
-            
-            LayerRoughness_exposer.def( 
-                "clone"
-                , clone_function_type(&::ISample::clone)
-                , default_clone_function_type(&LayerRoughness_wrapper::default_clone)
-                , bp::return_value_policy< bp::manage_new_object >() );
-        
-        }
-        { //::IParameterized::createParameterTree
-        
-            typedef ::ParameterPool * ( ::IParameterized::*createParameterTree_function_type )(  ) const;
-            typedef ::ParameterPool * ( LayerRoughness_wrapper::*default_createParameterTree_function_type )(  ) const;
-            
-            LayerRoughness_exposer.def( 
-                "createParameterTree"
-                , createParameterTree_function_type(&::IParameterized::createParameterTree)
-                , default_createParameterTree_function_type(&LayerRoughness_wrapper::default_createParameterTree)
-                , bp::return_value_policy< bp::manage_new_object >() );
-        
-        }
-        { //::IParameterized::printParameters
-        
-            typedef void ( ::IParameterized::*printParameters_function_type )(  ) const;
-            typedef void ( LayerRoughness_wrapper::*default_printParameters_function_type )(  ) const;
-            
-            LayerRoughness_exposer.def( 
-                "printParameters"
-                , printParameters_function_type(&::IParameterized::printParameters)
-                , default_printParameters_function_type(&LayerRoughness_wrapper::default_printParameters) );
-        
-        }
-        { //::ISample::print_structure
-        
-            typedef void ( ::ISample::*print_structure_function_type )(  ) ;
-            typedef void ( LayerRoughness_wrapper::*default_print_structure_function_type )(  ) ;
-            
-            LayerRoughness_exposer.def( 
-                "print_structure"
-                , print_structure_function_type(&::ISample::print_structure)
-                , default_print_structure_function_type(&LayerRoughness_wrapper::default_print_structure) );
-        
-        }
-        { //::IParameterized::setParametersAreChanged
-        
-            typedef void ( ::IParameterized::*setParametersAreChanged_function_type )(  ) ;
-            typedef void ( LayerRoughness_wrapper::*default_setParametersAreChanged_function_type )(  ) ;
-            
-            LayerRoughness_exposer.def( 
-                "setParametersAreChanged"
-                , setParametersAreChanged_function_type(&::IParameterized::setParametersAreChanged)
-                , default_setParametersAreChanged_function_type(&LayerRoughness_wrapper::default_setParametersAreChanged) );
-        
-        }
-        LayerRoughness_exposer.def( bp::self_ns::str( bp::self ) );
-    }
+    bp::class_< LayerRoughness_wrapper, boost::noncopyable >( "LayerRoughness", bp::init< >() )    
+        .def( bp::init< double, double, double >(( bp::arg("sigma"), bp::arg("hurstParameter"), bp::arg("latteralCorrLength") )) )    
+        .def( 
+            "clone"
+            , (::LayerRoughness * ( ::LayerRoughness::* )(  ) const)(&::LayerRoughness::clone)
+            , (::LayerRoughness * ( LayerRoughness_wrapper::* )(  ) const)(&LayerRoughness_wrapper::default_clone)
+            , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getHurstParameter"
+            , (double ( ::LayerRoughness::* )(  ) const)( &::LayerRoughness::getHurstParameter ) )    
+        .def( 
+            "getLatteralCorrLength"
+            , (double ( ::LayerRoughness::* )(  ) const)( &::LayerRoughness::getLatteralCorrLength ) )    
+        .def( 
+            "getSigma"
+            , (double ( ::LayerRoughness::* )(  ) const)( &::LayerRoughness::getSigma ) )    
+        .def( 
+            "setHurstParameter"
+            , (void ( ::LayerRoughness::* )( double ) )( &::LayerRoughness::setHurstParameter )
+            , ( bp::arg("hurstParameter") ) )    
+        .def( 
+            "setLatteralCorrLength"
+            , (void ( ::LayerRoughness::* )( double ) )( &::LayerRoughness::setLatteralCorrLength )
+            , ( bp::arg("latteralCorrLength") ) )    
+        .def( 
+            "setSigma"
+            , (void ( ::LayerRoughness::* )( double ) )( &::LayerRoughness::setSigma )
+            , ( bp::arg("sigma") ) )    
+        .def( 
+            "areParametersChanged"
+            , (bool ( ::IParameterized::* )(  ) )(&::IParameterized::areParametersChanged)
+            , (bool ( LayerRoughness_wrapper::* )(  ) )(&LayerRoughness_wrapper::default_areParametersChanged) )    
+        .def( 
+            "createParameterTree"
+            , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
+            , (::ParameterPool * ( LayerRoughness_wrapper::* )(  ) const)(&LayerRoughness_wrapper::default_createParameterTree)
+            , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "printParameters"
+            , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
+            , (void ( LayerRoughness_wrapper::* )(  ) const)(&LayerRoughness_wrapper::default_printParameters) )    
+        .def( 
+            "print_structure"
+            , (void ( ::ISample::* )(  ) )(&::ISample::print_structure)
+            , (void ( LayerRoughness_wrapper::* )(  ) )(&LayerRoughness_wrapper::default_print_structure) )    
+        .def( 
+            "setParametersAreChanged"
+            , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
+            , (void ( LayerRoughness_wrapper::* )(  ) )(&LayerRoughness_wrapper::default_setParametersAreChanged) )    
+        .def( bp::self_ns::str( bp::self ) );
 
 }
diff --git a/Core/PythonAPI/src/MaterialManager.pypp.cpp b/Core/PythonAPI/src/MaterialManager.pypp.cpp
index 68199f0132cbe98628a075ab7a06df9e1f472f2d..a50996f69e2b9ef94250baaffdc0054ad39da165 100644
--- a/Core/PythonAPI/src/MaterialManager.pypp.cpp
+++ b/Core/PythonAPI/src/MaterialManager.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -64,7 +65,7 @@ void register_MaterialManager_class(){
     bp::class_< MaterialManager, bp::bases< ISingleton< MaterialManager > >, boost::noncopyable >( "MaterialManager", bp::no_init )    
         .def( 
             "addHomogeneousMaterial"
-            , (::IMaterial const * ( ::MaterialManager::* )( ::std::string const &,::complex_t ) )( &::MaterialManager::addHomogeneousMaterial )
+            , (::IMaterial const * ( ::MaterialManager::* )( ::std::string const &,::complex_t const & ) )( &::MaterialManager::addHomogeneousMaterial )
             , ( bp::arg("name"), bp::arg("refractive_index") )
             , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
diff --git a/Core/PythonAPI/src/ISingleton_less__MaterialManager__greater_.pypp.cpp b/Core/PythonAPI/src/MaterialManagerSingleton_t.pypp.cpp
similarity index 91%
rename from Core/PythonAPI/src/ISingleton_less__MaterialManager__greater_.pypp.cpp
rename to Core/PythonAPI/src/MaterialManagerSingleton_t.pypp.cpp
index bb97ddda15eb95cbb55a7460f884e9f636f2b024..0c0ab97f6cf647726f37c40b874431ad737de994 100644
--- a/Core/PythonAPI/src/ISingleton_less__MaterialManager__greater_.pypp.cpp
+++ b/Core/PythonAPI/src/MaterialManagerSingleton_t.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -55,13 +56,13 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "Transform3D.h"
 #include "Units.h"
 #include "Types.h"
-#include "ISingleton_less__MaterialManager__greater_.pypp.h"
+#include "MaterialManagerSingleton_t.pypp.h"
 
 namespace bp = boost::python;
 
-void register_ISingleton_less__MaterialManager__greater__class(){
+void register_MaterialManagerSingleton_t_class(){
 
-    bp::class_< ISingleton< MaterialManager >, boost::noncopyable >( "ISingleton_less__MaterialManager__greater_", bp::no_init )    
+    bp::class_< ISingleton< MaterialManager >, boost::noncopyable >( "MaterialManagerSingleton_t", bp::no_init )    
         .def( 
             "instance"
             , (::MaterialManager & (*)(  ))( &::ISingleton< MaterialManager >::instance )
diff --git a/Core/PythonAPI/src/MesoCrystal.pypp.cpp b/Core/PythonAPI/src/MesoCrystal.pypp.cpp
index b026ac116e12b218d0fabe581732274a1066f79a..1a85c418b2236e82940fc519b68a74b5f8250f96 100644
--- a/Core/PythonAPI/src/MesoCrystal.pypp.cpp
+++ b/Core/PythonAPI/src/MesoCrystal.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -104,6 +105,30 @@ struct MesoCrystal_wrapper : MesoCrystal, bp::wrapper< MesoCrystal > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual ::complex_t const getRefractiveIndex(  ) const  {
         if( bp::override func_getRefractiveIndex = this->get_override( "getRefractiveIndex" ) )
             return func_getRefractiveIndex(  );
@@ -176,6 +201,18 @@ struct MesoCrystal_wrapper : MesoCrystal, bp::wrapper< MesoCrystal > {
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_MesoCrystal_class(){
@@ -195,6 +232,16 @@ void register_MesoCrystal_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( MesoCrystal_wrapper::* )(  ) const)(&MesoCrystal_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( MesoCrystal_wrapper::* )(  ) )(&MesoCrystal_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( MesoCrystal_wrapper::* )(  ) const)(&MesoCrystal_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "getRefractiveIndex"
             , (::complex_t const ( ::Particle::* )(  ) const)(&::Particle::getRefractiveIndex)
@@ -219,6 +266,10 @@ void register_MesoCrystal_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( MesoCrystal_wrapper::* )(  ) )(&MesoCrystal_wrapper::default_setParametersAreChanged) );
+            , (void ( MesoCrystal_wrapper::* )(  ) )(&MesoCrystal_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( MesoCrystal_wrapper::* )(  ) const)(&MesoCrystal_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/MultiLayer.pypp.cpp b/Core/PythonAPI/src/MultiLayer.pypp.cpp
index 3f2bcabbb77b20e8bf70e9c82604699965de29ad..1289a32a4d7299dabdf8c7fc775264515e1f5ba7 100644
--- a/Core/PythonAPI/src/MultiLayer.pypp.cpp
+++ b/Core/PythonAPI/src/MultiLayer.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -92,6 +93,30 @@ struct MultiLayer_wrapper : MultiLayer, bp::wrapper< MultiLayer > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -128,6 +153,18 @@ struct MultiLayer_wrapper : MultiLayer, bp::wrapper< MultiLayer > {
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_MultiLayer_class(){
@@ -150,6 +187,16 @@ void register_MultiLayer_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( MultiLayer_wrapper::* )(  ) const)(&MultiLayer_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( MultiLayer_wrapper::* )(  ) )(&MultiLayer_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( MultiLayer_wrapper::* )(  ) const)(&MultiLayer_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -162,6 +209,10 @@ void register_MultiLayer_class(){
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
             , (void ( MultiLayer_wrapper::* )(  ) )(&MultiLayer_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( MultiLayer_wrapper::* )(  ) const)(&MultiLayer_wrapper::default_size) )    
         .def( bp::self_ns::str( bp::self ) );
 
 }
diff --git a/Core/PythonAPI/src/OpticalFresnel.pypp.cpp b/Core/PythonAPI/src/OpticalFresnel.pypp.cpp
index 6decc83e8a64212f317d1c51e458cff7204d9439..2deeaf5c951b2e3e82c4f9b75fa6f284b2bf1e33 100644
--- a/Core/PythonAPI/src/OpticalFresnel.pypp.cpp
+++ b/Core/PythonAPI/src/OpticalFresnel.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -62,7 +63,7 @@ namespace bp = boost::python;
 void register_OpticalFresnel_class(){
 
     { //::OpticalFresnel
-        typedef bp::class_< OpticalFresnel > OpticalFresnel_exposer_t;
+        typedef bp::class_< OpticalFresnel, boost::noncopyable > OpticalFresnel_exposer_t;
         OpticalFresnel_exposer_t OpticalFresnel_exposer = OpticalFresnel_exposer_t( "OpticalFresnel", bp::init< >() );
         bp::scope OpticalFresnel_scope( OpticalFresnel_exposer );
         bp::class_< OpticalFresnel::FresnelCoeff >( "FresnelCoeff", bp::init< >() )    
@@ -98,7 +99,7 @@ void register_OpticalFresnel_class(){
                 , (::size_t ( ::OpticalFresnel::MultiLayerCoeff::* )(  ) const)( &::OpticalFresnel::MultiLayerCoeff::size ) );
         { //::OpticalFresnel::execute
         
-            typedef int ( ::OpticalFresnel::*execute_function_type )( ::MultiLayer const &,::kvector_t const &,::OpticalFresnel::MultiLayerCoeff & ) ;
+            typedef void ( ::OpticalFresnel::*execute_function_type )( ::MultiLayer const &,::kvector_t const &,::OpticalFresnel::MultiLayerCoeff & ) ;
             
             OpticalFresnel_exposer.def( 
                 "execute"
diff --git a/Core/PythonAPI/src/ParameterPool.pypp.cpp b/Core/PythonAPI/src/ParameterPool.pypp.cpp
index 65f7be5d4a87ef16cb7702ea14509432c7345a92..6555eeb27a5086fb250e48f9ddb68061af83c843 100644
--- a/Core/PythonAPI/src/ParameterPool.pypp.cpp
+++ b/Core/PythonAPI/src/ParameterPool.pypp.cpp
@@ -21,6 +21,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -60,14 +61,36 @@ GCC_DIAG_ON(missing-field-initializers);
 
 namespace bp = boost::python;
 
-static boost::python::object registerParameter_42aac450584ec1a35a1b3a450dfcae38( ::ParameterPool & inst, ::std::string const & name, unsigned int parpointer ){
-    bool result = inst.registerParameter(name, reinterpret_cast< double * >( parpointer ));
-    return bp::object( result );
-}
+struct ParameterPool_wrapper : ParameterPool, bp::wrapper< ParameterPool > {
+
+    ParameterPool_wrapper( )
+    : ParameterPool( )
+      , bp::wrapper< ParameterPool >(){
+        // null constructor
+    
+    }
+
+    virtual ::ParameterPool * clone(  ) const  {
+        if( bp::override func_clone = this->get_override( "clone" ) )
+            return func_clone(  );
+        else{
+            return this->ParameterPool::clone(  );
+        }
+    }
+    
+    ::ParameterPool * default_clone(  ) const  {
+        return ParameterPool::clone( );
+    }
+
+    static void registerParameter( ::ParameterPool & inst, ::std::string const & name, unsigned int parpointer ){
+        inst.registerParameter(name, reinterpret_cast< double * >( parpointer ));
+    }
+
+};
 
 void register_ParameterPool_class(){
 
-    bp::class_< ParameterPool, boost::noncopyable >( "ParameterPool", bp::init< >() )    
+    bp::class_< ParameterPool_wrapper, bp::bases< ICloneable >, boost::noncopyable >( "ParameterPool", bp::init< >() )    
         .def( 
             "addParameter"
             , (bool ( ::ParameterPool::* )( ::std::string const &,::RealParameterWrapper ) )( &::ParameterPool::addParameter )
@@ -77,11 +100,12 @@ void register_ParameterPool_class(){
             , (void ( ::ParameterPool::* )(  ) )( &::ParameterPool::clear ) )    
         .def( 
             "clone"
-            , (::ParameterPool * ( ::ParameterPool::* )(  ) )( &::ParameterPool::clone )
+            , (::ParameterPool * ( ::ParameterPool::* )(  ) const)(&::ParameterPool::clone)
+            , (::ParameterPool * ( ParameterPool_wrapper::* )(  ) const)(&ParameterPool_wrapper::default_clone)
             , bp::return_value_policy< bp::manage_new_object >() )    
         .def( 
             "cloneWithPrefix"
-            , (::ParameterPool * ( ::ParameterPool::* )( ::std::string const & ) )( &::ParameterPool::cloneWithPrefix )
+            , (::ParameterPool * ( ::ParameterPool::* )( ::std::string const & ) const)( &::ParameterPool::cloneWithPrefix )
             , ( bp::arg("prefix") )
             , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
@@ -90,7 +114,7 @@ void register_ParameterPool_class(){
             , ( bp::arg("name") ) )    
         .def( 
             "registerParameter"
-            , (boost::python::object (*)( ::ParameterPool &,::std::string const &,unsigned int ))( &registerParameter_42aac450584ec1a35a1b3a450dfcae38 )
+            , (void (*)( ::ParameterPool &,::std::string const &,unsigned int ))( &ParameterPool_wrapper::registerParameter )
             , ( bp::arg("inst"), bp::arg("name"), bp::arg("parpointer") ) )    
         .def( 
             "setMatchedParametersValue"
diff --git a/Core/PythonAPI/src/Particle.pypp.cpp b/Core/PythonAPI/src/Particle.pypp.cpp
index 35aa3c6cdc089a138248242a21f631c1eb9e7280..c74732543ffec65a26a8fc0d9cb8d5af8d3d6b70 100644
--- a/Core/PythonAPI/src/Particle.pypp.cpp
+++ b/Core/PythonAPI/src/Particle.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -61,8 +62,8 @@ namespace bp = boost::python;
 
 struct Particle_wrapper : Particle, bp::wrapper< Particle > {
 
-    Particle_wrapper(::complex_t refractive_index, ::IFormFactor const & p_form_factor )
-    : Particle( refractive_index, boost::ref(p_form_factor) )
+    Particle_wrapper(::complex_t const & refractive_index, ::IFormFactor const & p_form_factor )
+    : Particle( boost::ref(refractive_index), boost::ref(p_form_factor) )
       , bp::wrapper< Particle >(){
         // constructor
     
@@ -164,6 +165,30 @@ struct Particle_wrapper : Particle, bp::wrapper< Particle > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -200,11 +225,23 @@ struct Particle_wrapper : Particle, bp::wrapper< Particle > {
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_Particle_class(){
 
-    bp::class_< Particle_wrapper, bp::bases< ICompositeSample >, boost::noncopyable >( "Particle", bp::init< complex_t, IFormFactor const & >(( bp::arg("refractive_index"), bp::arg("p_form_factor") )) )    
+    bp::class_< Particle_wrapper, bp::bases< ICompositeSample >, boost::noncopyable >( "Particle", bp::init< complex_t const &, IFormFactor const & >(( bp::arg("refractive_index"), bp::arg("p_form_factor") )) )    
         .def( 
             "clone"
             , (::Particle * ( ::Particle::* )(  ) const)(&::Particle::clone)
@@ -242,6 +279,16 @@ void register_Particle_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( Particle_wrapper::* )(  ) const)(&Particle_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( Particle_wrapper::* )(  ) )(&Particle_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( Particle_wrapper::* )(  ) const)(&Particle_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -253,6 +300,10 @@ void register_Particle_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( Particle_wrapper::* )(  ) )(&Particle_wrapper::default_setParametersAreChanged) );
+            , (void ( Particle_wrapper::* )(  ) )(&Particle_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( Particle_wrapper::* )(  ) const)(&Particle_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/ParticleDecoration.pypp.cpp b/Core/PythonAPI/src/ParticleDecoration.pypp.cpp
index 6061e5a8bdc30791babda92caaf027760525508e..747f58a166ab2f17688dda2f4e9f6808f6e3f0ce 100644
--- a/Core/PythonAPI/src/ParticleDecoration.pypp.cpp
+++ b/Core/PythonAPI/src/ParticleDecoration.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -104,6 +105,30 @@ struct ParticleDecoration_wrapper : ParticleDecoration, bp::wrapper< ParticleDec
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -140,6 +165,18 @@ struct ParticleDecoration_wrapper : ParticleDecoration, bp::wrapper< ParticleDec
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_ParticleDecoration_class(){
@@ -199,6 +236,16 @@ void register_ParticleDecoration_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( ParticleDecoration_wrapper::* )(  ) const)(&ParticleDecoration_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( ParticleDecoration_wrapper::* )(  ) )(&ParticleDecoration_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( ParticleDecoration_wrapper::* )(  ) const)(&ParticleDecoration_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -210,6 +257,10 @@ void register_ParticleDecoration_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( ParticleDecoration_wrapper::* )(  ) )(&ParticleDecoration_wrapper::default_setParametersAreChanged) );
+            , (void ( ParticleDecoration_wrapper::* )(  ) )(&ParticleDecoration_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( ParticleDecoration_wrapper::* )(  ) const)(&ParticleDecoration_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/ParticleInfo.pypp.cpp b/Core/PythonAPI/src/ParticleInfo.pypp.cpp
index 9dcbeabf39bf04b40c42cb3ecaa88aee4b272cdd..a1ead3ad7e07162a4ad6069c60b4dc26d5881d14 100644
--- a/Core/PythonAPI/src/ParticleInfo.pypp.cpp
+++ b/Core/PythonAPI/src/ParticleInfo.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -97,6 +98,30 @@ struct ParticleInfo_wrapper : ParticleInfo, bp::wrapper< ParticleInfo > {
         return IParameterized::createParameterTree( );
     }
 
+    virtual ::ICompositeSample * getCompositeSample(  ) {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample * default_getCompositeSample(  ) {
+        return ICompositeSample::getCompositeSample( );
+    }
+
+    virtual ::ICompositeSample const * getCompositeSample(  ) const  {
+        if( bp::override func_getCompositeSample = this->get_override( "getCompositeSample" ) )
+            return func_getCompositeSample(  );
+        else{
+            return this->ICompositeSample::getCompositeSample(  );
+        }
+    }
+    
+    ::ICompositeSample const * default_getCompositeSample(  ) const  {
+        return ICompositeSample::getCompositeSample( );
+    }
+
     virtual void printParameters(  ) const  {
         if( bp::override func_printParameters = this->get_override( "printParameters" ) )
             func_printParameters(  );
@@ -133,6 +158,18 @@ struct ParticleInfo_wrapper : ParticleInfo, bp::wrapper< ParticleInfo > {
         IParameterized::setParametersAreChanged( );
     }
 
+    virtual ::size_t size(  ) const  {
+        if( bp::override func_size = this->get_override( "size" ) )
+            return func_size(  );
+        else{
+            return this->ICompositeSample::size(  );
+        }
+    }
+    
+    ::size_t default_size(  ) const  {
+        return ICompositeSample::size( );
+    }
+
 };
 
 void register_ParticleInfo_class(){
@@ -178,6 +215,16 @@ void register_ParticleInfo_class(){
             , (::ParameterPool * ( ::IParameterized::* )(  ) const)(&::IParameterized::createParameterTree)
             , (::ParameterPool * ( ParticleInfo_wrapper::* )(  ) const)(&ParticleInfo_wrapper::default_createParameterTree)
             , bp::return_value_policy< bp::manage_new_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample * ( ::ICompositeSample::* )(  ) )(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample * ( ParticleInfo_wrapper::* )(  ) )(&ParticleInfo_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
+        .def( 
+            "getCompositeSample"
+            , (::ICompositeSample const * ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::getCompositeSample)
+            , (::ICompositeSample const * ( ParticleInfo_wrapper::* )(  ) const)(&ParticleInfo_wrapper::default_getCompositeSample)
+            , bp::return_value_policy< bp::reference_existing_object >() )    
         .def( 
             "printParameters"
             , (void ( ::IParameterized::* )(  ) const)(&::IParameterized::printParameters)
@@ -189,6 +236,10 @@ void register_ParticleInfo_class(){
         .def( 
             "setParametersAreChanged"
             , (void ( ::IParameterized::* )(  ) )(&::IParameterized::setParametersAreChanged)
-            , (void ( ParticleInfo_wrapper::* )(  ) )(&ParticleInfo_wrapper::default_setParametersAreChanged) );
+            , (void ( ParticleInfo_wrapper::* )(  ) )(&ParticleInfo_wrapper::default_setParametersAreChanged) )    
+        .def( 
+            "size"
+            , (::size_t ( ::ICompositeSample::* )(  ) const)(&::ICompositeSample::size)
+            , (::size_t ( ParticleInfo_wrapper::* )(  ) const)(&ParticleInfo_wrapper::default_size) );
 
 }
diff --git a/Core/PythonAPI/src/PythonInterface_free_functions.pypp.cpp b/Core/PythonAPI/src/PythonInterface_free_functions.pypp.cpp
index 21727cd2008fa1c15462c53f6c1dc52693ef8a86..03ef3c6a8c6edc3fafa76b02b59b4ececc1077fd 100644
--- a/Core/PythonAPI/src/PythonInterface_free_functions.pypp.cpp
+++ b/Core/PythonAPI/src/PythonInterface_free_functions.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -61,6 +62,17 @@ namespace bp = boost::python;
 
 void register_free_functions(){
 
+    { //::Geometry::CrossProduct
+    
+        typedef ::Geometry::BasicVector3D< std::complex< double > > ( *CrossProduct_function_type )( ::Geometry::BasicVector3D< std::complex< double > > const &,::Geometry::BasicVector3D< std::complex< double > > const & );
+        
+        bp::def( 
+            "CrossProduct"
+            , CrossProduct_function_type( &::Geometry::CrossProduct )
+            , ( bp::arg("vectorLeft"), bp::arg("vectorRight") ) );
+    
+    }
+
     { //::Geometry::CrossProduct
     
         typedef ::Geometry::BasicVector3D< double > ( *CrossProduct_function_type )( ::Geometry::BasicVector3D< double > const &,::Geometry::BasicVector3D< double > const & );
@@ -72,6 +84,17 @@ void register_free_functions(){
     
     }
 
+    { //::Geometry::DotProduct
+    
+        typedef ::std::complex< double > ( *DotProduct_function_type )( ::Geometry::BasicVector3D< std::complex< double > > const &,::Geometry::BasicVector3D< std::complex< double > > const & );
+        
+        bp::def( 
+            "DotProduct"
+            , DotProduct_function_type( &::Geometry::DotProduct )
+            , ( bp::arg("left"), bp::arg("right") ) );
+    
+    }
+
     { //::Geometry::DotProduct
     
         typedef double ( *DotProduct_function_type )( ::Geometry::BasicVector3D< double > const &,::Geometry::BasicVector3D< double > const & );
diff --git a/Core/PythonAPI/src/PythonInterface_global_variables.pypp.cpp b/Core/PythonAPI/src/PythonInterface_global_variables.pypp.cpp
index 61773b8355b220ef466b7fc0911dacb9d63677a7..933abd09fc07583dde1c18231c98026a2d659c3c 100644
--- a/Core/PythonAPI/src/PythonInterface_global_variables.pypp.cpp
+++ b/Core/PythonAPI/src/PythonInterface_global_variables.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/PythonModule.cpp b/Core/PythonAPI/src/PythonModule.cpp
index 0c2cdb2aa2d80bd2a092f730f312f60720676532..2a21fb1be7753e7b80ab1452a3ff17ffe902bb30 100644
--- a/Core/PythonAPI/src/PythonModule.cpp
+++ b/Core/PythonAPI/src/PythonModule.cpp
@@ -4,6 +4,7 @@
 // the order of 3 guys above is important
 
 #include "Crystal.pypp.h" 
+#include "cvector_t.pypp.h" 
 #include "DiffuseParticleInfo.pypp.h" 
 #include "Experiment.pypp.h" 
 #include "FormFactorCrystal.pypp.h" 
@@ -17,6 +18,7 @@
 #include "FormFactorSphereGaussianRadius.pypp.h" 
 #include "GISASExperiment.pypp.h" 
 #include "HomogeneousMaterial.pypp.h" 
+#include "ICloneable.pypp.h" 
 #include "IClusteredParticles.pypp.h" 
 #include "ICompositeSample.pypp.h" 
 #include "IFormFactor.pypp.h" 
@@ -24,19 +26,20 @@
 #include "IFormFactorDecorator.pypp.h" 
 #include "IInterferenceFunction.pypp.h" 
 #include "IMaterial.pypp.h" 
+#include "InterferenceFunction1DParaCrystal.pypp.h" 
+#include "InterferenceFunctionNone.pypp.h" 
 #include "IParameterized.pypp.h" 
 #include "ISample.pypp.h" 
 #include "ISampleBuilder.pypp.h" 
 #include "ISelectionRule.pypp.h" 
-#include "ISingleton_less__MaterialManager__greater_.pypp.h" 
-#include "InterferenceFunction1DParaCrystal.pypp.h" 
-#include "InterferenceFunctionNone.pypp.h" 
+#include "kvector_t.pypp.h" 
 #include "Lattice.pypp.h" 
 #include "LatticeBasis.pypp.h" 
 #include "Layer.pypp.h" 
 #include "LayerDecorator.pypp.h" 
 #include "LayerRoughness.pypp.h" 
 #include "MaterialManager.pypp.h" 
+#include "MaterialManagerSingleton_t.pypp.h" 
 #include "MesoCrystal.pypp.h" 
 #include "MultiLayer.pypp.h" 
 #include "OpticalFresnel.pypp.h" 
@@ -65,11 +68,10 @@
 #include "TranslateX3D.pypp.h" 
 #include "TranslateY3D.pypp.h" 
 #include "TranslateZ3D.pypp.h" 
-#include "kvector_t.pypp.h" 
 #include "vdouble1d_t.pypp.h" 
+#include "vector_DiffuseParticleInfoPtr_t.pypp.h" 
+#include "vector_IFormFactorPtr_t.pypp.h" 
 #include "vector_kvector_t.pypp.h" 
-#include "vector_less__DiffuseParticleInfo_ptr___greater_.pypp.h" 
-#include "vector_less__IFormFactor_ptr___greater_.pypp.h" 
 #include "__call_policies.pypp.hpp" 
 
 #include "PythonListConverter.h"
@@ -77,9 +79,10 @@
 BOOST_PYTHON_MODULE(libScattCore){
 
     register_vdouble1d_t_class();
-    register_vector_less__IFormFactor_ptr___greater__class();
+    register_vector_IFormFactorPtr_t_class();
     register_vector_kvector_t_class();
-    register_vector_less__DiffuseParticleInfo_ptr___greater__class();
+    register_vector_DiffuseParticleInfoPtr_t_class();
+    register_ICloneable_class();
     register_IParameterized_class();
     register_ISample_class();
     register_ICompositeSample_class();
@@ -103,6 +106,7 @@ BOOST_PYTHON_MODULE(libScattCore){
     register_FormFactorSphereGaussianRadius_class();
     register_GISASExperiment_class();
     register_kvector_t_class();
+    register_cvector_t_class();
     register_Reflect3D_class();
     register_ReflectX3D_class();
     register_ReflectY3D_class();
@@ -124,7 +128,7 @@ BOOST_PYTHON_MODULE(libScattCore){
     register_IInterferenceFunction_class();
     register_ISampleBuilder_class();
     register_ISelectionRule_class();
-    register_ISingleton_less__MaterialManager__greater__class();
+    register_MaterialManagerSingleton_t_class();
     register_InterferenceFunction1DParaCrystal_class();
     register_InterferenceFunctionNone_class();
     register_Lattice_class();
diff --git a/Core/PythonAPI/src/RealParameterWrapper.pypp.cpp b/Core/PythonAPI/src/RealParameterWrapper.pypp.cpp
index 2b80c47bd2c26978b548b188d6aec77c79864908..8bf601d0cf7ae1587942cb7dd9d7f4237617c5aa 100644
--- a/Core/PythonAPI/src/RealParameterWrapper.pypp.cpp
+++ b/Core/PythonAPI/src/RealParameterWrapper.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/Reflect3D.pypp.cpp b/Core/PythonAPI/src/Reflect3D.pypp.cpp
index 25500f04840e9994ff6761f529c547cce2efd934..2f75f33ef5b98f2ca96ce4f9130fe41b3a3108dd 100644
--- a/Core/PythonAPI/src/Reflect3D.pypp.cpp
+++ b/Core/PythonAPI/src/Reflect3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/ReflectX3D.pypp.cpp b/Core/PythonAPI/src/ReflectX3D.pypp.cpp
index b1cee585502a795830e4fb18580662c34df5248f..f4ee5029189b86f3c437928adb9eea5e5e5fa03b 100644
--- a/Core/PythonAPI/src/ReflectX3D.pypp.cpp
+++ b/Core/PythonAPI/src/ReflectX3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/ReflectY3D.pypp.cpp b/Core/PythonAPI/src/ReflectY3D.pypp.cpp
index 59dabafd9f3cacfeb2eafcd7a953ecf160eb81d7..8dc4ca141abc93391c06255c4b0490805d638ab4 100644
--- a/Core/PythonAPI/src/ReflectY3D.pypp.cpp
+++ b/Core/PythonAPI/src/ReflectY3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/ReflectZ3D.pypp.cpp b/Core/PythonAPI/src/ReflectZ3D.pypp.cpp
index 22f6c432a15838f7cfc40ccd86e99469cbbbed36..fff7c48be7079444afcca04eee5811c6fe7652c3 100644
--- a/Core/PythonAPI/src/ReflectZ3D.pypp.cpp
+++ b/Core/PythonAPI/src/ReflectZ3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/Rotate3D.pypp.cpp b/Core/PythonAPI/src/Rotate3D.pypp.cpp
index fe6196924ad9334a932ed5cc916588ac2f3aa7d6..5c3ae8fb9cb110bb9e630574526af437b962b1bb 100644
--- a/Core/PythonAPI/src/Rotate3D.pypp.cpp
+++ b/Core/PythonAPI/src/Rotate3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/RotateX3D.pypp.cpp b/Core/PythonAPI/src/RotateX3D.pypp.cpp
index a6d46f4a39be2dbcc0424059958cb924a01fbc22..4c069c9c264dde284b443ca1a4286db3f1b516d0 100644
--- a/Core/PythonAPI/src/RotateX3D.pypp.cpp
+++ b/Core/PythonAPI/src/RotateX3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/RotateY3D.pypp.cpp b/Core/PythonAPI/src/RotateY3D.pypp.cpp
index b9a7515d8be0dff2ace1de842dcf4b4ebb19f8f5..a9957e057e33e63c4ed9cd507fa6532f04c41894 100644
--- a/Core/PythonAPI/src/RotateY3D.pypp.cpp
+++ b/Core/PythonAPI/src/RotateY3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/RotateZ3D.pypp.cpp b/Core/PythonAPI/src/RotateZ3D.pypp.cpp
index 6c3c9dbadc4fdf7e7aad4fb0c174ff4dc3a860a0..0013f74bfb192f3545e7def90bc3bd9f2b8e4be7 100644
--- a/Core/PythonAPI/src/RotateZ3D.pypp.cpp
+++ b/Core/PythonAPI/src/RotateZ3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/Scale3D.pypp.cpp b/Core/PythonAPI/src/Scale3D.pypp.cpp
index c61f5536e2db024283f0a761e50afaa0f2a59bf6..0b05add809c138d7cd46d5684522d3603bcccfd7 100644
--- a/Core/PythonAPI/src/Scale3D.pypp.cpp
+++ b/Core/PythonAPI/src/Scale3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/ScaleX3D.pypp.cpp b/Core/PythonAPI/src/ScaleX3D.pypp.cpp
index e6630941d449234f3d1a9616d3a447439cd8760f..f8617db6eb12ecee0449fc2e4399b45698a3c1c3 100644
--- a/Core/PythonAPI/src/ScaleX3D.pypp.cpp
+++ b/Core/PythonAPI/src/ScaleX3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/ScaleY3D.pypp.cpp b/Core/PythonAPI/src/ScaleY3D.pypp.cpp
index e3dd34ad6a39966b5ad41b20568ad404e3c9976a..7a4c14918503821928c0143382b8259ee12be131 100644
--- a/Core/PythonAPI/src/ScaleY3D.pypp.cpp
+++ b/Core/PythonAPI/src/ScaleY3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/ScaleZ3D.pypp.cpp b/Core/PythonAPI/src/ScaleZ3D.pypp.cpp
index 8cdfb36fe64210cc1a6aad139c16f1c00e799bd6..19786407aa9e0339aed3d125a5f3d7d51bb6676b 100644
--- a/Core/PythonAPI/src/ScaleZ3D.pypp.cpp
+++ b/Core/PythonAPI/src/ScaleZ3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/SimpleSelectionRule.pypp.cpp b/Core/PythonAPI/src/SimpleSelectionRule.pypp.cpp
index 6898273a53178403a91c46c57387fd0acc42127a..9844b5a887d37884a50257236c9dcf4c677d5537 100644
--- a/Core/PythonAPI/src/SimpleSelectionRule.pypp.cpp
+++ b/Core/PythonAPI/src/SimpleSelectionRule.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/Transform3D.pypp.cpp b/Core/PythonAPI/src/Transform3D.pypp.cpp
index f5b1a740dd7978a6ed4b69cfb7f1ba9e9a2cb4fd..83cec4fdc833341737e13faaccf99c088c25d2ef 100644
--- a/Core/PythonAPI/src/Transform3D.pypp.cpp
+++ b/Core/PythonAPI/src/Transform3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/Translate3D.pypp.cpp b/Core/PythonAPI/src/Translate3D.pypp.cpp
index 181ba66e4110e9245fb52f43afd76cc2bd44d36f..551ad3f65238f16ea0c5d072ae3a6299da333be4 100644
--- a/Core/PythonAPI/src/Translate3D.pypp.cpp
+++ b/Core/PythonAPI/src/Translate3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/TranslateX3D.pypp.cpp b/Core/PythonAPI/src/TranslateX3D.pypp.cpp
index c12674edab2c3897ed213581e2f3e5854268642a..40d61a224754489a71b9ca9da679adbcb9a9191d 100644
--- a/Core/PythonAPI/src/TranslateX3D.pypp.cpp
+++ b/Core/PythonAPI/src/TranslateX3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/TranslateY3D.pypp.cpp b/Core/PythonAPI/src/TranslateY3D.pypp.cpp
index 076aacabea3880b8cdcd49c6667704f0bd0bda25..10b5808c4f356729aad55d54a90e61e291b49fb9 100644
--- a/Core/PythonAPI/src/TranslateY3D.pypp.cpp
+++ b/Core/PythonAPI/src/TranslateY3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/TranslateZ3D.pypp.cpp b/Core/PythonAPI/src/TranslateZ3D.pypp.cpp
index 799558ff164c68b8b730d276928047cb3ee2e92c..026246b4d852a07098b63c436c24d605ad71680d 100644
--- a/Core/PythonAPI/src/TranslateZ3D.pypp.cpp
+++ b/Core/PythonAPI/src/TranslateZ3D.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/cvector_t.pypp.cpp b/Core/PythonAPI/src/cvector_t.pypp.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a0f5f36a74efb02eadc65c22fae148c7704cd986
--- /dev/null
+++ b/Core/PythonAPI/src/cvector_t.pypp.cpp
@@ -0,0 +1,264 @@
+// This file has been generated by Py++.
+
+#include "boost/python.hpp"
+#include "BasicVector3D.h"
+#include "PythonPlusplusHelper.h"
+#include "Transform3D.h"
+#include "Types.h"
+#include "cvector_t.pypp.h"
+
+namespace bp = boost::python;
+
+void register_cvector_t_class(){
+
+    { //::Geometry::BasicVector3D< std::complex< double > >
+        typedef bp::class_< Geometry::BasicVector3D< std::complex< double > > > cvector_t_exposer_t;
+        cvector_t_exposer_t cvector_t_exposer = cvector_t_exposer_t( "cvector_t", bp::init< >() );
+        bp::scope cvector_t_scope( cvector_t_exposer );
+        bp::scope().attr("X") = (int)Geometry::BasicVector3D<std::complex<double> >::X;
+        bp::scope().attr("Y") = (int)Geometry::BasicVector3D<std::complex<double> >::Y;
+        bp::scope().attr("Z") = (int)Geometry::BasicVector3D<std::complex<double> >::Z;
+        bp::scope().attr("NUM_COORDINATES") = (int)Geometry::BasicVector3D<std::complex<double> >::NUM_COORDINATES;
+        bp::scope().attr("SIZE") = (int)Geometry::BasicVector3D<std::complex<double> >::SIZE;
+        cvector_t_exposer.def( bp::init< std::complex< double > const &, std::complex< double > const &, std::complex< double > const & >(( bp::arg("x1"), bp::arg("y1"), bp::arg("z1") )) );
+        { //::Geometry::BasicVector3D< std::complex< double > >::cross
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::Geometry::BasicVector3D< std::complex< double > > ( exported_class_t::*cross_function_type )( ::Geometry::BasicVector3D< std::complex< double > > const & ) const;
+            
+            cvector_t_exposer.def( 
+                "cross"
+                , cross_function_type( &::Geometry::BasicVector3D< std::complex< double > >::cross )
+                , ( bp::arg("v") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::dot
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*dot_function_type )( ::Geometry::BasicVector3D< std::complex< double > > const & ) const;
+            
+            cvector_t_exposer.def( 
+                "dot"
+                , dot_function_type( &::Geometry::BasicVector3D< std::complex< double > >::dot )
+                , ( bp::arg("v") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::getR
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*getR_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "getR"
+                , getR_function_type( &::Geometry::BasicVector3D< std::complex< double > >::getR ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::mag
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*mag_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "mag"
+                , mag_function_type( &::Geometry::BasicVector3D< std::complex< double > >::mag ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::mag2
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*mag2_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "mag2"
+                , mag2_function_type( &::Geometry::BasicVector3D< std::complex< double > >::mag2 ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::magxy
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*magxy_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "magxy"
+                , magxy_function_type( &::Geometry::BasicVector3D< std::complex< double > >::magxy ) );
+        
+        }
+        cvector_t_exposer.def( bp::self *= bp::other< double >() );
+        cvector_t_exposer.def( bp::self += bp::self );
+        cvector_t_exposer.def( bp::self -= bp::self );
+        cvector_t_exposer.def( bp::self /= bp::other< double >() );
+        { //::Geometry::BasicVector3D< std::complex< double > >::operator=
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::Geometry::BasicVector3D< std::complex< double > > & ( exported_class_t::*assign_function_type )( ::Geometry::BasicVector3D< std::complex< double > > const & ) ;
+            
+            cvector_t_exposer.def( 
+                "assign"
+                , assign_function_type( &::Geometry::BasicVector3D< std::complex< double > >::operator= )
+                , ( bp::arg("v") )
+                , bp::return_self< >() );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::operator[]
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*__getitem___function_type )( int ) const;
+            
+            cvector_t_exposer.def( 
+                "__getitem__"
+                , __getitem___function_type( &::Geometry::BasicVector3D< std::complex< double > >::operator[] )
+                , ( bp::arg("i") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::operator[]
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > & ( exported_class_t::*__getitem___function_type )( int ) ;
+            
+            cvector_t_exposer.def( 
+                "__getitem__"
+                , __getitem___function_type( &::Geometry::BasicVector3D< std::complex< double > >::operator[] )
+                , ( bp::arg("i") )
+                , bp::return_internal_reference< >() );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::r
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*r_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "r"
+                , r_function_type( &::Geometry::BasicVector3D< std::complex< double > >::r ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::rho
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*rho_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "rho"
+                , rho_function_type( &::Geometry::BasicVector3D< std::complex< double > >::rho ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::set
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef void ( exported_class_t::*set_function_type )( ::std::complex< double > const &,::std::complex< double > const &,::std::complex< double > const & ) ;
+            
+            cvector_t_exposer.def( 
+                "set"
+                , set_function_type( &::Geometry::BasicVector3D< std::complex< double > >::set )
+                , ( bp::arg("x1"), bp::arg("y1"), bp::arg("z1") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::setLambdaAlphaPhi
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef void ( exported_class_t::*setLambdaAlphaPhi_function_type )( ::std::complex< double > const &,::std::complex< double > const &,::std::complex< double > const & ) ;
+            
+            cvector_t_exposer.def( 
+                "setLambdaAlphaPhi"
+                , setLambdaAlphaPhi_function_type( &::Geometry::BasicVector3D< std::complex< double > >::setLambdaAlphaPhi )
+                , ( bp::arg("_lambda"), bp::arg("_alpha"), bp::arg("_phi") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::setX
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef void ( exported_class_t::*setX_function_type )( ::std::complex< double > const & ) ;
+            
+            cvector_t_exposer.def( 
+                "setX"
+                , setX_function_type( &::Geometry::BasicVector3D< std::complex< double > >::setX )
+                , ( bp::arg("a") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::setXYZ
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef void ( exported_class_t::*setXYZ_function_type )( ::std::complex< double > const &,::std::complex< double > const &,::std::complex< double > const & ) ;
+            
+            cvector_t_exposer.def( 
+                "setXYZ"
+                , setXYZ_function_type( &::Geometry::BasicVector3D< std::complex< double > >::setXYZ )
+                , ( bp::arg("x1"), bp::arg("y1"), bp::arg("z1") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::setY
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef void ( exported_class_t::*setY_function_type )( ::std::complex< double > const & ) ;
+            
+            cvector_t_exposer.def( 
+                "setY"
+                , setY_function_type( &::Geometry::BasicVector3D< std::complex< double > >::setY )
+                , ( bp::arg("a") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::setZ
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef void ( exported_class_t::*setZ_function_type )( ::std::complex< double > const & ) ;
+            
+            cvector_t_exposer.def( 
+                "setZ"
+                , setZ_function_type( &::Geometry::BasicVector3D< std::complex< double > >::setZ )
+                , ( bp::arg("a") ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::transform
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::Geometry::BasicVector3D< std::complex< double > > & ( exported_class_t::*transform_function_type )( ::Geometry::Transform3D const & ) ;
+            
+            cvector_t_exposer.def( 
+                "transform"
+                , transform_function_type( &::Geometry::BasicVector3D< std::complex< double > >::transform )
+                , ( bp::arg("m") )
+                , bp::return_value_policy< bp::reference_existing_object >() );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::x
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*x_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "x"
+                , x_function_type( &::Geometry::BasicVector3D< std::complex< double > >::x ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::y
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*y_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "y"
+                , y_function_type( &::Geometry::BasicVector3D< std::complex< double > >::y ) );
+        
+        }
+        { //::Geometry::BasicVector3D< std::complex< double > >::z
+        
+            typedef Geometry::BasicVector3D< std::complex< double > > exported_class_t;
+            typedef ::std::complex< double > ( exported_class_t::*z_function_type )(  ) const;
+            
+            cvector_t_exposer.def( 
+                "z"
+                , z_function_type( &::Geometry::BasicVector3D< std::complex< double > >::z ) );
+        
+        }
+        cvector_t_exposer.def( bp::self != bp::self );
+        cvector_t_exposer.def( bp::self * bp::self );
+        cvector_t_exposer.def( bp::self + bp::self );
+        cvector_t_exposer.def( +bp::self );
+        cvector_t_exposer.def( bp::self - bp::self );
+        cvector_t_exposer.def( -bp::self );
+        cvector_t_exposer.def( bp::self / bp::other< std::complex< double > >() );
+        cvector_t_exposer.def( bp::self_ns::str( bp::self ) );
+        cvector_t_exposer.def( bp::self == bp::self );
+    }
+
+}
diff --git a/Core/PythonAPI/src/kvector_t.pypp.cpp b/Core/PythonAPI/src/kvector_t.pypp.cpp
index 7d93e6575173f09eef53d06a4829b378229632d2..91913193e24dff838f86a34fd529dca5c96a4f49 100644
--- a/Core/PythonAPI/src/kvector_t.pypp.cpp
+++ b/Core/PythonAPI/src/kvector_t.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -70,7 +71,7 @@ void register_kvector_t_class(){
         bp::scope().attr("Z") = (int)Geometry::BasicVector3D<double>::Z;
         bp::scope().attr("NUM_COORDINATES") = (int)Geometry::BasicVector3D<double>::NUM_COORDINATES;
         bp::scope().attr("SIZE") = (int)Geometry::BasicVector3D<double>::SIZE;
-        kvector_t_exposer.def( bp::init< double, double, double >(( bp::arg("x1"), bp::arg("y1"), bp::arg("z1") )) );
+        kvector_t_exposer.def( bp::init< double const &, double const &, double const & >(( bp::arg("x1"), bp::arg("y1"), bp::arg("z1") )) );
         { //::Geometry::BasicVector3D< double >::angle
         
             typedef Geometry::BasicVector3D< double > exported_class_t;
@@ -346,7 +347,7 @@ void register_kvector_t_class(){
         { //::Geometry::BasicVector3D< double >::set
         
             typedef Geometry::BasicVector3D< double > exported_class_t;
-            typedef void ( exported_class_t::*set_function_type )( double,double,double ) ;
+            typedef void ( exported_class_t::*set_function_type )( double const &,double const &,double const & ) ;
             
             kvector_t_exposer.def( 
                 "set"
@@ -357,12 +358,12 @@ void register_kvector_t_class(){
         { //::Geometry::BasicVector3D< double >::setLambdaAlphaPhi
         
             typedef Geometry::BasicVector3D< double > exported_class_t;
-            typedef void ( exported_class_t::*setLambdaAlphaPhi_function_type )( double,double,double ) ;
+            typedef void ( exported_class_t::*setLambdaAlphaPhi_function_type )( double const &,double const &,double const & ) ;
             
             kvector_t_exposer.def( 
                 "setLambdaAlphaPhi"
                 , setLambdaAlphaPhi_function_type( &::Geometry::BasicVector3D< double >::setLambdaAlphaPhi )
-                , ( bp::arg("lambda"), bp::arg("alpha"), bp::arg("phi") ) );
+                , ( bp::arg("_lambda"), bp::arg("_alpha"), bp::arg("_phi") ) );
         
         }
         { //::Geometry::BasicVector3D< double >::setMag
@@ -423,7 +424,7 @@ void register_kvector_t_class(){
         { //::Geometry::BasicVector3D< double >::setX
         
             typedef Geometry::BasicVector3D< double > exported_class_t;
-            typedef void ( exported_class_t::*setX_function_type )( double ) ;
+            typedef void ( exported_class_t::*setX_function_type )( double const & ) ;
             
             kvector_t_exposer.def( 
                 "setX"
@@ -434,7 +435,7 @@ void register_kvector_t_class(){
         { //::Geometry::BasicVector3D< double >::setXYZ
         
             typedef Geometry::BasicVector3D< double > exported_class_t;
-            typedef void ( exported_class_t::*setXYZ_function_type )( double,double,double ) ;
+            typedef void ( exported_class_t::*setXYZ_function_type )( double const &,double const &,double const & ) ;
             
             kvector_t_exposer.def( 
                 "setXYZ"
@@ -445,7 +446,7 @@ void register_kvector_t_class(){
         { //::Geometry::BasicVector3D< double >::setY
         
             typedef Geometry::BasicVector3D< double > exported_class_t;
-            typedef void ( exported_class_t::*setY_function_type )( double ) ;
+            typedef void ( exported_class_t::*setY_function_type )( double const & ) ;
             
             kvector_t_exposer.def( 
                 "setY"
@@ -456,7 +457,7 @@ void register_kvector_t_class(){
         { //::Geometry::BasicVector3D< double >::setZ
         
             typedef Geometry::BasicVector3D< double > exported_class_t;
-            typedef void ( exported_class_t::*setZ_function_type )( double ) ;
+            typedef void ( exported_class_t::*setZ_function_type )( double const & ) ;
             
             kvector_t_exposer.def( 
                 "setZ"
diff --git a/Core/PythonAPI/src/vdouble1d_t.pypp.cpp b/Core/PythonAPI/src/vdouble1d_t.pypp.cpp
index 53db6be9d9fcefc86c116050c21ca9d72ea0c185..2129e40b66912179db99601ec37ba1a632b26955 100644
--- a/Core/PythonAPI/src/vdouble1d_t.pypp.cpp
+++ b/Core/PythonAPI/src/vdouble1d_t.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Core/PythonAPI/src/vector_less__DiffuseParticleInfo_ptr___greater_.pypp.cpp b/Core/PythonAPI/src/vector_DiffuseParticleInfoPtr_t.pypp.cpp
similarity index 72%
rename from Core/PythonAPI/src/vector_less__DiffuseParticleInfo_ptr___greater_.pypp.cpp
rename to Core/PythonAPI/src/vector_DiffuseParticleInfoPtr_t.pypp.cpp
index f98f45f726aca4997214c9f459cad750be36b666..3842746b10c61971405da6169775667f38bf0c6d 100644
--- a/Core/PythonAPI/src/vector_less__DiffuseParticleInfo_ptr___greater_.pypp.cpp
+++ b/Core/PythonAPI/src/vector_DiffuseParticleInfoPtr_t.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -55,17 +56,17 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "Transform3D.h"
 #include "Units.h"
 #include "Types.h"
-#include "vector_less__DiffuseParticleInfo_ptr___greater_.pypp.h"
+#include "vector_DiffuseParticleInfoPtr_t.pypp.h"
 
 namespace bp = boost::python;
 
-void register_vector_less__DiffuseParticleInfo_ptr___greater__class(){
+void register_vector_DiffuseParticleInfoPtr_t_class(){
 
     { //::std::vector< DiffuseParticleInfo* >
-        typedef bp::class_< std::vector< DiffuseParticleInfo* > > vector_less__DiffuseParticleInfo_ptr___greater__exposer_t;
-        vector_less__DiffuseParticleInfo_ptr___greater__exposer_t vector_less__DiffuseParticleInfo_ptr___greater__exposer = vector_less__DiffuseParticleInfo_ptr___greater__exposer_t( "vector_less__DiffuseParticleInfo_ptr___greater_" );
-        bp::scope vector_less__DiffuseParticleInfo_ptr___greater__scope( vector_less__DiffuseParticleInfo_ptr___greater__exposer );
-        vector_less__DiffuseParticleInfo_ptr___greater__exposer.def( bp::vector_indexing_suite< ::std::vector< DiffuseParticleInfo* > >() );
+        typedef bp::class_< std::vector< DiffuseParticleInfo* > > vector_DiffuseParticleInfoPtr_t_exposer_t;
+        vector_DiffuseParticleInfoPtr_t_exposer_t vector_DiffuseParticleInfoPtr_t_exposer = vector_DiffuseParticleInfoPtr_t_exposer_t( "vector_DiffuseParticleInfoPtr_t" );
+        bp::scope vector_DiffuseParticleInfoPtr_t_scope( vector_DiffuseParticleInfoPtr_t_exposer );
+        vector_DiffuseParticleInfoPtr_t_exposer.def( bp::vector_indexing_suite< ::std::vector< DiffuseParticleInfo* > >() );
     }
 
 }
diff --git a/Core/PythonAPI/src/vector_less__IFormFactor_ptr___greater_.pypp.cpp b/Core/PythonAPI/src/vector_IFormFactorPtr_t.pypp.cpp
similarity index 75%
rename from Core/PythonAPI/src/vector_less__IFormFactor_ptr___greater_.pypp.cpp
rename to Core/PythonAPI/src/vector_IFormFactorPtr_t.pypp.cpp
index 355e0497f58587b4c169e5e57cc0ff1a4ef380b1..8cf1b5f343cfdca1bf97ed68d279014c525a1212 100644
--- a/Core/PythonAPI/src/vector_less__IFormFactor_ptr___greater_.pypp.cpp
+++ b/Core/PythonAPI/src/vector_IFormFactorPtr_t.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
@@ -55,17 +56,17 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "Transform3D.h"
 #include "Units.h"
 #include "Types.h"
-#include "vector_less__IFormFactor_ptr___greater_.pypp.h"
+#include "vector_IFormFactorPtr_t.pypp.h"
 
 namespace bp = boost::python;
 
-void register_vector_less__IFormFactor_ptr___greater__class(){
+void register_vector_IFormFactorPtr_t_class(){
 
     { //::std::vector< IFormFactor* >
-        typedef bp::class_< std::vector< IFormFactor* > > vector_less__IFormFactor_ptr___greater__exposer_t;
-        vector_less__IFormFactor_ptr___greater__exposer_t vector_less__IFormFactor_ptr___greater__exposer = vector_less__IFormFactor_ptr___greater__exposer_t( "vector_less__IFormFactor_ptr___greater_" );
-        bp::scope vector_less__IFormFactor_ptr___greater__scope( vector_less__IFormFactor_ptr___greater__exposer );
-        vector_less__IFormFactor_ptr___greater__exposer.def( bp::vector_indexing_suite< ::std::vector< IFormFactor* > >() );
+        typedef bp::class_< std::vector< IFormFactor* > > vector_IFormFactorPtr_t_exposer_t;
+        vector_IFormFactorPtr_t_exposer_t vector_IFormFactorPtr_t_exposer = vector_IFormFactorPtr_t_exposer_t( "vector_IFormFactorPtr_t" );
+        bp::scope vector_IFormFactorPtr_t_scope( vector_IFormFactorPtr_t_exposer );
+        vector_IFormFactorPtr_t_exposer.def( bp::vector_indexing_suite< ::std::vector< IFormFactor* > >() );
     }
 
 }
diff --git a/Core/PythonAPI/src/vector_kvector_t.pypp.cpp b/Core/PythonAPI/src/vector_kvector_t.pypp.cpp
index 29f652ea080c36c75fe01ccbaba33c70e16b162e..f01b4d99fc2f6aa9c9813c8b4279bee11c67dab9 100644
--- a/Core/PythonAPI/src/vector_kvector_t.pypp.cpp
+++ b/Core/PythonAPI/src/vector_kvector_t.pypp.cpp
@@ -20,6 +20,7 @@ GCC_DIAG_ON(missing-field-initializers);
 #include "FormFactorSphereGaussianRadius.h"
 #include "GISASExperiment.h"
 #include "HomogeneousMaterial.h"
+#include "ICloneable.h"
 #include "IClusteredParticles.h"
 #include "ICompositeSample.h"
 #include "IFormFactor.h"
diff --git a/Macros/BoostPythonGenerator/codepatch.py b/Macros/BoostPythonGenerator/codepatch.py
deleted file mode 100644
index e6fd3445e22acf5d96595b64ec6f0ad0c9ae9edc..0000000000000000000000000000000000000000
--- a/Macros/BoostPythonGenerator/codepatch.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# patch py++ generated files to get rid from compilation warnings
-#
-# replace #include "boost/python.hpp" 
-# with
-# include "Macros.h"
-# GCC_DIAG_OFF(unused-parameter);
-# GCC_DIAG_OFF(missing-field-initializers);
-# include "boost/python.hpp"
-# GCC_DIAG_ON(unused-parameter);
-# GCC_DIAG_ON(missing-field-initializers);
-
-import os
-import sys
-import glob
-
-
-OutputTempDir = "./output"
-files =glob.glob(OutputTempDir+"/*.*");
-print files
-
-
-for ff in files:
-    print ff
-    fin = file(ff,"r")
-    fout = file("tmp.tmp","w")
-    for line in fin:
-        if "boost/python.hpp" in line:
-            fout.write("#include \"Macros.h\"\n")
-            fout.write("GCC_DIAG_OFF(unused-parameter);\n")
-            fout.write("GCC_DIAG_OFF(missing-field-initializers);\n")
-            fout.write("#include \"boost/python.hpp\"\n")
-            fout.write("#include \"boost/python/suite/indexing/vector_indexing_suite.hpp\"\n")
-            fout.write("GCC_DIAG_ON(unused-parameter);\n")
-            fout.write("GCC_DIAG_ON(missing-field-initializers);\n")
-        elif "vector_indexing_suite.hpp" in line:
-            continue
-        else:
-            fout.write(line)
-    fout.close()
-    fin.close()
-    os.system("mv tmp.tmp "+ff)
diff --git a/Macros/BoostPythonGenerator/runinstall.py b/Macros/BoostPythonGenerator/runinstall.py
new file mode 100644
index 0000000000000000000000000000000000000000..84cedd7f155af95fdee5dfd08c3a283be0903f7c
--- /dev/null
+++ b/Macros/BoostPythonGenerator/runinstall.py
@@ -0,0 +1,186 @@
+# see codegenerator.py
+
+import os
+import sys
+import glob
+
+
+#-------------------------------------------------------------
+# generating python_module.pri for qt-creator
+#-------------------------------------------------------------
+def GenerateProjectFile(OutputTempDir, files_inc, files_src):
+  python_pri_file = OutputTempDir+"/python_module.pri"
+  fout = open(python_pri_file, 'w')
+  fout.write("HEADERS +=  \\ \n")
+  # existing files (written by human being)
+  fout.write("    PythonAPI/inc/PythonListConverter.h \\ \n")
+  fout.write("    PythonAPI/inc/PythonModule.h \\ \n")
+  fout.write("    PythonAPI/inc/PythonOutputData.h \\ \n")
+  fout.write("    PythonAPI/inc/PythonPlusplusHelper.h \\ \n")
+  # automatically generated files
+  for i_file in range(0,len(files_inc)):
+    delim = " \\"
+    if i_file == len(files_inc)-1:
+      delim = " "
+    ff = files_inc[i_file]
+    ff = ff.replace(OutputTempDir,"PythonAPI/inc")
+    fout.write("    "+ff+delim+"\n")
+  fout.write("\n")
+  fout.write("SOURCES +=  \\ \n")
+  # existing files (written by human being)
+  fout.write("    PythonAPI/src/PythonModule.cpp \\ \n")
+  fout.write("    PythonAPI/src/PythonListConverter.cpp \\ \n")
+  fout.write("    PythonAPI/src/PythonOutputData.cpp \\ \n")
+  fout.write("    PythonAPI/src/PythonPlusplusHelper.cpp \\ \n")
+  # automatically generated files
+  for i_file in range(0,len(files_src)):
+    delim = " \\"
+    if i_file == len(files_src)-1:
+      delim = " "
+    ff = files_src[i_file]
+    ff = ff.replace(OutputTempDir,"PythonAPI/src")
+    fout.write("    "+ff+delim+"\n")
+  fout.write("\n")
+
+  fout.write("INCLUDEPATH += ./PythonAPI/inc \n")
+  fout.write("DEPENDPATH  += ./PythonAPI/inc \n")
+  fout.close()
+  return python_pri_file
+
+
+#-------------------------------------------------------------
+# generating python module main cpp file
+#-------------------------------------------------------------
+def GenerateModuleFile(OutputTempDir, files_inc, files_src):
+  # generating own PythonModule.cpp
+  python_module_file = OutputTempDir+"/PythonModule.cpp"
+  fout = open(python_module_file, 'w')
+  fout.write("#include \"Python.h\"\n")
+  fout.write("#define PY_ARRAY_UNIQUE_SYMBOL scatt_ARRAY_API \n")
+  fout.write("#include \"numpy/arrayobject.h\"\n")
+  fout.write("// the order of 3 guys above is important\n")
+  fout.write("\n")
+  #fout.write("#include \"PythonModule.h\"\n")
+  for ff in files_inc:
+      ff = ff.replace(OutputTempDir+"/","")
+      fout.write("#include \""+ff+"\" \n")
+  fout.write("\n")
+  fout.write("#include \"PythonListConverter.h\"\n")
+  fout.write("\n")
+  fout.write("BOOST_PYTHON_MODULE(libScattCore){\n")
+  fout.write("\n")
+  # adding register lines
+  #for ff in files_inc:
+    #fout2 = open(ff,'r')
+    #for line in fout2:
+      #if "register_" in line:
+        #line = line.replace("void ","    ")
+        #fout.write(line)
+
+  # copying register lines from automaticaly generated module file to our manually generated
+  old_python_module_file = OutputTempDir+"/PythonInterface.main.cpp"
+  fin = open(old_python_module_file,'r')
+  for line in fin:
+      if "register_" in line:
+          fout.write(line)
+  fin.close()
+
+  fout.write("\n")
+  fout.write("    register_python2cpp_converters();\n")
+  fout.write("\n")
+  fout.write("    import_array();\n")
+  fout.write("    /* IMPORTANT\n")
+  fout.write("    this is initialisation function from C-API of python-numpy package. It has to be called once in the\n")
+  fout.write("    initialisation section of the module (i.e. here), when module is going to use any of python numpy C-API.\n")
+  fout.write("    Additional rule: when initialisation of the module, and functions that use python-numpy C-API are located in\n")
+  fout.write("    different files (different compilation units) - and this is exactly our case - additional defines has\n")
+  fout.write("    to be inserted before #include \"numpy/arrayobject.h\". See explanations\n")
+  fout.write("    http://docs.scipy.org/doc/numpy/reference/c-api.array.html#import_array\n")
+  fout.write("    */\n")
+  fout.write("}\n")
+
+  fout.close()
+  return python_module_file
+
+
+#-------------------------------------------------------------
+# patching generated files to get rid warnings from boost
+#-------------------------------------------------------------
+def PatchFiles(files):
+  for ff in files:
+    print ff
+    fin = file(ff,"r")
+    fout = file("tmp.tmp","w")
+    for line in fin:
+      if "boost/python.hpp" in line:
+        fout.write("#include \"Macros.h\"\n")
+        fout.write("GCC_DIAG_OFF(unused-parameter);\n")
+        fout.write("GCC_DIAG_OFF(missing-field-initializers);\n")
+        fout.write("#include \"boost/python.hpp\"\n")
+        fout.write("#include \"boost/python/suite/indexing/vector_indexing_suite.hpp\"\n")
+        fout.write("GCC_DIAG_ON(unused-parameter);\n")
+        fout.write("GCC_DIAG_ON(missing-field-initializers);\n")
+      elif "vector_indexing_suite.hpp" in line:
+        continue
+      else:
+        fout.write(line)
+    fout.close()
+    fin.close()
+    os.system("mv tmp.tmp "+ff)
+
+
+#-------------------------------------------------------------
+# copying files to the project directory
+#-------------------------------------------------------------
+def CopyFiles(files, InstallDir):
+  copycommand='cp '
+  # copying files
+  overwriteAnswer=''
+  for f in files:
+    fileName = os.path.basename(f)
+
+    # different output directory for source and headers
+    outputName=''
+    if '.cpp' in fileName:
+      outputName=InstallDir+"/src/"+fileName
+    elif '.h' in fileName:
+      outputName=InstallDir+"/inc/"+fileName
+    elif '.pri' in fileName:
+      outputName=InstallDir+"/../"+fileName
+    #print "XXX",f, outputName
+
+    # check file existance
+    if os.path.exists(outputName) and overwriteAnswer != 'a':
+      prompt="File '"+outputName+"' exists, Overwrite? [y/a/n] "
+      overwriteAnswer=raw_input(prompt)
+
+    if (overwriteAnswer == 'y' or overwriteAnswer=='a') or not os.path.exists(outputName):
+      command = copycommand + f + " " + outputName
+      print command
+      os.system(command)
+
+    else:
+      continue
+
+
+#-------------------------------------------------------------
+# InstallCode()
+#-------------------------------------------------------------
+def InstallCode(OutputTempDir, InstallDir):
+  files_inc =glob.glob(OutputTempDir+"/*.pypp.h");
+  files_inc+= glob.glob(OutputTempDir+"/__call_policies.pypp.hpp");
+  files_src = glob.glob(OutputTempDir+"/*.pypp.cpp");
+  files = files_inc+files_src
+
+  python_pri_file = GenerateProjectFile(OutputTempDir, files_inc, files_src)
+  files.append(python_pri_file)
+
+  python_module_file = GenerateModuleFile(OutputTempDir, files_inc, files_src)
+  files.append(python_module_file)
+
+  PatchFiles(files)
+
+  CopyFiles(files, InstallDir)
+
+
+
diff --git a/Macros/BoostPythonGenerator/runpyplusplus.py b/Macros/BoostPythonGenerator/runpyplusplus.py
new file mode 100644
index 0000000000000000000000000000000000000000..d044e635879de1ac7fa5ed66f236871e959fa6fc
--- /dev/null
+++ b/Macros/BoostPythonGenerator/runpyplusplus.py
@@ -0,0 +1,429 @@
+# see codegenerator.py
+
+import os
+import sys
+import glob
+from pyplusplus import module_builder
+from pyplusplus.module_builder import call_policies
+from pyplusplus import messages
+from pyplusplus import file_writers
+from pygccxml.declarations.matchers import access_type_matcher_t
+from pygccxml.declarations.matchers import virtuality_type_matcher_t
+from pygccxml import declarations
+from pyplusplus import function_transformers as FT
+
+
+ModuleName = 'PythonInterface'
+nOutputFiles = 8 # generated code for classes will be splitted in this number of files
+
+# list of files to analyse and corresponding functions with rules for analysis
+myFiles=[
+  'BasicVector3D.h',
+  #'Experiment.h',
+  #'FormFactorCrystal.h',
+  #'FormFactorCylinder.h',
+  #'FormFactorDecoratorDebyeWaller.h',
+  #'FormFactorFullSphere.h',
+  #'FormFactorGauss.h',
+  #'FormFactorLorentz.h',
+  #'FormFactorPrism3.h',
+  #'FormFactorPyramid.h',
+  #'FormFactorSphereGaussianRadius.h',
+  #'GISASExperiment.h',
+  #'HomogeneousMaterial.h',
+  #'IClusteredParticles.h',
+  #'ICompositeSample.h',
+  #'IFormFactor.h',
+  #'IFormFactorBorn.h',
+  #'IFormFactorDecorator.h',
+  #'IInterferenceFunction.h',
+  #'InterferenceFunctionNone.h',
+  #'InterferenceFunction1DParaCrystal.h',
+  #'IMaterial.h',
+  #'IParameterized.h',
+  #'ISample.h',
+  #'ISampleBuilder.h',
+  #'ISelectionRule.h',
+  #'ISingleton.h',
+  #'Lattice.h',
+  #'LatticeBasis.h',
+  #'Layer.h',
+  #'LayerDecorator.h',
+  #'LayerRoughness.h',
+  #'MaterialManager.h',
+  #'MesoCrystal.h',
+  #'MultiLayer.h',
+  #'Particle.h',
+  #'Crystal.h',
+  #'ParticleDecoration.h',
+  #'OpticalFresnel.h',
+  #'ParameterPool.h',
+  #'ParticleInfo.h',
+  #'DiffuseParticleInfo.h',
+  #'PythonOutputData.h',
+  'PythonPlusplusHelper.h',
+  #'RealParameterWrapper.h',
+  'Transform3D.h',
+  #'Units.h',
+  'Types.h',
+]
+
+# list of include directories
+myIncludes = ['../../Core/Samples/inc','../../Core/FormFactors/inc','../../Core/Algorithms/inc','../../Core/Tools/inc','../../Core/PythonAPI/inc','../../Core/Geometry/inc']
+
+
+# -------------------------------------------------------------------
+# AdditionalRules
+# -------------------------------------------------------------------
+def AdditionalRules(mb):
+
+  # --- BasicVector3D.h -----------------------------------------------
+  if "BasicVector3D.h" in myFiles:
+    ##cl = mb.class_("BasicVector3D<std::complex<double> >")
+    mb.classes(lambda decl: 'Geometry::BasicVector3D<std::complex<double> >' in decl.decl_string ).exclude()
+    mb.free_operators( lambda decl: 'Geometry::BasicVector3D<std::complex<double> >' in decl.decl_string ).exclude()
+    mb.free_functions( lambda decl: 'Geometry::BasicVector3D<std::complex<double> >' in decl.decl_string ).exclude()
+
+  # --- Experiment.h --------------------------------------------------
+  if "Experiment.h" in myFiles:
+    cl = mb.class_( "Experiment" )
+    cl.constructors( lambda decl: bool( decl.arguments ) ).exclude() # exclude non-default constructors
+    cl.member_functions().exclude()
+    cl.member_function("runSimulation").include()
+    cl.member_function("normalize").include()
+    cl.member_function("setBeamParameters").include()
+    cl.member_function("setBeamIntensity").include()
+    cl.member_function("setSample").include()
+    cl.member_function("setSampleBuilder").include()
+
+  # --- FormFactorCylinder.h ------------------------------------------
+  #if "FormFactorCylinder.h" in myFiles:
+    #cl = mb.class_( "FormFactorCylinder" )
+
+  # --- FormFactorDecoratorDebyeWaller.h ------------------------------
+  #if "FormFactorDecoratorDebyeWaller" in myFiles:
+    #cl = mb.class_( "FormFactorDecoratorDebyeWaller" )
+
+  # --- FormFactorFullSphere.h ----------------------------------------
+  #if "FormFactorFullSphere.h" in myFiles:
+    #cl = mb.class_( "FormFactorFullSphere" )
+
+  # --- FormFactorPyramid.h -------------------------------------------
+  #if "FormFactorPyramid.h" in myFiles:
+    #cl = mb.class_( "FormFactorPyramid" )
+
+  # --- FormFactorSphereGaussianRadius.h ------------------------------
+  if "FormFactorSphereGaussianRadius.h" in myFiles:
+    cl = mb.class_( "FormFactorSphereGaussianRadius" )
+    cl.member_functions("createDistributedFormFactors").exclude()
+
+  # --- GISASExperiment.h ---------------------------------------------
+  if "GISASExperiment.h" in myFiles:
+    cl = mb.class_( "GISASExperiment" )
+    cl.member_function( "setDetectorResolutionFunction" ).exclude()
+
+  # --- HomogeneousMaterial.h -----------------------------------------
+  #if "HomogeneousMaterial.h" in myFiles:
+    #cl = mb.class_( "HomogeneousMaterial" )
+
+  # --- IClusteredParticles.h -----------------------------------------
+  #if "IClusteredParticles.h" in myFiles:
+    #cl.constructors( lambda decl: bool( decl.arguments ) ).exclude() # exclude non-default constructors
+    #cl.member_function("createTotalFormFactor").call_policies = call_policies.return_value_policy(call_policies.manage_new_object )
+
+  # --- ICompositeSample.h --------------------------------------------
+  #if "ICompositeSample.h" in myFiles:
+    #cl = mb.class_( "ICompositeSample" )
+    #cl.constructors( lambda decl: bool( decl.arguments ) ).exclude() # exclude non-default constructors
+    #cl.member_functions().exclude()
+
+  # --- IFormFactor.h -------------------------------------------------
+  #if "IFormFactor.h" in myFiles:
+    #cl = mb.class_( "IFormFactor" )
+
+  # --- IFormFactorBorn.h ---------------------------------------------
+  #if "IFormFactorBorn.h" in myFiles:
+    #cl = mb.class_( "IFormFactorBorn" )
+
+  # --- IFormFactorBornSeparable.h ------------------------------------
+  #if "IFormFactorBornSeparable.h" in myFiles:
+    #cl = mb.class_( "IFormFactorBornSeparable" )
+
+  # --- IFormFactorDecorator.h ----------------------------------------
+  #if "IFormFactorDecorator.h" in myFiles:
+    #cl = mb.class_( "IFormFactorDecorator" )
+
+  # --- IInterferenceFunction.h ---------------------------------------
+  #if "IInterferenceFunction.h" in myFiles:
+    #cl = mb.class_( "IInterferenceFunction" )
+
+  # --- InterferenceFunctionNone.h ------------------------------------
+  #if "InterferenceFunctionNone.h" in myFiles:
+    #cl = mb.class_( "InterferenceFunctionNone" )
+
+  # --- InterferenceFunction1DParaCrystal.h ---------------------------
+  #if "InterferenceFunction1DParaCrystal.h" in myFiles:
+    #cl = mb.class_( "InterferenceFunction1DParaCrystal" )
+
+  # --- IMaterial.h ---------------------------------------------------
+  #if "IMaterial.h" in myFiles:
+    #cl = mb.class_( "IMaterial" )
+
+  # --- IParameterized.h ----------------------------------------------
+  #if "IParameterized.h" in myFiles:
+    #cl = mb.class_( "IParameterized" )
+    #cl.member_functions().exclude()
+    #cl.member_function( "createParameterTree" ).include()
+    #cl.member_function( "addParametersToExternalPool" ).include()
+
+  # --- ISingleton.h --------------------------------------------------
+  #if "ISingleton.h" in myFiles:
+    #cl = mb.class_( "ISingleton" )
+
+  # --- ISample.h -----------------------------------------------------
+  if "ISample.h" in myFiles:
+    cl = mb.class_( "ISample" )
+    cl.member_functions().exclude()
+    cl.member_function( "clone" ).include()
+    cl.member_function("print_structure").include()
+
+  # --- ISampleBuilder.h ----------------------------------------------
+  if "ISampleBuilder.h" in myFiles:
+    cl = mb.class_( "ISampleBuilder" )
+    cl.member_functions().exclude()
+    cl.member_function( "buildSample" ).include()
+    cl.member_function( "buildSample" ).call_policies = call_policies.return_value_policy( call_policies.manage_new_object )
+
+  # --- Lattice.h -----------------------------------------------------
+  if "Lattice.h" in myFiles:
+    cl = mb.class_( "Lattice" )
+    cl.member_functions().exclude()
+    cl.member_function("getBasisVectorA").include()
+    cl.member_function("getBasisVectorB").include()
+    cl.member_function("getBasisVectorC").include()
+    cl.member_function("createTrigonalLattice").include()
+    cl.member_function("createTrigonalLattice").call_policies = call_policies.return_value_policy(call_policies.return_by_value )
+    cl.member_function("setSelectionRule").include()
+
+  # --- LatticeBasis.h ------------------------------------------------
+  if "LatticeBasis.h" in myFiles:
+    cl = mb.class_( "LatticeBasis" )
+    cl.constructors( lambda decl: bool( decl.arguments ) ).exclude() # exclude non-default constructors
+    cl.member_functions().exclude()
+    cl.member_function("addParticle").include()
+
+  # --- Layer.h -------------------------------------------------------
+  if "Layer.h" in myFiles:
+    cl = mb.class_( "Layer" )
+    cl.member_function( "createDWBASimulation" ).exclude()
+    # we need to include back setMaterial methods since they have pointers in argument list (and our default policy is to exclude them)
+    for fun in cl.member_functions():
+      if fun.name == "setMaterial":
+        fun.include()
+        print fun
+    # including back constructors with pointers (general policy is to exclude them)
+    cl.constructors().include()
+
+  # --- LayerDecorator.h ----------------------------------------------
+  if "LayerDecorator.h" in myFiles:
+    cl = mb.class_( "LayerDecorator" )
+    cl.member_function( "createDiffuseDWBASimulation").exclude()
+    cl.member_function( "createDWBASimulation").exclude()
+    cl.member_function( "createStrategy").exclude()
+
+  # --- LayerRoughness.h ----------------------------------------------
+  if "LayerRoughness.h" in myFiles:
+    cl = mb.class_( "LayerRoughness" )
+    cl.member_function( "getSpectralFun" ).exclude()
+    cl.member_function( "getCorrFun" ).exclude()
+
+  # --- MaterialManager.h ---------------------------------------------
+  if "MaterialManager.h" in myFiles:
+    cl = mb.class_( "MaterialManager" )
+    cl.constructors().exclude()
+
+  # --- MesoCrystal.h -------------------------------------------------
+  if "MesoCrystal.h" in myFiles:
+    cl = mb.class_( "MesoCrystal" )
+    cl.member_functions( ).exclude() # excluding all member functions, leaving only constructors
+
+  # --- MultiLayer.h --------------------------------------------------
+  if "MultiLayer.h" in myFiles:
+    cl = mb.class_( "MultiLayer" )
+    cl.member_functions( ).exclude()
+    cl.member_function( "addLayer" ).include()
+    cl.member_function( "addLayer" ).include()
+    cl.member_function( "addLayerWithTopRoughness" ).include()
+
+  # --- Particle.h ----------------------------------------------------
+  if "Particle.h" in myFiles:
+    cl = mb.class_( "Particle" )
+    cl.member_function( "createDiffuseParticleInfo" ).exclude()
+    cl.member_function( "createDistributedParticles" ).exclude()
+
+  # --- Crystal.h -----------------------------------------------------
+  #if "Crystal.h" in myFiles:
+    #cl = mb.class_( "Crystal" )
+
+  # --- ParticleDecoration.h ------------------------------------------
+  if "ParticleDecoration.h" in myFiles:
+    cl = mb.class_( "ParticleDecoration" )
+    cl.constructors( lambda decl: bool( decl.arguments ) ).exclude() # exclude non-default constructors
+    cl.member_function("createStrategy").exclude()
+
+  # --- OpticalFresnel.h ----------------------------------------------
+  #if "OpticalFresnel.h" in myFiles:
+    #cl = mb.class_( "OpticalFresnel" )
+
+  # --- Point3D.h -----------------------------------------------------
+  #if "Point3D.h" in myFiles:
+    #cl = mb.class_( "Point3D<double>" )
+
+  # --- ParameterPool.h -----------------------------------------------
+  if "ParameterPool.h" in myFiles:
+    cl = mb.class_( "ParameterPool" )
+    cl.member_function("registerParameter").include()
+    cl.member_function("registerParameter").add_transformation( FT.from_address( 1 ) )
+    cl.member_function("getMatchedParameters").exclude()
+
+  # --- PythonOutputData.h --------------------------------------------
+  if "PythonOutputData.h" in myFiles:
+    # these functions returns PyObject, the empty custom policy is the only way I know
+    mb.free_function('GetOutputData').call_policies = call_policies.custom_call_policies("")
+    mb.free_function('GetOutputDataAxis').call_policies = call_policies.custom_call_policies("")
+
+  # --- PythonPlusplusHelper.h ----------------------------------------
+  if "PythonPlusplusHelper.h" in myFiles:
+    cl = mb.class_( "PythonPlusplusHelper" )
+    cl.exclude() # given class is only to teach pyplusplus to templates, but we do not need class itself to be visible in python, excluding it...
+
+  # --- RealParameterWrapper.h ----------------------------------------
+  if "RealParameterWrapper.h" in myFiles:
+    cl = mb.class_('RealParameterWrapper') # given class is only to teach pyplusplus to templates, but we do not need class itself to be visible in python, excluding it...
+    cl.member_functions().exclude()
+    cl.member_function("setValue").include()
+    cl.member_function("getValue").include()
+    cl.member_function("isNull").include()
+
+  # --- Transform3D.h -------------------------------------------------
+  if "Transform3D.h" in myFiles:
+    # removing mentioning of Point3D from constructors and member_functions
+    mb.class_( "Point3D<double>").exclude()
+    TransformClasses={"Transform3D","Reflect3D","Translate3D", "Scale3D", "Rotate3D"}
+    for clname in TransformClasses:
+      cl = mb.class_(clname)
+      cl.constructors(lambda decl: 'Point3D' in decl.decl_string, allow_empty=True ).exclude()
+      cl.member_functions(lambda decl: 'Point3D' in decl.decl_string, allow_empty=True ).exclude()
+
+  # --- Types.h -------------------------------------------------------
+  if "Types.h" in myFiles:
+    cl = mb.class_("KVectorContainer")
+    cl.exclude()
+
+
+def RunPyPlusPlus(OutputTempDir):
+  from pyplusplus.file_writers.balanced_files import balanced_files_t
+  balanced_files_t.HEADER_EXT='.h'
+  balanced_files_t.SOURCE_EXT='.cpp'
+  from pyplusplus.file_writers.multiple_files import multiple_files_t
+  multiple_files_t.HEADER_EXT='.pypp.h'
+  multiple_files_t.SOURCE_EXT='.pypp.cpp'
+
+  #GCCXML_COMPILER="/opt/local/bin/g++"
+  #GCCXML_CXXFLAGS=""
+
+  myIncludes.append('/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7')
+  myIncludes.append('/opt/local/include/')
+  mb = module_builder.module_builder_t(files=myFiles, include_paths=myIncludes, gccxml_path='/opt/local/bin', cflags="-m64")
+  #mb = module_builder.module_builder_t(files=myFiles, include_paths=myIncludes, gccxml_path='/opt/local/bin')
+
+  # ---------------------------------------------------------
+  # common properties
+  # ---------------------------------------------------------
+  mb.always_expose_using_scope = True
+
+  # Generated code containing errors will not compile on
+  mem_funs = mb.calldefs ()
+  mem_funs.create_with_signature = True
+
+  # Exclude protected and private that are not pure virtual (we still have to expose pure virtual functions to have them overriden in the wrapper)
+  query = declarations.access_type_matcher_t( 'private' ) & ~declarations.virtuality_type_matcher_t( declarations.VIRTUALITY_TYPES.PURE_VIRTUAL )
+  mb.global_ns.calldefs( query, allow_empty=True ).exclude()
+  query = declarations.access_type_matcher_t( 'protected' ) & ~declarations.virtuality_type_matcher_t( declarations.VIRTUALITY_TYPES.PURE_VIRTUAL )
+  mb.global_ns.calldefs( query, allow_empty=True ).exclude()
+
+  # excluding generation of methods for implicit conversion
+  mb.constructors().allow_implicit_conversion = False
+
+  # return policy for singletons, clone and create methods
+  classes = mb.classes();
+  for cl in classes:
+    cl.member_functions('instance', allow_empty=True).call_policies = call_policies.return_value_policy( call_policies.reference_existing_object )
+    cl.member_functions('clone', allow_empty=True).call_policies = call_policies.return_value_policy( call_policies.manage_new_object )
+    cl.member_functions( lambda x: x.name.startswith('create'), allow_empty=True ).call_policies = call_policies.return_value_policy( call_policies.manage_new_object )
+
+  # excluding constructors which have pointers in argument list
+  for cl in classes:
+    for ctor in cl.constructors(allow_empty=True):
+      for arg in ctor.arguments:
+        if declarations.type_traits.is_pointer(arg.type):
+          ctor.exclude()
+
+  # excluding member functions if they have pointers in argument list
+  for cl in classes:
+    for fun in cl.member_functions(allow_empty=True):
+      has_pointers = False
+      for arg in fun.arguments:
+        if declarations.type_traits.is_pointer(arg.type):
+          has_pointers = True
+      if has_pointers:
+          fun.exclude();
+
+  # ---------------------------------------------------------
+  # calling class individual parsing properties
+  # ---------------------------------------------------------
+  AdditionalRules(mb)
+
+  # set the default return policies (for references/pointers) on classes if it wasn't already been done for
+  mem_funs = mb.calldefs()
+  for mem_fun in mem_funs:
+    if mem_fun.call_policies:
+      continue
+    if not mem_fun.call_policies and (declarations.is_reference(mem_fun.return_type) or declarations.is_pointer(mem_fun.return_type) ):
+      mem_fun.call_policies = call_policies.return_value_policy(call_policies.reference_existing_object )
+
+  # disabling some warnings
+  messages.disable(
+        messages.W1020  # Warnings 1020 - 1031 are all about why Py++ generates wrapper for class X
+      , messages.W1021
+      , messages.W1022
+      , messages.W1023
+      , messages.W1024
+      , messages.W1025
+      , messages.W1026
+      , messages.W1027
+      , messages.W1028
+      , messages.W1029
+      , messages.W1030
+      , messages.W1031
+      #, messages.W1035
+      #, messages.W1040
+      #, messages.W1038
+      #, messages.W1041
+      #, messages.W1036 # pointer to Python immutable member
+      #, messages.W1033 # unnamed variables
+      #, messages.W1018 # expose unnamed classes
+      #, messages.W1049 # returns reference to local variable
+      #, messages.W1014 # unsupported '=' operator
+       )
+
+  # ---------------------------------------------------------
+  # generating output
+  # ---------------------------------------------------------
+  mb.build_code_creator( module_name=ModuleName)
+  mb.code_creator.user_defined_directories.append( os.path.abspath('./') )
+  if nOutputFiles > 0:
+    mb.split_module( OutputTempDir)
+    #mb.balanced_split_module( OutputTempDir, nOutputFiles)
+  else:
+    mb.write_module( "tmp.cpp")