diff --git a/CHANGELOG b/CHANGELOG
index 094642dc7900534617437a2a3a3f384a7c5a6f37..c78e09873fc96d6ba1cc3ac231af846384f0198d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,7 @@ BornAgain-22.0, in preparation
     * Datafield::flat flattens out axis of size 1
    > API:
     * Removed RectangularDetector.
+    * Removed AddLayerWithTopRoughness. Roughness now belongs to the layer itself.
     * Offspec analyzer is set for detector, not scan(#651)
     * FitObjective::addSimulationAndData has been replaced by function addFitPair,
       which takes experimental data in form of a Datafield object instead of a NumPy array
diff --git a/GUI/Model/FromCore/ItemizeSample.cpp b/GUI/Model/FromCore/ItemizeSample.cpp
index 8bf1f3a8c10b3a079e8b49b08a21d4e148e50acc..840a2e66130d4840a066b7238672bbea73d7f544 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.layer(layerIndex)->roughness();
 
         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 f500e50c284d645fb6fde806bc8591fb892fc9a4..f969129ad210a5ee3585cb9c0700db267ad7f36e 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 77505cb4261df3786e7840bceb7b7c7b1ab7a3a1..69ae6488925661500b4233dfeec68fb02c42f1ce 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 9a8a71b01b538fe511fcc77d56de54a5d58da918..f80ea579387e0fd643afe5bc0ef1cdf8de5b7e73 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"
@@ -81,14 +80,6 @@ std::vector<ZLimits> particleSpans(const MultiLayer& sample)
     return result;
 }
 
-//! Returns top roughness of layer
-const LayerRoughness* layerTopRoughness(const MultiLayer& sample, size_t i)
-{
-    if (i == 0)
-        return nullptr;
-    return sample.layerInterface(i - 1)->roughness();
-}
-
 //! Returns a vector of slices that represent the layer structure of the sample.
 //!
 //! Each slice is either a layer, or a fraction of a layer.
@@ -121,8 +112,8 @@ SliceStack slicify(const MultiLayer& sample, bool useAvgMaterials)
             } else {
                 if (i == nLayers - 1)
                     ASSERT(tl == 0);
-                const LayerRoughness* roughness = layerTopRoughness(sample, i);
-                const double rms = sample.layerInterfaceRMS(i - 1);
+                const LayerRoughness* roughness = sample.layer(i)->roughness();
+                const double rms = sample.layerRoughnessRMS(i);
                 result.addSlice(tl, *material, roughness, rms);
             }
         }
@@ -136,8 +127,8 @@ SliceStack slicify(const MultiLayer& sample, bool useAvgMaterials)
         double tl = layer->thickness();
         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 LayerRoughness* roughness = sample.layer(i)->roughness();
+        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 48cc3bb1732a4f35e4efe8b009730ca07b6bcf50..0000000000000000000000000000000000000000
--- a/Sample/Interface/LayerInterface.cpp
+++ /dev/null
@@ -1,45 +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 Layer* top_layer, const Layer* bottom_layer,
-                               const LayerRoughness* layerRoughness)
-    : m_top_layer(top_layer)
-    , m_bottom_layer(bottom_layer)
-    , m_roughness(layerRoughness)
-{
-    ASSERT(top_layer);
-    ASSERT(bottom_layer);
-    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 37c933c543ffb3d4ea628c013d37eebf59710f66..0000000000000000000000000000000000000000
--- a/Sample/Interface/LayerInterface.h
+++ /dev/null
@@ -1,70 +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 Layer* top_layer, const Layer* bottom_layer,
-                   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;
-
-    const Layer* topLayer() const;
-
-    const Layer* bottomLayer() const;
-
-    std::vector<const INode*> nodeChildren() const override;
-
-    std::string validate() const override;
-
-private:
-    const Layer* m_top_layer;                          //!< pointer to the layer above interface
-    const Layer* m_bottom_layer;                       //!< pointer to the layer below interface
-    std::unique_ptr<const LayerRoughness> m_roughness; //!< roughness of the interface
-};
-
-inline const LayerRoughness* LayerInterface::roughness() const
-{
-    return m_roughness.get();
-}
-
-inline const Layer* LayerInterface::topLayer() const
-{
-    return m_top_layer;
-}
-
-inline const Layer* LayerInterface::bottomLayer() const
-{
-    return m_bottom_layer;
-}
-
-#endif // BORNAGAIN_SAMPLE_INTERFACE_LAYERINTERFACE_H
diff --git a/Sample/Interface/RoughnessMap.cpp b/Sample/Interface/RoughnessMap.cpp
index bc89154d8daf30c8b8edf7deafa2f8e40d647674..b78bd19c9ed05b7676383e99596e08feebcb8ea7 100644
--- a/Sample/Interface/RoughnessMap.cpp
+++ b/Sample/Interface/RoughnessMap.cpp
@@ -15,8 +15,8 @@
 #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 "Sample/Multilayer/Layer.h"
 #include <algorithm>
 
 using PhysConsts::pi;
@@ -53,13 +53,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,10 +81,9 @@ 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 double sigma_factor = interlayerModel->sigmaRange();
+    const InterlayerModel* interlayer = m_sample.layer(m_i_layer)->roughness()->interlayerModel();
+    const double rms = m_sample.layerRoughnessRMS(m_i_layer);
+    const double sigma_factor = interlayer->sigmaRange();
     const double z_limit = rms * sigma_factor;
     const double step = 2 * z_limit / (z_steps - 1);
 
@@ -96,7 +95,7 @@ double2d_t RoughnessMap::mapFromHeights() const
     // fill mesh with weights
     std::vector<double> z_weights(z_steps);
     for (size_t i = 0; i < z_steps; i++)
-        z_weights[i] = interlayerModel->distribution(z_points[i], rms);
+        z_weights[i] = interlayer->distribution(z_points[i], rms);
 
     // fill map with random values
     std::discrete_distribution<int> d(z_weights.begin(), z_weights.end());
@@ -129,7 +128,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 +208,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 0b3f311b24b3fba18c91445c5c48aa81175ab74d..daa537b997198367c18edf9f2c3c88ee41cd5ee2 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 a60900f1aadf697920fbc95b818413e4233a4aad..86bc6aa2e44fc143fd296a87066841b3acee6bd5 100644
--- a/Sample/Multilayer/Layer.cpp
+++ b/Sample/Multilayer/Layer.cpp
@@ -13,25 +13,50 @@
 //  ************************************************************************************************
 
 #include "Sample/Multilayer/Layer.h"
+#include "Base/Util/Assert.h"
 #include "Base/Util/StringUtil.h"
 #include "Sample/Aggregate/ParticleLayout.h"
+#include "Sample/Interface/LayerRoughness.h"
+
+namespace {
+
+LayerRoughness* zeroRoughness()
+{
+    K_CorrelationModel autocorr(0);
+    ErfInterlayer interlayer;
+    return new LayerRoughness(&autocorr, &interlayer);
+}
+
+} // namespace
 
 //! Constructor of a layer with thickness and material
 //! @param material: material the layer is made of
 //! @param thickness: thickness of a layer in nanometers
-Layer::Layer(const Material& material, double thickness)
+//! @param roughness: roughness of a top layer surface
+Layer::Layer(const Material& material, double thickness, const LayerRoughness* roughness)
     : m_material(material)
     , m_thickness(thickness)
+    , m_roughness(roughness ? roughness->clone() : zeroRoughness())
 {
+    // If the roughness is not defined by user, it is equivalent to the situation when roughness is
+    // defined, but has zero rms. To avoid constant nullptr checks in the code and to ease
+    // resampling it was accepted that "Layer" should always have non-null roughness descriptor.
+    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())
@@ -44,6 +69,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 e247a6246922e46313f2369b19187909839d7ac6..0b5513779142f9a20ea50ffcabb26b7306a009c5 100644
--- a/Sample/Multilayer/Layer.h
+++ b/Sample/Multilayer/Layer.h
@@ -19,13 +19,16 @@
 #include "Sample/Material/Material.h"
 #include "Sample/Scattering/ISampleNode.h"
 
+class LayerRoughness;
 class ParticleLayout;
 
 //! A layer in a MultiLayer sample.
 
 class Layer : public ISampleNode {
 public:
-    Layer(const Material& material, double thickness = 0);
+    Layer(const Material& material, double thickness = 0,
+          const LayerRoughness* roughness = nullptr);
+    Layer(const Material& material, const LayerRoughness* roughness);
     ~Layer() override;
 
     Layer* clone() const override;
@@ -62,11 +65,17 @@ public:
         return m_n_slices;
     }
 
+    const LayerRoughness* roughness() const
+    {
+        return m_roughness.get();
+    }
+
 private:
-    Material m_material;                    //!< material
-    R3 m_B_field;                           //!< cached value of magnetic induction
-    double m_thickness;                     //!< layer thickness in nanometers
-    OwningVector<ParticleLayout> m_layouts; //!< independent layouts in this layer
+    Material m_material;                               //!< material
+    R3 m_B_field;                                      //!< cached value of magnetic induction
+    double m_thickness;                                //!< layer thickness in nanometers
+    OwningVector<ParticleLayout> m_layouts;            //!< independent layouts in this layer
+    std::unique_ptr<const LayerRoughness> m_roughness; //!< roughness of the top surface. Never null
     unsigned int m_n_slices = 1; //!< number of slices to create for graded layer approach
 #endif                           // SWIG
 };
diff --git a/Sample/Multilayer/MultiLayer.cpp b/Sample/Multilayer/MultiLayer.cpp
index ae46086b7f0eccf2f87926f10f2a481e2c565799..d8aad9ecec82df906b0293ff03811dcac81d3a5c 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,57 +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 Layer* last_layer = m_layers.back();
-        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(last_layer, new_layer, 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 layer(i_layer)->roughness()->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 = layer(i_layer)->roughness()->autocorrelationModel();
         result = std::max(autocorr->maxSpatialFrequency(), result);
     }
     return result;
@@ -113,30 +76,25 @@ const Layer* MultiLayer::layer(size_t i_layer) const
     return m_layers.at(i_layer);
 }
 
-const LayerInterface* MultiLayer::layerInterface(size_t i_interface) const
-{
-    return m_interfaces.at(i_interface);
-}
-
 void MultiLayer::setExternalField(const R3& ext_field)
 {
     m_ext_field = 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;
@@ -146,10 +104,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;
         }
@@ -158,19 +116,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));
     }
@@ -181,14 +139,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;
 }
 
@@ -219,12 +174,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 3e979ebfd6f31ed08cf8121484b4041c58099776..996d11f84fd185281e08ffee26283089690e4e7f 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,8 @@ 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;
     R3 externalField() const
     {
         return m_ext_field;
@@ -93,14 +86,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 8718a5288b80652cc629d40eefc2ea99561eead3..43d0c3a92b25ba83e61d309d1566e0c918e49c62 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 fcfbaf66481d5dfb6a3467ab647daaf48a219248..190689b1b73c32b51e0f28246cea4b4d15f6cef2 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 409e40e39978fe32aa10044305578866ef8d32b8..678697ad6266d226e9d57a1e80c60d2c20726d60 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 f74b33047f6b2c8075d9eb8bbec705720b0025a6..141d634101fcfde2568bbbbe1a9c426fea7aa944 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 2ed6661fa5bac81d9064362493d8346e15e7c87a..9f06947a56a05bb7322fcd642e9e4d05b8dcac3b 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 e6f8096b709f20b0a221a3e92fb0e1b2d13b2c11..7545002a1519acf5fc3d0ce8b06eeb8f24c25b35 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 e6d3368d0e56aea141ededc08ef76dc5012f0d94..fdf95b7039410c728f3df7e543a30dd4906153b7 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 576115dc5edb78b3a9c88b06dfa17aeb0307b7ec..6da87dfc3e9111beb37761f0fc60e752a6caf608 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 ce487881e67d53ed97dba8ccd3d098031591d258..b06082d109cf063481e5d2c51ec9b9346e248828 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 8033a9b620cfc6e4223363fecebd62c077d1e7b6..7bed030b7580203ad3f8c4ff4258b3e4776cf63d 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,15 +540,8 @@ 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";
+                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 ef086de2ee6f79e55c6fef339a352b8158e1e293..db8ee08324196be89261a0d2b2398bb9b98b32d6 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 224772063ce1c3d63f347a12169590b445920164..abf7aefdd0d53916f5cb27254b561b5147c7d137 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.layer(1)->roughness();
+    EXPECT_TRUE(nullptr != roughness1);
+    EXPECT_EQ(mLayer.layerRoughnessRMS(1), 0.0);
+
+    const LayerRoughness* roughness2 = mLayer.layer(2)->roughness();
+    EXPECT_TRUE(nullptr != roughness2);
+    EXPECT_EQ(mLayer.layerRoughnessRMS(2), 0.0);
+
+    const LayerRoughness* roughness3 = mLayer.layer(3)->roughness();
+    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->layer(1)->roughness();
+    EXPECT_TRUE(nullptr != roughness0);
+    EXPECT_EQ(mLayerClone->layerRoughnessRMS(1), 0.0);
+    EXPECT_TRUE(nullptr == roughness0->crosscorrelationModel());
+
+    const LayerRoughness* roughness1 = mLayerClone->layer(2)->roughness();
+    EXPECT_TRUE(nullptr != roughness1);
+    EXPECT_EQ(mLayerClone->layerRoughnessRMS(2), 0.0);
+    EXPECT_TRUE(nullptr == roughness1->crosscorrelationModel());
+
+    const LayerRoughness* roughness2 = mLayerClone->layer(3)->roughness();
+    EXPECT_TRUE(nullptr != roughness2);
+    EXPECT_EQ(mLayerClone->layerRoughnessRMS(3), 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.layer(1)->roughness();
+    const LayerRoughness* roughness1 = mLayer.layer(2)->roughness();
 
     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->layer(1)->roughness();
+    const LayerRoughness* roughness2 = mLayerClone->layer(2)->roughness();
 
-    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), interface_buffer[i]->bottomLayer()->thickness());
+        EXPECT_EQ(double(i * 20), layer_buffer[i]->thickness());
 }
diff --git a/Wrap/Swig/libBornAgainSample.i b/Wrap/Swig/libBornAgainSample.i
index 2e0e86dcb8cfdc5f93450abd11dceeb81fbee054..e81f05a2da273f81f82d640520e6a2a92110af75 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 29be6f67614bf3a3bebb811f55475552fc250407..7c714b29a604cc26fe268eac59b03721f81e004a 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 1936b6ddcb78d7df94c58f3da4ef630da36b2757..dce5578cbb55810c1f2f542a4e3864514d096969 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 34ce24986a74c44e8f7d75f457aaf3765af948af..5e7c1d4115deae069e085f6a51e57231e75bd966 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 4c2edb5c23d8406c81641e7069427d3124830d78..824c2d3761de35e011b26d978be3e193e973529d 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 759eb516ed604b4bb0334c0e1fd4d61712c13757..44875ce8c491afa7254c15fb9fcce40fe2a7e509 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 436eba87aa21ac1191a09ae058059106df25d767..e49b70eba97203ebd84f32f9c65ab580dcd168e1 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 de6876e58f12aadbbaf067ca0a6f55c08ab59dbe..8fcbd4d6bfa8123bb85e678924972a0cbe55637d 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 cb9833311e820afaafba7d8bb1a9f5bc1ed201dd..585266ed7a4ea6df61c09e00ffc68c941b513a70 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 83614489f14e63bcb7815b0ae0de4fc8acba05d8..ac3cff679d88ed15e8e38c8b59ae7638ead754d4 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 5747ec9ad9492b2a7e200c19b4fc16a2279c0513..f61f9b5e908e46e4ccb0e7d9fdc82eea1b335802 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 ff255726adeb14559fb70d63a365baf25733e477..edd0d85e0ad5e1894c6d4bede5e0d1a6afd8162a 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 3d696268a6a10f872a18de36794cfef3442bf252..d130ba14f728857cac4944fa43ffe58e5b7a0ca6 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 caa327132912ff900cf25f8ef0d60840588bd0a2..b8ce9056563778bc07d34cb41fb90e49c9f3f0e2 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 d3a7fc2e37b803ff73b3f39801e206913a6fc671..f53ff3d4bc4f4f01e646e67f5aae01ed4b027921 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 a6ea4b4b0fb67c7fc5098a4280f96c3f35cda8d6..0d30e034ceae9bf5ccc838e2641c5a7c6c1091c1 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 6f319b1e8ffe4f54c3046e34ffab1539027be1f3..760cee57d5cfb3b5f7a70becb3258afb14449631 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
 
@@ -97,12 +97,12 @@ if __name__ == '__main__':
     Y_points = 512
 
     sample = get_sample()
-    interface_index = 0 # top interface
+    layer_index = 1 # top interface
     seed = -1 # seed < 0 ==> random every time
 
     # generate roughness map
     roughness_map = ba.RoughnessMap(X_points, Y_points, Lx, Ly,
-                                    sample, interface_index, seed)
+                                    sample, layer_index, seed)
     surface = dac.npArray(roughness_map.generate())
     print("rms = {:.3}".format(np.std(surface)),"nm")
 
diff --git a/auto/FigExamples/fit/scatter2d/expfit_galaxi.py b/auto/FigExamples/fit/scatter2d/expfit_galaxi.py
index 7b744666a992d461bc7029dc466b2efb29770d91..e7f44ceb8c4e1238e4c9f5b5e8c1f9defd328419 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 1936b6ddcb78d7df94c58f3da4ef630da36b2757..dce5578cbb55810c1f2f542a4e3864514d096969 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 d2fd6fb2c2cc6a50f1caab69559b4055a1ddb36b..7b5937050a8a36f91c102f2b33064f0527726183 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 48d5cd964c6158864c3acf40f55a1e9d5cd01fbc..09a5b85ddc1eb85859ac8d5f0586ce04192c4cfa 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 f6ca20a4d9a1c64388a9d0bd96772b601d7a26c8..87ef4678a46325ddb42b7e26ac50cac13167664f 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 283b7dc962517de178418f6d9315f811d61d144d..587f9362ca587810d0099c2100c32bc7e3cbfb9a 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 0561abf001ee0f3b1d1d50286d682edd460aff78..b6277d248f7b9dceb5157f1f61c0aeac60ca4b0d 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 6d918bd201c348b8e5d2dff28f1929fe0dc2062d..481f900f9d18a9eaf7b2e6d2698bfa3246869d3e 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 a70446e70ea9e20af7c4a865317c475b07102576..74504c8213b11abd5e1875955e779c99e355c281 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 fdb0644de49dd40b176bb562c0462a797d3d85e4..34ef03d1f99796b748baa77cc47106a169743524 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 3e12728728967c77db29047bcd7fdf035c514816..291bef064ebadb77297ff3c11734cf0f57c82e4e 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 3f60f0f3ac8725a21909afd6ddb47413010550a3..b8ec2ff1dc84d8a0660f13f8fbf3ac12f562455e 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 dd42a718c6bc34f404817f8c566a7aaf978c23b3..4699a7a31cdd2707fce0b9d75d3ba9d070aae1f0 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 0a4d92092360adfb134c73f458fc565639cc9ea0..305bfaab0933fed529a79e279b0254b1c36ab02a 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 a52132ee3887050665ff5b79d2a43022a942e927..dc16882b36a95b0ff1caa53015579ca523a4d298 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 181070ebdde44b133c01ea41bd906a2f5c246afa..18bca802f96337cb92562146458014bdcac25025 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
 
@@ -97,12 +97,12 @@ if __name__ == '__main__':
     Y_points = 512
 
     sample = get_sample()
-    interface_index = 0 # top interface
+    layer_index = 1 # top interface
     seed = -1 # seed < 0 ==> random every time
 
     # generate roughness map
     roughness_map = ba.RoughnessMap(X_points, Y_points, Lx, Ly,
-                                    sample, interface_index, seed)
+                                    sample, layer_index, seed)
     surface = dac.npArray(roughness_map.generate())
     print("rms = {:.3}".format(np.std(surface)),"nm")
 
diff --git a/auto/MiniExamples/fit/scatter2d/expfit_galaxi.py b/auto/MiniExamples/fit/scatter2d/expfit_galaxi.py
index 7b744666a992d461bc7029dc466b2efb29770d91..e7f44ceb8c4e1238e4c9f5b5e8c1f9defd328419 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 1936b6ddcb78d7df94c58f3da4ef630da36b2757..dce5578cbb55810c1f2f542a4e3864514d096969 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 d2fd6fb2c2cc6a50f1caab69559b4055a1ddb36b..7b5937050a8a36f91c102f2b33064f0527726183 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 48d5cd964c6158864c3acf40f55a1e9d5cd01fbc..09a5b85ddc1eb85859ac8d5f0586ce04192c4cfa 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 f6ca20a4d9a1c64388a9d0bd96772b601d7a26c8..87ef4678a46325ddb42b7e26ac50cac13167664f 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 2fd2ab16085354ed9d4fae6d3920a78506bf193b..c86a05ce2897b9c54995065c771263eca181b3b1 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 dff362626ff5ae135c223b978b176157623af74a..c5bf1e6fef5b4ef757540e89b9784e11daf00a89 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 e9ad574e64619e6c823e3c522d9511f2e8f5dfa6..c91d672cd9060eca04759e3eb6ad0a1de7614613 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 8b5d01caa96c74d851e3247c868ea8c3997cbdc1..e274965f772a4aa459fd53e5164b5ed10560f7b9 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 d2e103da8b6284575d9c2be88c9f92688f313ad6..50290728ac5497eff0efcd7f9948d292e20d34c0 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 3e12728728967c77db29047bcd7fdf035c514816..291bef064ebadb77297ff3c11734cf0f57c82e4e 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 3f60f0f3ac8725a21909afd6ddb47413010550a3..b8ec2ff1dc84d8a0660f13f8fbf3ac12f562455e 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 d02b645a71c06c71a9ae8e6b45ef660ec9faef14..20643d08d3757cbb11281df05e5ddf3e272cab6d 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 537c356420c62c87ad8521b6d8383a4e94ed0362..73ccd906f8f6923e9d7e84da34930f070a43c374 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 a52132ee3887050665ff5b79d2a43022a942e927..dc16882b36a95b0ff1caa53015579ca523a4d298 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 e677d0d71bde31933fc84e9a2875735656dc85e3..045be5bde5e3f7a878d8f231cfcdc17cb2a32932 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
 
@@ -97,12 +97,12 @@ if __name__ == '__main__':
     Y_points = 10
 
     sample = get_sample()
-    interface_index = 0 # top interface
+    layer_index = 1 # top interface
     seed = -1 # seed < 0 ==> random every time
 
     # generate roughness map
     roughness_map = ba.RoughnessMap(X_points, Y_points, Lx, Ly,
-                                    sample, interface_index, seed)
+                                    sample, layer_index, seed)
     surface = dac.npArray(roughness_map.generate())
     print("rms = {:.3}".format(np.std(surface)),"nm")
 
diff --git a/auto/Wrap/libBornAgainSample.py b/auto/Wrap/libBornAgainSample.py
index 435fde8107ad55f7739f64c35d88826e21fe6d2a..f209238069463e1b9f19b5643e614e80cc0fc23b 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):
-        r"""__init__(Layer self, Material material, double thickness=0) -> Layer"""
-        _libBornAgainSample.Layer_swiginit(self, _libBornAgainSample.new_Layer(material, thickness))
+    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 80fe650453fde55bfdc2b765eac44ade1ae99dd8..b7f7a6019e8659f9b50e0cecf9a1379390e0f06b 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"
@@ -51245,6 +51244,57 @@ SWIGINTERN PyObject *RoughnessMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObj
 }
 
 SWIGINTERN PyObject *_wrap_new_Layer__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  Material *arg1 = 0 ;
+  double arg2 ;
+  LayerRoughness *arg3 = (LayerRoughness *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  Layer *result = 0 ;
+  
+  (void)self;
+  if ((nobjs < 3) || (nobjs > 3)) 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);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_Layer" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_LayerRoughness, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_Layer" "', argument " "3"" of type '" "LayerRoughness const *""'"); 
+  }
+  arg3 = reinterpret_cast< LayerRoughness * >(argp3);
+  {
+    try {
+      result = (Layer *)new Layer((Material const &)*arg1,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_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Layer, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_Layer__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   Material *arg1 = 0 ;
   double arg2 ;
@@ -51287,7 +51337,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_new_Layer__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
+SWIGINTERN PyObject *_wrap_new_Layer__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) {
   PyObject *resultobj = 0;
   Material *arg1 = 0 ;
   void *argp1 = 0 ;
@@ -51322,20 +51372,76 @@ 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[3] = {
+  PyObject *argv[4] = {
     0
   };
   
-  if (!(argc = SWIG_Python_UnpackTuple(args, "new_Layer", 0, 2, argv))) SWIG_fail;
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_Layer", 0, 3, argv))) SWIG_fail;
   --argc;
   if (argc == 1) {
     int _v = 0;
     int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL | 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      return _wrap_new_Layer__SWIG_1(self, argc, argv);
+      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) {
@@ -51348,7 +51454,26 @@ SWIGINTERN PyObject *_wrap_new_Layer(PyObject *self, PyObject *args) {
         _v = SWIG_CheckState(res);
       }
       if (_v) {
-        return _wrap_new_Layer__SWIG_0(self, argc, argv);
+        return _wrap_new_Layer__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v = 0;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_Material, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_LayerRoughness, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new_Layer__SWIG_0(self, argc, argv);
+        }
       }
     }
   }
@@ -51356,8 +51481,10 @@ SWIGINTERN PyObject *_wrap_new_Layer(PyObject *self, PyObject *args) {
 fail:
   SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_Layer'.\n"
     "  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;
 }
 
@@ -51759,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 ;
@@ -51903,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 ;
@@ -51918,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 {
@@ -51952,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 ;
@@ -51964,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 {
@@ -75237,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)"},
+	 { "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"},
@@ -75257,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"},
@@ -75885,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 d8c144eea870eed96af0fbe0295c9baeeaa0ab30..832075302e49c83564cb2d253e29613953013559 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 1936b6ddcb78d7df94c58f3da4ef630da36b2757..dce5578cbb55810c1f2f542a4e3864514d096969 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 598aadf8726565eae1965d017a857a3e9eb2d292..f5d118abc5a3f17303dc3a6cf8b16b958f8d4374 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 f4f708970f0b172894e11eb60594195e8912b37d..0f93a677597e7c605771b98aa2e677cdd9e5a436 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 a86ffcaab708b0fdb8936e4129ae8d5cde5b0eb8..51c37b6ebbf0a5bc3e53e6bf97c087ddcd73d07c 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 a7f82ddcb8ef515b31f2ad4d1024349f2d63ddab..fbd96289b55a4237229ee872192a0668953cb1db 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 fd99e5c65c4c0ac4b05dfe6bbbc8ffb744eae78e..e4ce4b0b9ffcaf6cdda45e41761e28ef8b88cd0d 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 4f8f2494eb7fd84fcd45025f36b3aaa49ec60b24..db7c12daa157e659ab5c63338c7543b738c2febb 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 e7581e87aa1cb042e615a5cf18ed745b77ff5b5a..9f865dec3f73349585225dd627b591a3a90ce32d 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 c81a982904023bb6c4a17d98d9a1e4e2ac3a20af..fe751b4c1801348cfb8e425d02a1a63a694bf6bf 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 4431c856819ed6d293c94a3387acb1a34ec53c25..9f097d78e1ba18164c118476cdc38ce060693b67 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 487d78cca4c14b945c1e455064ed37ee60f396d7..1eaa33e3368390e0e67cce0df23d70c5a7a76b30 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 60f2379a0437bfe5c7bb39b951b27afe13ed308f..195c7632e395802e0fe2db3280547f15365da670 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 fa8e1c6f775ead36ea12938155f5a62ec28498b8..f9dc7f97965b1c95e00233ca813f97f35fdabd03 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 e8e5342b211a9c55509ed3dbaadd54a1e8ee2346..8ae7cdaada354d11c05eb19167f8c24230632c5a 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 f353a60c88787bb69c15f6c50ffbbd74c4ef9b4f..24a0029a9a139862140e251d9aea14eab4981218 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
 
@@ -97,12 +97,12 @@ if __name__ == '__main__':
     Y_points = <%= test_mode ? 10 : 512 %>
 
     sample = get_sample()
-    interface_index = 0 # top interface
+    layer_index = 1 # top interface
     seed = -1 # seed < 0 ==> random every time
 
     # generate roughness map
     roughness_map = ba.RoughnessMap(X_points, Y_points, Lx, Ly,
-                                    sample, interface_index, seed)
+                                    sample, layer_index, seed)
     surface = dac.npArray(roughness_map.generate())
     print("rms = {:.3}".format(np.std(surface)),"nm")