diff --git a/Core/Instrument/SimulationResult.h b/Core/Instrument/SimulationResult.h
index a532f550617d4a1a2048bd36ae97a0882cfa8b0b..77dac8441462f39840fc553ccb226bea9e670d3a 100644
--- a/Core/Instrument/SimulationResult.h
+++ b/Core/Instrument/SimulationResult.h
@@ -42,11 +42,16 @@ class SimulationResult
 public:
     SimulationResult() = default;
     SimulationResult(const OutputData<double>& data, const IUnitConverter& unit_converter);
+
     SimulationResult(const SimulationResult& other);
+#ifndef SWIG
     SimulationResult(SimulationResult&& other);
+#endif
 
     SimulationResult& operator=(const SimulationResult& other);
+#ifndef SWIG
     SimulationResult& operator=(SimulationResult&& other);
+#endif
 
 #ifndef SWIG
     std::unique_ptr<OutputData<double>> data(Axes::Units units = Axes::Units::DEFAULT) const;
diff --git a/Core/Material/Material.cpp b/Core/Material/Material.cpp
index 9a1e12d0f28bad01c2c18571e265eb6c4f12085e..278d87c4b30ca76b270d1720996f9aeb93305891 100644
--- a/Core/Material/Material.cpp
+++ b/Core/Material/Material.cpp
@@ -19,6 +19,11 @@
 #include "Core/Material/WavevectorInfo.h"
 #include <typeinfo>
 
+Material::Material(std::unique_ptr<BaseMaterialImpl> material_impl)
+    : m_material_impl(std::move(material_impl))
+{
+}
+
 Material::Material(const Material& material)
 {
     if (material.isEmpty())
@@ -27,11 +32,6 @@ Material::Material(const Material& material)
     m_material_impl.reset(material.m_material_impl->clone());
 }
 
-Material::Material(std::unique_ptr<BaseMaterialImpl> material_impl)
-    : m_material_impl(std::move(material_impl))
-{
-}
-
 Material& Material::operator=(const Material& other)
 {
     if (other.isEmpty())
diff --git a/Core/Material/Material.h b/Core/Material/Material.h
index 8d2a970e6d947c67c4a11eb87d083df9304ba843..7e7e2bba65fa5cdc5ae25700505e5b878e7c981d 100644
--- a/Core/Material/Material.h
+++ b/Core/Material/Material.h
@@ -31,22 +31,20 @@ class WavevectorInfo;
 class Material
 {
 public:
-    //! Material copy-constructor
-    Material(const Material& material);
-
-    //! Material move-constructor
-    Material(Material&& material) = default;
-
 #ifndef SWIG
     //! Creates material with particular material implementation
     Material(std::unique_ptr<BaseMaterialImpl> material_impl);
 #endif // SWIG
 
-    //! Material copy assignment
-    Material& operator=(const Material& other);
+    Material(const Material& material);
+#ifndef SWIG
+    Material(Material&& material) = default;
+#endif // SWIG
 
-    //! Material move assignment
+    Material& operator=(const Material& other);
+#ifndef SWIG
     Material& operator=(Material&& other) = default;
+#endif // SWIG
 
     //! Constructs a material with inverted magnetization
     Material inverted() const;
diff --git a/Wrap/swig/directors.i b/Wrap/swig/directors.i
index 513c1345295bf506cc9c44ba95713ecc1642eddf..15fbf7a1af562f45dade56f6607a23a41693f206 100644
--- a/Wrap/swig/directors.i
+++ b/Wrap/swig/directors.i
@@ -1,17 +1,16 @@
  // manually declare which classes can be derived in Python and passed back to C++
  // this can be used to reduce the bloat in the swig-generated code
 
-%feature("director") IParameterized;
-%feature("director") ISampleBuilder;
-%feature("director") INode;
-%feature("director") ISample;
-%feature("director") IFormFactor;
-%feature("director") IFormFactorBorn;
-%feature("director") IInterferenceFunction;
-%feature("director") PyCallback;
-%feature("director") PyBuilderCallback;
-%feature("director") PyObserverCallback;
-%feature("director") FitObjective;
+%feature("director") IParameterized;     // needed by ISampleBuilder
+%feature("director") ISampleBuilder;     // used in mesocrystal1.py
+%feature("director") INode;              // needed by ISample
+%feature("director") ISample;            // needed by IFormFactor
+%feature("director") IFormFactor;        // needed by IFormFactorBorn
+%feature("director") IFormFactorBorn;    // used in CustomFormFactor.py
+%feature("director") FitObjective;       // used in custom_objective_function.py
+%feature("director") PyCallback;         // used in extendFit.i
+%feature("director") PyBuilderCallback;  // used in extendCore.i
+%feature("director") PyObserverCallback; // used in extendCore.i
 
 // Propagate python exceptions
 // taken from
diff --git a/Wrap/swig/warnings.i b/Wrap/swig/warnings.i
index 64802f14bc598c42794bc6eaf10f326954cdefac..a5c4a18c18a3d4c772c025accd26b03398893d38 100644
--- a/Wrap/swig/warnings.i
+++ b/Wrap/swig/warnings.i
@@ -5,7 +5,7 @@
 #pragma SWIG nowarn=389 // operator[] ignored, consider %extend
 #pragma SWIG nowarn=503 // operator= ignored, consider renaming to valid identifier
 
-// questionable warnings, TODO: reinvestigate
-#pragma SWIG nowarn=473 // questionable return pointer
-#pragma SWIG nowarn=509 // overloaded method shadowed, effectively ignored
-#pragma SWIG nowarn=520 // base class not similarly marked as a smart pointer
+// questionable warnings, complicated machinery -> reinvestigate later
+#pragma SWIG nowarn=473 // return pointer from director
+#pragma SWIG nowarn=509 // overloaded method shadowed
+#pragma SWIG nowarn=520 // base class not marked as shared_ptr (allow for ISampleBuilder)
diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i
index d83811fc3c157492ff768d02df63d13e5c703c7a..28ca1e46171535fa5125b93603a31f21d93f0941 100644
--- a/auto/Wrap/doxygenCore.i
+++ b/auto/Wrap/doxygenCore.i
@@ -9989,19 +9989,15 @@ A wrapper for underlying material implementation
 C++ includes: Material.h
 ";
 
-%feature("docstring")  Material::Material "Material::Material(const Material &material)
+%feature("docstring")  Material::Material "Material::Material(std::unique_ptr< BaseMaterialImpl > material_impl)
 
-Material copy-constructor. 
+Creates material with particular material implementation. 
 ";
 
-%feature("docstring")  Material::Material "Material::Material(Material &&material)=default
-
-Material move-constructor. 
+%feature("docstring")  Material::Material "Material::Material(const Material &material)
 ";
 
-%feature("docstring")  Material::Material "Material::Material(std::unique_ptr< BaseMaterialImpl > material_impl)
-
-Creates material with particular material implementation. 
+%feature("docstring")  Material::Material "Material::Material(Material &&material)=default
 ";
 
 %feature("docstring")  Material::inverted "Material Material::inverted() const
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index 06ccecb091a36b98336fc96ef3d7bc539f5d2353..29b0dc1c1f14ba79dc93730aafe6675b43142960 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -11487,20 +11487,10 @@ class IInterferenceFunction(ISample):
     """
 
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
-    __repr__ = _swig_repr
 
-    def __init__(self, *args):
-        r"""
-        __init__(IInterferenceFunction self, NodeMeta meta, vdouble1d_t PValues) -> IInterferenceFunction
-        __init__(IInterferenceFunction self, double position_var) -> IInterferenceFunction
-        IInterferenceFunction::IInterferenceFunction(double position_var)
-
-        """
-        if self.__class__ == IInterferenceFunction:
-            _self = None
-        else:
-            _self = self
-        _libBornAgainCore.IInterferenceFunction_swiginit(self, _libBornAgainCore.new_IInterferenceFunction(_self, *args))
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
 
     def clone(self):
         r"""
@@ -11571,15 +11561,7 @@ class IInterferenceFunction(ISample):
 
         """
         return _libBornAgainCore.IInterferenceFunction_DWfactor(self, q)
-
-    def iff_without_dw(self, q):
-        r"""iff_without_dw(IInterferenceFunction self, kvector_t q) -> double"""
-        return _libBornAgainCore.IInterferenceFunction_iff_without_dw(self, q)
     __swig_destroy__ = _libBornAgainCore.delete_IInterferenceFunction
-    def __disown__(self):
-        self.this.disown()
-        _libBornAgainCore.disown_IInterferenceFunction(self)
-        return weakref.proxy(self)
 
 # Register IInterferenceFunction in _libBornAgainCore:
 _libBornAgainCore.IInterferenceFunction_swigregister(IInterferenceFunction)
@@ -20276,7 +20258,6 @@ class SimulationResult(object):
         __init__(SimulationResult self) -> SimulationResult
         __init__(SimulationResult self, IntensityData data, IUnitConverter unit_converter) -> SimulationResult
         __init__(SimulationResult self, SimulationResult other) -> SimulationResult
-        __init__(SimulationResult self, SimulationResult other) -> SimulationResult
         SimulationResult::SimulationResult(SimulationResult &&other)
 
         """
@@ -21237,16 +21218,13 @@ class Material(object):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, *args):
+    def __init__(self, material):
         r"""
         __init__(Material self, Material material) -> Material
-        __init__(Material self, Material material) -> Material
-        Material::Material(std::unique_ptr< BaseMaterialImpl > material_impl)
-
-        Creates material with particular material implementation. 
+        Material::Material(Material &&material)=default
 
         """
-        _libBornAgainCore.Material_swiginit(self, _libBornAgainCore.new_Material(*args))
+        _libBornAgainCore.Material_swiginit(self, _libBornAgainCore.new_Material(material))
 
     def inverted(self):
         r"""
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 88299cfc20c66b562a2e9c7599b78e0c2e4e427c..bcc8347ef45b0085752169fd9403214b187a5d75 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -10075,498 +10075,6 @@ void SwigDirector_PyObserverCallback::update(FitObjective const &arg0) {
 }
 
 
-SwigDirector_IInterferenceFunction::SwigDirector_IInterferenceFunction(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues): IInterferenceFunction(meta, PValues), Swig::Director(self) {
-  SWIG_DIRECTOR_RGTR((IInterferenceFunction *)this, this); 
-}
-
-
-
-
-SwigDirector_IInterferenceFunction::SwigDirector_IInterferenceFunction(PyObject *self, double position_var): IInterferenceFunction(position_var), Swig::Director(self) {
-  SWIG_DIRECTOR_RGTR((IInterferenceFunction *)this, this); 
-}
-
-
-
-
-SwigDirector_IInterferenceFunction::~SwigDirector_IInterferenceFunction() {
-}
-
-IInterferenceFunction *SwigDirector_IInterferenceFunction::clone() const {
-  IInterferenceFunction *c_result = 0 ;
-  void *swig_argp ;
-  int swig_res ;
-  swig_owntype own ;
-  
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 0;
-  const char *const swig_method_name = "clone";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("clone");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_IInterferenceFunction,  0  | SWIG_POINTER_DISOWN, &own);
-  if (!SWIG_IsOK(swig_res)) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""IInterferenceFunction *""'");
-  }
-  c_result = reinterpret_cast< IInterferenceFunction * >(swig_argp);
-  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
-  return (IInterferenceFunction *) c_result;
-}
-
-
-void SwigDirector_IInterferenceFunction::transferToCPP() {
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 1;
-  const char *const swig_method_name = "transferToCPP";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("transferToCPP");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-}
-
-
-ParameterPool *SwigDirector_IInterferenceFunction::createParameterTree() const {
-  ParameterPool *c_result = 0 ;
-  void *swig_argp ;
-  int swig_res ;
-  swig_owntype own ;
-  
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 2;
-  const char *const swig_method_name = "createParameterTree";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("createParameterTree");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_ParameterPool,  0  | SWIG_POINTER_DISOWN, &own);
-  if (!SWIG_IsOK(swig_res)) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""ParameterPool *""'");
-  }
-  c_result = reinterpret_cast< ParameterPool * >(swig_argp);
-  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
-  return (ParameterPool *) c_result;
-}
-
-
-void SwigDirector_IInterferenceFunction::onChange() {
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 3;
-  const char *const swig_method_name = "onChange";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("onChange");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-}
-
-
-void SwigDirector_IInterferenceFunction::accept(INodeVisitor *visitor) const {
-  swig::SwigVar_PyObject obj0;
-  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(visitor), SWIGTYPE_p_INodeVisitor,  0 );
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 4;
-  const char *const swig_method_name = "accept";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject result = PyObject_CallFunctionObjArgs(method ,(PyObject *)obj0, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("accept");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name ,(PyObject *)obj0, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-}
-
-
-std::string SwigDirector_IInterferenceFunction::treeToString() const {
-  std::string c_result;
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 5;
-  const char *const swig_method_name = "treeToString";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("treeToString");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  std::string *swig_optr = 0;
-  int swig_ores = SWIG_AsPtr_std_string(result, &swig_optr);
-  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::string""'");
-  }
-  c_result = *swig_optr;
-  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
-  return (std::string) c_result;
-}
-
-
-std::vector< INode const *, std::allocator< INode const * > > SwigDirector_IInterferenceFunction::getChildren() const {
-  std::vector< INode const *,std::allocator< INode const * > > c_result;
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 6;
-  const char *const swig_method_name = "getChildren";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("getChildren");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  std::vector< INode const*,std::allocator< INode const * > > *swig_optr = 0;
-  int swig_ores = swig::asptr(result, &swig_optr);
-  if (!SWIG_IsOK(swig_ores) || !swig_optr) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError((swig_optr ? swig_ores : SWIG_TypeError))), "in output value of type '""std::vector< INode const *,std::allocator< INode const * > >""'");
-  }
-  c_result = *swig_optr;
-  if (SWIG_IsNewObj(swig_ores)) delete swig_optr;
-  return (std::vector< INode const *,std::allocator< INode const * > >) c_result;
-}
-
-
-void SwigDirector_IInterferenceFunction::setParent(INode const *newParent) {
-  swig::SwigVar_PyObject obj0;
-  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(newParent), SWIGTYPE_p_INode,  0 );
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 7;
-  const char *const swig_method_name = "setParent";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject result = PyObject_CallFunctionObjArgs(method ,(PyObject *)obj0, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("setParent");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name ,(PyObject *)obj0, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-}
-
-
-Material const *SwigDirector_IInterferenceFunction::material() const {
-  Material *c_result = 0 ;
-  void *swig_argp ;
-  int swig_res ;
-  swig_owntype own ;
-  
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 8;
-  const char *const swig_method_name = "material";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("material");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  swig_res = SWIG_ConvertPtrAndOwn(result, &swig_argp, SWIGTYPE_p_Material,  0  | SWIG_POINTER_DISOWN, &own);
-  if (!SWIG_IsOK(swig_res)) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""Material const *""'");
-  }
-  c_result = reinterpret_cast< Material * >(swig_argp);
-  swig_acquire_ownership_obj(SWIG_as_voidptr(c_result), own /* & TODO: SWIG_POINTER_OWN */);
-  return (Material const *) c_result;
-}
-
-
-double SwigDirector_IInterferenceFunction::evaluate(kvector_t const q, double outer_iff) const {
-  double c_result = SwigValueInit< double >() ;
-  
-  swig::SwigVar_PyObject obj0;
-  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(new kvector_t((const kvector_t &)q)), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
-  swig::SwigVar_PyObject obj1;
-  obj1 = SWIG_From_double(static_cast< double >(outer_iff));
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 9;
-  const char *const swig_method_name = "evaluate";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject result = PyObject_CallFunctionObjArgs(method ,(PyObject *)obj0,(PyObject *)obj1, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("evaluate");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name ,(PyObject *)obj0,(PyObject *)obj1, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  double swig_val;
-  int swig_res = SWIG_AsVal_double(result, &swig_val);
-  if (!SWIG_IsOK(swig_res)) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""double""'");
-  }
-  c_result = static_cast< double >(swig_val);
-  return (double) c_result;
-}
-
-
-double SwigDirector_IInterferenceFunction::getParticleDensity() const {
-  double c_result = SwigValueInit< double >() ;
-  
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 11;
-  const char *const swig_method_name = "getParticleDensity";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("getParticleDensity");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  double swig_val;
-  int swig_res = SWIG_AsVal_double(result, &swig_val);
-  if (!SWIG_IsOK(swig_res)) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""double""'");
-  }
-  c_result = static_cast< double >(swig_val);
-  return (double) c_result;
-}
-
-
-bool SwigDirector_IInterferenceFunction::supportsMultilayer() const {
-  bool c_result = SwigValueInit< bool >() ;
-  
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 12;
-  const char *const swig_method_name = "supportsMultilayer";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject args = PyTuple_New(0);
-  swig::SwigVar_PyObject result = PyObject_Call(method, (PyObject *) args, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("supportsMultilayer");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);
-#endif
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  bool swig_val;
-  int swig_res = SWIG_AsVal_bool(result, &swig_val);
-  if (!SWIG_IsOK(swig_res)) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""bool""'");
-  }
-  c_result = static_cast< bool >(swig_val);
-  return (bool) c_result;
-}
-
-
-double SwigDirector_IInterferenceFunction::iff_without_dw(kvector_t const q) const {
-  double c_result = SwigValueInit< double >() ;
-  
-  swig::SwigVar_PyObject obj0;
-  obj0 = SWIG_NewPointerObj(SWIG_as_voidptr(new kvector_t((const kvector_t &)q)), SWIGTYPE_p_BasicVector3DT_double_t, SWIG_POINTER_OWN |  0 );
-  swig_set_inner("iff_without_dw", true);
-  if (!swig_get_self()) {
-    Swig::DirectorException::raise("'self' uninitialized, maybe you forgot to call IInterferenceFunction.__init__.");
-  }
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-  const size_t swig_method_index = 13;
-  const char *const swig_method_name = "iff_without_dw";
-  PyObject *method = swig_get_method(swig_method_index, swig_method_name);
-  swig::SwigVar_PyObject result = PyObject_CallFunctionObjArgs(method ,(PyObject *)obj0, NULL);
-#else
-  swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar("iff_without_dw");
-  swig::SwigVar_PyObject result = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name ,(PyObject *)obj0, NULL);
-#endif
-  swig_set_inner("iff_without_dw", false);
-  if (!result) {
-    PyObject *error = PyErr_Occurred();
-    {
-      if( error != NULL ) {
-        PyObject *ptype, *pvalue, *ptraceback;
-        PyErr_Fetch( &ptype, &pvalue, &ptraceback );
-        PyErr_Restore( ptype, pvalue, ptraceback );
-        PyErr_Print();
-        Py_Exit(1);
-      }
-    }
-  }
-  double swig_val;
-  int swig_res = SWIG_AsVal_double(result, &swig_val);
-  if (!SWIG_IsOK(swig_res)) {
-    Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(SWIG_ArgError(swig_res)), "in output value of type '""double""'");
-  }
-  c_result = static_cast< double >(swig_val);
-  return (double) c_result;
-}
-
-
 SwigDirector_ISampleBuilder::SwigDirector_ISampleBuilder(PyObject *self): ISampleBuilder(), Swig::Director(self) {
   SWIG_DIRECTOR_RGTR((ISampleBuilder *)this, this); 
 }
@@ -80786,138 +80294,12 @@ SWIGINTERN PyObject *MisesGaussPeakShape_swiginit(PyObject *SWIGUNUSEDPARM(self)
   return SWIG_Python_InitShadowInstance(args);
 }
 
-SWIGINTERN PyObject *_wrap_new_IInterferenceFunction__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  NodeMeta *arg2 = 0 ;
-  std::vector< double,std::allocator< double > > *arg3 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  int res3 = SWIG_OLDOBJ ;
-  IInterferenceFunction *result = 0 ;
-  
-  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
-  arg1 = swig_obj[0];
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_NodeMeta,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_IInterferenceFunction" "', argument " "2"" of type '" "NodeMeta const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IInterferenceFunction" "', argument " "2"" of type '" "NodeMeta const &""'"); 
-  }
-  arg2 = reinterpret_cast< NodeMeta * >(argp2);
-  {
-    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
-    res3 = swig::asptr(swig_obj[2], &ptr);
-    if (!SWIG_IsOK(res3)) {
-      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_IInterferenceFunction" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    if (!ptr) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IInterferenceFunction" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
-    }
-    arg3 = ptr;
-  }
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (IInterferenceFunction *)new SwigDirector_IInterferenceFunction(arg1,(NodeMeta const &)*arg2,(std::vector< double,std::allocator< double > > const &)*arg3); 
-  } else {
-    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
-    SWIG_fail;
-  }
-  
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_NEW |  0 );
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return resultobj;
-fail:
-  if (SWIG_IsNewObj(res3)) delete arg3;
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IInterferenceFunction__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  PyObject *arg1 = (PyObject *) 0 ;
-  double arg2 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  IInterferenceFunction *result = 0 ;
-  
-  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
-  arg1 = swig_obj[0];
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IInterferenceFunction" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  if ( arg1 != Py_None ) {
-    /* subclassed */
-    result = (IInterferenceFunction *)new SwigDirector_IInterferenceFunction(arg1,arg2); 
-  } else {
-    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing abstract class or protected constructor"); 
-    SWIG_fail;
-  }
-  
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_IInterferenceFunction(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IInterferenceFunction", 0, 3, argv))) SWIG_fail;
-  --argc;
-  if (argc == 2) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_new_IInterferenceFunction__SWIG_1(self, argc, argv);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    _v = (argv[0] != 0);
-    if (_v) {
-      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_NodeMeta, SWIG_POINTER_NO_NULL | 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
-        _v = SWIG_CheckState(res);
-        if (_v) {
-          return _wrap_new_IInterferenceFunction__SWIG_0(self, argc, argv);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IInterferenceFunction'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    IInterferenceFunction::IInterferenceFunction(NodeMeta const &,std::vector< double,std::allocator< double > > const &)\n"
-    "    IInterferenceFunction::IInterferenceFunction(PyObject *,double)\n");
-  return 0;
-}
-
-
 SWIGINTERN PyObject *_wrap_IInterferenceFunction_clone(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
   IInterferenceFunction *result = 0 ;
   
   if (!args) SWIG_fail;
@@ -80927,27 +80309,8 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_clone(PyObject *SWIGUNUSEDPARM(
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_clone" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
   }
   arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      Swig::DirectorPureVirtualException::raise("IInterferenceFunction::clone");
-    } else {
-      result = (IInterferenceFunction *)((IInterferenceFunction const *)arg1)->clone();
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  director = SWIG_DIRECTOR_CAST(result);
-  if (director) {
-    resultobj = director->swig_get_self();
-    Py_INCREF(resultobj);
-  } else {
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  }
-  if (director) {
-    SWIG_AcquirePtr(resultobj, director->swig_release_ownership(SWIG_as_voidptr(result)));
-  }
+  result = (IInterferenceFunction *)((IInterferenceFunction const *)arg1)->clone();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -80965,8 +80328,6 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate__SWIG_0(PyObject *SWIG
   int res2 = 0 ;
   double val3 ;
   int ecode3 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
   double result;
   
   if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
@@ -80993,17 +80354,7 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate__SWIG_0(PyObject *SWIG
     SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IInterferenceFunction_evaluate" "', argument " "3"" of type '" "double""'");
   } 
   arg3 = static_cast< double >(val3);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::evaluate(arg2,arg3);
-    } else {
-      result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2,arg3);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
+  result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2,arg3);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -81019,8 +80370,6 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate__SWIG_1(PyObject *SWIG
   int res1 = 0 ;
   void *argp2 ;
   int res2 = 0 ;
-  Swig::Director *director = 0;
-  bool upcall = false;
   double result;
   
   if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
@@ -81042,17 +80391,7 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_evaluate__SWIG_1(PyObject *SWIG
       if (SWIG_IsNewObj(res2)) delete temp;
     }
   }
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::evaluate(arg2);
-    } else {
-      result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
+  result = (double)((IInterferenceFunction const *)arg1)->evaluate(arg2);
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -81168,8 +80507,6 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_getParticleDensity(PyObject *SW
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
   double result;
   
   if (!args) SWIG_fail;
@@ -81179,17 +80516,7 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_getParticleDensity(PyObject *SW
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_getParticleDensity" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
   }
   arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (double)((IInterferenceFunction const *)arg1)->IInterferenceFunction::getParticleDensity();
-    } else {
-      result = (double)((IInterferenceFunction const *)arg1)->getParticleDensity();
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
+  result = (double)((IInterferenceFunction const *)arg1)->getParticleDensity();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -81203,8 +80530,6 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_supportsMultilayer(PyObject *SW
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
   bool result;
   
   if (!args) SWIG_fail;
@@ -81214,17 +80539,7 @@ SWIGINTERN PyObject *_wrap_IInterferenceFunction_supportsMultilayer(PyObject *SW
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_supportsMultilayer" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
   }
   arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  director = SWIG_DIRECTOR_CAST(arg1);
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    if (upcall) {
-      result = (bool)((IInterferenceFunction const *)arg1)->IInterferenceFunction::supportsMultilayer();
-    } else {
-      result = (bool)((IInterferenceFunction const *)arg1)->supportsMultilayer();
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
+  result = (bool)((IInterferenceFunction const *)arg1)->supportsMultilayer();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -81270,62 +80585,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_IInterferenceFunction_iff_without_dw(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  kvector_t arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 ;
-  int res2 = 0 ;
-  PyObject *swig_obj[2] ;
-  Swig::Director *director = 0;
-  bool upcall = false;
-  SwigDirector_IInterferenceFunction *darg = 0;
-  double result;
-  
-  if (!SWIG_Python_UnpackTuple(args, "IInterferenceFunction_iff_without_dw", 2, 2, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "1"" of type '" "IInterferenceFunction const *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  {
-    res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_BasicVector3DT_double_t,  0  | 0);
-    if (!SWIG_IsOK(res2)) {
-      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "2"" of type '" "kvector_t const""'"); 
-    }  
-    if (!argp2) {
-      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IInterferenceFunction_iff_without_dw" "', argument " "2"" of type '" "kvector_t const""'");
-    } else {
-      kvector_t * temp = reinterpret_cast< kvector_t * >(argp2);
-      arg2 = *temp;
-      if (SWIG_IsNewObj(res2)) delete temp;
-    }
-  }
-  director = SWIG_DIRECTOR_CAST(arg1);
-  if (!director || !(director->swig_get_inner("iff_without_dw"))) {
-    SWIG_SetErrorMsg(PyExc_RuntimeError,"accessing protected member iff_without_dw");
-    SWIG_fail;
-  }
-  upcall = (director && (director->swig_get_self()==swig_obj[0]));
-  try {
-    darg = dynamic_cast<SwigDirector_IInterferenceFunction *>(arg1);
-    if (upcall) {
-      Swig::DirectorPureVirtualException::raise("IInterferenceFunction::iff_without_dw");
-    } else {
-      result = (double)((SwigDirector_IInterferenceFunction const *)darg)->iff_without_dw(arg2);
-    }
-  } catch (Swig::DirectorException&) {
-    SWIG_fail;
-  }
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_delete_IInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
@@ -81348,32 +80607,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_disown_IInterferenceFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  IInterferenceFunction *arg1 = (IInterferenceFunction *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject *swig_obj[1] ;
-  
-  if (!args) SWIG_fail;
-  swig_obj[0] = args;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "disown_IInterferenceFunction" "', argument " "1"" of type '" "IInterferenceFunction *""'"); 
-  }
-  arg1 = reinterpret_cast< IInterferenceFunction * >(argp1);
-  {
-    Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);
-    if (director) director->swig_disown();
-  }
-  
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *IInterferenceFunction_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
   if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
@@ -81381,10 +80614,6 @@ SWIGINTERN PyObject *IInterferenceFunction_swigregister(PyObject *SWIGUNUSEDPARM
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *IInterferenceFunction_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  return SWIG_Python_InitShadowInstance(args);
-}
-
 SWIGINTERN PyObject *_wrap_new_InterferenceFunction1DLattice(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   double arg1 ;
@@ -83013,7 +82242,6 @@ SWIGINTERN PyObject *_wrap_InterferenceFunction2DSuperLattice_substructureIFF(Py
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
   IInterferenceFunction *result = 0 ;
   
   if (!args) SWIG_fail;
@@ -83024,13 +82252,7 @@ SWIGINTERN PyObject *_wrap_InterferenceFunction2DSuperLattice_substructureIFF(Py
   }
   arg1 = reinterpret_cast< InterferenceFunction2DSuperLattice * >(argp1);
   result = (IInterferenceFunction *) &((InterferenceFunction2DSuperLattice const *)arg1)->substructureIFF();
-  director = SWIG_DIRECTOR_CAST(result);
-  if (director) {
-    resultobj = director->swig_get_self();
-    Py_INCREF(resultobj);
-  } else {
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -85896,7 +85118,6 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_interferenceFunction(PyObject *SWIGUNU
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject *swig_obj[1] ;
-  Swig::Director *director = 0;
   IInterferenceFunction *result = 0 ;
   
   if (!args) SWIG_fail;
@@ -85907,13 +85128,7 @@ SWIGINTERN PyObject *_wrap_ParticleLayout_interferenceFunction(PyObject *SWIGUNU
   }
   arg1 = reinterpret_cast< ParticleLayout * >(argp1);
   result = (IInterferenceFunction *)((ParticleLayout const *)arg1)->interferenceFunction();
-  director = SWIG_DIRECTOR_CAST(result);
-  if (director) {
-    resultobj = director->swig_get_self();
-    Py_INCREF(resultobj);
-  } else {
-    resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
-  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_IInterferenceFunction, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -113886,30 +113101,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_SimulationResult__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  SimulationResult *arg1 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  SimulationResult *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_SimulationResult,  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_SimulationResult" "', argument " "1"" of type '" "SimulationResult &&""'"); 
-  }
-  if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_SimulationResult" "', argument " "1"" of type '" "SimulationResult &&""'"); 
-  }
-  arg1 = reinterpret_cast< SimulationResult * >(argp1);
-  result = (SimulationResult *)new SimulationResult((SimulationResult &&)*arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_SimulationResult, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_new_SimulationResult(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[3] = {
@@ -113929,15 +113120,6 @@ SWIGINTERN PyObject *_wrap_new_SimulationResult(PyObject *self, PyObject *args)
       return _wrap_new_SimulationResult__SWIG_2(self, argc, argv);
     }
   }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_SimulationResult, SWIG_POINTER_NO_NULL);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_SimulationResult__SWIG_3(self, argc, argv);
-    }
-  }
   if (argc == 2) {
     int _v;
     int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_OutputDataT_double_t, SWIG_POINTER_NO_NULL | 0);
@@ -113956,8 +113138,7 @@ fail:
     "  Possible C/C++ prototypes are:\n"
     "    SimulationResult::SimulationResult()\n"
     "    SimulationResult::SimulationResult(OutputData< double > const &,IUnitConverter const &)\n"
-    "    SimulationResult::SimulationResult(SimulationResult const &)\n"
-    "    SimulationResult::SimulationResult(SimulationResult &&)\n");
+    "    SimulationResult::SimulationResult(SimulationResult const &)\n");
   return 0;
 }
 
@@ -117828,14 +117009,16 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_Material__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_Material(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Material *arg1 = 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  PyObject *swig_obj[1] ;
   Material *result = 0 ;
   
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Material,  0  | 0);
   if (!SWIG_IsOK(res1)) {
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Material" "', argument " "1"" of type '" "Material const &""'"); 
@@ -117852,65 +117035,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_Material__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
-  PyObject *resultobj = 0;
-  Material *arg1 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  Material *result = 0 ;
-  
-  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_Material,  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Material" "', argument " "1"" of type '" "Material &&""'"); 
-  }
-  if (!argp1) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Material" "', argument " "1"" of type '" "Material &&""'"); 
-  }
-  arg1 = reinterpret_cast< Material * >(argp1);
-  result = (Material *)new Material((Material &&)*arg1);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Material, SWIG_POINTER_NEW |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_new_Material(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[2] = {
-    0
-  };
-  
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_Material", 0, 1, argv))) SWIG_fail;
-  --argc;
-  if (argc == 1) {
-    int _v;
-    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL | 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_Material__SWIG_0(self, argc, argv);
-    }
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_new_Material__SWIG_1(self, argc, argv);
-    }
-  }
-  
-fail:
-  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_Material'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    Material::Material(Material const &)\n"
-    "    Material::Material(Material &&)\n");
-  return 0;
-}
-
-
 SWIGINTERN PyObject *_wrap_Material_inverted(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   Material *arg1 = (Material *) 0 ;
@@ -125219,12 +124343,6 @@ static PyMethodDef SwigMethods[] = {
 		""},
 	 { "MisesGaussPeakShape_swigregister", MisesGaussPeakShape_swigregister, METH_O, NULL},
 	 { "MisesGaussPeakShape_swiginit", MisesGaussPeakShape_swiginit, METH_VARARGS, NULL},
-	 { "new_IInterferenceFunction", _wrap_new_IInterferenceFunction, METH_VARARGS, "\n"
-		"IInterferenceFunction(NodeMeta meta, vdouble1d_t PValues)\n"
-		"new_IInterferenceFunction(PyObject * _self, double position_var) -> IInterferenceFunction\n"
-		"IInterferenceFunction::IInterferenceFunction(double position_var)\n"
-		"\n"
-		""},
 	 { "IInterferenceFunction_clone", _wrap_IInterferenceFunction_clone, METH_O, "\n"
 		"IInterferenceFunction_clone(IInterferenceFunction self) -> IInterferenceFunction\n"
 		"virtual IInterferenceFunction* IInterferenceFunction::clone() const =0\n"
@@ -125274,11 +124392,8 @@ static PyMethodDef SwigMethods[] = {
 		"Evaluates the Debye-Waller factor for a given wavevector transfer. \n"
 		"\n"
 		""},
-	 { "IInterferenceFunction_iff_without_dw", _wrap_IInterferenceFunction_iff_without_dw, METH_VARARGS, "IInterferenceFunction_iff_without_dw(IInterferenceFunction self, kvector_t q) -> double"},
 	 { "delete_IInterferenceFunction", _wrap_delete_IInterferenceFunction, METH_O, "delete_IInterferenceFunction(IInterferenceFunction self)"},
-	 { "disown_IInterferenceFunction", _wrap_disown_IInterferenceFunction, METH_O, NULL},
 	 { "IInterferenceFunction_swigregister", IInterferenceFunction_swigregister, METH_O, NULL},
-	 { "IInterferenceFunction_swiginit", IInterferenceFunction_swiginit, METH_VARARGS, NULL},
 	 { "new_InterferenceFunction1DLattice", _wrap_new_InterferenceFunction1DLattice, METH_VARARGS, "\n"
 		"new_InterferenceFunction1DLattice(double length, double xi) -> InterferenceFunction1DLattice\n"
 		"InterferenceFunction1DLattice::InterferenceFunction1DLattice(double length, double xi)\n"
@@ -130393,7 +129508,6 @@ static PyMethodDef SwigMethods[] = {
 	 { "new_SimulationResult", _wrap_new_SimulationResult, METH_VARARGS, "\n"
 		"SimulationResult()\n"
 		"SimulationResult(IntensityData data, IUnitConverter unit_converter)\n"
-		"SimulationResult(SimulationResult other)\n"
 		"new_SimulationResult(SimulationResult other) -> SimulationResult\n"
 		"SimulationResult::SimulationResult(SimulationResult &&other)\n"
 		"\n"
@@ -130912,12 +130026,9 @@ static PyMethodDef SwigMethods[] = {
 		"Lattice LatticeUtils::createBCTLattice(double a, double c, const ILatticeOrientation &orientation)\n"
 		"\n"
 		""},
-	 { "new_Material", _wrap_new_Material, METH_VARARGS, "\n"
-		"Material(Material material)\n"
+	 { "new_Material", _wrap_new_Material, METH_O, "\n"
 		"new_Material(Material material) -> Material\n"
-		"Material::Material(std::unique_ptr< BaseMaterialImpl > material_impl)\n"
-		"\n"
-		"Creates material with particular material implementation. \n"
+		"Material::Material(Material &&material)=default\n"
 		"\n"
 		""},
 	 { "Material_inverted", _wrap_Material_inverted, METH_O, "\n"
diff --git a/auto/Wrap/libBornAgainCore_wrap.h b/auto/Wrap/libBornAgainCore_wrap.h
index f67c0f84b1874ef8eb2d3bd0d3e4aa7d0bbfe22a..aecc74d8ec881ccb1cbfc5e5b3c7a57b29109ba5 100644
--- a/auto/Wrap/libBornAgainCore_wrap.h
+++ b/auto/Wrap/libBornAgainCore_wrap.h
@@ -416,61 +416,6 @@ private:
 };
 
 
-class SwigDirector_IInterferenceFunction : public IInterferenceFunction, public Swig::Director {
-
-public:
-    SwigDirector_IInterferenceFunction(PyObject *self, NodeMeta const &meta, std::vector< double, std::allocator< double > > const &PValues);
-    SwigDirector_IInterferenceFunction(PyObject *self, double position_var);
-    virtual ~SwigDirector_IInterferenceFunction();
-    virtual IInterferenceFunction *clone() const;
-    virtual void transferToCPP();
-    virtual ParameterPool *createParameterTree() const;
-    virtual void onChange();
-    virtual void accept(INodeVisitor *visitor) const;
-    virtual std::string treeToString() const;
-    virtual std::vector< INode const *, std::allocator< INode const * > > getChildren() const;
-    virtual void setParent(INode const *newParent);
-    virtual Material const *material() const;
-    virtual double evaluate(kvector_t const q, double outer_iff = 1.0) const;
-    virtual double getParticleDensity() const;
-    virtual bool supportsMultilayer() const;
-    virtual double iff_without_dw(kvector_t const q) const;
-
-/* Internal director utilities */
-public:
-    bool swig_get_inner(const char *swig_protected_method_name) const {
-      std::map<std::string, bool>::const_iterator iv = swig_inner.find(swig_protected_method_name);
-      return (iv != swig_inner.end() ? iv->second : false);
-    }
-    void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {
-      swig_inner[swig_protected_method_name] = swig_val;
-    }
-private:
-    mutable std::map<std::string, bool> swig_inner;
-
-#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)
-/* VTable implementation */
-    PyObject *swig_get_method(size_t method_index, const char *method_name) const {
-      PyObject *method = vtable[method_index];
-      if (!method) {
-        swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);
-        method = PyObject_GetAttr(swig_get_self(), name);
-        if (!method) {
-          std::string msg = "Method in class IInterferenceFunction doesn't exist, undefined ";
-          msg += method_name;
-          Swig::DirectorMethodException::raise(msg.c_str());
-        }
-        vtable[method_index] = method;
-      }
-      return method;
-    }
-private:
-    mutable swig::SwigVar_PyObject vtable[14];
-#endif
-
-};
-
-
 class SwigDirector_ISampleBuilder : public ISampleBuilder, public Swig::Director {
 
 public: