From 3c05f2f7e8a08f0b993c4b1c3394234ec1a20846 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Mon, 23 Sep 2024 17:32:12 +0200
Subject: [PATCH] remove AddLayerWithTopRoughness and upd everything

---
 GUI/Model/FromCore/ItemizeSample.cpp          |  13 +-
 GUI/Model/ToCore/SampleToCore.cpp             |  44 +++--
 GUI/View/Realspace/RealspaceBuilder.cpp       |  16 +-
 Resample/Processed/ReSample.cpp               |  11 +-
 Sample/Interface/LayerInterface.cpp           |  40 -----
 Sample/Interface/LayerInterface.h             |  53 -------
 Sample/Interface/RoughnessMap.cpp             |  14 +-
 Sample/Interface/RoughnessMap.h               |   4 +-
 Sample/Multilayer/Layer.cpp                   |   9 +-
 Sample/Multilayer/Layer.h                     |   1 +
 Sample/Multilayer/MultiLayer.cpp              | 103 ++++--------
 Sample/Multilayer/MultiLayer.h                |  23 +--
 Sample/StandardSample/CylindersBuilder.cpp    |   1 -
 Sample/StandardSample/FeNiBilayerBuilder.cpp  |  12 +-
 .../HomogeneousMultilayerBuilder.cpp          |   4 +-
 .../StandardSample/MagneticLayersBuilder.cpp  |   9 +-
 .../MagneticParticlesBuilder.cpp              |   1 -
 .../MultiLayerWithRoughnessBuilder.cpp        |  16 +-
 Sample/StandardSample/ResonatorBuilder.cpp    |  24 +--
 .../ThickAbsorptiveSampleBuilder.cpp          |  12 +-
 .../RoughMultiLayerContribution.cpp           |   1 -
 Sim/Export/SampleToPython.cpp                 |  16 +-
 Tests/Unit/Resample/RTTest.cpp                |   5 +-
 Tests/Unit/Sample/MultiLayerTest.cpp          | 123 ++++++--------
 Wrap/Swig/libBornAgainSample.i                |   1 -
 auto/Examples/fit/scatter2d/expfit_galaxi.py  |   8 +-
 .../Examples/fit/scatter2d/hardcode_galaxi.py |   8 +-
 auto/Examples/fit/specular/Honeycomb_fit.py   |  25 +--
 .../fit/specular/PolarizedSpinAsymmetry.py    |  12 +-
 auto/Examples/fit/specular/Pt_layer_fit.py    |  13 +-
 auto/Examples/fit/specular/TREFF_Ni_film.py   |  11 +-
 .../Examples/scatter2d/CorrelatedRoughness.py |  19 +--
 auto/Examples/scatter2d/FindPeaks.py          |  12 +-
 auto/Examples/scatter2d/RectangularGrating.py |  12 +-
 auto/Examples/scatter2d/RoughAndSpecular.py   |   8 +-
 .../specular/MagneticLayerImperfect.py        |  18 +--
 .../specular/PolarizedSpinAsymmetry.py        |  12 +-
 auto/Examples/specular/RoughnessModel.py      |  18 +--
 .../SpecularSimulationWithRoughness.py        |  19 +--
 auto/Examples/varia/MaterialProfile.py        |  17 +-
 auto/Examples/varia/RoughSurface.py           |  14 +-
 .../fit/scatter2d/expfit_galaxi.py            |   8 +-
 .../fit/scatter2d/hardcode_galaxi.py          |   8 +-
 .../FigExamples/fit/specular/Honeycomb_fit.py |  25 +--
 .../fit/specular/PolarizedSpinAsymmetry.py    |  12 +-
 auto/FigExamples/fit/specular/Pt_layer_fit.py |  13 +-
 .../FigExamples/fit/specular/TREFF_Ni_film.py |  11 +-
 .../scatter2d/CorrelatedRoughness.py          |  19 +--
 auto/FigExamples/scatter2d/FindPeaks.py       |  12 +-
 .../scatter2d/RectangularGrating.py           |  12 +-
 .../FigExamples/scatter2d/RoughAndSpecular.py |   8 +-
 .../specular/MagneticLayerImperfect.py        |  18 +--
 .../specular/PolarizedSpinAsymmetry.py        |  12 +-
 auto/FigExamples/specular/RoughnessModel.py   |  18 +--
 .../SpecularSimulationWithRoughness.py        |  19 +--
 auto/FigExamples/varia/MaterialProfile.py     |  17 +-
 auto/FigExamples/varia/RoughSurface.py        |  14 +-
 .../fit/scatter2d/expfit_galaxi.py            |   8 +-
 .../fit/scatter2d/hardcode_galaxi.py          |   8 +-
 .../fit/specular/Honeycomb_fit.py             |  25 +--
 .../fit/specular/PolarizedSpinAsymmetry.py    |  12 +-
 .../MiniExamples/fit/specular/Pt_layer_fit.py |  13 +-
 .../fit/specular/TREFF_Ni_film.py             |  11 +-
 .../scatter2d/CorrelatedRoughness.py          |  19 +--
 auto/MiniExamples/scatter2d/FindPeaks.py      |  12 +-
 .../scatter2d/RectangularGrating.py           |  12 +-
 .../scatter2d/RoughAndSpecular.py             |   8 +-
 .../specular/MagneticLayerImperfect.py        |  18 +--
 .../specular/PolarizedSpinAsymmetry.py        |  12 +-
 auto/MiniExamples/specular/RoughnessModel.py  |  18 +--
 .../SpecularSimulationWithRoughness.py        |  19 +--
 auto/MiniExamples/varia/MaterialProfile.py    |  17 +-
 auto/MiniExamples/varia/RoughSurface.py       |  14 +-
 auto/Wrap/libBornAgainSample.py               |  37 +++--
 auto/Wrap/libBornAgainSample_wrap.cpp         | 150 +++++++++---------
 rawEx/fit/scatter2d/expfit_galaxi.py          |   8 +-
 rawEx/fit/scatter2d/hardcode_galaxi.py        |   8 +-
 rawEx/fit/specular/Honeycomb_fit.py           |  25 +--
 rawEx/fit/specular/PolarizedSpinAsymmetry.py  |  12 +-
 rawEx/fit/specular/Pt_layer_fit.py            |  13 +-
 rawEx/fit/specular/TREFF_Ni_film.py           |  11 +-
 rawEx/scatter2d/CorrelatedRoughness.py        |  19 +--
 rawEx/scatter2d/FindPeaks.py                  |  12 +-
 rawEx/scatter2d/RectangularGrating.py         |  12 +-
 rawEx/scatter2d/RoughAndSpecular.py           |   8 +-
 rawEx/specular/MagneticLayerImperfect.py      |  18 +--
 rawEx/specular/PolarizedSpinAsymmetry.py      |  12 +-
 rawEx/specular/RoughnessModel.py              |  18 +--
 .../SpecularSimulationWithRoughness.py        |  19 +--
 rawEx/varia/MaterialProfile.py                |  17 +-
 rawEx/varia/RoughSurface.py                   |  14 +-
 91 files changed, 742 insertions(+), 905 deletions(-)
 delete mode 100644 Sample/Interface/LayerInterface.cpp
 delete mode 100644 Sample/Interface/LayerInterface.h

diff --git a/GUI/Model/FromCore/ItemizeSample.cpp b/GUI/Model/FromCore/ItemizeSample.cpp
index 8bf1f3a8c10..162c3008fd6 100644
--- a/GUI/Model/FromCore/ItemizeSample.cpp
+++ b/GUI/Model/FromCore/ItemizeSample.cpp
@@ -27,7 +27,6 @@
 #include "Sample/Aggregate/Interferences.h"
 #include "Sample/Aggregate/ParticleLayout.h"
 #include "Sample/HardParticle/HardParticles.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
@@ -302,15 +301,13 @@ void set_CrosscorrelationModel(RoughnessItem* parent, const CrosscorrelationMode
             cd->baseCrossCorrDepth(), cd->baseSpatialFrequency(), cd->power()));
 }
 
-void set_Roughness(LayerItem* parent, const LayerInterface* top_interface)
+void set_Roughness(LayerItem* parent, const LayerRoughness* roughness)
 {
-    if (!top_interface) {
+    if (!roughness) {
         parent->roughnessSelection().setCertainItem(nullptr);
         return;
     }
 
-    const LayerRoughness* roughness = top_interface->roughness();
-
     if (!roughness->showInScriptOrGui()) {
         parent->roughnessSelection().setCertainItem(nullptr);
         return;
@@ -656,15 +653,15 @@ SampleItem* itemizeSample(const MultiLayer& sample, const QString& nodeName)
     for (size_t layerIndex = 0; layerIndex < sample.numberOfLayers(); layerIndex++) {
         const auto* layer = sample.layer(layerIndex);
 
-        const LayerInterface* top_interface =
-            layerIndex == 0 ? nullptr : sample.layerInterface(layerIndex - 1);
+        const LayerRoughness* top_roughness =
+            layerIndex == 0 ? nullptr : sample.layerRoughness(layerIndex);
 
         auto* layerItem = result->createLayerItemAt();
         layerItem->setMaterial(findMaterialItem(matItems, layer));
         layerItem->thickness().setDVal(layer->thickness());
         layerItem->setNumSlices(layer->numberOfSlices());
 
-        set_Roughness(layerItem, top_interface);
+        set_Roughness(layerItem, top_roughness);
 
         // iterate over particle layouts
         for (const auto* layout : layer->layouts()) {
diff --git a/GUI/Model/ToCore/SampleToCore.cpp b/GUI/Model/ToCore/SampleToCore.cpp
index f500e50c284..f969129ad21 100644
--- a/GUI/Model/ToCore/SampleToCore.cpp
+++ b/GUI/Model/ToCore/SampleToCore.cpp
@@ -47,9 +47,26 @@ std::unique_ptr<MultiLayer> createMultiLayer(const SampleItem& item)
 
 std::unique_ptr<Layer> createLayer(const LayerItem& item)
 {
+    const RoughnessItem* roughItem = item.certainRoughness();
+    std::unique_ptr<LayerRoughness> roughness;
+    if (!item.isTopLayer() && roughItem) {
+        std::unique_ptr<AutocorrelationModel> autocorrelation = roughItem->createModel();
+
+        std::unique_ptr<InterlayerModel> interlayer =
+            roughItem->certainInterlayerModel()->createModel();
+
+        std::unique_ptr<CrosscorrelationModel> crosscorrelation;
+        if (!item.isBottomLayer() && !dynamic_cast<LinearGrowthModel*>(autocorrelation.get()))
+            if (const auto* item = roughItem->certainCrosscorrModel())
+                crosscorrelation = item->createModel();
+
+        roughness = std::make_unique<LayerRoughness>(autocorrelation.get(), interlayer.get(),
+                                                     crosscorrelation.get());
+    }
     const bool isFirstOrLastLayer = item.isTopLayer() || item.isBottomLayer();
     auto layer = std::make_unique<Layer>(*item.materialItem()->createMaterial(),
-                                         isFirstOrLastLayer ? 0.0 : item.thickness().dVal());
+                                         isFirstOrLastLayer ? 0.0 : item.thickness().dVal(),
+                                         roughness.get());
     layer->setNumberOfSlices(item.numSlices());
     return layer;
 }
@@ -108,28 +125,7 @@ std::unique_ptr<Layer> buildLayer(const LayerItem& item)
 std::unique_ptr<MultiLayer> GUI::ToCore::itemToSample(const SampleItem& sampleItem)
 {
     auto sample = createMultiLayer(sampleItem);
-    for (auto* layerItem : sampleItem.layerItems()) {
-        auto layer = buildLayer(*layerItem);
-        ASSERT(layer);
-
-        const RoughnessItem* roughItem = layerItem->certainRoughness();
-        if (layerItem->isTopLayer() || !roughItem) {
-            sample->addLayer(*layer);
-            continue;
-        }
-
-        std::unique_ptr<AutocorrelationModel> autocorrelation = roughItem->createModel();
-
-        std::unique_ptr<InterlayerModel> interlayer =
-            roughItem->certainInterlayerModel()->createModel();
-
-        std::unique_ptr<CrosscorrelationModel> crosscorrelation;
-        if (!layerItem->isBottomLayer() && !dynamic_cast<LinearGrowthModel*>(autocorrelation.get()))
-            if (const auto* item = roughItem->certainCrosscorrModel())
-                crosscorrelation = item->createModel();
-
-        LayerRoughness roughness(autocorrelation.get(), interlayer.get(), crosscorrelation.get());
-        sample->addLayerWithTopRoughness(*layer, roughness);
-    }
+    for (auto* layerItem : sampleItem.layerItems())
+        sample->addLayer(*buildLayer(*layerItem));
     return sample;
 }
diff --git a/GUI/View/Realspace/RealspaceBuilder.cpp b/GUI/View/Realspace/RealspaceBuilder.cpp
index 77505cb4261..69ae6488925 100644
--- a/GUI/View/Realspace/RealspaceBuilder.cpp
+++ b/GUI/View/Realspace/RealspaceBuilder.cpp
@@ -92,17 +92,16 @@ std::unique_ptr<double2d_t> scaledArray(const double2d_t& src, double factor)
                                 [&src, factor](size_t i, size_t j) { return src[i][j] * factor; }));
 }
 
-std::unique_ptr<const double2d_t> layerRoughnessMap(const MultiLayer& sample, int i_interface,
+std::unique_ptr<const double2d_t> layerRoughnessMap(const MultiLayer& sample, int i_layer,
                                                     const SceneGeometry& sceneGeometry, int seed)
 {
-    if (i_interface < 0 || i_interface >= int(sample.numberOfInterfaces())
-        || sample.layerInterfaceRMS(i_interface) == 0)
+    if (i_layer < 1 || i_layer >= int(sample.numberOfLayers())
+        || sample.layerRoughnessRMS(i_layer) == 0)
         return nullptr;
 
     int n = sceneGeometry.numRoughnessPointsAlongAxis;
     double L = 2 * sceneGeometry.layerSize;
-    auto rmap =
-        RoughnessMap(n, n, L, L, sample, i_interface, seed); // seed < 0 ==> random every time
+    auto rmap = RoughnessMap(n, n, L, L, sample, i_layer, seed); // seed < 0 ==> random every time
     return std::make_unique<const double2d_t>(rmap.generateMap());
 }
 
@@ -176,7 +175,7 @@ void RealspaceBuilder::populateSample(Model* model, const SampleItem& sampleItem
     rough_maps.push_back(nullptr); // top interface of fronting
     for (size_t i = 1; i < layers.size(); i++)
         rough_maps.push_back(
-            ::layerRoughnessMap(*sample, i - 1, sceneGeometry, layers[i]->roughnessSeed).release());
+            ::layerRoughnessMap(*sample, i, sceneGeometry, layers[i]->roughnessSeed).release());
     rough_maps.push_back(nullptr); // bottom interface of substrate
 
     for (size_t i = 0; i < layers.size(); i++) {
@@ -203,14 +202,13 @@ void RealspaceBuilder::populateLayer(Model* model, const LayerItem& layerItem,
     // individual layer visualization
     if (!topRoughMap && !bottomRoughMap) {
         std::unique_ptr<MultiLayer> sample = GUI::ToCore::itemToSample(sampleItem);
-        const int i_interface = i_layer - 1;
         auto new_topRoughMap =
-            ::layerRoughnessMap(*sample, i_interface, sceneGeometry, layerItem.roughnessSeed);
+            ::layerRoughnessMap(*sample, i_layer, sceneGeometry, layerItem.roughnessSeed);
 
         std::unique_ptr<const double2d_t> new_bottomRoughMap;
         if (i_layer + 1 < int(sampleItem.layerItems().size())) {
             const LayerItem* layerItemBelow = sampleItem.layerItems()[i_layer + 1];
-            new_bottomRoughMap = ::layerRoughnessMap(*sample, i_interface + 1, sceneGeometry,
+            new_bottomRoughMap = ::layerRoughnessMap(*sample, i_layer + 1, sceneGeometry,
                                                      layerItemBelow->roughnessSeed);
         }
         layer = ::createLayer(layerItem, sampleItem, sceneGeometry, origin, new_topRoughMap.get(),
diff --git a/Resample/Processed/ReSample.cpp b/Resample/Processed/ReSample.cpp
index 9a8a71b01b5..1786228a1a3 100644
--- a/Resample/Processed/ReSample.cpp
+++ b/Resample/Processed/ReSample.cpp
@@ -25,7 +25,6 @@
 #include "Resample/Specular/ComputeFluxScalar.h"
 #include "Sample/Aggregate/IInterference.h"
 #include "Sample/Aggregate/ParticleLayout.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Material/MaterialBySLDImpl.h"
 #include "Sample/Material/MaterialUtil.h"
@@ -82,11 +81,11 @@ std::vector<ZLimits> particleSpans(const MultiLayer& sample)
 }
 
 //! Returns top roughness of layer
-const LayerRoughness* layerTopRoughness(const MultiLayer& sample, size_t i)
+const LayerRoughness* layerTopRoughness(const MultiLayer& sample, size_t i_layer)
 {
-    if (i == 0)
+    if (i_layer == 0)
         return nullptr;
-    return sample.layerInterface(i - 1)->roughness();
+    return sample.layerRoughness(i_layer);
 }
 
 //! Returns a vector of slices that represent the layer structure of the sample.
@@ -122,7 +121,7 @@ SliceStack slicify(const MultiLayer& sample, bool useAvgMaterials)
                 if (i == nLayers - 1)
                     ASSERT(tl == 0);
                 const LayerRoughness* roughness = layerTopRoughness(sample, i);
-                const double rms = sample.layerInterfaceRMS(i - 1);
+                const double rms = sample.layerRoughnessRMS(i);
                 result.addSlice(tl, *material, roughness, rms);
             }
         }
@@ -137,7 +136,7 @@ SliceStack slicify(const MultiLayer& sample, bool useAvgMaterials)
         const Material* const material = layer->material();
         const ZLimits& particle_span = particle_spans[i];
         const LayerRoughness* roughness = layerTopRoughness(sample, i);
-        const double rms = (i >= 1) ? sample.layerInterfaceRMS(i - 1) : 0.0;
+        const double rms = sample.layerRoughnessRMS(i);
 
         // if no slicing is needed, create single slice for the layer
         if (!particle_span.isFinite()) { // also if layer contains no particles
diff --git a/Sample/Interface/LayerInterface.cpp b/Sample/Interface/LayerInterface.cpp
deleted file mode 100644
index c8ddcd2f93a..00000000000
--- a/Sample/Interface/LayerInterface.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Sample/Interface/LayerInterface.cpp
-//! @brief     Implements class LayerInterface.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Sample/Interface/LayerInterface.h"
-#include "Base/Util/Assert.h"
-#include "Sample/Interface/LayerRoughness.h"
-
-LayerInterface::LayerInterface(const LayerRoughness* layerRoughness)
-    : m_roughness(layerRoughness)
-{
-    ASSERT(layerRoughness);
-}
-
-LayerInterface::~LayerInterface() = default;
-
-LayerInterface* LayerInterface::clone() const
-{
-    throw std::runtime_error("LayerInterface::clone -> Not allowed to clone.");
-}
-
-std::vector<const INode*> LayerInterface::nodeChildren() const
-{
-    return std::vector<const INode*>() << m_roughness;
-}
-
-std::string LayerInterface::validate() const
-{
-    return "";
-}
diff --git a/Sample/Interface/LayerInterface.h b/Sample/Interface/LayerInterface.h
deleted file mode 100644
index 98cff49c57a..00000000000
--- a/Sample/Interface/LayerInterface.h
+++ /dev/null
@@ -1,53 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Sample/Interface/LayerInterface.h
-//! @brief     Defines class LayerInterface.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifdef SWIG
-#error no need to expose this header to Swig
-#endif // SWIG
-#ifndef BORNAGAIN_SAMPLE_INTERFACE_LAYERINTERFACE_H
-#define BORNAGAIN_SAMPLE_INTERFACE_LAYERINTERFACE_H
-
-#include "Sample/Scattering/ISampleNode.h"
-#include <memory>
-
-class Layer;
-class LayerRoughness;
-
-//! Interface between two layers, always with roughness.
-
-class LayerInterface : public ISampleNode {
-public:
-    LayerInterface(const LayerRoughness* layerRoughness);
-    ~LayerInterface() override;
-
-    LayerInterface* clone() const override;
-    std::string className() const final { return "LayerInterface"; }
-
-    //! Returns roughness of the interface.
-    const LayerRoughness* roughness() const;
-
-    std::vector<const INode*> nodeChildren() const override;
-
-    std::string validate() const override;
-
-private:
-    std::unique_ptr<const LayerRoughness> m_roughness; //!< roughness of the interface
-};
-
-inline const LayerRoughness* LayerInterface::roughness() const
-{
-    return m_roughness.get();
-}
-
-#endif // BORNAGAIN_SAMPLE_INTERFACE_LAYERINTERFACE_H
diff --git a/Sample/Interface/RoughnessMap.cpp b/Sample/Interface/RoughnessMap.cpp
index bc89154d8da..1e0056d7bab 100644
--- a/Sample/Interface/RoughnessMap.cpp
+++ b/Sample/Interface/RoughnessMap.cpp
@@ -15,7 +15,6 @@
 #include "Sample/Interface/RoughnessMap.h"
 #include "Base/Const/PhysicalConstants.h"
 #include "Base/Util/Assert.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include <algorithm>
 
@@ -53,13 +52,13 @@ Arrayf64Wrapper arrayExport(const std::vector<std::size_t>& dimensions,
 } // namespace
 
 RoughnessMap::RoughnessMap(size_t x_points, size_t y_points, double Lx, double Ly,
-                           const MultiLayer& sample, int i_interface, int seed)
+                           const MultiLayer& sample, int i_layer, int seed)
     : m_x_points(x_points)
     , m_y_points(y_points)
     , m_lx(Lx)
     , m_ly(Ly)
     , m_sample(sample)
-    , m_i_interface(i_interface)
+    , m_i_layer(i_layer)
     , m_gen(seed < 0 ? m_rd() : seed)
 {
     if (x_points == 0)
@@ -81,9 +80,8 @@ double2d_t RoughnessMap::generateMap()
 double2d_t RoughnessMap::mapFromHeights() const
 {
     const size_t z_steps = 3999;
-    const InterlayerModel* interlayerModel =
-        m_sample.layerInterface(m_i_interface)->roughness()->interlayerModel();
-    const double rms = m_sample.layerInterfaceRMS(m_i_interface);
+    const InterlayerModel* interlayerModel = m_sample.layerRoughness(m_i_layer)->interlayerModel();
+    const double rms = m_sample.layerRoughnessRMS(m_i_layer);
     const double sigma_factor = interlayerModel->sigmaRange();
     const double z_limit = rms * sigma_factor;
     const double step = 2 * z_limit / (z_steps - 1);
@@ -129,7 +127,7 @@ double2d_t RoughnessMap::mapFromSpectrum() const
     for (int i = 0; i < N; i++) {
         for (int j = 0; j < M; j++)
             psd_mag[j][i] =
-                std::sqrt(m_sample.layerInterfaceSpectrum(std::hypot(fx[i], fy[j]), m_i_interface));
+                std::sqrt(m_sample.layerRoughnessSpectrum(std::hypot(fx[i], fy[j]), m_i_layer));
         for (int j = M; j < m_y_points; j++)
             psd_mag[j][i] = psd_mag[m_y_points - j][i];
     }
@@ -209,7 +207,7 @@ double2d_t RoughnessMap::applyHeightsToSpectrum(const double2d_t& h_map,
 
 void RoughnessMap::createMap()
 {
-    if (m_sample.layerInterfaceRMS(m_i_interface) < 1e-10) {
+    if (m_sample.layerRoughnessRMS(m_i_layer) < 1e-10) {
         m_rough_map = double2d_t(m_y_points, std::vector<double>(m_x_points));
         return;
     }
diff --git a/Sample/Interface/RoughnessMap.h b/Sample/Interface/RoughnessMap.h
index 0b3f311b24b..daa537b9971 100644
--- a/Sample/Interface/RoughnessMap.h
+++ b/Sample/Interface/RoughnessMap.h
@@ -31,7 +31,7 @@
 class RoughnessMap {
 public:
     RoughnessMap(size_t x_points, size_t y_points, double Lx, double Ly, const MultiLayer& sample,
-                 int i_interface, int seed = -1);
+                 int i_layer, int seed = -1);
     RoughnessMap() = delete;
 
     double2d_t generateMap();
@@ -61,7 +61,7 @@ private:
 
     const MultiLayer& m_sample;
 
-    int m_i_interface;
+    int m_i_layer;
     double2d_t m_rough_map;
 
     mutable FourierTransform m_ft;
diff --git a/Sample/Multilayer/Layer.cpp b/Sample/Multilayer/Layer.cpp
index f20114bcd28..4981351563a 100644
--- a/Sample/Multilayer/Layer.cpp
+++ b/Sample/Multilayer/Layer.cpp
@@ -41,13 +41,19 @@ Layer::Layer(const Material& material, double thickness, const LayerRoughness* r
     ASSERT(m_roughness);
     if (thickness < 0.)
         throw std::runtime_error("Layer contructor called with negative thickness");
+    validateOrThrow();
+}
+
+Layer::Layer(const Material& material, const LayerRoughness* roughness)
+    : Layer(material, 0, roughness)
+{
 }
 
 Layer::~Layer() = default;
 
 Layer* Layer::clone() const
 {
-    auto* result = new Layer(m_material, m_thickness);
+    auto* result = new Layer(m_material, m_thickness, m_roughness.get());
     result->m_B_field = m_B_field;
     result->m_n_slices = m_n_slices;
     for (const auto* layout : layouts())
@@ -60,6 +66,7 @@ std::vector<const INode*> Layer::nodeChildren() const
     std::vector<const INode*> result;
     for (const auto* layout : m_layouts)
         result.push_back(layout);
+    result.push_back(m_roughness.get());
     return result;
 }
 
diff --git a/Sample/Multilayer/Layer.h b/Sample/Multilayer/Layer.h
index 5f753db3a9a..c6dd7a5d611 100644
--- a/Sample/Multilayer/Layer.h
+++ b/Sample/Multilayer/Layer.h
@@ -28,6 +28,7 @@ class Layer : public ISampleNode {
 public:
     Layer(const Material& material, double thickness = 0,
           const LayerRoughness* roughness = nullptr);
+    Layer(const Material& material, const LayerRoughness* roughness);
     ~Layer() override;
 
     Layer* clone() const override;
diff --git a/Sample/Multilayer/MultiLayer.cpp b/Sample/Multilayer/MultiLayer.cpp
index 55f6e3585d7..bef82bede71 100644
--- a/Sample/Multilayer/MultiLayer.cpp
+++ b/Sample/Multilayer/MultiLayer.cpp
@@ -18,7 +18,6 @@
 #include "Base/Util/Assert.h"
 #include "Base/Util/StringUtil.h"
 #include "Sample/Aggregate/ParticleLayout.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Material/MaterialUtil.h"
 #include "Sample/Multilayer/Layer.h"
@@ -36,13 +35,8 @@ MultiLayer* MultiLayer::clone() const
 {
     auto* result = new MultiLayer;
     result->setExternalField(externalField());
-    for (size_t i = 0; i < numberOfLayers(); ++i) {
-        const LayerInterface* interface = i > 0 ? m_interfaces[i - 1] : nullptr;
-        if (i > 0 && interface->roughness())
-            result->addLayerWithTopRoughness(std::as_const(*m_layers[i]), *interface->roughness());
-        else
-            result->addLayer(std::as_const(*m_layers[i]));
-    }
+    for (size_t i = 0; i < numberOfLayers(); ++i)
+        result->addLayer(std::as_const(*m_layers[i]));
     return result;
 }
 
@@ -52,56 +46,26 @@ void MultiLayer::checkMaterials(double wavelength) const
         m_layers[i]->material()->checkRefractiveIndex(wavelength);
 }
 
-//! Adds layer with default (zero) roughness
 void MultiLayer::addLayer(const Layer& layer)
 {
-    addLayerExec(layer, nullptr);
-}
-
-//! Adds layer with top roughness
-void MultiLayer::addLayerWithTopRoughness(const Layer& layer, const LayerRoughness& roughness)
-{
-    addLayerExec(layer, &roughness);
-}
-
-//! Internal
-void MultiLayer::addLayerExec(const Layer& layer, const LayerRoughness* roughness)
-{
-    const Layer* new_layer = layer.clone();
-
-    if (numberOfLayers()) { // not the top layer
-        const LayerRoughness* new_roughness;
-        if (roughness)
-            new_roughness = roughness->clone();
-        else {
-            K_CorrelationModel autocorrelation(0, 0, 0);
-            ErfInterlayer interlayer;
-            new_roughness = new LayerRoughness(&autocorrelation, &interlayer);
-        }
-        m_interfaces.push_back(new LayerInterface(new_roughness));
-
-    } else { // the top layer
-        if (new_layer->thickness() != 0.0)
+    if (!numberOfLayers()) // the top layer
+        if (layer.thickness() != 0.0)
             throw std::runtime_error("Invalid top layer; to indicate that it is semiinfinite,"
                                      " it must have a nominal thickness of 0");
-        if (roughness)
-            throw std::runtime_error("Invalid top layer with roughness");
-    }
-
-    m_layers.push_back(new_layer);
+    m_layers.push_back(layer.clone());
     m_validated = false;
 }
 
-const AutocorrelationModel* MultiLayer::autocorrAt(int i_interface) const
+const AutocorrelationModel* MultiLayer::autocorrAt(int i_layer) const
 {
-    return m_interfaces.at(i_interface)->roughness()->autocorrelationModel();
+    return layerRoughness(i_layer)->autocorrelationModel();
 }
 
-double MultiLayer::maxCutoffSpatialFrequencyAt(size_t i_interface) const
+double MultiLayer::maxCutoffSpatialFrequencyAt(size_t i_layer) const
 {
     double result = 0;
-    for (size_t i = i_interface; i < m_interfaces.size(); i++) {
-        const auto autocorr = m_interfaces.at(i_interface)->roughness()->autocorrelationModel();
+    for (size_t i = i_layer; i < m_layers.size(); i++) {
+        const auto autocorr = layerRoughness(i_layer)->autocorrelationModel();
         result = std::max(autocorr->maxSpatialFrequency(), result);
     }
     return result;
@@ -112,9 +76,9 @@ const Layer* MultiLayer::layer(size_t i_layer) const
     return m_layers.at(i_layer);
 }
 
-const LayerInterface* MultiLayer::layerInterface(size_t i_interface) const
+const LayerRoughness* MultiLayer::layerRoughness(size_t i_layer) const
 {
-    return m_interfaces.at(i_interface);
+    return m_layers.at(i_layer)->roughness();
 }
 
 void MultiLayer::setExternalField(const R3& ext_field)
@@ -123,19 +87,19 @@ void MultiLayer::setExternalField(const R3& ext_field)
     m_validated = false;
 }
 
-double MultiLayer::layerInterfaceSpectrum(double spatial_f, int i_interface) const
+double MultiLayer::layerRoughnessSpectrum(double spatial_f, int i_layer) const
 {
-    int size = m_interfaces.size();
-    const AutocorrelationModel* autocorr = autocorrAt(i_interface);
+    int size = m_layers.size();
+    const AutocorrelationModel* autocorr = autocorrAt(i_layer);
 
     if (const auto k_corr = dynamic_cast<const K_CorrelationModel*>(autocorr))
         return k_corr->spectralFunction(spatial_f);
 
     if (dynamic_cast<const LinearGrowthModel*>(autocorr)) {
-        if (i_interface == size - 1)
+        if (i_layer == size - 1)
             ASSERT_NEVER;
 
-        int j = i_interface + 1;
+        int j = i_layer + 1;
         for (; j < size; j++) {
             if (dynamic_cast<const K_CorrelationModel*>(autocorrAt(j)))
                 break;
@@ -145,10 +109,10 @@ double MultiLayer::layerInterfaceSpectrum(double spatial_f, int i_interface) con
         double spectrum_below = base_k_corr->spectralFunction(spatial_f);
         double current_spectrum = spectrum_below;
 
-        // all interfaces between i and j have linear growth model
-        for (int k = j - 1; k >= i_interface; k--) {
+        // all layers between i and j have linear growth model
+        for (int k = j - 1; k >= i_layer; k--) {
             const auto lin_growth = dynamic_cast<const LinearGrowthModel*>(autocorrAt(k));
-            const double thickness = m_layers.at(k + 1)->thickness();
+            const double thickness = m_layers.at(k)->thickness();
             current_spectrum = lin_growth->spectralFunction(spectrum_below, thickness, spatial_f);
             spectrum_below = current_spectrum;
         }
@@ -157,19 +121,19 @@ double MultiLayer::layerInterfaceSpectrum(double spatial_f, int i_interface) con
     ASSERT_NEVER;
 }
 
-double MultiLayer::layerInterfaceRMS(size_t i_interface) const
+double MultiLayer::layerRoughnessRMS(size_t i_layer) const
 {
-    ASSERT(i_interface < m_interfaces.size());
-    const auto autocorr = m_interfaces.at(i_interface)->roughness()->autocorrelationModel();
+    ASSERT(i_layer < m_layers.size());
+    const auto autocorr = autocorrAt(i_layer);
 
     if (auto* k_corr = dynamic_cast<const K_CorrelationModel*>(autocorr)) {
         return k_corr->rms();
     } else if (dynamic_cast<const LinearGrowthModel*>(autocorr)) {
-        const double maxSpatialFrequency = maxCutoffSpatialFrequencyAt(i_interface);
+        const double maxSpatialFrequency = maxCutoffSpatialFrequencyAt(i_layer);
         return std::sqrt((2 * pi)
                          * RealIntegrator().integrate(
-                             [this, i_interface](double spatial_f) -> double {
-                                 return spatial_f * layerInterfaceSpectrum(spatial_f, i_interface);
+                             [this, i_layer](double spatial_f) -> double {
+                                 return spatial_f * layerRoughnessSpectrum(spatial_f, i_layer);
                              },
                              0, maxSpatialFrequency));
     }
@@ -180,14 +144,11 @@ std::vector<const INode*> MultiLayer::nodeChildren() const
 {
     std::vector<const INode*> result;
     const size_t N = m_layers.size();
-    result.reserve(N + m_interfaces.size());
+    result.reserve(N);
 
-    for (size_t i = 0; i < N; ++i) {
+    for (size_t i = 0; i < N; ++i)
         result.push_back(layer(i));
-        if (i == N - 1)
-            break;
-        result.push_back(layerInterface(i));
-    }
+
     return result;
 }
 
@@ -218,12 +179,6 @@ std::string MultiLayer::validate() const
             errs.push_back("{ layer " + std::to_string(i) + ": " + err + " }");
     }
 
-    for (size_t i = 0; i < m_interfaces.size(); ++i) {
-        std::string err = m_interfaces[i]->validate();
-        if (!err.empty())
-            errs.push_back("{ interface " + std::to_string(i) + ": " + err + " }");
-    }
-
     if (!errs.empty())
         return "[ " + Base::String::join(errs, ", ") + " ]";
 
diff --git a/Sample/Multilayer/MultiLayer.h b/Sample/Multilayer/MultiLayer.h
index 3e979ebfd6f..d15f75f5fc2 100644
--- a/Sample/Multilayer/MultiLayer.h
+++ b/Sample/Multilayer/MultiLayer.h
@@ -23,7 +23,6 @@
 
 class AutocorrelationModel;
 class Layer;
-class LayerInterface;
 class LayerRoughness;
 class ParticleLayout;
 
@@ -49,17 +48,16 @@ public:
     std::string className() const final { return "MultiLayer"; }
 
     void addLayer(const Layer& layer);
-    void addLayerWithTopRoughness(const Layer& layer, const LayerRoughness& roughness);
     //! Sets the external field applied to the sample (units: A/m)
     void setExternalField(const R3& ext_field);
 
     void setName(const std::string& name) { m_sample_name = name; }
 
-    //! Returns roughness spectrum for a given interface index
-    double layerInterfaceSpectrum(double spatial_f, int i_interface) const;
+    //! Returns roughness spectrum for a given layer index
+    double layerRoughnessSpectrum(double spatial_f, int i_layer) const;
 
-    //! Returns roughness rms for a given interface index
-    double layerInterfaceRMS(size_t i_interface) const;
+    //! Returns roughness rms for a given layer index
+    double layerRoughnessRMS(size_t i_layer) const;
 
 #ifndef SWIG
     std::vector<const INode*> nodeChildren() const override;
@@ -78,13 +76,9 @@ public:
     {
         return m_layers.size();
     }
-    size_t numberOfInterfaces() const
-    {
-        return m_interfaces.size();
-    }
 
     const Layer* layer(size_t i_layer) const;
-    const LayerInterface* layerInterface(size_t i_interface) const;
+    const LayerRoughness* layerRoughness(size_t i_layer) const;
     R3 externalField() const
     {
         return m_ext_field;
@@ -93,14 +87,11 @@ public:
     void checkMaterials(double wavelength) const;
 
 private:
-    void addLayerExec(const Layer& layer, const LayerRoughness* roughness);
-    const AutocorrelationModel* autocorrAt(int i_interface) const;
-    double maxCutoffSpatialFrequencyAt(size_t i_interface) const;
+    const AutocorrelationModel* autocorrAt(int i_layer) const;
+    double maxCutoffSpatialFrequencyAt(size_t i_layer) const;
 
     //! stack of layers [nlayers]
     OwningVector<const Layer> m_layers;
-    //! stack of layer interfaces [nlayers-1]
-    OwningVector<const LayerInterface> m_interfaces;
     //! external magnetic field (in A/m)
     R3 m_ext_field;
 
diff --git a/Sample/StandardSample/CylindersBuilder.cpp b/Sample/StandardSample/CylindersBuilder.cpp
index 8718a5288b8..43d0c3a92b2 100644
--- a/Sample/StandardSample/CylindersBuilder.cpp
+++ b/Sample/StandardSample/CylindersBuilder.cpp
@@ -15,7 +15,6 @@
 #include "Sample/StandardSample/CylindersBuilder.h"
 #include "Sample/Aggregate/ParticleLayout.h"
 #include "Sample/HardParticle/Cylinder.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
 #include "Sample/Particle/Particle.h"
diff --git a/Sample/StandardSample/FeNiBilayerBuilder.cpp b/Sample/StandardSample/FeNiBilayerBuilder.cpp
index fcfbaf66481..190689b1b73 100644
--- a/Sample/StandardSample/FeNiBilayerBuilder.cpp
+++ b/Sample/StandardSample/FeNiBilayerBuilder.cpp
@@ -110,19 +110,19 @@ std::unique_ptr<MultiLayer> FeNiBilayer::constructSample()
     auto m_Ni = MaterialBySLD("Ni", sldNi.real(), sldNi.imag());
     auto m_Substrate = MaterialBySLD("Au", sldAu.real(), sldAu.imag());
 
-    Layer l_Fe{m_Fe, thicknessFe};
-    Layer l_Ni{m_Ni, thicknessNi};
-
     K_CorrelationModel autocorrelation(sigmaRoughness);
     LayerRoughness roughness{&autocorrelation, interlayerModel.get()};
+
+    Layer l_Fe{m_Fe, thicknessFe, &roughness};
+    Layer l_Ni{m_Ni, thicknessNi, &roughness};
     result->addLayer(Layer{m_ambient});
 
     for (auto i = 0; i < NBilayers; ++i) {
-        result->addLayerWithTopRoughness(l_Fe, roughness);
-        result->addLayerWithTopRoughness(l_Ni, roughness);
+        result->addLayer(l_Fe);
+        result->addLayer(l_Ni);
     }
 
-    result->addLayerWithTopRoughness(Layer{m_Substrate}, roughness);
+    result->addLayer(Layer{m_Substrate, &roughness});
     return result;
 }
 
diff --git a/Sample/StandardSample/HomogeneousMultilayerBuilder.cpp b/Sample/StandardSample/HomogeneousMultilayerBuilder.cpp
index 409e40e3997..678697ad626 100644
--- a/Sample/StandardSample/HomogeneousMultilayerBuilder.cpp
+++ b/Sample/StandardSample/HomogeneousMultilayerBuilder.cpp
@@ -31,10 +31,10 @@ MultiLayer* ExemplarySamples::createHomogeneousMultilayer()
     Material ni_material = RefractiveMaterial("Ni", delta_ni, 0.0);
     Material ti_material = RefractiveMaterial("Ti", delta_ti, 0.0);
 
-    Layer vacuum_layer(vacuum_material, 0);
+    Layer vacuum_layer(vacuum_material);
     Layer ni_layer(ni_material, thick_ni);
     Layer ti_layer(ti_material, thick_ti);
-    Layer substrate_layer(substrate_material, 0);
+    Layer substrate_layer(substrate_material);
 
     auto* sample = new MultiLayer;
     sample->addLayer(vacuum_layer);
diff --git a/Sample/StandardSample/MagneticLayersBuilder.cpp b/Sample/StandardSample/MagneticLayersBuilder.cpp
index f74b33047f6..141d634101f 100644
--- a/Sample/StandardSample/MagneticLayersBuilder.cpp
+++ b/Sample/StandardSample/MagneticLayersBuilder.cpp
@@ -140,11 +140,12 @@ ExemplarySamples::createSimpleMagneticRotationWithRoughness(const std::string& r
     auto roughness = LayerRoughness(&autocorrelation, interlayerModel.get());
 
     Layer vacuum_layer(vacuum_material);
-    Layer substrate_layer(substrate_material);
-    Layer layer(layer_material, 200 * Units::angstrom);
+    Layer layer(layer_material, 200 * Units::angstrom, &roughness);
+    Layer substrate_layer(substrate_material, &roughness);
+
     sample->addLayer(vacuum_layer);
-    sample->addLayerWithTopRoughness(layer, roughness);
-    sample->addLayerWithTopRoughness(substrate_layer, roughness);
+    sample->addLayer(layer);
+    sample->addLayer(substrate_layer);
     return sample;
 }
 
diff --git a/Sample/StandardSample/MagneticParticlesBuilder.cpp b/Sample/StandardSample/MagneticParticlesBuilder.cpp
index 2ed6661fa5b..9f06947a56a 100644
--- a/Sample/StandardSample/MagneticParticlesBuilder.cpp
+++ b/Sample/StandardSample/MagneticParticlesBuilder.cpp
@@ -16,7 +16,6 @@
 #include "Sample/Aggregate/ParticleLayout.h"
 #include "Sample/HardParticle/Cylinder.h"
 #include "Sample/HardParticle/Sphere.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Multilayer/Layer.h"
diff --git a/Sample/StandardSample/MultiLayerWithRoughnessBuilder.cpp b/Sample/StandardSample/MultiLayerWithRoughnessBuilder.cpp
index e6f8096b709..7545002a151 100644
--- a/Sample/StandardSample/MultiLayerWithRoughnessBuilder.cpp
+++ b/Sample/StandardSample/MultiLayerWithRoughnessBuilder.cpp
@@ -33,22 +33,22 @@ MultiLayer* createMultiLayerWithInterlayerModel(const InterlayerModel* interlaye
     Material part_a_material = RefractiveMaterial("PartA", 5e-6, 0.0);
     Material part_b_material = RefractiveMaterial("PartB", 10e-6, 0.0);
 
-    Layer vacuum_layer(vacuum_material, 0);
-    Layer partA_layer(part_a_material, thicknessA);
-    Layer partB_layer(part_b_material, thicknessB);
-    Layer substrate_layer(substrate_material, 0);
-
     K_CorrelationModel autocorrelation(sigma, hurst, lateralCorrLength);
     CommonDepthCrosscorrelation crosscorrelation(crossCorrDepth);
     LayerRoughness roughness(&autocorrelation, interlayerModel, &crosscorrelation);
 
+    Layer vacuum_layer(vacuum_material);
+    Layer partA_layer(part_a_material, thicknessA, &roughness);
+    Layer partB_layer(part_b_material, thicknessB, &roughness);
+    Layer substrate_layer(substrate_material, &roughness);
+
     auto* sample = new MultiLayer;
     sample->addLayer(vacuum_layer);
     for (int i = 0; i < 5; ++i) {
-        sample->addLayerWithTopRoughness(partA_layer, roughness);
-        sample->addLayerWithTopRoughness(partB_layer, roughness);
+        sample->addLayer(partA_layer);
+        sample->addLayer(partB_layer);
     }
-    sample->addLayerWithTopRoughness(substrate_layer, roughness);
+    sample->addLayer(substrate_layer);
     return sample;
 }
 } // namespace
diff --git a/Sample/StandardSample/ResonatorBuilder.cpp b/Sample/StandardSample/ResonatorBuilder.cpp
index e6d3368d0e5..fdf95b70394 100644
--- a/Sample/StandardSample/ResonatorBuilder.cpp
+++ b/Sample/StandardSample/ResonatorBuilder.cpp
@@ -29,29 +29,29 @@ MultiLayer* ExemplarySamples::createResonator(double ti_thickness)
     Material m_Pt = RefractiveMaterial("Pt", 2.52936993309e-05, 7.54553992473e-09);
     Material m_D2O = RefractiveMaterial("D2O", 2.52897204573e-05, 4.5224432814e-13);
 
-    Layer l_TiO2(m_TiO2, 3.0);
-    Layer l_Ti_top(m_Ti, 10.0);
-    Layer l_Ti(m_Ti, ti_thickness);
-    Layer l_Si(m_Si);
-    Layer l_Pt(m_Pt, 32.0);
-    Layer l_D2O(m_D2O);
-
     K_CorrelationModel autocorrelation(2.0, 0.8, 1e4);
     TanhInterlayer interlayer;
     CommonDepthCrosscorrelation crosscorrelation(400);
     LayerRoughness roughness(&autocorrelation, &interlayer, &crosscorrelation);
 
+    Layer l_TiO2(m_TiO2, 3.0, &roughness);
+    Layer l_Ti_top(m_Ti, 10.0, &roughness);
+    Layer l_Ti(m_Ti, ti_thickness, &roughness);
+    Layer l_Si(m_Si);
+    Layer l_Pt(m_Pt, 32.0, &roughness);
+    Layer l_D2O(m_D2O, &roughness);
+
     result->addLayer(l_Si);
 
     const int nlayers = 3;
     for (size_t i = 0; i < nlayers; ++i) {
-        result->addLayerWithTopRoughness(l_Ti, roughness);
-        result->addLayerWithTopRoughness(l_Pt, roughness);
+        result->addLayer(l_Ti);
+        result->addLayer(l_Pt);
     }
 
-    result->addLayerWithTopRoughness(l_Ti_top, roughness);
-    result->addLayerWithTopRoughness(l_TiO2, roughness);
-    result->addLayerWithTopRoughness(l_D2O, roughness);
+    result->addLayer(l_Ti_top);
+    result->addLayer(l_TiO2);
+    result->addLayer(l_D2O);
 
     return result;
 }
diff --git a/Sample/StandardSample/ThickAbsorptiveSampleBuilder.cpp b/Sample/StandardSample/ThickAbsorptiveSampleBuilder.cpp
index 576115dc5ed..6da87dfc3e9 100644
--- a/Sample/StandardSample/ThickAbsorptiveSampleBuilder.cpp
+++ b/Sample/StandardSample/ThickAbsorptiveSampleBuilder.cpp
@@ -24,19 +24,19 @@ MultiLayer* ExemplarySamples::createThickAbsorptiveSample()
     Material au_material = MaterialBySLD("Au", 3.48388057043e-05, 1.79057609656e-05);
     Material si_material = MaterialBySLD("Si", 3.84197565094e-07, 6.28211531498e-07);
 
+    K_CorrelationModel autocorrelation(5.0, 0.5, 10.0);
+    ErfInterlayer interlayer;
+    LayerRoughness roughness(&autocorrelation, &interlayer);
+
     Layer vacuum_layer(vacuum_material);
     Layer au_layer(au_material, 200.0);
     Layer vacuum_layer_2(vacuum_material, 10.0);
-    Layer substrate_layer(si_material);
-
-    K_CorrelationModel autocorrelation(5.0, 0.5, 10.0);
-    ErfInterlayer interlayer;
-    LayerRoughness rough(&autocorrelation, &interlayer);
+    Layer substrate_layer(si_material, &roughness);
 
     auto* sample = new MultiLayer;
     sample->addLayer(vacuum_layer);
     sample->addLayer(au_layer);
     sample->addLayer(vacuum_layer_2);
-    sample->addLayerWithTopRoughness(substrate_layer, rough);
+    sample->addLayer(substrate_layer);
     return sample;
 }
diff --git a/Sim/Computation/RoughMultiLayerContribution.cpp b/Sim/Computation/RoughMultiLayerContribution.cpp
index ce487881e67..b06082d109c 100644
--- a/Sim/Computation/RoughMultiLayerContribution.cpp
+++ b/Sim/Computation/RoughMultiLayerContribution.cpp
@@ -19,7 +19,6 @@
 #include "Resample/Element/DiffuseElement.h"
 #include "Resample/Flux/ScalarFlux.h"
 #include "Resample/Processed/ReSample.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Multilayer/Layer.h"
 #include "Sample/Multilayer/MultiLayer.h"
diff --git a/Sim/Export/SampleToPython.cpp b/Sim/Export/SampleToPython.cpp
index 8033a9b620c..8d11316527d 100644
--- a/Sim/Export/SampleToPython.cpp
+++ b/Sim/Export/SampleToPython.cpp
@@ -19,7 +19,6 @@
 #include "Param/Node/NodeUtil.h"
 #include "Sample/Aggregate/Interferences.h"
 #include "Sample/Aggregate/ParticleLayout.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Lattice/Lattice3D.h"
 #include "Sample/Multilayer/Layer.h"
@@ -127,8 +126,11 @@ std::string defineLayers(const ComponentKeyHandler& objHandler,
                          const MaterialKeyHandler& matHandler)
 {
     std::vector<const Layer*> v = objHandler.objectsOfType<Layer>();
+    std::vector<const LayerRoughness*> r = objHandler.objectsOfType<LayerRoughness>();
+    ASSERT(v.size() == r.size())
     if (v.empty())
         return "";
+
     std::ostringstream result;
     result << "\n" << indent() << "# Define layers\n";
     result << std::setprecision(12);
@@ -137,6 +139,11 @@ std::string defineLayers(const ComponentKeyHandler& objHandler,
         result << indent() << key << " = ba.Layer(" << matHandler.mat2key(s->material());
         if (s->thickness() != 0)
             result << ", " << Py::Fmt::printNm(s->thickness());
+
+        const LayerRoughness* rough = s->roughness();
+        if (rough->showInScriptOrGui())
+            result << ", " << objHandler.obj2key(rough);
+
         result << ")\n";
         if (s->numberOfSlices() != 1)
             result << indent() << key << ".setNumberOfSlices(" << s->numberOfSlices() << ")\n";
@@ -533,13 +540,6 @@ std::string defineMultiLayers(const ComponentKeyHandler& objHandler)
 
             size_t i_layer = 1;
             while (i_layer != numberOfLayers) {
-                const LayerInterface* layerInterface = s->layerInterface(i_layer - 1);
-                const LayerRoughness* rough = layerInterface->roughness();
-                if (rough->showInScriptOrGui())
-                    result << indent() << key << ".addLayerWithTopRoughness("
-                           << objHandler.obj2key(s->layer(i_layer)) << ", "
-                           << objHandler.obj2key(rough) << ")\n";
-                else
                     result << indent() << key << ".addLayer("
                            << objHandler.obj2key(s->layer(i_layer)) << ")\n";
                 i_layer++;
diff --git a/Tests/Unit/Resample/RTTest.cpp b/Tests/Unit/Resample/RTTest.cpp
index ef086de2ee6..db8ee083241 100644
--- a/Tests/Unit/Resample/RTTest.cpp
+++ b/Tests/Unit/Resample/RTTest.cpp
@@ -3,7 +3,6 @@
 #include "Resample/Processed/ReSample.h"
 #include "Resample/Specular/ComputeFluxScalar.h"
 #include "Sample/Aggregate/ParticleLayout.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Multilayer/Layer.h"
@@ -39,8 +38,8 @@ protected:
     const Material amat = RefractiveMaterial("material A", 2e-6, 8e-7);
     const Material bmat = RefractiveMaterial("material B (high absorption)", 3e-5, 2e-4);
     const Material stone = RefractiveMaterial("substrate material", 1e-6, 1e-7);
-    const Layer topLayer{air, 0};
-    const Layer substrate{stone, 0};
+    const Layer topLayer{air};
+    const Layer substrate{stone};
     const R3 k{1, 0, -1e-3};
     MultiLayer sample1, sample2;
     std::vector<ScalarFlux> coeffs1, coeffs2;
diff --git a/Tests/Unit/Sample/MultiLayerTest.cpp b/Tests/Unit/Sample/MultiLayerTest.cpp
index d03a2e642ec..7d2e0c19985 100644
--- a/Tests/Unit/Sample/MultiLayerTest.cpp
+++ b/Tests/Unit/Sample/MultiLayerTest.cpp
@@ -2,7 +2,6 @@
 
 #include "Base/Const/Units.h"
 #include "Sample/Aggregate/ParticleLayout.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Material/MaterialFactoryFuncs.h"
 #include "Sample/Multilayer/Layer.h"
@@ -84,20 +83,17 @@ TEST_F(MultiLayerTest, LayerInterfaces)
     set_four();
 
     // check interfaces
-    const LayerInterface* interface0 = mLayer.layerInterface(0);
-    EXPECT_TRUE(nullptr != interface0);
-    EXPECT_TRUE(nullptr != interface0->roughness());
-    EXPECT_EQ(mLayer.layerInterfaceRMS(0), 0.0);
-
-    const LayerInterface* interface1 = mLayer.layerInterface(1);
-    EXPECT_TRUE(nullptr != interface1);
-    EXPECT_TRUE(nullptr != interface1->roughness());
-    EXPECT_EQ(mLayer.layerInterfaceRMS(1), 0.0);
-
-    const LayerInterface* interface2 = mLayer.layerInterface(2);
-    EXPECT_TRUE(nullptr != interface2);
-    EXPECT_TRUE(nullptr != interface2->roughness());
-    EXPECT_EQ(mLayer.layerInterfaceRMS(2), 0.0);
+    const LayerRoughness* roughness1 = mLayer.layerRoughness(1);
+    EXPECT_TRUE(nullptr != roughness1);
+    EXPECT_EQ(mLayer.layerRoughnessRMS(1), 0.0);
+
+    const LayerRoughness* roughness2 = mLayer.layerRoughness(2);
+    EXPECT_TRUE(nullptr != roughness2);
+    EXPECT_EQ(mLayer.layerRoughnessRMS(2), 0.0);
+
+    const LayerRoughness* roughness3 = mLayer.layerRoughness(3);
+    EXPECT_TRUE(nullptr != roughness3);
+    EXPECT_EQ(mLayer.layerRoughnessRMS(3), 0.0);
 }
 
 TEST_F(MultiLayerTest, Clone)
@@ -116,23 +112,20 @@ TEST_F(MultiLayerTest, Clone)
     EXPECT_EQ(substrate.thickness(), mLayerClone->layer(3)->thickness());
 
     // check interfaces
-    const LayerInterface* interface0 = mLayerClone->layerInterface(0);
-    EXPECT_TRUE(nullptr != interface0);
-    EXPECT_TRUE(nullptr != interface0->roughness());
-    EXPECT_EQ(mLayerClone->layerInterfaceRMS(0), 0.0);
-    EXPECT_TRUE(nullptr == interface0->roughness()->crosscorrelationModel());
-
-    const LayerInterface* interface1 = mLayerClone->layerInterface(1);
-    EXPECT_TRUE(nullptr != interface1);
-    EXPECT_TRUE(nullptr != interface1->roughness());
-    EXPECT_EQ(mLayerClone->layerInterfaceRMS(1), 0.0);
-    EXPECT_TRUE(nullptr == interface1->roughness()->crosscorrelationModel());
-
-    const LayerInterface* interface2 = mLayerClone->layerInterface(2);
-    EXPECT_TRUE(nullptr != interface2);
-    EXPECT_TRUE(nullptr != interface2->roughness());
-    EXPECT_EQ(mLayerClone->layerInterfaceRMS(2), 0.0);
-    EXPECT_TRUE(nullptr == interface2->roughness()->crosscorrelationModel());
+    const LayerRoughness* roughness0 = mLayerClone->layerRoughness(0);
+    EXPECT_TRUE(nullptr != roughness0);
+    EXPECT_EQ(mLayerClone->layerRoughnessRMS(0), 0.0);
+    EXPECT_TRUE(nullptr == roughness0->crosscorrelationModel());
+
+    const LayerRoughness* roughness1 = mLayerClone->layerRoughness(1);
+    EXPECT_TRUE(nullptr != roughness1);
+    EXPECT_EQ(mLayerClone->layerRoughnessRMS(1), 0.0);
+    EXPECT_TRUE(nullptr == roughness1->crosscorrelationModel());
+
+    const LayerRoughness* roughness2 = mLayerClone->layerRoughness(2);
+    EXPECT_TRUE(nullptr != roughness2);
+    EXPECT_EQ(mLayerClone->layerRoughnessRMS(2), 0.0);
+    EXPECT_TRUE(nullptr == roughness2->crosscorrelationModel());
 
     delete mLayerClone;
 }
@@ -142,71 +135,67 @@ TEST_F(MultiLayerTest, WithRoughness)
     K_CorrelationModel autocorrelation(1.1, .3, 0.1, 1e100);
     ErfInterlayer interlayer;
     LayerRoughness lr(&autocorrelation, &interlayer);
+
     mLayer.addLayer(topLayer);
-    mLayer.addLayerWithTopRoughness(layer1, lr);
+    mLayer.addLayer(Layer(*layer1.material(), layer1.thickness(), &lr));
     mLayer.addLayer(substrate);
 
-    const LayerInterface* interface0 = mLayer.layerInterface(0);
-    const LayerInterface* interface1 = mLayer.layerInterface(1);
-
-    const LayerRoughness* roughness0 = interface0->roughness();
-    const LayerRoughness* roughness1 = interface1->roughness();
+    const LayerRoughness* roughness0 = mLayer.layerRoughness(1);
+    const LayerRoughness* roughness1 = mLayer.layerRoughness(2);
 
     EXPECT_TRUE(roughness0);
     auto* roughness0_AC =
         dynamic_cast<const K_CorrelationModel*>(roughness0->autocorrelationModel());
     EXPECT_TRUE(roughness0_AC);
 
-    EXPECT_EQ(1.1, mLayer.layerInterfaceRMS(0));
+    EXPECT_EQ(1.1, mLayer.layerRoughnessRMS(1));
     EXPECT_EQ(.3, roughness0_AC->hurst());
     EXPECT_EQ(0.1, roughness0_AC->lateralCorrLength());
 
     EXPECT_TRUE(roughness1);
-    EXPECT_EQ(mLayer.layerInterfaceRMS(1), 0.0);
+    EXPECT_EQ(mLayer.layerRoughnessRMS(2), 0.0);
 }
 
 TEST_F(MultiLayerTest, CloneWithRoughness)
 {
     ErfInterlayer interlayer;
 
-    K_CorrelationModel autocorrelation0(2.1, .3, 12.1, 1e100);
-    LayerRoughness lr0(&autocorrelation0, &interlayer);
-    K_CorrelationModel autocorrelation1(1.1, .3, 0.1, 1e100);
+    K_CorrelationModel autocorrelation1(2.1, .3, 12.1, 1e100);
     LayerRoughness lr1(&autocorrelation1, &interlayer);
+    K_CorrelationModel autocorrelation2(1.1, .3, 0.1, 1e100);
+    LayerRoughness lr2(&autocorrelation2, &interlayer);
 
     auto magnetization = R3{0., 1e8, 0.};
     auto magneticLayer =
         Layer(RefractiveMaterial("iron", 2e-5, 8e-5, magnetization), 20 * Units::nm);
 
     mLayer.addLayer(topLayer);
-    mLayer.addLayerWithTopRoughness(magneticLayer, lr0);
-    mLayer.addLayerWithTopRoughness(substrate, lr1);
+    mLayer.addLayer(Layer(*magneticLayer.material(), magneticLayer.thickness(), &lr1));
+    mLayer.addLayer(Layer(*substrate.material(), substrate.thickness(), &lr2));
 
     MultiLayer* mLayerClone = mLayer.clone();
 
-    const LayerInterface* interface0 = mLayerClone->layerInterface(0);
-    const LayerInterface* interface1 = mLayerClone->layerInterface(1);
-    const LayerRoughness* roughness0 = interface0->roughness();
-    const LayerRoughness* roughness1 = interface1->roughness();
+    const LayerRoughness* roughness1 = mLayerClone->layerRoughness(1);
+    const LayerRoughness* roughness2 = mLayerClone->layerRoughness(2);
 
-    EXPECT_TRUE(roughness0);
     EXPECT_TRUE(roughness1);
-
-    auto* roughness0_AC =
-        dynamic_cast<const K_CorrelationModel*>(roughness0->autocorrelationModel());
-    EXPECT_TRUE(roughness0_AC);
-
-    EXPECT_EQ(2.1, mLayerClone->layerInterfaceRMS(0));
-    EXPECT_EQ(.3, roughness0_AC->hurst());
-    EXPECT_EQ(12.1, roughness0_AC->lateralCorrLength());
+    EXPECT_TRUE(roughness2);
 
     auto* roughness1_AC =
         dynamic_cast<const K_CorrelationModel*>(roughness1->autocorrelationModel());
     EXPECT_TRUE(roughness1_AC);
 
-    EXPECT_EQ(1.1, mLayerClone->layerInterfaceRMS(1));
+    EXPECT_EQ(2.1, mLayerClone->layerRoughnessRMS(1));
     EXPECT_EQ(.3, roughness1_AC->hurst());
-    EXPECT_EQ(0.1, roughness1_AC->lateralCorrLength());
+    EXPECT_EQ(12.1, roughness1_AC->lateralCorrLength());
+
+    auto* roughness2_AC =
+        dynamic_cast<const K_CorrelationModel*>(roughness2->autocorrelationModel());
+    EXPECT_TRUE(roughness2_AC);
+
+    EXPECT_EQ(1.1, mLayerClone->layerRoughnessRMS(2));
+    EXPECT_EQ(.3, roughness2_AC->hurst());
+    EXPECT_EQ(0.1, roughness2_AC->lateralCorrLength());
 
     EXPECT_EQ(mLayerClone->layer(1)->material()->isMagneticMaterial(), true);
     EXPECT_EQ(mLayerClone->layer(1)->material()->magnetization(), magnetization);
@@ -233,26 +222,18 @@ TEST_F(MultiLayerTest, MultiLayerComposite)
     mLayer.addLayer(layer4);
 
     std::vector<const Layer*> layer_buffer;
-    std::vector<const LayerInterface*> interface_buffer;
     int counter(0);
 
     std::vector<const INode*> children = mLayer.nodeChildren();
     for (const auto* sample : children) {
-        if (counter % 2 == 1) {
-            const auto* interface = dynamic_cast<const LayerInterface*>(sample);
-            EXPECT_TRUE(nullptr != interface);
-            interface_buffer.push_back(interface);
-        } else {
+        if (counter % 2 == 0) {
             const auto* layer = dynamic_cast<const Layer*>(sample);
             EXPECT_TRUE(nullptr != layer);
             layer_buffer.push_back(layer);
         }
         counter++;
     }
-    EXPECT_EQ(size_t(5), layer_buffer.size());
-    EXPECT_EQ(size_t(4), interface_buffer.size());
+    EXPECT_EQ(size_t(3), layer_buffer.size());
     for (size_t i = 0; i < layer_buffer.size(); ++i)
-        EXPECT_EQ(double(i * 10), layer_buffer[i]->thickness());
-    for (size_t i = 0; i < interface_buffer.size(); ++i)
-        EXPECT_EQ(double((i + 1) * 10), layer_buffer[i + 1]->thickness());
+        EXPECT_EQ(double(i * 20), layer_buffer[i]->thickness());
 }
diff --git a/Wrap/Swig/libBornAgainSample.i b/Wrap/Swig/libBornAgainSample.i
index 2e0e86dcb8c..e81f05a2da2 100644
--- a/Wrap/Swig/libBornAgainSample.i
+++ b/Wrap/Swig/libBornAgainSample.i
@@ -53,7 +53,6 @@
 #include "Sample/Particle/Particle.h"
 #include "Sample/Particle/Compound.h"
 #include "Sample/Particle/CoreAndShell.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Interface/RoughnessMap.h"
 #include "Sample/Scattering/Rotations.h"
diff --git a/auto/Examples/fit/scatter2d/expfit_galaxi.py b/auto/Examples/fit/scatter2d/expfit_galaxi.py
index 29be6f67614..7c714b29a60 100755
--- a/auto/Examples/fit/scatter2d/expfit_galaxi.py
+++ b/auto/Examples/fit/scatter2d/expfit_galaxi.py
@@ -76,16 +76,16 @@ def get_sample(P):
 
     # layers
     vacuum_layer = ba.Layer(vacuum)
-    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness)
+    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness, r_hmdso)
     hmdso_layer.addLayout(layout)
-    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness)
+    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness, r_ptfe)
     substrate_layer = ba.Layer(material_Si)
 
     # assembling sample
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
-    sample.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+    sample.addLayer(hmdso_layer)
+    sample.addLayer(ptfe_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/Examples/fit/scatter2d/hardcode_galaxi.py b/auto/Examples/fit/scatter2d/hardcode_galaxi.py
index 1936b6ddcb7..dce5578cbb5 100755
--- a/auto/Examples/fit/scatter2d/hardcode_galaxi.py
+++ b/auto/Examples/fit/scatter2d/hardcode_galaxi.py
@@ -58,16 +58,16 @@ def get_sample():
 
     # layers
     vacuum_layer = ba.Layer(vacuum)
-    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness)
+    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness, r_hmdso)
     hmdso_layer.addLayout(layout)
-    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness)
+    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness, r_ptfe)
     substrate_layer = ba.Layer(material_Si)
 
     # assembling sample
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
-    sample.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+    sample.addLayer(hmdso_layer)
+    sample.addLayer(ptfe_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/Examples/fit/specular/Honeycomb_fit.py b/auto/Examples/fit/specular/Honeycomb_fit.py
index 34ce24986a7..5e7c1d4115d 100755
--- a/auto/Examples/fit/specular/Honeycomb_fit.py
+++ b/auto/Examples/fit/specular/Honeycomb_fit.py
@@ -42,13 +42,6 @@ def get_sample(P, sign, T):
     material_Si = ba.MaterialBySLD("Substrate", P["sld_Si_real"]*1e-6,
                                    P["sld_Si_imag"]*1e-6)
 
-    l_Air = ba.Layer(material_Air)
-    l_PyOx = ba.Layer(material_PyOx, P["t_PyOx"]*angstrom)
-    l_Py2 = ba.Layer(material_Py2, P["t_Py2"]*angstrom)
-    l_Py1 = ba.Layer(material_Py1, P["t_Py1"]*angstrom)
-    l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom)
-    l_Si = ba.Layer(material_Si)
-
     interlayer_model = ba.ErfInterlayer()
 
     rPyOx_autocorr = ba.K_CorrelationModel(P["rPyOx"]*angstrom)
@@ -62,14 +55,22 @@ def get_sample(P, sign, T):
     rPy1 = ba.LayerRoughness(rPy1_autocorr, interlayer_model)
     rSiO2 = ba.LayerRoughness(rSiO2_autocorr, interlayer_model)
     rSi = ba.LayerRoughness(rSi_autocorr, interlayer_model)
+        
+    l_Air = ba.Layer(material_Air)
+    l_PyOx = ba.Layer(material_PyOx, P["t_PyOx"]*angstrom, rPyOx)
+    l_Py2 = ba.Layer(material_Py2, P["t_Py2"]*angstrom, rPy2)
+    l_Py1 = ba.Layer(material_Py1, P["t_Py1"]*angstrom, rPy1)
+    l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom, rSiO2)
+    l_Si = ba.Layer(material_Si, rSi)
+
     sample = ba.MultiLayer()
 
     sample.addLayer(l_Air)
-    sample.addLayerWithTopRoughness(l_PyOx, rPyOx)
-    sample.addLayerWithTopRoughness(l_Py2, rPy2)
-    sample.addLayerWithTopRoughness(l_Py1, rPy1)
-    sample.addLayerWithTopRoughness(l_SiO2, rSiO2)
-    sample.addLayerWithTopRoughness(l_Si, rSi)
+    sample.addLayer(l_PyOx)
+    sample.addLayer(l_Py2)
+    sample.addLayer(l_Py1)
+    sample.addLayer(l_SiO2)
+    sample.addLayer(l_Si)
 
     return sample
 
diff --git a/auto/Examples/fit/specular/PolarizedSpinAsymmetry.py b/auto/Examples/fit/specular/PolarizedSpinAsymmetry.py
index 4c2edb5c23d..824c2d3761d 100755
--- a/auto/Examples/fit/specular/PolarizedSpinAsymmetry.py
+++ b/auto/Examples/fit/specular/PolarizedSpinAsymmetry.py
@@ -47,10 +47,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("(Mg,Al,Fe)3O4", P["rho_Mafo"]*1e-6, 0, B)
     material_substrate = ba.MaterialBySLD("MgAl2O4", *sldMao)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     r_Mafo_autocorr = ba.K_CorrelationModel(P["r_Mafo"]*angstrom)
     r_substrate_autocorr = ba.K_CorrelationModel(P["r_Mao"]*angstrom)
 
@@ -59,10 +55,14 @@ def get_sample(P):
     r_Mafo = ba.LayerRoughness(r_Mafo_autocorr, interlayer)
     r_substrate = ba.LayerRoughness(r_substrate_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom, r_Mafo)
+    substrate_layer = ba.Layer(material_substrate, r_substrate)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_Mafo)
-    sample.addLayerWithTopRoughness(substrate_layer, r_substrate)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/Examples/fit/specular/Pt_layer_fit.py b/auto/Examples/fit/specular/Pt_layer_fit.py
index 759eb516ed6..44875ce8c49 100755
--- a/auto/Examples/fit/specular/Pt_layer_fit.py
+++ b/auto/Examples/fit/specular/Pt_layer_fit.py
@@ -28,10 +28,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("Pt", *sldPt)
     material_substrate = ba.MaterialBySLD("Si", *sldSi)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_pt/nm"])
-    substrate_layer = ba.Layer(material_substrate)
-
     interlayer = ba.TanhInterlayer()
 
     si_autocorr = ba.K_CorrelationModel(P["r_si/nm"])
@@ -40,11 +36,14 @@ def get_sample(P):
     r_si = ba.LayerRoughness(si_autocorr, interlayer)
     r_pt = ba.LayerRoughness(pt_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_pt/nm"], r_pt)
+    substrate_layer = ba.Layer(material_substrate, r_si)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_pt)
-
-    sample.addLayerWithTopRoughness(substrate_layer, r_si)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/Examples/fit/specular/TREFF_Ni_film.py b/auto/Examples/fit/specular/TREFF_Ni_film.py
index 436eba87aa2..e49b70eba97 100755
--- a/auto/Examples/fit/specular/TREFF_Ni_film.py
+++ b/auto/Examples/fit/specular/TREFF_Ni_film.py
@@ -24,22 +24,21 @@ def get_sample(P):
     material_SiO2 = ba.MaterialBySLD("SiO2", 2.0704e-06, 0)
 
     # Layers and interfaces
-    layer_Ni = ba.Layer(material_Ni_58, P["thickness"])
-
     interlayer = ba.TanhInterlayer()
 
     Ni_autocorr = ba.K_CorrelationModel(P["sigma_Ni"])
     roughness_Ni = ba.LayerRoughness(Ni_autocorr, interlayer)
 
-    substrate = ba.Layer(material_SiO2)
-
     sub_autocorr = ba.K_CorrelationModel(P["sigma_Substrate"])
     roughness_Substrate = ba.LayerRoughness(sub_autocorr, interlayer)
+    
+    layer_Ni = ba.Layer(material_Ni_58, P["thickness"], roughness_Ni)
+    substrate = ba.Layer(material_SiO2, roughness_Substrate)
 
     sample = ba.MultiLayer()
     sample.addLayer(ba.Layer(vacuum))
-    sample.addLayerWithTopRoughness(layer_Ni, roughness_Ni)
-    sample.addLayerWithTopRoughness(substrate, roughness_Substrate)
+    sample.addLayer(layer_Ni)
+    sample.addLayer(substrate)
 
     return sample
 
diff --git a/auto/Examples/scatter2d/CorrelatedRoughness.py b/auto/Examples/scatter2d/CorrelatedRoughness.py
index de6876e58f1..8fcbd4d6bfa 100755
--- a/auto/Examples/scatter2d/CorrelatedRoughness.py
+++ b/auto/Examples/scatter2d/CorrelatedRoughness.py
@@ -17,18 +17,19 @@ def get_sample():
     material_part_b = ba.RefractiveMaterial("PartB", 10e-6, 0)
     material_substrate = ba.RefractiveMaterial("substrate", 15e-6, 0)
 
-    # defining layers
-    l_ambience = ba.Layer(vacuum)
-    l_part_a = ba.Layer(material_part_a, 2.5*nm)
-    l_part_b = ba.Layer(material_part_b, 5*nm)
-    l_substrate = ba.Layer(material_substrate)
-
+    # defining roughenss
     sigma, hurst, corrLength = 1*nm, 0.3, 5*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     crosscorrelation = ba.CommonDepthCrosscorrelation(10*nm)
     roughness = ba.LayerRoughness(autocorr, interlayer, crosscorrelation)
 
+    # defining layers
+    l_ambience = ba.Layer(vacuum)
+    l_part_a = ba.Layer(material_part_a, 2.5*nm, roughness)
+    l_part_b = ba.Layer(material_part_b, 5*nm, roughness)
+    l_substrate = ba.Layer(material_substrate, roughness)
+
     my_sample = ba.MultiLayer()
 
     # adding layers
@@ -36,10 +37,10 @@ def get_sample():
 
     n_repetitions = 5
     for _ in range(n_repetitions):
-        my_sample.addLayerWithTopRoughness(l_part_a, roughness)
-        my_sample.addLayerWithTopRoughness(l_part_b, roughness)
+        my_sample.addLayer(l_part_a)
+        my_sample.addLayer(l_part_b)
 
-    my_sample.addLayerWithTopRoughness(l_substrate, roughness)
+    my_sample.addLayer(l_substrate)
 
     return my_sample
 
diff --git a/auto/Examples/scatter2d/FindPeaks.py b/auto/Examples/scatter2d/FindPeaks.py
index cb9833311e8..585266ed7a4 100755
--- a/auto/Examples/scatter2d/FindPeaks.py
+++ b/auto/Examples/scatter2d/FindPeaks.py
@@ -36,19 +36,19 @@ def get_sample(lattice_rotation_angle=0*deg):
     particle_layout.addParticle(box)
     particle_layout.setInterference(interference)
 
-    # assembling the sample
-    vacuum_layer = ba.Layer(ba.Vacuum())
-    vacuum_layer.addLayout(particle_layout)
-    substrate_layer = ba.Layer(material_si)
-
     sigma, hurst, corrLength = 5*nm, 0.5, 10*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # assembling the sample
+    vacuum_layer = ba.Layer(ba.Vacuum())
+    vacuum_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(material_si, roughness)
+
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+    sample.addLayer(substrate_layer)
     return sample
 
 
diff --git a/auto/Examples/scatter2d/RectangularGrating.py b/auto/Examples/scatter2d/RectangularGrating.py
index 83614489f14..ac3cff679d8 100755
--- a/auto/Examples/scatter2d/RectangularGrating.py
+++ b/auto/Examples/scatter2d/RectangularGrating.py
@@ -36,19 +36,19 @@ def get_sample(lattice_rotation_angle=0*deg):
     particle_layout.addParticle(box)
     particle_layout.setInterference(interference)
 
-    # Sample
-    vacuum_layer = ba.Layer(vacuum)
-    vacuum_layer.addLayout(particle_layout)
-    substrate_layer = ba.Layer(material_si)
-
     sigma, hurst, corrLength = 5*nm, 0.5, 10*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Sample
+    vacuum_layer = ba.Layer(vacuum)
+    vacuum_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(material_si, roughness)
+
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+    sample.addLayer(substrate_layer)
     return sample
 
 
diff --git a/auto/Examples/scatter2d/RoughAndSpecular.py b/auto/Examples/scatter2d/RoughAndSpecular.py
index 5747ec9ad94..f61f9b5e908 100755
--- a/auto/Examples/scatter2d/RoughAndSpecular.py
+++ b/auto/Examples/scatter2d/RoughAndSpecular.py
@@ -22,15 +22,15 @@ def get_sample():
 
     # Define layers
     layer_1 = ba.Layer(material_Vacuum)
-    layer_2 = ba.Layer(material_HMDSO, 18.5*nm)
-    layer_3 = ba.Layer(material_PTFE, 22.1*nm)
+    layer_2 = ba.Layer(material_HMDSO, 18.5*nm, roughness_1)
+    layer_3 = ba.Layer(material_PTFE, 22.1*nm, roughness_2)
     layer_4 = ba.Layer(material_Si)
 
     # Define sample
     sample = ba.MultiLayer()
     sample.addLayer(layer_1)
-    sample.addLayerWithTopRoughness(layer_2, roughness_1)
-    sample.addLayerWithTopRoughness(layer_3, roughness_2)
+    sample.addLayer(layer_2)
+    sample.addLayer(layer_3)
     sample.addLayer(layer_4)
 
     return sample
diff --git a/auto/Examples/specular/MagneticLayerImperfect.py b/auto/Examples/specular/MagneticLayerImperfect.py
index ff255726ade..edd0d85e0ad 100755
--- a/auto/Examples/specular/MagneticLayerImperfect.py
+++ b/auto/Examples/specular/MagneticLayerImperfect.py
@@ -20,22 +20,22 @@ def get_sample():
     material_Fe = ba.MaterialBySLD("Fe", 8.0241e-06, 6.0448e-10, B)
     material_substrate = ba.MaterialBySLD("MgO", 5.9803e-06, 9.3996e-12)
 
-    # Layers
-    layer_vacuum = ba.Layer(vacuum)
-    layer_Pd = ba.Layer(material_Pd, 120*angstrom)
-    layer_Fe = ba.Layer(material_Fe, 1000*angstrom)
-    layer_substrate = ba.Layer(material_substrate)
-
     autocorr = ba.K_CorrelationModel(20*angstrom)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Layers
+    layer_vacuum = ba.Layer(vacuum)
+    layer_Pd = ba.Layer(material_Pd, 120*angstrom, roughness)
+    layer_Fe = ba.Layer(material_Fe, 1000*angstrom, roughness)
+    layer_substrate = ba.Layer(material_substrate, roughness)
+
     # Multilayer
     sample = ba.MultiLayer()
     sample.addLayer(layer_vacuum)
-    sample.addLayerWithTopRoughness(layer_Pd, roughness)
-    sample.addLayerWithTopRoughness(layer_Fe, roughness)
-    sample.addLayerWithTopRoughness(layer_substrate, roughness)
+    sample.addLayer(layer_Pd)
+    sample.addLayer(layer_Fe)
+    sample.addLayer(layer_substrate)
 
     return sample
 
diff --git a/auto/Examples/specular/PolarizedSpinAsymmetry.py b/auto/Examples/specular/PolarizedSpinAsymmetry.py
index 3d696268a6a..d130ba14f72 100755
--- a/auto/Examples/specular/PolarizedSpinAsymmetry.py
+++ b/auto/Examples/specular/PolarizedSpinAsymmetry.py
@@ -48,10 +48,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("(Mg,Al,Fe)3O4", P["rho_Mafo"]*1e-6, 0, B)
     material_substrate = ba.MaterialBySLD("MgAl2O4", *sldMao)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     r_Mafo_autocorr = ba.K_CorrelationModel(P["r_Mafo"]*angstrom)
     r_sub_autocorr = ba.K_CorrelationModel(P["r_Mao"]*angstrom)
 
@@ -60,10 +56,14 @@ def get_sample(P):
     r_Mafo = ba.LayerRoughness(r_Mafo_autocorr, interlayer)
     r_substrate = ba.LayerRoughness(r_sub_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom, r_Mafo)
+    substrate_layer = ba.Layer(material_substrate, r_substrate)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_Mafo)
-    sample.addLayerWithTopRoughness(substrate_layer, r_substrate)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/Examples/specular/RoughnessModel.py b/auto/Examples/specular/RoughnessModel.py
index caa32713291..b8ce9056563 100755
--- a/auto/Examples/specular/RoughnessModel.py
+++ b/auto/Examples/specular/RoughnessModel.py
@@ -16,23 +16,23 @@ def get_sample(interlayer):
     material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)
 
-    # create layers
-    ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     # Roughness
     autocorr = ba.K_CorrelationModel(10*angstrom)
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # create layers
+    ambient_layer = ba.Layer(vacuum)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
+    substrate_layer = ba.Layer(material_substrate, roughness)
+
     # create sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     for _ in range(10):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/Examples/specular/SpecularSimulationWithRoughness.py b/auto/Examples/specular/SpecularSimulationWithRoughness.py
index d3a7fc2e37b..f53ff3d4bc4 100755
--- a/auto/Examples/specular/SpecularSimulationWithRoughness.py
+++ b/auto/Examples/specular/SpecularSimulationWithRoughness.py
@@ -16,23 +16,24 @@ def get_sample():
     material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)
 
-    # Layers
-    ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
+    # roughness
     autocorr = ba.K_CorrelationModel(1*nm)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Layers
+    ambient_layer = ba.Layer(vacuum)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
+    substrate_layer = ba.Layer(material_substrate, roughness)
+
     # Sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     for _ in range(10):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/Examples/varia/MaterialProfile.py b/auto/Examples/varia/MaterialProfile.py
index a6ea4b4b0fb..0d30e034cea 100755
--- a/auto/Examples/varia/MaterialProfile.py
+++ b/auto/Examples/varia/MaterialProfile.py
@@ -19,24 +19,25 @@ def get_sample():
     B_substrate = R3(1e8, 0, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0,
                                           B_substrate)
+    
+    # roughness
+    autocorr = ba.K_CorrelationModel(5*angstrom, 0.5, 10*angstrom)
+    interlayer = ba.TanhInterlayer()
+    roughness = ba.LayerRoughness(autocorr, interlayer)
 
     # layers
     ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
     substrate_layer = ba.Layer(material_substrate)
 
     # sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     
-    autocorr = ba.K_CorrelationModel(5*angstrom, 0.5, 10*angstrom)
-    interlayer = ba.TanhInterlayer()
-    roughness = ba.LayerRoughness(autocorr, interlayer)
-    
     for _ in range(4):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/Examples/varia/RoughSurface.py b/auto/Examples/varia/RoughSurface.py
index 6f319b1e8ff..0f50e6bb9f0 100755
--- a/auto/Examples/varia/RoughSurface.py
+++ b/auto/Examples/varia/RoughSurface.py
@@ -55,11 +55,6 @@ def get_sample():
     material_layer = ba.RefractiveMaterial("layer", 5e-6, 0)
     material_substrate = ba.RefractiveMaterial("substrate", 15e-6, 0)
 
-    # defining layers
-    l_ambience = ba.Layer(vacuum)
-    l_layer = ba.Layer(material_layer, 25*nm)
-    l_substrate = ba.Layer(material_substrate)
-
     # defining roughness
     height_distribution = ba.ErfInterlayer()
     max_spat_freq = 0.5*nm
@@ -80,11 +75,16 @@ def get_sample():
     autocorr_sub = ba.K_CorrelationModel(sigma, alpha, xi, max_spat_freq)
     roughness_sub = ba.LayerRoughness(autocorr_sub, height_distribution)
 
+    # defining layers
+    l_ambience = ba.Layer(vacuum)
+    l_layer = ba.Layer(material_layer, 25*nm, roughness_layer)
+    l_substrate = ba.Layer(material_substrate, roughness_sub)
+
     # adding layers
     my_sample = ba.MultiLayer()
     my_sample.addLayer(l_ambience)
-    my_sample.addLayerWithTopRoughness(l_layer, roughness_layer)
-    my_sample.addLayerWithTopRoughness(l_substrate, roughness_sub)
+    my_sample.addLayer(l_layer)
+    my_sample.addLayer(l_substrate)
 
     return my_sample
 
diff --git a/auto/FigExamples/fit/scatter2d/expfit_galaxi.py b/auto/FigExamples/fit/scatter2d/expfit_galaxi.py
index 7b744666a99..e7f44ceb8c4 100755
--- a/auto/FigExamples/fit/scatter2d/expfit_galaxi.py
+++ b/auto/FigExamples/fit/scatter2d/expfit_galaxi.py
@@ -76,16 +76,16 @@ def get_sample(P):
 
     # layers
     vacuum_layer = ba.Layer(vacuum)
-    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness)
+    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness, r_hmdso)
     hmdso_layer.addLayout(layout)
-    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness)
+    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness, r_ptfe)
     substrate_layer = ba.Layer(material_Si)
 
     # assembling sample
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
-    sample.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+    sample.addLayer(hmdso_layer)
+    sample.addLayer(ptfe_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/FigExamples/fit/scatter2d/hardcode_galaxi.py b/auto/FigExamples/fit/scatter2d/hardcode_galaxi.py
index 1936b6ddcb7..dce5578cbb5 100755
--- a/auto/FigExamples/fit/scatter2d/hardcode_galaxi.py
+++ b/auto/FigExamples/fit/scatter2d/hardcode_galaxi.py
@@ -58,16 +58,16 @@ def get_sample():
 
     # layers
     vacuum_layer = ba.Layer(vacuum)
-    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness)
+    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness, r_hmdso)
     hmdso_layer.addLayout(layout)
-    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness)
+    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness, r_ptfe)
     substrate_layer = ba.Layer(material_Si)
 
     # assembling sample
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
-    sample.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+    sample.addLayer(hmdso_layer)
+    sample.addLayer(ptfe_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/FigExamples/fit/specular/Honeycomb_fit.py b/auto/FigExamples/fit/specular/Honeycomb_fit.py
index d2fd6fb2c2c..7b5937050a8 100755
--- a/auto/FigExamples/fit/specular/Honeycomb_fit.py
+++ b/auto/FigExamples/fit/specular/Honeycomb_fit.py
@@ -42,13 +42,6 @@ def get_sample(P, sign, T):
     material_Si = ba.MaterialBySLD("Substrate", P["sld_Si_real"]*1e-6,
                                    P["sld_Si_imag"]*1e-6)
 
-    l_Air = ba.Layer(material_Air)
-    l_PyOx = ba.Layer(material_PyOx, P["t_PyOx"]*angstrom)
-    l_Py2 = ba.Layer(material_Py2, P["t_Py2"]*angstrom)
-    l_Py1 = ba.Layer(material_Py1, P["t_Py1"]*angstrom)
-    l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom)
-    l_Si = ba.Layer(material_Si)
-
     interlayer_model = ba.ErfInterlayer()
 
     rPyOx_autocorr = ba.K_CorrelationModel(P["rPyOx"]*angstrom)
@@ -62,14 +55,22 @@ def get_sample(P, sign, T):
     rPy1 = ba.LayerRoughness(rPy1_autocorr, interlayer_model)
     rSiO2 = ba.LayerRoughness(rSiO2_autocorr, interlayer_model)
     rSi = ba.LayerRoughness(rSi_autocorr, interlayer_model)
+        
+    l_Air = ba.Layer(material_Air)
+    l_PyOx = ba.Layer(material_PyOx, P["t_PyOx"]*angstrom, rPyOx)
+    l_Py2 = ba.Layer(material_Py2, P["t_Py2"]*angstrom, rPy2)
+    l_Py1 = ba.Layer(material_Py1, P["t_Py1"]*angstrom, rPy1)
+    l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom, rSiO2)
+    l_Si = ba.Layer(material_Si, rSi)
+
     sample = ba.MultiLayer()
 
     sample.addLayer(l_Air)
-    sample.addLayerWithTopRoughness(l_PyOx, rPyOx)
-    sample.addLayerWithTopRoughness(l_Py2, rPy2)
-    sample.addLayerWithTopRoughness(l_Py1, rPy1)
-    sample.addLayerWithTopRoughness(l_SiO2, rSiO2)
-    sample.addLayerWithTopRoughness(l_Si, rSi)
+    sample.addLayer(l_PyOx)
+    sample.addLayer(l_Py2)
+    sample.addLayer(l_Py1)
+    sample.addLayer(l_SiO2)
+    sample.addLayer(l_Si)
 
     return sample
 
diff --git a/auto/FigExamples/fit/specular/PolarizedSpinAsymmetry.py b/auto/FigExamples/fit/specular/PolarizedSpinAsymmetry.py
index 48d5cd964c6..09a5b85ddc1 100755
--- a/auto/FigExamples/fit/specular/PolarizedSpinAsymmetry.py
+++ b/auto/FigExamples/fit/specular/PolarizedSpinAsymmetry.py
@@ -47,10 +47,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("(Mg,Al,Fe)3O4", P["rho_Mafo"]*1e-6, 0, B)
     material_substrate = ba.MaterialBySLD("MgAl2O4", *sldMao)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     r_Mafo_autocorr = ba.K_CorrelationModel(P["r_Mafo"]*angstrom)
     r_substrate_autocorr = ba.K_CorrelationModel(P["r_Mao"]*angstrom)
 
@@ -59,10 +55,14 @@ def get_sample(P):
     r_Mafo = ba.LayerRoughness(r_Mafo_autocorr, interlayer)
     r_substrate = ba.LayerRoughness(r_substrate_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom, r_Mafo)
+    substrate_layer = ba.Layer(material_substrate, r_substrate)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_Mafo)
-    sample.addLayerWithTopRoughness(substrate_layer, r_substrate)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/FigExamples/fit/specular/Pt_layer_fit.py b/auto/FigExamples/fit/specular/Pt_layer_fit.py
index f6ca20a4d9a..87ef4678a46 100755
--- a/auto/FigExamples/fit/specular/Pt_layer_fit.py
+++ b/auto/FigExamples/fit/specular/Pt_layer_fit.py
@@ -28,10 +28,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("Pt", *sldPt)
     material_substrate = ba.MaterialBySLD("Si", *sldSi)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_pt/nm"])
-    substrate_layer = ba.Layer(material_substrate)
-
     interlayer = ba.TanhInterlayer()
 
     si_autocorr = ba.K_CorrelationModel(P["r_si/nm"])
@@ -40,11 +36,14 @@ def get_sample(P):
     r_si = ba.LayerRoughness(si_autocorr, interlayer)
     r_pt = ba.LayerRoughness(pt_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_pt/nm"], r_pt)
+    substrate_layer = ba.Layer(material_substrate, r_si)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_pt)
-
-    sample.addLayerWithTopRoughness(substrate_layer, r_si)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/FigExamples/fit/specular/TREFF_Ni_film.py b/auto/FigExamples/fit/specular/TREFF_Ni_film.py
index 283b7dc9625..587f9362ca5 100755
--- a/auto/FigExamples/fit/specular/TREFF_Ni_film.py
+++ b/auto/FigExamples/fit/specular/TREFF_Ni_film.py
@@ -24,22 +24,21 @@ def get_sample(P):
     material_SiO2 = ba.MaterialBySLD("SiO2", 2.0704e-06, 0)
 
     # Layers and interfaces
-    layer_Ni = ba.Layer(material_Ni_58, P["thickness"])
-
     interlayer = ba.TanhInterlayer()
 
     Ni_autocorr = ba.K_CorrelationModel(P["sigma_Ni"])
     roughness_Ni = ba.LayerRoughness(Ni_autocorr, interlayer)
 
-    substrate = ba.Layer(material_SiO2)
-
     sub_autocorr = ba.K_CorrelationModel(P["sigma_Substrate"])
     roughness_Substrate = ba.LayerRoughness(sub_autocorr, interlayer)
+    
+    layer_Ni = ba.Layer(material_Ni_58, P["thickness"], roughness_Ni)
+    substrate = ba.Layer(material_SiO2, roughness_Substrate)
 
     sample = ba.MultiLayer()
     sample.addLayer(ba.Layer(vacuum))
-    sample.addLayerWithTopRoughness(layer_Ni, roughness_Ni)
-    sample.addLayerWithTopRoughness(substrate, roughness_Substrate)
+    sample.addLayer(layer_Ni)
+    sample.addLayer(substrate)
 
     return sample
 
diff --git a/auto/FigExamples/scatter2d/CorrelatedRoughness.py b/auto/FigExamples/scatter2d/CorrelatedRoughness.py
index 0561abf001e..b6277d248f7 100755
--- a/auto/FigExamples/scatter2d/CorrelatedRoughness.py
+++ b/auto/FigExamples/scatter2d/CorrelatedRoughness.py
@@ -17,18 +17,19 @@ def get_sample():
     material_part_b = ba.RefractiveMaterial("PartB", 10e-6, 0)
     material_substrate = ba.RefractiveMaterial("substrate", 15e-6, 0)
 
-    # defining layers
-    l_ambience = ba.Layer(vacuum)
-    l_part_a = ba.Layer(material_part_a, 2.5*nm)
-    l_part_b = ba.Layer(material_part_b, 5*nm)
-    l_substrate = ba.Layer(material_substrate)
-
+    # defining roughenss
     sigma, hurst, corrLength = 1*nm, 0.3, 5*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     crosscorrelation = ba.CommonDepthCrosscorrelation(10*nm)
     roughness = ba.LayerRoughness(autocorr, interlayer, crosscorrelation)
 
+    # defining layers
+    l_ambience = ba.Layer(vacuum)
+    l_part_a = ba.Layer(material_part_a, 2.5*nm, roughness)
+    l_part_b = ba.Layer(material_part_b, 5*nm, roughness)
+    l_substrate = ba.Layer(material_substrate, roughness)
+
     my_sample = ba.MultiLayer()
 
     # adding layers
@@ -36,10 +37,10 @@ def get_sample():
 
     n_repetitions = 5
     for _ in range(n_repetitions):
-        my_sample.addLayerWithTopRoughness(l_part_a, roughness)
-        my_sample.addLayerWithTopRoughness(l_part_b, roughness)
+        my_sample.addLayer(l_part_a)
+        my_sample.addLayer(l_part_b)
 
-    my_sample.addLayerWithTopRoughness(l_substrate, roughness)
+    my_sample.addLayer(l_substrate)
 
     return my_sample
 
diff --git a/auto/FigExamples/scatter2d/FindPeaks.py b/auto/FigExamples/scatter2d/FindPeaks.py
index 6d918bd201c..481f900f9d1 100755
--- a/auto/FigExamples/scatter2d/FindPeaks.py
+++ b/auto/FigExamples/scatter2d/FindPeaks.py
@@ -36,19 +36,19 @@ def get_sample(lattice_rotation_angle=0*deg):
     particle_layout.addParticle(box)
     particle_layout.setInterference(interference)
 
-    # assembling the sample
-    vacuum_layer = ba.Layer(ba.Vacuum())
-    vacuum_layer.addLayout(particle_layout)
-    substrate_layer = ba.Layer(material_si)
-
     sigma, hurst, corrLength = 5*nm, 0.5, 10*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # assembling the sample
+    vacuum_layer = ba.Layer(ba.Vacuum())
+    vacuum_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(material_si, roughness)
+
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+    sample.addLayer(substrate_layer)
     return sample
 
 
diff --git a/auto/FigExamples/scatter2d/RectangularGrating.py b/auto/FigExamples/scatter2d/RectangularGrating.py
index a70446e70ea..74504c8213b 100755
--- a/auto/FigExamples/scatter2d/RectangularGrating.py
+++ b/auto/FigExamples/scatter2d/RectangularGrating.py
@@ -36,19 +36,19 @@ def get_sample(lattice_rotation_angle=0*deg):
     particle_layout.addParticle(box)
     particle_layout.setInterference(interference)
 
-    # Sample
-    vacuum_layer = ba.Layer(vacuum)
-    vacuum_layer.addLayout(particle_layout)
-    substrate_layer = ba.Layer(material_si)
-
     sigma, hurst, corrLength = 5*nm, 0.5, 10*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Sample
+    vacuum_layer = ba.Layer(vacuum)
+    vacuum_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(material_si, roughness)
+
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+    sample.addLayer(substrate_layer)
     return sample
 
 
diff --git a/auto/FigExamples/scatter2d/RoughAndSpecular.py b/auto/FigExamples/scatter2d/RoughAndSpecular.py
index fdb0644de49..34ef03d1f99 100755
--- a/auto/FigExamples/scatter2d/RoughAndSpecular.py
+++ b/auto/FigExamples/scatter2d/RoughAndSpecular.py
@@ -22,15 +22,15 @@ def get_sample():
 
     # Define layers
     layer_1 = ba.Layer(material_Vacuum)
-    layer_2 = ba.Layer(material_HMDSO, 18.5*nm)
-    layer_3 = ba.Layer(material_PTFE, 22.1*nm)
+    layer_2 = ba.Layer(material_HMDSO, 18.5*nm, roughness_1)
+    layer_3 = ba.Layer(material_PTFE, 22.1*nm, roughness_2)
     layer_4 = ba.Layer(material_Si)
 
     # Define sample
     sample = ba.MultiLayer()
     sample.addLayer(layer_1)
-    sample.addLayerWithTopRoughness(layer_2, roughness_1)
-    sample.addLayerWithTopRoughness(layer_3, roughness_2)
+    sample.addLayer(layer_2)
+    sample.addLayer(layer_3)
     sample.addLayer(layer_4)
 
     return sample
diff --git a/auto/FigExamples/specular/MagneticLayerImperfect.py b/auto/FigExamples/specular/MagneticLayerImperfect.py
index 3e127287289..291bef064eb 100755
--- a/auto/FigExamples/specular/MagneticLayerImperfect.py
+++ b/auto/FigExamples/specular/MagneticLayerImperfect.py
@@ -20,22 +20,22 @@ def get_sample():
     material_Fe = ba.MaterialBySLD("Fe", 8.0241e-06, 6.0448e-10, B)
     material_substrate = ba.MaterialBySLD("MgO", 5.9803e-06, 9.3996e-12)
 
-    # Layers
-    layer_vacuum = ba.Layer(vacuum)
-    layer_Pd = ba.Layer(material_Pd, 120*angstrom)
-    layer_Fe = ba.Layer(material_Fe, 1000*angstrom)
-    layer_substrate = ba.Layer(material_substrate)
-
     autocorr = ba.K_CorrelationModel(20*angstrom)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Layers
+    layer_vacuum = ba.Layer(vacuum)
+    layer_Pd = ba.Layer(material_Pd, 120*angstrom, roughness)
+    layer_Fe = ba.Layer(material_Fe, 1000*angstrom, roughness)
+    layer_substrate = ba.Layer(material_substrate, roughness)
+
     # Multilayer
     sample = ba.MultiLayer()
     sample.addLayer(layer_vacuum)
-    sample.addLayerWithTopRoughness(layer_Pd, roughness)
-    sample.addLayerWithTopRoughness(layer_Fe, roughness)
-    sample.addLayerWithTopRoughness(layer_substrate, roughness)
+    sample.addLayer(layer_Pd)
+    sample.addLayer(layer_Fe)
+    sample.addLayer(layer_substrate)
 
     return sample
 
diff --git a/auto/FigExamples/specular/PolarizedSpinAsymmetry.py b/auto/FigExamples/specular/PolarizedSpinAsymmetry.py
index 3f60f0f3ac8..b8ec2ff1dc8 100755
--- a/auto/FigExamples/specular/PolarizedSpinAsymmetry.py
+++ b/auto/FigExamples/specular/PolarizedSpinAsymmetry.py
@@ -48,10 +48,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("(Mg,Al,Fe)3O4", P["rho_Mafo"]*1e-6, 0, B)
     material_substrate = ba.MaterialBySLD("MgAl2O4", *sldMao)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     r_Mafo_autocorr = ba.K_CorrelationModel(P["r_Mafo"]*angstrom)
     r_sub_autocorr = ba.K_CorrelationModel(P["r_Mao"]*angstrom)
 
@@ -60,10 +56,14 @@ def get_sample(P):
     r_Mafo = ba.LayerRoughness(r_Mafo_autocorr, interlayer)
     r_substrate = ba.LayerRoughness(r_sub_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom, r_Mafo)
+    substrate_layer = ba.Layer(material_substrate, r_substrate)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_Mafo)
-    sample.addLayerWithTopRoughness(substrate_layer, r_substrate)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/FigExamples/specular/RoughnessModel.py b/auto/FigExamples/specular/RoughnessModel.py
index dd42a718c6b..4699a7a31cd 100755
--- a/auto/FigExamples/specular/RoughnessModel.py
+++ b/auto/FigExamples/specular/RoughnessModel.py
@@ -16,23 +16,23 @@ def get_sample(interlayer):
     material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)
 
-    # create layers
-    ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     # Roughness
     autocorr = ba.K_CorrelationModel(10*angstrom)
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # create layers
+    ambient_layer = ba.Layer(vacuum)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
+    substrate_layer = ba.Layer(material_substrate, roughness)
+
     # create sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     for _ in range(10):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/FigExamples/specular/SpecularSimulationWithRoughness.py b/auto/FigExamples/specular/SpecularSimulationWithRoughness.py
index 0a4d9209236..305bfaab093 100755
--- a/auto/FigExamples/specular/SpecularSimulationWithRoughness.py
+++ b/auto/FigExamples/specular/SpecularSimulationWithRoughness.py
@@ -16,23 +16,24 @@ def get_sample():
     material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)
 
-    # Layers
-    ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
+    # roughness
     autocorr = ba.K_CorrelationModel(1*nm)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Layers
+    ambient_layer = ba.Layer(vacuum)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
+    substrate_layer = ba.Layer(material_substrate, roughness)
+
     # Sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     for _ in range(10):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/FigExamples/varia/MaterialProfile.py b/auto/FigExamples/varia/MaterialProfile.py
index a52132ee388..dc16882b36a 100755
--- a/auto/FigExamples/varia/MaterialProfile.py
+++ b/auto/FigExamples/varia/MaterialProfile.py
@@ -19,24 +19,25 @@ def get_sample():
     B_substrate = R3(1e8, 0, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0,
                                           B_substrate)
+    
+    # roughness
+    autocorr = ba.K_CorrelationModel(5*angstrom, 0.5, 10*angstrom)
+    interlayer = ba.TanhInterlayer()
+    roughness = ba.LayerRoughness(autocorr, interlayer)
 
     # layers
     ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
     substrate_layer = ba.Layer(material_substrate)
 
     # sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     
-    autocorr = ba.K_CorrelationModel(5*angstrom, 0.5, 10*angstrom)
-    interlayer = ba.TanhInterlayer()
-    roughness = ba.LayerRoughness(autocorr, interlayer)
-    
     for _ in range(4):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/FigExamples/varia/RoughSurface.py b/auto/FigExamples/varia/RoughSurface.py
index 181070ebdde..76ad9a64d7b 100755
--- a/auto/FigExamples/varia/RoughSurface.py
+++ b/auto/FigExamples/varia/RoughSurface.py
@@ -55,11 +55,6 @@ def get_sample():
     material_layer = ba.RefractiveMaterial("layer", 5e-6, 0)
     material_substrate = ba.RefractiveMaterial("substrate", 15e-6, 0)
 
-    # defining layers
-    l_ambience = ba.Layer(vacuum)
-    l_layer = ba.Layer(material_layer, 25*nm)
-    l_substrate = ba.Layer(material_substrate)
-
     # defining roughness
     height_distribution = ba.ErfInterlayer()
     max_spat_freq = 0.5*nm
@@ -80,11 +75,16 @@ def get_sample():
     autocorr_sub = ba.K_CorrelationModel(sigma, alpha, xi, max_spat_freq)
     roughness_sub = ba.LayerRoughness(autocorr_sub, height_distribution)
 
+    # defining layers
+    l_ambience = ba.Layer(vacuum)
+    l_layer = ba.Layer(material_layer, 25*nm, roughness_layer)
+    l_substrate = ba.Layer(material_substrate, roughness_sub)
+
     # adding layers
     my_sample = ba.MultiLayer()
     my_sample.addLayer(l_ambience)
-    my_sample.addLayerWithTopRoughness(l_layer, roughness_layer)
-    my_sample.addLayerWithTopRoughness(l_substrate, roughness_sub)
+    my_sample.addLayer(l_layer)
+    my_sample.addLayer(l_substrate)
 
     return my_sample
 
diff --git a/auto/MiniExamples/fit/scatter2d/expfit_galaxi.py b/auto/MiniExamples/fit/scatter2d/expfit_galaxi.py
index 7b744666a99..e7f44ceb8c4 100755
--- a/auto/MiniExamples/fit/scatter2d/expfit_galaxi.py
+++ b/auto/MiniExamples/fit/scatter2d/expfit_galaxi.py
@@ -76,16 +76,16 @@ def get_sample(P):
 
     # layers
     vacuum_layer = ba.Layer(vacuum)
-    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness)
+    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness, r_hmdso)
     hmdso_layer.addLayout(layout)
-    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness)
+    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness, r_ptfe)
     substrate_layer = ba.Layer(material_Si)
 
     # assembling sample
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
-    sample.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+    sample.addLayer(hmdso_layer)
+    sample.addLayer(ptfe_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/MiniExamples/fit/scatter2d/hardcode_galaxi.py b/auto/MiniExamples/fit/scatter2d/hardcode_galaxi.py
index 1936b6ddcb7..dce5578cbb5 100755
--- a/auto/MiniExamples/fit/scatter2d/hardcode_galaxi.py
+++ b/auto/MiniExamples/fit/scatter2d/hardcode_galaxi.py
@@ -58,16 +58,16 @@ def get_sample():
 
     # layers
     vacuum_layer = ba.Layer(vacuum)
-    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness)
+    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness, r_hmdso)
     hmdso_layer.addLayout(layout)
-    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness)
+    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness, r_ptfe)
     substrate_layer = ba.Layer(material_Si)
 
     # assembling sample
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
-    sample.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+    sample.addLayer(hmdso_layer)
+    sample.addLayer(ptfe_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/MiniExamples/fit/specular/Honeycomb_fit.py b/auto/MiniExamples/fit/specular/Honeycomb_fit.py
index d2fd6fb2c2c..7b5937050a8 100755
--- a/auto/MiniExamples/fit/specular/Honeycomb_fit.py
+++ b/auto/MiniExamples/fit/specular/Honeycomb_fit.py
@@ -42,13 +42,6 @@ def get_sample(P, sign, T):
     material_Si = ba.MaterialBySLD("Substrate", P["sld_Si_real"]*1e-6,
                                    P["sld_Si_imag"]*1e-6)
 
-    l_Air = ba.Layer(material_Air)
-    l_PyOx = ba.Layer(material_PyOx, P["t_PyOx"]*angstrom)
-    l_Py2 = ba.Layer(material_Py2, P["t_Py2"]*angstrom)
-    l_Py1 = ba.Layer(material_Py1, P["t_Py1"]*angstrom)
-    l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom)
-    l_Si = ba.Layer(material_Si)
-
     interlayer_model = ba.ErfInterlayer()
 
     rPyOx_autocorr = ba.K_CorrelationModel(P["rPyOx"]*angstrom)
@@ -62,14 +55,22 @@ def get_sample(P, sign, T):
     rPy1 = ba.LayerRoughness(rPy1_autocorr, interlayer_model)
     rSiO2 = ba.LayerRoughness(rSiO2_autocorr, interlayer_model)
     rSi = ba.LayerRoughness(rSi_autocorr, interlayer_model)
+        
+    l_Air = ba.Layer(material_Air)
+    l_PyOx = ba.Layer(material_PyOx, P["t_PyOx"]*angstrom, rPyOx)
+    l_Py2 = ba.Layer(material_Py2, P["t_Py2"]*angstrom, rPy2)
+    l_Py1 = ba.Layer(material_Py1, P["t_Py1"]*angstrom, rPy1)
+    l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom, rSiO2)
+    l_Si = ba.Layer(material_Si, rSi)
+
     sample = ba.MultiLayer()
 
     sample.addLayer(l_Air)
-    sample.addLayerWithTopRoughness(l_PyOx, rPyOx)
-    sample.addLayerWithTopRoughness(l_Py2, rPy2)
-    sample.addLayerWithTopRoughness(l_Py1, rPy1)
-    sample.addLayerWithTopRoughness(l_SiO2, rSiO2)
-    sample.addLayerWithTopRoughness(l_Si, rSi)
+    sample.addLayer(l_PyOx)
+    sample.addLayer(l_Py2)
+    sample.addLayer(l_Py1)
+    sample.addLayer(l_SiO2)
+    sample.addLayer(l_Si)
 
     return sample
 
diff --git a/auto/MiniExamples/fit/specular/PolarizedSpinAsymmetry.py b/auto/MiniExamples/fit/specular/PolarizedSpinAsymmetry.py
index 48d5cd964c6..09a5b85ddc1 100755
--- a/auto/MiniExamples/fit/specular/PolarizedSpinAsymmetry.py
+++ b/auto/MiniExamples/fit/specular/PolarizedSpinAsymmetry.py
@@ -47,10 +47,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("(Mg,Al,Fe)3O4", P["rho_Mafo"]*1e-6, 0, B)
     material_substrate = ba.MaterialBySLD("MgAl2O4", *sldMao)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     r_Mafo_autocorr = ba.K_CorrelationModel(P["r_Mafo"]*angstrom)
     r_substrate_autocorr = ba.K_CorrelationModel(P["r_Mao"]*angstrom)
 
@@ -59,10 +55,14 @@ def get_sample(P):
     r_Mafo = ba.LayerRoughness(r_Mafo_autocorr, interlayer)
     r_substrate = ba.LayerRoughness(r_substrate_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom, r_Mafo)
+    substrate_layer = ba.Layer(material_substrate, r_substrate)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_Mafo)
-    sample.addLayerWithTopRoughness(substrate_layer, r_substrate)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/MiniExamples/fit/specular/Pt_layer_fit.py b/auto/MiniExamples/fit/specular/Pt_layer_fit.py
index f6ca20a4d9a..87ef4678a46 100755
--- a/auto/MiniExamples/fit/specular/Pt_layer_fit.py
+++ b/auto/MiniExamples/fit/specular/Pt_layer_fit.py
@@ -28,10 +28,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("Pt", *sldPt)
     material_substrate = ba.MaterialBySLD("Si", *sldSi)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_pt/nm"])
-    substrate_layer = ba.Layer(material_substrate)
-
     interlayer = ba.TanhInterlayer()
 
     si_autocorr = ba.K_CorrelationModel(P["r_si/nm"])
@@ -40,11 +36,14 @@ def get_sample(P):
     r_si = ba.LayerRoughness(si_autocorr, interlayer)
     r_pt = ba.LayerRoughness(pt_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_pt/nm"], r_pt)
+    substrate_layer = ba.Layer(material_substrate, r_si)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_pt)
-
-    sample.addLayerWithTopRoughness(substrate_layer, r_si)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/MiniExamples/fit/specular/TREFF_Ni_film.py b/auto/MiniExamples/fit/specular/TREFF_Ni_film.py
index 2fd2ab16085..c86a05ce289 100755
--- a/auto/MiniExamples/fit/specular/TREFF_Ni_film.py
+++ b/auto/MiniExamples/fit/specular/TREFF_Ni_film.py
@@ -24,22 +24,21 @@ def get_sample(P):
     material_SiO2 = ba.MaterialBySLD("SiO2", 2.0704e-06, 0)
 
     # Layers and interfaces
-    layer_Ni = ba.Layer(material_Ni_58, P["thickness"])
-
     interlayer = ba.TanhInterlayer()
 
     Ni_autocorr = ba.K_CorrelationModel(P["sigma_Ni"])
     roughness_Ni = ba.LayerRoughness(Ni_autocorr, interlayer)
 
-    substrate = ba.Layer(material_SiO2)
-
     sub_autocorr = ba.K_CorrelationModel(P["sigma_Substrate"])
     roughness_Substrate = ba.LayerRoughness(sub_autocorr, interlayer)
+    
+    layer_Ni = ba.Layer(material_Ni_58, P["thickness"], roughness_Ni)
+    substrate = ba.Layer(material_SiO2, roughness_Substrate)
 
     sample = ba.MultiLayer()
     sample.addLayer(ba.Layer(vacuum))
-    sample.addLayerWithTopRoughness(layer_Ni, roughness_Ni)
-    sample.addLayerWithTopRoughness(substrate, roughness_Substrate)
+    sample.addLayer(layer_Ni)
+    sample.addLayer(substrate)
 
     return sample
 
diff --git a/auto/MiniExamples/scatter2d/CorrelatedRoughness.py b/auto/MiniExamples/scatter2d/CorrelatedRoughness.py
index dff362626ff..c5bf1e6fef5 100755
--- a/auto/MiniExamples/scatter2d/CorrelatedRoughness.py
+++ b/auto/MiniExamples/scatter2d/CorrelatedRoughness.py
@@ -17,18 +17,19 @@ def get_sample():
     material_part_b = ba.RefractiveMaterial("PartB", 10e-6, 0)
     material_substrate = ba.RefractiveMaterial("substrate", 15e-6, 0)
 
-    # defining layers
-    l_ambience = ba.Layer(vacuum)
-    l_part_a = ba.Layer(material_part_a, 2.5*nm)
-    l_part_b = ba.Layer(material_part_b, 5*nm)
-    l_substrate = ba.Layer(material_substrate)
-
+    # defining roughenss
     sigma, hurst, corrLength = 1*nm, 0.3, 5*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     crosscorrelation = ba.CommonDepthCrosscorrelation(10*nm)
     roughness = ba.LayerRoughness(autocorr, interlayer, crosscorrelation)
 
+    # defining layers
+    l_ambience = ba.Layer(vacuum)
+    l_part_a = ba.Layer(material_part_a, 2.5*nm, roughness)
+    l_part_b = ba.Layer(material_part_b, 5*nm, roughness)
+    l_substrate = ba.Layer(material_substrate, roughness)
+
     my_sample = ba.MultiLayer()
 
     # adding layers
@@ -36,10 +37,10 @@ def get_sample():
 
     n_repetitions = 5
     for _ in range(n_repetitions):
-        my_sample.addLayerWithTopRoughness(l_part_a, roughness)
-        my_sample.addLayerWithTopRoughness(l_part_b, roughness)
+        my_sample.addLayer(l_part_a)
+        my_sample.addLayer(l_part_b)
 
-    my_sample.addLayerWithTopRoughness(l_substrate, roughness)
+    my_sample.addLayer(l_substrate)
 
     return my_sample
 
diff --git a/auto/MiniExamples/scatter2d/FindPeaks.py b/auto/MiniExamples/scatter2d/FindPeaks.py
index e9ad574e646..c91d672cd90 100755
--- a/auto/MiniExamples/scatter2d/FindPeaks.py
+++ b/auto/MiniExamples/scatter2d/FindPeaks.py
@@ -36,19 +36,19 @@ def get_sample(lattice_rotation_angle=0*deg):
     particle_layout.addParticle(box)
     particle_layout.setInterference(interference)
 
-    # assembling the sample
-    vacuum_layer = ba.Layer(ba.Vacuum())
-    vacuum_layer.addLayout(particle_layout)
-    substrate_layer = ba.Layer(material_si)
-
     sigma, hurst, corrLength = 5*nm, 0.5, 10*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # assembling the sample
+    vacuum_layer = ba.Layer(ba.Vacuum())
+    vacuum_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(material_si, roughness)
+
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+    sample.addLayer(substrate_layer)
     return sample
 
 
diff --git a/auto/MiniExamples/scatter2d/RectangularGrating.py b/auto/MiniExamples/scatter2d/RectangularGrating.py
index 8b5d01caa96..e274965f772 100755
--- a/auto/MiniExamples/scatter2d/RectangularGrating.py
+++ b/auto/MiniExamples/scatter2d/RectangularGrating.py
@@ -36,19 +36,19 @@ def get_sample(lattice_rotation_angle=0*deg):
     particle_layout.addParticle(box)
     particle_layout.setInterference(interference)
 
-    # Sample
-    vacuum_layer = ba.Layer(vacuum)
-    vacuum_layer.addLayout(particle_layout)
-    substrate_layer = ba.Layer(material_si)
-
     sigma, hurst, corrLength = 5*nm, 0.5, 10*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Sample
+    vacuum_layer = ba.Layer(vacuum)
+    vacuum_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(material_si, roughness)
+
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+    sample.addLayer(substrate_layer)
     return sample
 
 
diff --git a/auto/MiniExamples/scatter2d/RoughAndSpecular.py b/auto/MiniExamples/scatter2d/RoughAndSpecular.py
index d2e103da8b6..50290728ac5 100755
--- a/auto/MiniExamples/scatter2d/RoughAndSpecular.py
+++ b/auto/MiniExamples/scatter2d/RoughAndSpecular.py
@@ -22,15 +22,15 @@ def get_sample():
 
     # Define layers
     layer_1 = ba.Layer(material_Vacuum)
-    layer_2 = ba.Layer(material_HMDSO, 18.5*nm)
-    layer_3 = ba.Layer(material_PTFE, 22.1*nm)
+    layer_2 = ba.Layer(material_HMDSO, 18.5*nm, roughness_1)
+    layer_3 = ba.Layer(material_PTFE, 22.1*nm, roughness_2)
     layer_4 = ba.Layer(material_Si)
 
     # Define sample
     sample = ba.MultiLayer()
     sample.addLayer(layer_1)
-    sample.addLayerWithTopRoughness(layer_2, roughness_1)
-    sample.addLayerWithTopRoughness(layer_3, roughness_2)
+    sample.addLayer(layer_2)
+    sample.addLayer(layer_3)
     sample.addLayer(layer_4)
 
     return sample
diff --git a/auto/MiniExamples/specular/MagneticLayerImperfect.py b/auto/MiniExamples/specular/MagneticLayerImperfect.py
index 3e127287289..291bef064eb 100755
--- a/auto/MiniExamples/specular/MagneticLayerImperfect.py
+++ b/auto/MiniExamples/specular/MagneticLayerImperfect.py
@@ -20,22 +20,22 @@ def get_sample():
     material_Fe = ba.MaterialBySLD("Fe", 8.0241e-06, 6.0448e-10, B)
     material_substrate = ba.MaterialBySLD("MgO", 5.9803e-06, 9.3996e-12)
 
-    # Layers
-    layer_vacuum = ba.Layer(vacuum)
-    layer_Pd = ba.Layer(material_Pd, 120*angstrom)
-    layer_Fe = ba.Layer(material_Fe, 1000*angstrom)
-    layer_substrate = ba.Layer(material_substrate)
-
     autocorr = ba.K_CorrelationModel(20*angstrom)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Layers
+    layer_vacuum = ba.Layer(vacuum)
+    layer_Pd = ba.Layer(material_Pd, 120*angstrom, roughness)
+    layer_Fe = ba.Layer(material_Fe, 1000*angstrom, roughness)
+    layer_substrate = ba.Layer(material_substrate, roughness)
+
     # Multilayer
     sample = ba.MultiLayer()
     sample.addLayer(layer_vacuum)
-    sample.addLayerWithTopRoughness(layer_Pd, roughness)
-    sample.addLayerWithTopRoughness(layer_Fe, roughness)
-    sample.addLayerWithTopRoughness(layer_substrate, roughness)
+    sample.addLayer(layer_Pd)
+    sample.addLayer(layer_Fe)
+    sample.addLayer(layer_substrate)
 
     return sample
 
diff --git a/auto/MiniExamples/specular/PolarizedSpinAsymmetry.py b/auto/MiniExamples/specular/PolarizedSpinAsymmetry.py
index 3f60f0f3ac8..b8ec2ff1dc8 100755
--- a/auto/MiniExamples/specular/PolarizedSpinAsymmetry.py
+++ b/auto/MiniExamples/specular/PolarizedSpinAsymmetry.py
@@ -48,10 +48,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("(Mg,Al,Fe)3O4", P["rho_Mafo"]*1e-6, 0, B)
     material_substrate = ba.MaterialBySLD("MgAl2O4", *sldMao)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     r_Mafo_autocorr = ba.K_CorrelationModel(P["r_Mafo"]*angstrom)
     r_sub_autocorr = ba.K_CorrelationModel(P["r_Mao"]*angstrom)
 
@@ -60,10 +56,14 @@ def get_sample(P):
     r_Mafo = ba.LayerRoughness(r_Mafo_autocorr, interlayer)
     r_substrate = ba.LayerRoughness(r_sub_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom, r_Mafo)
+    substrate_layer = ba.Layer(material_substrate, r_substrate)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_Mafo)
-    sample.addLayerWithTopRoughness(substrate_layer, r_substrate)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/MiniExamples/specular/RoughnessModel.py b/auto/MiniExamples/specular/RoughnessModel.py
index d02b645a71c..20643d08d37 100755
--- a/auto/MiniExamples/specular/RoughnessModel.py
+++ b/auto/MiniExamples/specular/RoughnessModel.py
@@ -16,23 +16,23 @@ def get_sample(interlayer):
     material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)
 
-    # create layers
-    ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     # Roughness
     autocorr = ba.K_CorrelationModel(10*angstrom)
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # create layers
+    ambient_layer = ba.Layer(vacuum)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
+    substrate_layer = ba.Layer(material_substrate, roughness)
+
     # create sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     for _ in range(10):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/MiniExamples/specular/SpecularSimulationWithRoughness.py b/auto/MiniExamples/specular/SpecularSimulationWithRoughness.py
index 537c356420c..73ccd906f8f 100755
--- a/auto/MiniExamples/specular/SpecularSimulationWithRoughness.py
+++ b/auto/MiniExamples/specular/SpecularSimulationWithRoughness.py
@@ -16,23 +16,24 @@ def get_sample():
     material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)
 
-    # Layers
-    ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
+    # roughness
     autocorr = ba.K_CorrelationModel(1*nm)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Layers
+    ambient_layer = ba.Layer(vacuum)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
+    substrate_layer = ba.Layer(material_substrate, roughness)
+
     # Sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     for _ in range(10):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/auto/MiniExamples/varia/MaterialProfile.py b/auto/MiniExamples/varia/MaterialProfile.py
index a52132ee388..dc16882b36a 100755
--- a/auto/MiniExamples/varia/MaterialProfile.py
+++ b/auto/MiniExamples/varia/MaterialProfile.py
@@ -19,24 +19,25 @@ def get_sample():
     B_substrate = R3(1e8, 0, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0,
                                           B_substrate)
+    
+    # roughness
+    autocorr = ba.K_CorrelationModel(5*angstrom, 0.5, 10*angstrom)
+    interlayer = ba.TanhInterlayer()
+    roughness = ba.LayerRoughness(autocorr, interlayer)
 
     # layers
     ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
     substrate_layer = ba.Layer(material_substrate)
 
     # sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     
-    autocorr = ba.K_CorrelationModel(5*angstrom, 0.5, 10*angstrom)
-    interlayer = ba.TanhInterlayer()
-    roughness = ba.LayerRoughness(autocorr, interlayer)
-    
     for _ in range(4):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/auto/MiniExamples/varia/RoughSurface.py b/auto/MiniExamples/varia/RoughSurface.py
index e677d0d71bd..f40422c2357 100755
--- a/auto/MiniExamples/varia/RoughSurface.py
+++ b/auto/MiniExamples/varia/RoughSurface.py
@@ -55,11 +55,6 @@ def get_sample():
     material_layer = ba.RefractiveMaterial("layer", 5e-6, 0)
     material_substrate = ba.RefractiveMaterial("substrate", 15e-6, 0)
 
-    # defining layers
-    l_ambience = ba.Layer(vacuum)
-    l_layer = ba.Layer(material_layer, 25*nm)
-    l_substrate = ba.Layer(material_substrate)
-
     # defining roughness
     height_distribution = ba.ErfInterlayer()
     max_spat_freq = 0.5*nm
@@ -80,11 +75,16 @@ def get_sample():
     autocorr_sub = ba.K_CorrelationModel(sigma, alpha, xi, max_spat_freq)
     roughness_sub = ba.LayerRoughness(autocorr_sub, height_distribution)
 
+    # defining layers
+    l_ambience = ba.Layer(vacuum)
+    l_layer = ba.Layer(material_layer, 25*nm, roughness_layer)
+    l_substrate = ba.Layer(material_substrate, roughness_sub)
+
     # adding layers
     my_sample = ba.MultiLayer()
     my_sample.addLayer(l_ambience)
-    my_sample.addLayerWithTopRoughness(l_layer, roughness_layer)
-    my_sample.addLayerWithTopRoughness(l_substrate, roughness_sub)
+    my_sample.addLayer(l_layer)
+    my_sample.addLayer(l_substrate)
 
     return my_sample
 
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index 6c2e39716d6..f2092380694 100644
--- a/auto/Wrap/libBornAgainSample.py
+++ b/auto/Wrap/libBornAgainSample.py
@@ -4212,9 +4212,9 @@ class RoughnessMap(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, x_points, y_points, Lx, Ly, sample, i_interface, seed=-1):
-        r"""__init__(RoughnessMap self, size_t x_points, size_t y_points, double Lx, double Ly, MultiLayer sample, int i_interface, int seed=-1) -> RoughnessMap"""
-        _libBornAgainSample.RoughnessMap_swiginit(self, _libBornAgainSample.new_RoughnessMap(x_points, y_points, Lx, Ly, sample, i_interface, seed))
+    def __init__(self, x_points, y_points, Lx, Ly, sample, i_layer, seed=-1):
+        r"""__init__(RoughnessMap self, size_t x_points, size_t y_points, double Lx, double Ly, MultiLayer sample, int i_layer, int seed=-1) -> RoughnessMap"""
+        _libBornAgainSample.RoughnessMap_swiginit(self, _libBornAgainSample.new_RoughnessMap(x_points, y_points, Lx, Ly, sample, i_layer, seed))
 
     def generateMap(self):
         r"""generateMap(RoughnessMap self) -> double2d_t"""
@@ -4233,9 +4233,12 @@ class Layer(ISampleNode):
     thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
     __repr__ = _swig_repr
 
-    def __init__(self, material, thickness=0, roughness=None):
-        r"""__init__(Layer self, Material material, double thickness=0, LayerRoughness roughness=None) -> Layer"""
-        _libBornAgainSample.Layer_swiginit(self, _libBornAgainSample.new_Layer(material, thickness, roughness))
+    def __init__(self, *args):
+        r"""
+        __init__(Layer self, Material material, double thickness=0, LayerRoughness roughness=None) -> Layer
+        __init__(Layer self, Material material, LayerRoughness roughness) -> Layer
+        """
+        _libBornAgainSample.Layer_swiginit(self, _libBornAgainSample.new_Layer(*args))
     __swig_destroy__ = _libBornAgainSample.delete_Layer
 
     def clone(self):
@@ -4283,10 +4286,6 @@ class MultiLayer(ISampleNode):
         r"""addLayer(MultiLayer self, Layer layer)"""
         return _libBornAgainSample.MultiLayer_addLayer(self, layer)
 
-    def addLayerWithTopRoughness(self, layer, roughness):
-        r"""addLayerWithTopRoughness(MultiLayer self, Layer layer, LayerRoughness roughness)"""
-        return _libBornAgainSample.MultiLayer_addLayerWithTopRoughness(self, layer, roughness)
-
     def setExternalField(self, ext_field):
         r"""setExternalField(MultiLayer self, R3 ext_field)"""
         return _libBornAgainSample.MultiLayer_setExternalField(self, ext_field)
@@ -4295,13 +4294,13 @@ class MultiLayer(ISampleNode):
         r"""setName(MultiLayer self, std::string const & name)"""
         return _libBornAgainSample.MultiLayer_setName(self, name)
 
-    def layerInterfaceSpectrum(self, spatial_f, i_interface):
-        r"""layerInterfaceSpectrum(MultiLayer self, double spatial_f, int i_interface) -> double"""
-        return _libBornAgainSample.MultiLayer_layerInterfaceSpectrum(self, spatial_f, i_interface)
+    def layerRoughnessSpectrum(self, spatial_f, i_layer):
+        r"""layerRoughnessSpectrum(MultiLayer self, double spatial_f, int i_layer) -> double"""
+        return _libBornAgainSample.MultiLayer_layerRoughnessSpectrum(self, spatial_f, i_layer)
 
-    def layerInterfaceRMS(self, i_interface):
-        r"""layerInterfaceRMS(MultiLayer self, size_t i_interface) -> double"""
-        return _libBornAgainSample.MultiLayer_layerInterfaceRMS(self, i_interface)
+    def layerRoughnessRMS(self, i_layer):
+        r"""layerRoughnessRMS(MultiLayer self, size_t i_layer) -> double"""
+        return _libBornAgainSample.MultiLayer_layerRoughnessRMS(self, i_layer)
 
 # Register MultiLayer in _libBornAgainSample:
 _libBornAgainSample.MultiLayer_swigregister(MultiLayer)
@@ -6391,9 +6390,9 @@ class SimpleSelectionRule(ISelectionRule):
         r"""isEqualTo(SimpleSelectionRule self, ISelectionRule isr) -> bool"""
         return _libBornAgainSample.SimpleSelectionRule_isEqualTo(self, isr)
 
-    def __eq__(self, arg2):
-        r"""__eq__(SimpleSelectionRule self, SimpleSelectionRule arg2) -> bool"""
-        return _libBornAgainSample.SimpleSelectionRule___eq__(self, arg2)
+    def __eq__(self, other):
+        r"""__eq__(SimpleSelectionRule self, SimpleSelectionRule other) -> bool"""
+        return _libBornAgainSample.SimpleSelectionRule___eq__(self, other)
 
 # Register SimpleSelectionRule in _libBornAgainSample:
 _libBornAgainSample.SimpleSelectionRule_swigregister(SimpleSelectionRule)
diff --git a/auto/Wrap/libBornAgainSample_wrap.cpp b/auto/Wrap/libBornAgainSample_wrap.cpp
index a3071aed777..b7f7a6019e8 100644
--- a/auto/Wrap/libBornAgainSample_wrap.cpp
+++ b/auto/Wrap/libBornAgainSample_wrap.cpp
@@ -7147,7 +7147,6 @@ SWIGINTERN void std_vector_Sl_std_pair_Sl_double_Sc_double_Sg__Sg__insert__SWIG_
 #include "Sample/Particle/Particle.h"
 #include "Sample/Particle/Compound.h"
 #include "Sample/Particle/CoreAndShell.h"
-#include "Sample/Interface/LayerInterface.h"
 #include "Sample/Interface/LayerRoughness.h"
 #include "Sample/Interface/RoughnessMap.h"
 #include "Sample/Scattering/Rotations.h"
@@ -51373,6 +51372,49 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_new_Layer__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  Material *arg1 = 0 ;
+  LayerRoughness *arg2 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  Layer *result = 0 ;
+  
+  (void)self;
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  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_Layer" "', argument " "1"" of type '" "Material const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_Layer" "', argument " "1"" of type '" "Material const &""'"); 
+  }
+  arg1 = reinterpret_cast< Material * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_Layer" "', argument " "2"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg2 = reinterpret_cast< LayerRoughness * >(argp2);
+  {
+    try {
+      result = (Layer *)new Layer((Material const &)*arg1,(LayerRoughness const *)arg2);
+    } catch (const std::exception& ex) {
+      // message shown in the Python interpreter
+      const std::string msg {
+        "BornAgain C++ Exception: " + std::string(ex.what())
+      };
+      SWIG_exception(SWIG_RuntimeError, msg.c_str());
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Layer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_new_Layer(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[4] = {
@@ -51389,6 +51431,19 @@ SWIGINTERN PyObject *_wrap_new_Layer(PyObject *self, PyObject *args) {
       return _wrap_new_Layer__SWIG_2(self, argc, argv);
     }
   }
+  if (argc == 2) {
+    int _v = 0;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_LayerRoughness, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_Layer__SWIG_3(self, argc, argv);
+      }
+    }
+  }
   if (argc == 2) {
     int _v = 0;
     int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL | 0);
@@ -51428,7 +51483,8 @@ fail:
     "  Possible C/C++ prototypes are:\n"
     "    Layer::Layer(Material const &,double,LayerRoughness const *)\n"
     "    Layer::Layer(Material const &,double)\n"
-    "    Layer::Layer(Material const &)\n");
+    "    Layer::Layer(Material const &)\n"
+    "    Layer::Layer(Material const &,LayerRoughness const *)\n");
   return 0;
 }
 
@@ -51830,60 +51886,6 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MultiLayer_addLayerWithTopRoughness(PyObject *self, PyObject *args) {
-  PyObject *resultobj = 0;
-  MultiLayer *arg1 = (MultiLayer *) 0 ;
-  Layer *arg2 = 0 ;
-  LayerRoughness *arg3 = 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  void *argp3 = 0 ;
-  int res3 = 0 ;
-  PyObject *swig_obj[3] ;
-  
-  (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "MultiLayer_addLayerWithTopRoughness", 3, 3, swig_obj)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "1"" of type '" "MultiLayer *""'"); 
-  }
-  arg1 = reinterpret_cast< MultiLayer * >(argp1);
-  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_Layer,  0  | 0);
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "2"" of type '" "Layer const &""'"); 
-  }
-  if (!argp2) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "2"" of type '" "Layer const &""'"); 
-  }
-  arg2 = reinterpret_cast< Layer * >(argp2);
-  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_LayerRoughness,  0  | 0);
-  if (!SWIG_IsOK(res3)) {
-    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "3"" of type '" "LayerRoughness const &""'"); 
-  }
-  if (!argp3) {
-    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "MultiLayer_addLayerWithTopRoughness" "', argument " "3"" of type '" "LayerRoughness const &""'"); 
-  }
-  arg3 = reinterpret_cast< LayerRoughness * >(argp3);
-  {
-    try {
-      (arg1)->addLayerWithTopRoughness((Layer const &)*arg2,(LayerRoughness const &)*arg3);
-    } catch (const std::exception& ex) {
-      // message shown in the Python interpreter
-      const std::string msg {
-        "BornAgain C++ Exception: " + std::string(ex.what())
-      };
-      SWIG_exception(SWIG_RuntimeError, msg.c_str());
-    }
-  }
-  resultobj = SWIG_Py_Void();
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
 SWIGINTERN PyObject *_wrap_MultiLayer_setExternalField(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   MultiLayer *arg1 = (MultiLayer *) 0 ;
@@ -51974,7 +51976,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MultiLayer_layerInterfaceSpectrum(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_MultiLayer_layerRoughnessSpectrum(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   MultiLayer *arg1 = (MultiLayer *) 0 ;
   double arg2 ;
@@ -51989,25 +51991,25 @@ SWIGINTERN PyObject *_wrap_MultiLayer_layerInterfaceSpectrum(PyObject *self, PyO
   double result;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "MultiLayer_layerInterfaceSpectrum", 3, 3, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "MultiLayer_layerRoughnessSpectrum", 3, 3, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_layerInterfaceSpectrum" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_layerRoughnessSpectrum" "', argument " "1"" of type '" "MultiLayer const *""'"); 
   }
   arg1 = reinterpret_cast< MultiLayer * >(argp1);
   ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_layerInterfaceSpectrum" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_layerRoughnessSpectrum" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
   ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
   if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "MultiLayer_layerInterfaceSpectrum" "', argument " "3"" of type '" "int""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "MultiLayer_layerRoughnessSpectrum" "', argument " "3"" of type '" "int""'");
   } 
   arg3 = static_cast< int >(val3);
   {
     try {
-      result = (double)((MultiLayer const *)arg1)->layerInterfaceSpectrum(arg2,arg3);
+      result = (double)((MultiLayer const *)arg1)->layerRoughnessSpectrum(arg2,arg3);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -52023,7 +52025,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_MultiLayer_layerInterfaceRMS(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_MultiLayer_layerRoughnessRMS(PyObject *self, PyObject *args) {
   PyObject *resultobj = 0;
   MultiLayer *arg1 = (MultiLayer *) 0 ;
   size_t arg2 ;
@@ -52035,20 +52037,20 @@ SWIGINTERN PyObject *_wrap_MultiLayer_layerInterfaceRMS(PyObject *self, PyObject
   double result;
   
   (void)self;
-  if (!SWIG_Python_UnpackTuple(args, "MultiLayer_layerInterfaceRMS", 2, 2, swig_obj)) SWIG_fail;
+  if (!SWIG_Python_UnpackTuple(args, "MultiLayer_layerRoughnessRMS", 2, 2, swig_obj)) SWIG_fail;
   res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_MultiLayer, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_layerInterfaceRMS" "', argument " "1"" of type '" "MultiLayer const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "MultiLayer_layerRoughnessRMS" "', argument " "1"" of type '" "MultiLayer const *""'"); 
   }
   arg1 = reinterpret_cast< MultiLayer * >(argp1);
   ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_layerInterfaceRMS" "', argument " "2"" of type '" "size_t""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "MultiLayer_layerRoughnessRMS" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
   {
     try {
-      result = (double)((MultiLayer const *)arg1)->layerInterfaceRMS(arg2);
+      result = (double)((MultiLayer const *)arg1)->layerRoughnessRMS(arg2);
     } catch (const std::exception& ex) {
       // message shown in the Python interpreter
       const std::string msg {
@@ -75308,13 +75310,16 @@ static PyMethodDef SwigMethods[] = {
 	 { "delete_LayerRoughness", _wrap_delete_LayerRoughness, METH_O, "delete_LayerRoughness(LayerRoughness self)"},
 	 { "LayerRoughness_swigregister", LayerRoughness_swigregister, METH_O, NULL},
 	 { "LayerRoughness_swiginit", LayerRoughness_swiginit, METH_VARARGS, NULL},
-	 { "new_RoughnessMap", _wrap_new_RoughnessMap, METH_VARARGS, "RoughnessMap(size_t x_points, size_t y_points, double Lx, double Ly, MultiLayer sample, int i_interface, int seed=-1)"},
+	 { "new_RoughnessMap", _wrap_new_RoughnessMap, METH_VARARGS, "RoughnessMap(size_t x_points, size_t y_points, double Lx, double Ly, MultiLayer sample, int i_layer, int seed=-1)"},
 	 { "RoughnessMap_generateMap", _wrap_RoughnessMap_generateMap, METH_O, "RoughnessMap_generateMap(RoughnessMap self) -> double2d_t"},
 	 { "RoughnessMap_generate", _wrap_RoughnessMap_generate, METH_O, "RoughnessMap_generate(RoughnessMap self) -> Arrayf64Wrapper"},
 	 { "delete_RoughnessMap", _wrap_delete_RoughnessMap, METH_O, "delete_RoughnessMap(RoughnessMap self)"},
 	 { "RoughnessMap_swigregister", RoughnessMap_swigregister, METH_O, NULL},
 	 { "RoughnessMap_swiginit", RoughnessMap_swiginit, METH_VARARGS, NULL},
-	 { "new_Layer", _wrap_new_Layer, METH_VARARGS, "Layer(Material material, double thickness=0, LayerRoughness roughness=None)"},
+	 { "new_Layer", _wrap_new_Layer, METH_VARARGS, "\n"
+		"Layer(Material material, double thickness=0, LayerRoughness roughness=None)\n"
+		"new_Layer(Material material, LayerRoughness roughness) -> Layer\n"
+		""},
 	 { "delete_Layer", _wrap_delete_Layer, METH_O, "delete_Layer(Layer self)"},
 	 { "Layer_clone", _wrap_Layer_clone, METH_O, "Layer_clone(Layer self) -> Layer"},
 	 { "Layer_className", _wrap_Layer_className, METH_O, "Layer_className(Layer self) -> std::string"},
@@ -75328,11 +75333,10 @@ static PyMethodDef SwigMethods[] = {
 	 { "MultiLayer_clone", _wrap_MultiLayer_clone, METH_O, "MultiLayer_clone(MultiLayer self) -> MultiLayer"},
 	 { "MultiLayer_className", _wrap_MultiLayer_className, METH_O, "MultiLayer_className(MultiLayer self) -> std::string"},
 	 { "MultiLayer_addLayer", _wrap_MultiLayer_addLayer, METH_VARARGS, "MultiLayer_addLayer(MultiLayer self, Layer layer)"},
-	 { "MultiLayer_addLayerWithTopRoughness", _wrap_MultiLayer_addLayerWithTopRoughness, METH_VARARGS, "MultiLayer_addLayerWithTopRoughness(MultiLayer self, Layer layer, LayerRoughness roughness)"},
 	 { "MultiLayer_setExternalField", _wrap_MultiLayer_setExternalField, METH_VARARGS, "MultiLayer_setExternalField(MultiLayer self, R3 ext_field)"},
 	 { "MultiLayer_setName", _wrap_MultiLayer_setName, METH_VARARGS, "MultiLayer_setName(MultiLayer self, std::string const & name)"},
-	 { "MultiLayer_layerInterfaceSpectrum", _wrap_MultiLayer_layerInterfaceSpectrum, METH_VARARGS, "MultiLayer_layerInterfaceSpectrum(MultiLayer self, double spatial_f, int i_interface) -> double"},
-	 { "MultiLayer_layerInterfaceRMS", _wrap_MultiLayer_layerInterfaceRMS, METH_VARARGS, "MultiLayer_layerInterfaceRMS(MultiLayer self, size_t i_interface) -> double"},
+	 { "MultiLayer_layerRoughnessSpectrum", _wrap_MultiLayer_layerRoughnessSpectrum, METH_VARARGS, "MultiLayer_layerRoughnessSpectrum(MultiLayer self, double spatial_f, int i_layer) -> double"},
+	 { "MultiLayer_layerRoughnessRMS", _wrap_MultiLayer_layerRoughnessRMS, METH_VARARGS, "MultiLayer_layerRoughnessRMS(MultiLayer self, size_t i_layer) -> double"},
 	 { "MultiLayer_swigregister", MultiLayer_swigregister, METH_O, NULL},
 	 { "MultiLayer_swiginit", MultiLayer_swiginit, METH_VARARGS, NULL},
 	 { "AutocorrelationModel_clone", _wrap_AutocorrelationModel_clone, METH_O, "AutocorrelationModel_clone(AutocorrelationModel self) -> AutocorrelationModel"},
@@ -75956,7 +75960,7 @@ static PyMethodDef SwigMethods[] = {
 	 { "SimpleSelectionRule_clone", _wrap_SimpleSelectionRule_clone, METH_O, "SimpleSelectionRule_clone(SimpleSelectionRule self) -> SimpleSelectionRule"},
 	 { "SimpleSelectionRule_coordinateSelected", _wrap_SimpleSelectionRule_coordinateSelected, METH_VARARGS, "SimpleSelectionRule_coordinateSelected(SimpleSelectionRule self, I3 const & coordinate) -> bool"},
 	 { "SimpleSelectionRule_isEqualTo", _wrap_SimpleSelectionRule_isEqualTo, METH_VARARGS, "SimpleSelectionRule_isEqualTo(SimpleSelectionRule self, ISelectionRule isr) -> bool"},
-	 { "SimpleSelectionRule___eq__", _wrap_SimpleSelectionRule___eq__, METH_VARARGS, "SimpleSelectionRule___eq__(SimpleSelectionRule self, SimpleSelectionRule arg2) -> bool"},
+	 { "SimpleSelectionRule___eq__", _wrap_SimpleSelectionRule___eq__, METH_VARARGS, "SimpleSelectionRule___eq__(SimpleSelectionRule self, SimpleSelectionRule other) -> bool"},
 	 { "SimpleSelectionRule_swigregister", SimpleSelectionRule_swigregister, METH_O, NULL},
 	 { "SimpleSelectionRule_swiginit", SimpleSelectionRule_swiginit, METH_VARARGS, NULL},
 	 { "new_Lattice3D", _wrap_new_Lattice3D, METH_VARARGS, "\n"
diff --git a/rawEx/fit/scatter2d/expfit_galaxi.py b/rawEx/fit/scatter2d/expfit_galaxi.py
index d8c144eea87..832075302e4 100755
--- a/rawEx/fit/scatter2d/expfit_galaxi.py
+++ b/rawEx/fit/scatter2d/expfit_galaxi.py
@@ -76,16 +76,16 @@ def get_sample(P):
 
     # layers
     vacuum_layer = ba.Layer(vacuum)
-    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness)
+    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness, r_hmdso)
     hmdso_layer.addLayout(layout)
-    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness)
+    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness, r_ptfe)
     substrate_layer = ba.Layer(material_Si)
 
     # assembling sample
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
-    sample.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+    sample.addLayer(hmdso_layer)
+    sample.addLayer(ptfe_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/rawEx/fit/scatter2d/hardcode_galaxi.py b/rawEx/fit/scatter2d/hardcode_galaxi.py
index 1936b6ddcb7..dce5578cbb5 100755
--- a/rawEx/fit/scatter2d/hardcode_galaxi.py
+++ b/rawEx/fit/scatter2d/hardcode_galaxi.py
@@ -58,16 +58,16 @@ def get_sample():
 
     # layers
     vacuum_layer = ba.Layer(vacuum)
-    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness)
+    hmdso_layer = ba.Layer(material_HMDSO, hmdso_thickness, r_hmdso)
     hmdso_layer.addLayout(layout)
-    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness)
+    ptfe_layer = ba.Layer(material_PTFE, ptfe_thickness, r_ptfe)
     substrate_layer = ba.Layer(material_Si)
 
     # assembling sample
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(hmdso_layer, r_hmdso)
-    sample.addLayerWithTopRoughness(ptfe_layer, r_ptfe)
+    sample.addLayer(hmdso_layer)
+    sample.addLayer(ptfe_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/rawEx/fit/specular/Honeycomb_fit.py b/rawEx/fit/specular/Honeycomb_fit.py
index 598aadf8726..f5d118abc5a 100755
--- a/rawEx/fit/specular/Honeycomb_fit.py
+++ b/rawEx/fit/specular/Honeycomb_fit.py
@@ -42,13 +42,6 @@ def get_sample(P, sign, T):
     material_Si = ba.MaterialBySLD("Substrate", P["sld_Si_real"]*1e-6,
                                    P["sld_Si_imag"]*1e-6)
 
-    l_Air = ba.Layer(material_Air)
-    l_PyOx = ba.Layer(material_PyOx, P["t_PyOx"]*angstrom)
-    l_Py2 = ba.Layer(material_Py2, P["t_Py2"]*angstrom)
-    l_Py1 = ba.Layer(material_Py1, P["t_Py1"]*angstrom)
-    l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom)
-    l_Si = ba.Layer(material_Si)
-
     interlayer_model = ba.ErfInterlayer()
 
     rPyOx_autocorr = ba.K_CorrelationModel(P["rPyOx"]*angstrom)
@@ -62,14 +55,22 @@ def get_sample(P, sign, T):
     rPy1 = ba.LayerRoughness(rPy1_autocorr, interlayer_model)
     rSiO2 = ba.LayerRoughness(rSiO2_autocorr, interlayer_model)
     rSi = ba.LayerRoughness(rSi_autocorr, interlayer_model)
+        
+    l_Air = ba.Layer(material_Air)
+    l_PyOx = ba.Layer(material_PyOx, P["t_PyOx"]*angstrom, rPyOx)
+    l_Py2 = ba.Layer(material_Py2, P["t_Py2"]*angstrom, rPy2)
+    l_Py1 = ba.Layer(material_Py1, P["t_Py1"]*angstrom, rPy1)
+    l_SiO2 = ba.Layer(material_SiO2, P["t_SiO2"]*angstrom, rSiO2)
+    l_Si = ba.Layer(material_Si, rSi)
+
     sample = ba.MultiLayer()
 
     sample.addLayer(l_Air)
-    sample.addLayerWithTopRoughness(l_PyOx, rPyOx)
-    sample.addLayerWithTopRoughness(l_Py2, rPy2)
-    sample.addLayerWithTopRoughness(l_Py1, rPy1)
-    sample.addLayerWithTopRoughness(l_SiO2, rSiO2)
-    sample.addLayerWithTopRoughness(l_Si, rSi)
+    sample.addLayer(l_PyOx)
+    sample.addLayer(l_Py2)
+    sample.addLayer(l_Py1)
+    sample.addLayer(l_SiO2)
+    sample.addLayer(l_Si)
 
     return sample
 
diff --git a/rawEx/fit/specular/PolarizedSpinAsymmetry.py b/rawEx/fit/specular/PolarizedSpinAsymmetry.py
index f4f708970f0..0f93a677597 100755
--- a/rawEx/fit/specular/PolarizedSpinAsymmetry.py
+++ b/rawEx/fit/specular/PolarizedSpinAsymmetry.py
@@ -47,10 +47,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("(Mg,Al,Fe)3O4", P["rho_Mafo"]*1e-6, 0, B)
     material_substrate = ba.MaterialBySLD("MgAl2O4", *sldMao)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     r_Mafo_autocorr = ba.K_CorrelationModel(P["r_Mafo"]*angstrom)
     r_substrate_autocorr = ba.K_CorrelationModel(P["r_Mao"]*angstrom)
 
@@ -59,10 +55,14 @@ def get_sample(P):
     r_Mafo = ba.LayerRoughness(r_Mafo_autocorr, interlayer)
     r_substrate = ba.LayerRoughness(r_substrate_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom, r_Mafo)
+    substrate_layer = ba.Layer(material_substrate, r_substrate)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_Mafo)
-    sample.addLayerWithTopRoughness(substrate_layer, r_substrate)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/rawEx/fit/specular/Pt_layer_fit.py b/rawEx/fit/specular/Pt_layer_fit.py
index a86ffcaab70..51c37b6ebbf 100755
--- a/rawEx/fit/specular/Pt_layer_fit.py
+++ b/rawEx/fit/specular/Pt_layer_fit.py
@@ -28,10 +28,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("Pt", *sldPt)
     material_substrate = ba.MaterialBySLD("Si", *sldSi)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_pt/nm"])
-    substrate_layer = ba.Layer(material_substrate)
-
     interlayer = ba.TanhInterlayer()
 
     si_autocorr = ba.K_CorrelationModel(P["r_si/nm"])
@@ -40,11 +36,14 @@ def get_sample(P):
     r_si = ba.LayerRoughness(si_autocorr, interlayer)
     r_pt = ba.LayerRoughness(pt_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_pt/nm"], r_pt)
+    substrate_layer = ba.Layer(material_substrate, r_si)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_pt)
-
-    sample.addLayerWithTopRoughness(substrate_layer, r_si)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/rawEx/fit/specular/TREFF_Ni_film.py b/rawEx/fit/specular/TREFF_Ni_film.py
index a7f82ddcb8e..fbd96289b55 100755
--- a/rawEx/fit/specular/TREFF_Ni_film.py
+++ b/rawEx/fit/specular/TREFF_Ni_film.py
@@ -24,22 +24,21 @@ def get_sample(P):
     material_SiO2 = ba.MaterialBySLD("SiO2", 2.0704e-06, 0)
 
     # Layers and interfaces
-    layer_Ni = ba.Layer(material_Ni_58, P["thickness"])
-
     interlayer = ba.TanhInterlayer()
 
     Ni_autocorr = ba.K_CorrelationModel(P["sigma_Ni"])
     roughness_Ni = ba.LayerRoughness(Ni_autocorr, interlayer)
 
-    substrate = ba.Layer(material_SiO2)
-
     sub_autocorr = ba.K_CorrelationModel(P["sigma_Substrate"])
     roughness_Substrate = ba.LayerRoughness(sub_autocorr, interlayer)
+    
+    layer_Ni = ba.Layer(material_Ni_58, P["thickness"], roughness_Ni)
+    substrate = ba.Layer(material_SiO2, roughness_Substrate)
 
     sample = ba.MultiLayer()
     sample.addLayer(ba.Layer(vacuum))
-    sample.addLayerWithTopRoughness(layer_Ni, roughness_Ni)
-    sample.addLayerWithTopRoughness(substrate, roughness_Substrate)
+    sample.addLayer(layer_Ni)
+    sample.addLayer(substrate)
 
     return sample
 
diff --git a/rawEx/scatter2d/CorrelatedRoughness.py b/rawEx/scatter2d/CorrelatedRoughness.py
index fd99e5c65c4..e4ce4b0b9ff 100755
--- a/rawEx/scatter2d/CorrelatedRoughness.py
+++ b/rawEx/scatter2d/CorrelatedRoughness.py
@@ -17,18 +17,19 @@ def get_sample():
     material_part_b = ba.RefractiveMaterial("PartB", 10e-6, 0)
     material_substrate = ba.RefractiveMaterial("substrate", 15e-6, 0)
 
-    # defining layers
-    l_ambience = ba.Layer(vacuum)
-    l_part_a = ba.Layer(material_part_a, 2.5*nm)
-    l_part_b = ba.Layer(material_part_b, 5*nm)
-    l_substrate = ba.Layer(material_substrate)
-
+    # defining roughenss
     sigma, hurst, corrLength = 1*nm, 0.3, 5*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     crosscorrelation = ba.CommonDepthCrosscorrelation(10*nm)
     roughness = ba.LayerRoughness(autocorr, interlayer, crosscorrelation)
 
+    # defining layers
+    l_ambience = ba.Layer(vacuum)
+    l_part_a = ba.Layer(material_part_a, 2.5*nm, roughness)
+    l_part_b = ba.Layer(material_part_b, 5*nm, roughness)
+    l_substrate = ba.Layer(material_substrate, roughness)
+
     my_sample = ba.MultiLayer()
 
     # adding layers
@@ -36,10 +37,10 @@ def get_sample():
 
     n_repetitions = 5
     for _ in range(n_repetitions):
-        my_sample.addLayerWithTopRoughness(l_part_a, roughness)
-        my_sample.addLayerWithTopRoughness(l_part_b, roughness)
+        my_sample.addLayer(l_part_a)
+        my_sample.addLayer(l_part_b)
 
-    my_sample.addLayerWithTopRoughness(l_substrate, roughness)
+    my_sample.addLayer(l_substrate)
 
     return my_sample
 
diff --git a/rawEx/scatter2d/FindPeaks.py b/rawEx/scatter2d/FindPeaks.py
index 4f8f2494eb7..db7c12daa15 100755
--- a/rawEx/scatter2d/FindPeaks.py
+++ b/rawEx/scatter2d/FindPeaks.py
@@ -36,19 +36,19 @@ def get_sample(lattice_rotation_angle=0*deg):
     particle_layout.addParticle(box)
     particle_layout.setInterference(interference)
 
-    # assembling the sample
-    vacuum_layer = ba.Layer(ba.Vacuum())
-    vacuum_layer.addLayout(particle_layout)
-    substrate_layer = ba.Layer(material_si)
-
     sigma, hurst, corrLength = 5*nm, 0.5, 10*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # assembling the sample
+    vacuum_layer = ba.Layer(ba.Vacuum())
+    vacuum_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(material_si, roughness)
+
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+    sample.addLayer(substrate_layer)
     return sample
 
 
diff --git a/rawEx/scatter2d/RectangularGrating.py b/rawEx/scatter2d/RectangularGrating.py
index e7581e87aa1..9f865dec3f7 100755
--- a/rawEx/scatter2d/RectangularGrating.py
+++ b/rawEx/scatter2d/RectangularGrating.py
@@ -36,19 +36,19 @@ def get_sample(lattice_rotation_angle=0*deg):
     particle_layout.addParticle(box)
     particle_layout.setInterference(interference)
 
-    # Sample
-    vacuum_layer = ba.Layer(vacuum)
-    vacuum_layer.addLayout(particle_layout)
-    substrate_layer = ba.Layer(material_si)
-
     sigma, hurst, corrLength = 5*nm, 0.5, 10*nm
     autocorr = ba.K_CorrelationModel(sigma, hurst, corrLength)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Sample
+    vacuum_layer = ba.Layer(vacuum)
+    vacuum_layer.addLayout(particle_layout)
+    substrate_layer = ba.Layer(material_si, roughness)
+
     sample = ba.MultiLayer()
     sample.addLayer(vacuum_layer)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+    sample.addLayer(substrate_layer)
     return sample
 
 
diff --git a/rawEx/scatter2d/RoughAndSpecular.py b/rawEx/scatter2d/RoughAndSpecular.py
index c81a9829040..fe751b4c180 100755
--- a/rawEx/scatter2d/RoughAndSpecular.py
+++ b/rawEx/scatter2d/RoughAndSpecular.py
@@ -22,15 +22,15 @@ def get_sample():
 
     # Define layers
     layer_1 = ba.Layer(material_Vacuum)
-    layer_2 = ba.Layer(material_HMDSO, 18.5*nm)
-    layer_3 = ba.Layer(material_PTFE, 22.1*nm)
+    layer_2 = ba.Layer(material_HMDSO, 18.5*nm, roughness_1)
+    layer_3 = ba.Layer(material_PTFE, 22.1*nm, roughness_2)
     layer_4 = ba.Layer(material_Si)
 
     # Define sample
     sample = ba.MultiLayer()
     sample.addLayer(layer_1)
-    sample.addLayerWithTopRoughness(layer_2, roughness_1)
-    sample.addLayerWithTopRoughness(layer_3, roughness_2)
+    sample.addLayer(layer_2)
+    sample.addLayer(layer_3)
     sample.addLayer(layer_4)
 
     return sample
diff --git a/rawEx/specular/MagneticLayerImperfect.py b/rawEx/specular/MagneticLayerImperfect.py
index 4431c856819..9f097d78e1b 100755
--- a/rawEx/specular/MagneticLayerImperfect.py
+++ b/rawEx/specular/MagneticLayerImperfect.py
@@ -20,22 +20,22 @@ def get_sample():
     material_Fe = ba.MaterialBySLD("Fe", 8.0241e-06, 6.0448e-10, B)
     material_substrate = ba.MaterialBySLD("MgO", 5.9803e-06, 9.3996e-12)
 
-    # Layers
-    layer_vacuum = ba.Layer(vacuum)
-    layer_Pd = ba.Layer(material_Pd, 120*angstrom)
-    layer_Fe = ba.Layer(material_Fe, 1000*angstrom)
-    layer_substrate = ba.Layer(material_substrate)
-
     autocorr = ba.K_CorrelationModel(20*angstrom)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Layers
+    layer_vacuum = ba.Layer(vacuum)
+    layer_Pd = ba.Layer(material_Pd, 120*angstrom, roughness)
+    layer_Fe = ba.Layer(material_Fe, 1000*angstrom, roughness)
+    layer_substrate = ba.Layer(material_substrate, roughness)
+
     # Multilayer
     sample = ba.MultiLayer()
     sample.addLayer(layer_vacuum)
-    sample.addLayerWithTopRoughness(layer_Pd, roughness)
-    sample.addLayerWithTopRoughness(layer_Fe, roughness)
-    sample.addLayerWithTopRoughness(layer_substrate, roughness)
+    sample.addLayer(layer_Pd)
+    sample.addLayer(layer_Fe)
+    sample.addLayer(layer_substrate)
 
     return sample
 
diff --git a/rawEx/specular/PolarizedSpinAsymmetry.py b/rawEx/specular/PolarizedSpinAsymmetry.py
index 487d78cca4c..1eaa33e3368 100755
--- a/rawEx/specular/PolarizedSpinAsymmetry.py
+++ b/rawEx/specular/PolarizedSpinAsymmetry.py
@@ -48,10 +48,6 @@ def get_sample(P):
     material_layer = ba.MaterialBySLD("(Mg,Al,Fe)3O4", P["rho_Mafo"]*1e-6, 0, B)
     material_substrate = ba.MaterialBySLD("MgAl2O4", *sldMao)
 
-    ambient_layer = ba.Layer(vacuum)
-    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     r_Mafo_autocorr = ba.K_CorrelationModel(P["r_Mafo"]*angstrom)
     r_sub_autocorr = ba.K_CorrelationModel(P["r_Mao"]*angstrom)
 
@@ -60,10 +56,14 @@ def get_sample(P):
     r_Mafo = ba.LayerRoughness(r_Mafo_autocorr, interlayer)
     r_substrate = ba.LayerRoughness(r_sub_autocorr, interlayer)
 
+    ambient_layer = ba.Layer(vacuum)
+    layer = ba.Layer(material_layer, P["t_Mafo"]*angstrom, r_Mafo)
+    substrate_layer = ba.Layer(material_substrate, r_substrate)
+
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
-    sample.addLayerWithTopRoughness(layer, r_Mafo)
-    sample.addLayerWithTopRoughness(substrate_layer, r_substrate)
+    sample.addLayer(layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/rawEx/specular/RoughnessModel.py b/rawEx/specular/RoughnessModel.py
index 60f2379a043..195c7632e39 100755
--- a/rawEx/specular/RoughnessModel.py
+++ b/rawEx/specular/RoughnessModel.py
@@ -16,23 +16,23 @@ def get_sample(interlayer):
     material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)
 
-    # create layers
-    ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
     # Roughness
     autocorr = ba.K_CorrelationModel(10*angstrom)
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # create layers
+    ambient_layer = ba.Layer(vacuum)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
+    substrate_layer = ba.Layer(material_substrate, roughness)
+
     # create sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     for _ in range(10):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/rawEx/specular/SpecularSimulationWithRoughness.py b/rawEx/specular/SpecularSimulationWithRoughness.py
index fa8e1c6f775..f9dc7f97965 100755
--- a/rawEx/specular/SpecularSimulationWithRoughness.py
+++ b/rawEx/specular/SpecularSimulationWithRoughness.py
@@ -16,23 +16,24 @@ def get_sample():
     material_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0)
 
-    # Layers
-    ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
-    substrate_layer = ba.Layer(material_substrate)
-
+    # roughness
     autocorr = ba.K_CorrelationModel(1*nm)
     interlayer = ba.TanhInterlayer()
     roughness = ba.LayerRoughness(autocorr, interlayer)
 
+    # Layers
+    ambient_layer = ba.Layer(vacuum)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
+    substrate_layer = ba.Layer(material_substrate, roughness)
+
     # Sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     for _ in range(10):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
-    sample.addLayerWithTopRoughness(substrate_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
+    sample.addLayer(substrate_layer)
 
     return sample
 
diff --git a/rawEx/varia/MaterialProfile.py b/rawEx/varia/MaterialProfile.py
index e8e5342b211..8ae7cdaada3 100755
--- a/rawEx/varia/MaterialProfile.py
+++ b/rawEx/varia/MaterialProfile.py
@@ -19,24 +19,25 @@ def get_sample():
     B_substrate = R3(1e8, 0, 0)
     material_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0,
                                           B_substrate)
+    
+    # roughness
+    autocorr = ba.K_CorrelationModel(5*angstrom, 0.5, 10*angstrom)
+    interlayer = ba.TanhInterlayer()
+    roughness = ba.LayerRoughness(autocorr, interlayer)
 
     # layers
     ambient_layer = ba.Layer(vacuum)
-    ti_layer = ba.Layer(material_ti, 30*angstrom)
-    ni_layer = ba.Layer(material_ni, 70*angstrom)
+    ti_layer = ba.Layer(material_ti, 30*angstrom, roughness)
+    ni_layer = ba.Layer(material_ni, 70*angstrom, roughness)
     substrate_layer = ba.Layer(material_substrate)
 
     # sample
     sample = ba.MultiLayer()
     sample.addLayer(ambient_layer)
     
-    autocorr = ba.K_CorrelationModel(5*angstrom, 0.5, 10*angstrom)
-    interlayer = ba.TanhInterlayer()
-    roughness = ba.LayerRoughness(autocorr, interlayer)
-    
     for _ in range(4):
-        sample.addLayerWithTopRoughness(ti_layer, roughness)
-        sample.addLayerWithTopRoughness(ni_layer, roughness)
+        sample.addLayer(ti_layer)
+        sample.addLayer(ni_layer)
     sample.addLayer(substrate_layer)
 
     return sample
diff --git a/rawEx/varia/RoughSurface.py b/rawEx/varia/RoughSurface.py
index f353a60c887..7814154371a 100755
--- a/rawEx/varia/RoughSurface.py
+++ b/rawEx/varia/RoughSurface.py
@@ -55,11 +55,6 @@ def get_sample():
     material_layer = ba.RefractiveMaterial("layer", 5e-6, 0)
     material_substrate = ba.RefractiveMaterial("substrate", 15e-6, 0)
 
-    # defining layers
-    l_ambience = ba.Layer(vacuum)
-    l_layer = ba.Layer(material_layer, 25*nm)
-    l_substrate = ba.Layer(material_substrate)
-
     # defining roughness
     height_distribution = ba.ErfInterlayer()
     max_spat_freq = 0.5*nm
@@ -80,11 +75,16 @@ def get_sample():
     autocorr_sub = ba.K_CorrelationModel(sigma, alpha, xi, max_spat_freq)
     roughness_sub = ba.LayerRoughness(autocorr_sub, height_distribution)
 
+    # defining layers
+    l_ambience = ba.Layer(vacuum)
+    l_layer = ba.Layer(material_layer, 25*nm, roughness_layer)
+    l_substrate = ba.Layer(material_substrate, roughness_sub)
+
     # adding layers
     my_sample = ba.MultiLayer()
     my_sample.addLayer(l_ambience)
-    my_sample.addLayerWithTopRoughness(l_layer, roughness_layer)
-    my_sample.addLayerWithTopRoughness(l_substrate, roughness_sub)
+    my_sample.addLayer(l_layer)
+    my_sample.addLayer(l_substrate)
 
     return my_sample
 
-- 
GitLab