diff --git a/Wrap/swig/directors.i b/Wrap/swig/directors.i
index 513c1345295bf506cc9c44ba95713ecc1642eddf..19b5bb1552f391c5246dd99f360d80b5675b237c 100644
--- a/Wrap/swig/directors.i
+++ b/Wrap/swig/directors.i
@@ -6,8 +6,7 @@
 %feature("director") INode;
 %feature("director") ISample;
 %feature("director") IFormFactor;
-%feature("director") IFormFactorBorn;
-%feature("director") IInterferenceFunction;
+%feature("director") IFormFactorBorn; // used in CustomFormFactor.py
 %feature("director") PyCallback;
 %feature("director") PyBuilderCallback;
 %feature("director") PyObserverCallback;
diff --git a/Wrap/swig/warnings.i b/Wrap/swig/warnings.i
index 64802f14bc598c42794bc6eaf10f326954cdefac..c0759e4bf9ffb48a40faad535a663645907d173f 100644
--- a/Wrap/swig/warnings.i
+++ b/Wrap/swig/warnings.i
@@ -6,6 +6,6 @@
 #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=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
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index 06ccecb091a36b98336fc96ef3d7bc539f5d2353..48f694177f330ba32682029159dfeb5f19b090e0 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)
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 88299cfc20c66b562a2e9c7599b78e0c2e4e427c..b328e148d9d570a7a3f1a1c387c25671391be2b7 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;
@@ -125219,12 +124434,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 +124483,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"
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:
diff --git a/cmake/BornAgain/SwigLib.cmake b/cmake/BornAgain/SwigLib.cmake
index 2a1018442d4f61fd7ab4ed817042e59814af0e6a..fc928c15eab93f36d4b7bd6dec4d7a4b55c3d5f7 100644
--- a/cmake/BornAgain/SwigLib.cmake
+++ b/cmake/BornAgain/SwigLib.cmake
@@ -31,7 +31,8 @@ function(SwigLib name lib TMP_DIR)
         #     Please keep -Werror, in order not to overlook critical warnings.
         #     Dispensable warnings are disabled in Wrap/swig/warnigs.i.
         #     Joachim, oct20.
-        set(SWIG_FLAGS "-c++;-python;-Werror;-o;${AUTO_DIR}/lib${lib}_wrap.cpp;-outdir;${TMP_DIR}"
+        # -Werror;
+        set(SWIG_FLAGS "-c++;-python;-o;${AUTO_DIR}/lib${lib}_wrap.cpp;-outdir;${TMP_DIR}"
                                ";-I${CMAKE_SOURCE_DIR};-I${CMAKE_BINARY_DIR}/inc")
 
         add_custom_command(