diff --git a/Sample/Correlations/IPeakShape.cpp b/Sample/Correlations/IPeakShape.cpp
index 87726d7d942a5006f44590e5ca55a4f24a52a3d5..44a194c29555e1bf2583adb7cd4a4ce0793578ce 100644
--- a/Sample/Correlations/IPeakShape.cpp
+++ b/Sample/Correlations/IPeakShape.cpp
@@ -71,7 +71,7 @@ double Cauchy3D(double q2, double domainsize)
 //  ************************************************************************************************
 
 IPeakShape::IPeakShape(const NodeMeta& meta, const std::vector<double>& PValues)
-    : ISampleNode(meta, PValues)
+    : INode(meta, PValues)
 {
 }
 
diff --git a/Sample/Correlations/IPeakShape.h b/Sample/Correlations/IPeakShape.h
index 47e6ffbc316307f3d2c92be16ef134ea105ba1d6..63562e80f81a4a42e436ec6498b6894f087329af 100644
--- a/Sample/Correlations/IPeakShape.h
+++ b/Sample/Correlations/IPeakShape.h
@@ -16,12 +16,13 @@
 #ifndef BORNAGAIN_SAMPLE_CORRELATIONS_IPEAKSHAPE_H
 #define BORNAGAIN_SAMPLE_CORRELATIONS_IPEAKSHAPE_H
 
-#include "Sample/Scattering/ISampleNode.h"
+#include "Base/Types/ICloneable.h"
+#include "Param/Node/INode.h"
 #include <heinz/Vectors3D.h>
 
 //! Abstract base class class that defines the peak shape of a Bragg peak.
 
-class IPeakShape : public ISampleNode {
+class IPeakShape : public ICloneable, public INode {
 public:
     IPeakShape() = default;
     IPeakShape(const NodeMeta& meta, const std::vector<double>& PValues);
diff --git a/auto/Wrap/doxygenSample.i b/auto/Wrap/doxygenSample.i
index 425c84882dff9d4f7ab4a046ca2248dc461e2e63..1ea9a0c044e9d3d6726afcc67aefba6f8e46e217 100644
--- a/auto/Wrap/doxygenSample.i
+++ b/auto/Wrap/doxygenSample.i
@@ -2221,8 +2221,6 @@ C++ includes: IPeakShape.h
 ";
 
 %feature("docstring")  GaussFisherPeakShape::clone "GaussFisherPeakShape * GaussFisherPeakShape::clone() const override
-
-Returns a clone of this  ISampleNode object. 
 ";
 
 %feature("docstring")  GaussFisherPeakShape::evaluate "double GaussFisherPeakShape::evaluate(R3 q, R3 q_lattice_point) const override
@@ -3475,8 +3473,6 @@ C++ includes: IPeakShape.h
 ";
 
 %feature("docstring")  IPeakShape::clone "IPeakShape* IPeakShape::clone() const override=0
-
-Returns a clone of this  ISampleNode object. 
 ";
 
 %feature("docstring")  IPeakShape::evaluate "virtual double IPeakShape::evaluate(R3 q, R3 q_lattice_point) const =0
@@ -3695,8 +3691,6 @@ C++ includes: IPeakShape.h
 ";
 
 %feature("docstring")  IsotropicGaussPeakShape::clone "IsotropicGaussPeakShape * IsotropicGaussPeakShape::clone() const override
-
-Returns a clone of this  ISampleNode object. 
 ";
 
 %feature("docstring")  IsotropicGaussPeakShape::evaluate "double IsotropicGaussPeakShape::evaluate(R3 q, R3 q_lattice_point) const override
@@ -3723,8 +3717,6 @@ C++ includes: IPeakShape.h
 ";
 
 %feature("docstring")  IsotropicLorentzPeakShape::clone "IsotropicLorentzPeakShape * IsotropicLorentzPeakShape::clone() const override
-
-Returns a clone of this  ISampleNode object. 
 ";
 
 %feature("docstring")  IsotropicLorentzPeakShape::evaluate "double IsotropicLorentzPeakShape::evaluate(R3 q, R3 q_lattice_point) const override
@@ -4052,8 +4044,6 @@ C++ includes: IPeakShape.h
 ";
 
 %feature("docstring")  LorentzFisherPeakShape::clone "LorentzFisherPeakShape * LorentzFisherPeakShape::clone() const override
-
-Returns a clone of this  ISampleNode object. 
 ";
 
 %feature("docstring")  LorentzFisherPeakShape::evaluate "double LorentzFisherPeakShape::evaluate(R3 q, R3 q_lattice_point) const override
@@ -4303,8 +4293,6 @@ C++ includes: IPeakShape.h
 ";
 
 %feature("docstring")  MisesFisherGaussPeakShape::clone "MisesFisherGaussPeakShape * MisesFisherGaussPeakShape::clone() const override
-
-Returns a clone of this  ISampleNode object. 
 ";
 
 %feature("docstring")  MisesFisherGaussPeakShape::evaluate "double MisesFisherGaussPeakShape::evaluate(R3 q, R3 q_lattice_point) const override
@@ -4336,8 +4324,6 @@ C++ includes: IPeakShape.h
 ";
 
 %feature("docstring")  MisesGaussPeakShape::clone "MisesGaussPeakShape * MisesGaussPeakShape::clone() const override
-
-Returns a clone of this  ISampleNode object. 
 ";
 
 %feature("docstring")  MisesGaussPeakShape::evaluate "double MisesGaussPeakShape::evaluate(R3 q, R3 q_lattice_point) const override
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index feeba95320aee681ec8bc29f57a1a58bbf49aacb..e9180f66badd3c1c8051bf6ada3776aa662809c2 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -6090,7 +6090,7 @@ class FTDistribution2DVoigt(IFTDistribution2D):
 # Register FTDistribution2DVoigt in _libBornAgainSample:
 _libBornAgainSample.FTDistribution2DVoigt_swigregister(FTDistribution2DVoigt)
 
-class IPeakShape(ISampleNode):
+class IPeakShape(libBornAgainBase.ICloneable, libBornAgainParam.INode):
     r"""
 
 
@@ -6112,8 +6112,6 @@ class IPeakShape(ISampleNode):
         clone(IPeakShape self) -> IPeakShape
         IPeakShape* IPeakShape::clone() const override=0
 
-        Returns a clone of this  ISampleNode object. 
-
         """
         return _libBornAgainSample.IPeakShape_clone(self)
 
@@ -6175,8 +6173,6 @@ class IsotropicGaussPeakShape(IPeakShape):
         clone(IsotropicGaussPeakShape self) -> IsotropicGaussPeakShape
         IsotropicGaussPeakShape * IsotropicGaussPeakShape::clone() const override
 
-        Returns a clone of this  ISampleNode object. 
-
         """
         return _libBornAgainSample.IsotropicGaussPeakShape_clone(self)
 
@@ -6228,8 +6224,6 @@ class IsotropicLorentzPeakShape(IPeakShape):
         clone(IsotropicLorentzPeakShape self) -> IsotropicLorentzPeakShape
         IsotropicLorentzPeakShape * IsotropicLorentzPeakShape::clone() const override
 
-        Returns a clone of this  ISampleNode object. 
-
         """
         return _libBornAgainSample.IsotropicLorentzPeakShape_clone(self)
 
@@ -6281,8 +6275,6 @@ class GaussFisherPeakShape(IPeakShape):
         clone(GaussFisherPeakShape self) -> GaussFisherPeakShape
         GaussFisherPeakShape * GaussFisherPeakShape::clone() const override
 
-        Returns a clone of this  ISampleNode object. 
-
         """
         return _libBornAgainSample.GaussFisherPeakShape_clone(self)
 
@@ -6344,8 +6336,6 @@ class LorentzFisherPeakShape(IPeakShape):
         clone(LorentzFisherPeakShape self) -> LorentzFisherPeakShape
         LorentzFisherPeakShape * LorentzFisherPeakShape::clone() const override
 
-        Returns a clone of this  ISampleNode object. 
-
         """
         return _libBornAgainSample.LorentzFisherPeakShape_clone(self)
 
@@ -6407,8 +6397,6 @@ class MisesFisherGaussPeakShape(IPeakShape):
         clone(MisesFisherGaussPeakShape self) -> MisesFisherGaussPeakShape
         MisesFisherGaussPeakShape * MisesFisherGaussPeakShape::clone() const override
 
-        Returns a clone of this  ISampleNode object. 
-
         """
         return _libBornAgainSample.MisesFisherGaussPeakShape_clone(self)
 
@@ -6470,8 +6458,6 @@ class MisesGaussPeakShape(IPeakShape):
         clone(MisesGaussPeakShape self) -> MisesGaussPeakShape
         MisesGaussPeakShape * MisesGaussPeakShape::clone() const override
 
-        Returns a clone of this  ISampleNode object. 
-
         """
         return _libBornAgainSample.MisesGaussPeakShape_clone(self)
 
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index a9c89cedfab6a222edb8bbc01c545bad3c2af569..1a7b1c6a450835d20982d1898c6c9ec393a45918 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -70085,8 +70085,6 @@ static PyMethodDef SwigMethods[] = {
 		"IPeakShape_clone(IPeakShape self) -> IPeakShape\n"
 		"IPeakShape* IPeakShape::clone() const override=0\n"
 		"\n"
-		"Returns a clone of this  ISampleNode object. \n"
-		"\n"
 		""},
 	 { "IPeakShape_evaluate", _wrap_IPeakShape_evaluate, METH_VARARGS, "\n"
 		"IPeakShape_evaluate(IPeakShape self, R3 q, R3 q_lattice_point) -> double\n"
@@ -70122,8 +70120,6 @@ static PyMethodDef SwigMethods[] = {
 		"IsotropicGaussPeakShape_clone(IsotropicGaussPeakShape self) -> IsotropicGaussPeakShape\n"
 		"IsotropicGaussPeakShape * IsotropicGaussPeakShape::clone() const override\n"
 		"\n"
-		"Returns a clone of this  ISampleNode object. \n"
-		"\n"
 		""},
 	 { "IsotropicGaussPeakShape_evaluate", _wrap_IsotropicGaussPeakShape_evaluate, METH_VARARGS, "\n"
 		"IsotropicGaussPeakShape_evaluate(IsotropicGaussPeakShape self, R3 q, R3 q_lattice_point) -> double\n"
@@ -70153,8 +70149,6 @@ static PyMethodDef SwigMethods[] = {
 		"IsotropicLorentzPeakShape_clone(IsotropicLorentzPeakShape self) -> IsotropicLorentzPeakShape\n"
 		"IsotropicLorentzPeakShape * IsotropicLorentzPeakShape::clone() const override\n"
 		"\n"
-		"Returns a clone of this  ISampleNode object. \n"
-		"\n"
 		""},
 	 { "IsotropicLorentzPeakShape_evaluate", _wrap_IsotropicLorentzPeakShape_evaluate, METH_VARARGS, "\n"
 		"IsotropicLorentzPeakShape_evaluate(IsotropicLorentzPeakShape self, R3 q, R3 q_lattice_point) -> double\n"
@@ -70184,8 +70178,6 @@ static PyMethodDef SwigMethods[] = {
 		"GaussFisherPeakShape_clone(GaussFisherPeakShape self) -> GaussFisherPeakShape\n"
 		"GaussFisherPeakShape * GaussFisherPeakShape::clone() const override\n"
 		"\n"
-		"Returns a clone of this  ISampleNode object. \n"
-		"\n"
 		""},
 	 { "GaussFisherPeakShape_evaluate", _wrap_GaussFisherPeakShape_evaluate, METH_VARARGS, "\n"
 		"GaussFisherPeakShape_evaluate(GaussFisherPeakShape self, R3 q, R3 q_lattice_point) -> double\n"
@@ -70222,8 +70214,6 @@ static PyMethodDef SwigMethods[] = {
 		"LorentzFisherPeakShape_clone(LorentzFisherPeakShape self) -> LorentzFisherPeakShape\n"
 		"LorentzFisherPeakShape * LorentzFisherPeakShape::clone() const override\n"
 		"\n"
-		"Returns a clone of this  ISampleNode object. \n"
-		"\n"
 		""},
 	 { "LorentzFisherPeakShape_evaluate", _wrap_LorentzFisherPeakShape_evaluate, METH_VARARGS, "\n"
 		"LorentzFisherPeakShape_evaluate(LorentzFisherPeakShape self, R3 q, R3 q_lattice_point) -> double\n"
@@ -70260,8 +70250,6 @@ static PyMethodDef SwigMethods[] = {
 		"MisesFisherGaussPeakShape_clone(MisesFisherGaussPeakShape self) -> MisesFisherGaussPeakShape\n"
 		"MisesFisherGaussPeakShape * MisesFisherGaussPeakShape::clone() const override\n"
 		"\n"
-		"Returns a clone of this  ISampleNode object. \n"
-		"\n"
 		""},
 	 { "MisesFisherGaussPeakShape_evaluate", _wrap_MisesFisherGaussPeakShape_evaluate, METH_VARARGS, "\n"
 		"MisesFisherGaussPeakShape_evaluate(MisesFisherGaussPeakShape self, R3 q, R3 q_lattice_point) -> double\n"
@@ -70298,8 +70286,6 @@ static PyMethodDef SwigMethods[] = {
 		"MisesGaussPeakShape_clone(MisesGaussPeakShape self) -> MisesGaussPeakShape\n"
 		"MisesGaussPeakShape * MisesGaussPeakShape::clone() const override\n"
 		"\n"
-		"Returns a clone of this  ISampleNode object. \n"
-		"\n"
 		""},
 	 { "MisesGaussPeakShape_evaluate", _wrap_MisesGaussPeakShape_evaluate, METH_VARARGS, "\n"
 		"MisesGaussPeakShape_evaluate(MisesGaussPeakShape self, R3 q, R3 q_lattice_point) -> double\n"
@@ -73223,56 +73209,35 @@ static void *_p_MisesFisherGaussPeakShapeTo_p_IPeakShape(void *x, int *SWIGUNUSE
 static void *_p_MisesGaussPeakShapeTo_p_IPeakShape(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((IPeakShape *)  ((MisesGaussPeakShape *) x));
 }
-static void *_p_MultiLayerTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *)  ((MultiLayer *) x));
-}
-static void *_p_MisesGaussPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IPeakShape *) ((MisesGaussPeakShape *) x));
-}
-static void *_p_MisesFisherGaussPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IPeakShape *) ((MisesFisherGaussPeakShape *) x));
-}
-static void *_p_LorentzFisherPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IPeakShape *) ((LorentzFisherPeakShape *) x));
-}
-static void *_p_GaussFisherPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IPeakShape *) ((GaussFisherPeakShape *) x));
-}
-static void *_p_IsotropicLorentzPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IPeakShape *) ((IsotropicLorentzPeakShape *) x));
+static void *_p_ParticleCompositionTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISampleNode *) (IParticle *) ((ParticleComposition *) x));
 }
-static void *_p_IsotropicGaussPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IPeakShape *) ((IsotropicGaussPeakShape *) x));
+static void *_p_LayerRoughnessTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISampleNode *)  ((LayerRoughness *) x));
 }
-static void *_p_IPeakShapeTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *)  ((IPeakShape *) x));
+static void *_p_ParticleLayoutTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISampleNode *)  ((ParticleLayout *) x));
 }
-static void *_p_MesoCrystalTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IParticle *) ((MesoCrystal *) x));
+static void *_p_MultiLayerTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISampleNode *)  ((MultiLayer *) x));
 }
 static void *_p_CrystalTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *)  ((Crystal *) x));
 }
-static void *_p_LayerTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *)  ((Layer *) x));
-}
-static void *_p_ParticleTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IParticle *) ((Particle *) x));
+static void *_p_MesoCrystalTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISampleNode *) (IParticle *) ((MesoCrystal *) x));
 }
 static void *_p_IParticleTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *)  ((IParticle *) x));
 }
-static void *_p_ParticleCompositionTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *) (IParticle *) ((ParticleComposition *) x));
-}
-static void *_p_ParticleLayoutTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *)  ((ParticleLayout *) x));
+static void *_p_ParticleTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISampleNode *) (IParticle *) ((Particle *) x));
 }
 static void *_p_ParticleCoreShellTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ISampleNode *) (IParticle *) ((ParticleCoreShell *) x));
 }
-static void *_p_LayerRoughnessTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ISampleNode *)  ((LayerRoughness *) x));
+static void *_p_LayerTo_p_ISampleNode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((ISampleNode *)  ((Layer *) x));
 }
 static void *_p_BasicLattice2DTo_p_Lattice2D(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((Lattice2D *)  ((BasicLattice2D *) x));
@@ -73374,25 +73339,25 @@ static void *_p_IBornFFTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory))
     return (void *)((ICloneable *) (IFormFactor *) ((IBornFF *) x));
 }
 static void *_p_MisesGaussPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IPeakShape *) ((MisesGaussPeakShape *) x));
+    return (void *)((ICloneable *) (IPeakShape *) ((MisesGaussPeakShape *) x));
 }
 static void *_p_MisesFisherGaussPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IPeakShape *) ((MisesFisherGaussPeakShape *) x));
+    return (void *)((ICloneable *) (IPeakShape *) ((MisesFisherGaussPeakShape *) x));
 }
 static void *_p_LorentzFisherPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IPeakShape *) ((LorentzFisherPeakShape *) x));
+    return (void *)((ICloneable *) (IPeakShape *) ((LorentzFisherPeakShape *) x));
 }
 static void *_p_GaussFisherPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IPeakShape *) ((GaussFisherPeakShape *) x));
+    return (void *)((ICloneable *) (IPeakShape *) ((GaussFisherPeakShape *) x));
 }
 static void *_p_IsotropicLorentzPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IPeakShape *) ((IsotropicLorentzPeakShape *) x));
+    return (void *)((ICloneable *) (IPeakShape *) ((IsotropicLorentzPeakShape *) x));
 }
 static void *_p_IsotropicGaussPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *)(IPeakShape *) ((IsotropicGaussPeakShape *) x));
+    return (void *)((ICloneable *) (IPeakShape *) ((IsotropicGaussPeakShape *) x));
 }
 static void *_p_IPeakShapeTo_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((ICloneable *) (ISampleNode *) ((IPeakShape *) x));
+    return (void *)((ICloneable *)  ((IPeakShape *) x));
 }
 static void *_p_FormFactorPrism3To_p_ICloneable(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((ICloneable *) (IFormFactor *)(IBornFF *)(IFormFactorPrism *) ((FormFactorPrism3 *) x));
@@ -73728,25 +73693,25 @@ static void *_p_IBornFFTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IFormFactor *) ((IBornFF *) x));
 }
 static void *_p_MisesGaussPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IPeakShape *) ((MisesGaussPeakShape *) x));
+    return (void *)((INode *) (IPeakShape *) ((MisesGaussPeakShape *) x));
 }
 static void *_p_MisesFisherGaussPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IPeakShape *) ((MisesFisherGaussPeakShape *) x));
+    return (void *)((INode *) (IPeakShape *) ((MisesFisherGaussPeakShape *) x));
 }
 static void *_p_LorentzFisherPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IPeakShape *) ((LorentzFisherPeakShape *) x));
+    return (void *)((INode *) (IPeakShape *) ((LorentzFisherPeakShape *) x));
 }
 static void *_p_GaussFisherPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IPeakShape *) ((GaussFisherPeakShape *) x));
+    return (void *)((INode *) (IPeakShape *) ((GaussFisherPeakShape *) x));
 }
 static void *_p_IsotropicLorentzPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IPeakShape *) ((IsotropicLorentzPeakShape *) x));
+    return (void *)((INode *) (IPeakShape *) ((IsotropicLorentzPeakShape *) x));
 }
 static void *_p_IsotropicGaussPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *)(IPeakShape *) ((IsotropicGaussPeakShape *) x));
+    return (void *)((INode *) (IPeakShape *) ((IsotropicGaussPeakShape *) x));
 }
 static void *_p_IPeakShapeTo_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
-    return (void *)((INode *) (ISampleNode *) ((IPeakShape *) x));
+    return (void *)((INode *)  ((IPeakShape *) x));
 }
 static void *_p_FormFactorPrism3To_p_INode(void *x, int *SWIGUNUSEDPARM(newmemory)) {
     return (void *)((INode *) (IFormFactor *)(IBornFF *)(IFormFactorPrism *) ((FormFactorPrism3 *) x));
@@ -74629,7 +74594,7 @@ static swig_cast_info _swigc__p_IPeakShape[] = {  {&_swigt__p_IPeakShape, 0, 0,
 static swig_cast_info _swigc__p_IProfileRectangularRipple[] = {  {&_swigt__p_IProfileRectangularRipple, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IProfileRipple[] = {  {&_swigt__p_FormFactorCosineRippleLorentz, _p_FormFactorCosineRippleLorentzTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_IProfileRipple, 0, 0},  {&_swigt__p_IProfileRectangularRipple, _p_IProfileRectangularRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_ISawtoothRipple, _p_ISawtoothRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleBox, _p_FormFactorCosineRippleBoxTo_p_IProfileRipple, 0, 0},  {&_swigt__p_IProfileRipple, 0, 0, 0},  {&_swigt__p_ICosineRipple, _p_ICosineRippleTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_IProfileRipple, 0, 0},  {&_swigt__p_FormFactorCosineRippleGauss, _p_FormFactorCosineRippleGaussTo_p_IProfileRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IRotation[] = {  {&_swigt__p_RotationY, _p_RotationYTo_p_IRotation, 0, 0},  {&_swigt__p_RotationEuler, _p_RotationEulerTo_p_IRotation, 0, 0},  {&_swigt__p_RotationZ, _p_RotationZTo_p_IRotation, 0, 0},  {&_swigt__p_IRotation, 0, 0, 0},  {&_swigt__p_IdentityRotation, _p_IdentityRotationTo_p_IRotation, 0, 0},  {&_swigt__p_RotationX, _p_RotationXTo_p_IRotation, 0, 0},{0, 0, 0, 0}};
-static swig_cast_info _swigc__p_ISampleNode[] = {  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISampleNode, 0, 0},  {&_swigt__p_MisesGaussPeakShape, _p_MisesGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_MisesFisherGaussPeakShape, _p_MisesFisherGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_LorentzFisherPeakShape, _p_LorentzFisherPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_GaussFisherPeakShape, _p_GaussFisherPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IsotropicLorentzPeakShape, _p_IsotropicLorentzPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IsotropicGaussPeakShape, _p_IsotropicGaussPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_IPeakShape, _p_IPeakShapeTo_p_ISampleNode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISampleNode, 0, 0},  {&_swigt__p_ISampleNode, 0, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISampleNode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISampleNode, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_ISampleNode[] = {  {&_swigt__p_ParticleComposition, _p_ParticleCompositionTo_p_ISampleNode, 0, 0},  {&_swigt__p_LayerRoughness, _p_LayerRoughnessTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleLayout, _p_ParticleLayoutTo_p_ISampleNode, 0, 0},  {&_swigt__p_MultiLayer, _p_MultiLayerTo_p_ISampleNode, 0, 0},  {&_swigt__p_ISampleNode, 0, 0, 0},  {&_swigt__p_Crystal, _p_CrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_MesoCrystal, _p_MesoCrystalTo_p_ISampleNode, 0, 0},  {&_swigt__p_Layer, _p_LayerTo_p_ISampleNode, 0, 0},  {&_swigt__p_IParticle, _p_IParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_Particle, _p_ParticleTo_p_ISampleNode, 0, 0},  {&_swigt__p_ParticleCoreShell, _p_ParticleCoreShellTo_p_ISampleNode, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISawtoothRipple[] = {  {&_swigt__p_FormFactorSawtoothRippleLorentz, _p_FormFactorSawtoothRippleLorentzTo_p_ISawtoothRipple, 0, 0},  {&_swigt__p_ISawtoothRipple, 0, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleBox, _p_FormFactorSawtoothRippleBoxTo_p_ISawtoothRipple, 0, 0},  {&_swigt__p_FormFactorSawtoothRippleGauss, _p_FormFactorSawtoothRippleGaussTo_p_ISawtoothRipple, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_ISelectionRule[] = {  {&_swigt__p_ISelectionRule, 0, 0, 0},  {&_swigt__p_SimpleSelectionRule, _p_SimpleSelectionRuleTo_p_ISelectionRule, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_IdentityRotation[] = {  {&_swigt__p_IdentityRotation, 0, 0, 0},{0, 0, 0, 0}};