diff --git a/Sample/Aggregate/InterferenceFunction2DLattice.cpp b/Sample/Aggregate/InterferenceFunction2DLattice.cpp
index b103698ae81f09a1c11e01b5dbe928caf49fff6d..2b4b8bed912dffbfcb09bc83255f40aa71ba4a09 100644
--- a/Sample/Aggregate/InterferenceFunction2DLattice.cpp
+++ b/Sample/Aggregate/InterferenceFunction2DLattice.cpp
@@ -56,24 +56,6 @@ InterferenceFunction2DLattice* InterferenceFunction2DLattice::clone() const
     return ret;
 }
 
-//! Creates square lattice.
-//! @param lattice_length: length of the first and second basis vectors in nanometers
-//! @param xi: rotation of the lattice with respect to the x-axis in radians
-InterferenceFunction2DLattice* InterferenceFunction2DLattice::createSquare(double lattice_length,
-                                                                           double xi)
-{
-    return new InterferenceFunction2DLattice(SquareLattice(lattice_length, xi));
-}
-
-//! Creates hexagonal lattice.
-//! @param lattice_length: length of the first and second basis vectors in nanometers
-//! @param xi: rotation of the lattice with respect to the x-axis in radians
-InterferenceFunction2DLattice* InterferenceFunction2DLattice::createHexagonal(double lattice_length,
-                                                                              double xi)
-{
-    return new InterferenceFunction2DLattice(HexagonalLattice(lattice_length, xi));
-}
-
 //! Sets two-dimensional decay function.
 //! @param decay: two-dimensional decay function in reciprocal space
 void InterferenceFunction2DLattice::setDecayFunction(const IFTDecayFunction2D& decay)
diff --git a/Sample/Aggregate/InterferenceFunction2DLattice.h b/Sample/Aggregate/InterferenceFunction2DLattice.h
index 173d061d261d00995f7bbdbcd7eaa0beaf357c08..400c67e242ee259334325ec71b54ad9ca9d58f9d 100644
--- a/Sample/Aggregate/InterferenceFunction2DLattice.h
+++ b/Sample/Aggregate/InterferenceFunction2DLattice.h
@@ -34,9 +34,6 @@ public:
 
     void accept(INodeVisitor* visitor) const override final { visitor->visit(this); }
 
-    static InterferenceFunction2DLattice* createSquare(double lattice_length, double xi);
-    static InterferenceFunction2DLattice* createHexagonal(double lattice_length, double xi);
-
     void setDecayFunction(const IFTDecayFunction2D& decay);
 
     void setIntegrationOverXi(bool integrate_xi);
diff --git a/Sample/StandardSamples/ParticleCompositionBuilder.cpp b/Sample/StandardSamples/ParticleCompositionBuilder.cpp
index b7d7639d832c84c7a9164c1502e6a326c781eeea..770fd27422b33c0a1c26a7bb45fa413941acac3b 100644
--- a/Sample/StandardSamples/ParticleCompositionBuilder.cpp
+++ b/Sample/StandardSamples/ParticleCompositionBuilder.cpp
@@ -43,12 +43,11 @@ MultiLayer* ParticleCompositionBuilder::buildSample() const
     basis.addParticles(sphere, positions);
     particle_layout.addParticle(basis);
 
-    std::unique_ptr<InterferenceFunction2DLattice> P_interference{
-        InterferenceFunction2DLattice::createHexagonal(radius * 2.0, 0)};
+    InterferenceFunction2DLattice iff(HexagonalLattice(radius * 2.0, 0));
     FTDecayFunction2DCauchy pdf(10 * Units::nm, 10 * Units::nm, 0);
-    P_interference->setDecayFunction(pdf);
+    iff.setDecayFunction(pdf);
 
-    particle_layout.setInterferenceFunction(*P_interference);
+    particle_layout.setInterferenceFunction(iff);
 
     vacuum_layer.addLayout(particle_layout);
 
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index 789a6fb62ffeff6184413c0561f442317044146d..0a2733d82a4c92afb55de0f3c6c8e111632c373f 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -6934,16 +6934,6 @@ class InterferenceFunction2DLattice(IInterferenceFunction):
         """
         return _libBornAgainSample.InterferenceFunction2DLattice_accept(self, visitor)
 
-    @staticmethod
-    def createSquare(lattice_length, xi):
-        r"""createSquare(double lattice_length, double xi) -> InterferenceFunction2DLattice"""
-        return _libBornAgainSample.InterferenceFunction2DLattice_createSquare(lattice_length, xi)
-
-    @staticmethod
-    def createHexagonal(lattice_length, xi):
-        r"""createHexagonal(double lattice_length, double xi) -> InterferenceFunction2DLattice"""
-        return _libBornAgainSample.InterferenceFunction2DLattice_createHexagonal(lattice_length, xi)
-
     def setDecayFunction(self, decay):
         r"""
         setDecayFunction(InterferenceFunction2DLattice self, IFTDecayFunction2D decay)
@@ -7013,14 +7003,6 @@ class InterferenceFunction2DLattice(IInterferenceFunction):
 # Register InterferenceFunction2DLattice in _libBornAgainSample:
 _libBornAgainSample.InterferenceFunction2DLattice_swigregister(InterferenceFunction2DLattice)
 
-def InterferenceFunction2DLattice_createSquare(lattice_length, xi):
-    r"""InterferenceFunction2DLattice_createSquare(double lattice_length, double xi) -> InterferenceFunction2DLattice"""
-    return _libBornAgainSample.InterferenceFunction2DLattice_createSquare(lattice_length, xi)
-
-def InterferenceFunction2DLattice_createHexagonal(lattice_length, xi):
-    r"""InterferenceFunction2DLattice_createHexagonal(double lattice_length, double xi) -> InterferenceFunction2DLattice"""
-    return _libBornAgainSample.InterferenceFunction2DLattice_createHexagonal(lattice_length, xi)
-
 class InterferenceFunction2DParaCrystal(IInterferenceFunction):
     r"""
 
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index b054f0a41b336b8d66b241aa29657b4c39d8fc23..3a22e681632e477b4abe888091a2b78c2228d605 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -52311,66 +52311,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_createSquare(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  InterferenceFunction2DLattice *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "InterferenceFunction2DLattice_createSquare", 2, 2, swig_obj)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DLattice_createSquare" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DLattice_createSquare" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (InterferenceFunction2DLattice *)InterferenceFunction2DLattice::createSquare(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_createHexagonal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  double arg1 ;
-  double arg2 ;
-  double val1 ;
-  int ecode1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject *swig_obj[2] ;
-  InterferenceFunction2DLattice *result = 0 ;
-  
-  if (!SWIG_Python_UnpackTuple(args, "InterferenceFunction2DLattice_createHexagonal", 2, 2, swig_obj)) SWIG_fail;
-  ecode1 = SWIG_AsVal_double(swig_obj[0], &val1);
-  if (!SWIG_IsOK(ecode1)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "InterferenceFunction2DLattice_createHexagonal" "', argument " "1"" of type '" "double""'");
-  } 
-  arg1 = static_cast< double >(val1);
-  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "InterferenceFunction2DLattice_createHexagonal" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (InterferenceFunction2DLattice *)InterferenceFunction2DLattice::createHexagonal(arg1,arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_InterferenceFunction2DLattice, SWIG_POINTER_OWN |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_InterferenceFunction2DLattice_setDecayFunction(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   InterferenceFunction2DLattice *arg1 = (InterferenceFunction2DLattice *) 0 ;
@@ -73002,8 +72942,6 @@ static PyMethodDef SwigMethods[] = {
 		"void InterferenceFunction2DLattice::accept(INodeVisitor *visitor) const override final\n"
 		"\n"
 		""},
-	 { "InterferenceFunction2DLattice_createSquare", _wrap_InterferenceFunction2DLattice_createSquare, METH_VARARGS, "InterferenceFunction2DLattice_createSquare(double lattice_length, double xi) -> InterferenceFunction2DLattice"},
-	 { "InterferenceFunction2DLattice_createHexagonal", _wrap_InterferenceFunction2DLattice_createHexagonal, METH_VARARGS, "InterferenceFunction2DLattice_createHexagonal(double lattice_length, double xi) -> InterferenceFunction2DLattice"},
 	 { "InterferenceFunction2DLattice_setDecayFunction", _wrap_InterferenceFunction2DLattice_setDecayFunction, METH_VARARGS, "\n"
 		"InterferenceFunction2DLattice_setDecayFunction(InterferenceFunction2DLattice self, IFTDecayFunction2D decay)\n"
 		"void InterferenceFunction2DLattice::setDecayFunction(const IFTDecayFunction2D &decay)\n"