diff --git a/App/src/TestDiffuseScattering.cpp b/App/src/TestDiffuseScattering.cpp
index e87edff764e161a5f3877bf134903ac2b54905eb..71e9a3d907374fc7866cbc4af775e8ad8f9a54cf 100644
--- a/App/src/TestDiffuseScattering.cpp
+++ b/App/src/TestDiffuseScattering.cpp
@@ -26,22 +26,17 @@ void TestDiffuseScattering::execute()
 {
     std::cout << "TestDiffuseScattering::execute() -> Info." << std::endl;
 
-    std::cout << "TestFresnelCoeff::execute() -> Info." << std::endl;
-
-
+    // creation of materials
     MaterialManager &matManager = MaterialManager::instance();
-
-
-    MultiLayer mySample;
-
-    // creation of materials and layers
     const IMaterial *mAmbience = matManager.addHomogeneousMaterial("ambience",complex_t(1.0, 0.0) );
     const IMaterial *mAg1 = matManager.addHomogeneousMaterial( "Ag1",complex_t(0.99999653774962993, 0) );
     const IMaterial *mCr1 = matManager.addHomogeneousMaterial("Cr1",complex_t(0.99999701914797656, 0) );
     const IMaterial *mSubstrate = matManager.addHomogeneousMaterial("substrate", complex_t(0.99999692440971188, 0) );
-
     matManager.print();
 
+    // create layers
+    MultiLayer mySample;
+
     Layer lAmbience;
     lAmbience.setMaterial(mAmbience, 0);
 
@@ -55,16 +50,27 @@ void TestDiffuseScattering::execute()
     lSubstrate.setMaterial(mSubstrate, 0);
 
     // adding layers
-    mySample.add(lAmbience);
+    mySample.addLayer(lAmbience);
 
     const unsigned nrepetitions = 4;
     for(unsigned i=0; i<nrepetitions; ++i) {
         mySample.addLayerWithTopRoughness(lAg1, LayerRoughness(3.,4.,5.) );
-        mySample.add(lCr1);
+        mySample.addLayer(lCr1);
     }
-    mySample.add(lSubstrate);
+    mySample.addLayer(lSubstrate);
 
     mySample.print();
 
+    std::cout << "--- Attempt to clone MultiLayer" << std::endl;
+
+    MultiLayer *newSample = mySample.clone();
+    newSample->print();
+
+    MultiLayer *newSample2 = newSample->clone();
+
+    delete newSample;
+
+    newSample2->print();
+
 }
 
diff --git a/App/src/TestFresnelCoeff.cpp b/App/src/TestFresnelCoeff.cpp
index e17657bf03d4b838a650d44a0c693db8913bc77b..6bb54a57024fee55a070d974095b73400ad32200 100644
--- a/App/src/TestFresnelCoeff.cpp
+++ b/App/src/TestFresnelCoeff.cpp
@@ -48,14 +48,14 @@ void TestFresnelCoeff::execute()
     lSubstrate.setMaterial(&mSubstrate, 0);
 
     // adding layers
-    mySample.add(lAmbience);
+    mySample.addLayer(lAmbience);
 
     const unsigned nrepetitions = 4;
     for(unsigned i=0; i<nrepetitions; ++i) {
-        mySample.add(lAg1);
-        mySample.add(lCr1);
+        mySample.addLayer(lAg1);
+        mySample.addLayer(lCr1);
     }
-    mySample.add(lSubstrate);
+    mySample.addLayer(lSubstrate);
 
     // -------------------
     // calculation of Fresnel coefficients for multi-layers system
diff --git a/Core/inc/LayerInterface.h b/Core/inc/LayerInterface.h
index 95a39f0c9c29f6e9a8ddd1f6fb45ab3816fb4a07..89f95f11947666d5f168d251c170ce0b989e5e59 100644
--- a/Core/inc/LayerInterface.h
+++ b/Core/inc/LayerInterface.h
@@ -50,6 +50,9 @@ public:
     //! set roughness of the interface
     inline void setRoughness(const LayerRoughness &roughness) { m_roughness = roughness; }
 
+    //! get roughness of the interface
+    inline const LayerRoughness &getRoughness() { return m_roughness; }
+
     //! get top layer
     inline const Layer *getLayerTop() const { return m_LayerTop; }
 
diff --git a/Core/inc/MultiLayer.h b/Core/inc/MultiLayer.h
index 134e32e8cc1e020e54c00db010ae7cc1ed095075..858d7134eed5ea30fd49ab4e3f08f3c9babf48e5 100644
--- a/Core/inc/MultiLayer.h
+++ b/Core/inc/MultiLayer.h
@@ -25,7 +25,7 @@
 /// @class MultiLayer
 /// @brief Stack of layers one on top of the other
 ///
-/// Example of system of 4 layers:
+/// Example of system of 4 layers (3 interfaces):
 ///
 ///  ambience    layer #0        z=getLayerBottomZ(0)=0.0
 ///  ---------   interface #0
@@ -46,13 +46,13 @@ public:
     inline size_t getNumberOfLayers() const { return m_layers.size(); }
 
     /// add object to multilayer, overrides from ISample
-    virtual void add(const ISample &p_child);
+    void addLayer(const Layer &p_child);
 
     /// add layer with top roughness
     void addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness);
 
     /// return layer with given index
-    const Layer *getLayer(size_t i_layer) const { return &m_layers[ check_layer_index(i_layer) ]; }
+    const Layer *getLayer(size_t i_layer) const { return m_layers[ check_layer_index(i_layer) ]; }
 
     /// return z-coordinate of the layer's bottom
     double getLayerBottomZ(size_t i_layer) const { return m_layers_z[ check_layer_index(i_layer) ]; }
@@ -73,10 +73,8 @@ public:
     void print();
 
 private:
-    /// hiding copy constructor
+    /// hiding copy constructor & assignment operator
     MultiLayer(const MultiLayer &);
-
-    /// hiding assignment operator
     MultiLayer &operator=(const MultiLayer &);
 
     /// check index of layer w.r.t. vector length
@@ -85,7 +83,7 @@ private:
     /// check index of interface w.r.t. vector length
     inline size_t check_interface_index(size_t i_interface) const { return i_interface < m_interfaces.size() ? i_interface : throw OutOfBoundsException("Interface index is out of bounds"); }
 
-    std::vector<Layer > m_layers;                 ///< stack of layers [nlayers]
+    std::vector<Layer *> m_layers;                ///< stack of layers [nlayers]
     std::vector<double > m_layers_z;              ///< coordinate of layer's bottoms [nlayers]
     std::vector<LayerInterface *> m_interfaces;   ///< stack of layer interfaces [nlayers-1]
 };
diff --git a/Core/src/MultiLayer.cpp b/Core/src/MultiLayer.cpp
index 7e4352eda67698ba27c4a606e9014ad21be13a34..ab9f3db9939c11d557a0eedfc8aeed4e39a02151 100644
--- a/Core/src/MultiLayer.cpp
+++ b/Core/src/MultiLayer.cpp
@@ -9,31 +9,9 @@ MultiLayer::MultiLayer()
 }
 
 
-//MultiLayer::MultiLayer(const MultiLayer &other) : ISample(other)
-//{
-//    m_layers = other.m_layers;
-//    m_layers_z = other.m_layers_z;
-//    m_interfaces = other.m_interfaces;
-//}
-
-
-//MultiLayer &MultiLayer::operator=(const MultiLayer &other)
-//{
-//    if( this != &other)
-//    {
-
-//        clean();
-//        m_layers = other.m_layers;
-//        m_layers_z = other.m_layers_z;
-//        //m_interfaces = other.m_interfaces;
-//    }
-//    return *this;
-//}
-
-
 MultiLayer::~MultiLayer()
 {
-
+    clear();
 }
 
 
@@ -42,50 +20,65 @@ MultiLayer::~MultiLayer()
 /* ************************************************************************* */
 void MultiLayer::clear()
 {
+    for(size_t i=0; i<m_layers.size(); i++) {
+        if( m_layers[i] ) delete m_layers[i];
+    }
     m_layers.clear();
-    m_layers_z.clear();
-    for(size_t i=0; i<m_interfaces.size(); i++)
-    {
-        if( m_interfaces[i] ) {
-            delete m_interfaces[i];
-            m_interfaces[i] = 0;
-        }
-        m_interfaces.clear();
+
+    for(size_t i=0; i<m_interfaces.size(); i++) {
+        if( m_interfaces[i] ) delete m_interfaces[i];
     }
+    m_interfaces.clear();
+
+    m_layers_z.clear();
 }
 
 
 /* ************************************************************************* */
-// clear MultiLayer contents including interfaces
+// clone MultiLayer contents including interfaces
 /* ************************************************************************* */
 MultiLayer *MultiLayer::clone()
 {
-//    MultiLayer
-//    m_layers.clear();
-//    m_layers_z.clear();
-//    for(size_t i=0; i<m_interfaces.size(); i++)
-//    {
-//        if( m_interfaces[i] ) {
-//            delete m_interfaces[i];
-//            m_interfaces[i] = 0;
-//        }
-//        m_interfaces.clear();
-//    }
-    return 0;
-}
+    MultiLayer *newMultiLayer = new MultiLayer();
 
-const LayerInterface *MultiLayer::getLayerBottomInterface(size_t i_layer)
-{
-    return i_layer<m_interfaces.size() ? m_interfaces[ check_interface_index(i_layer) ] : 0;
+    newMultiLayer->m_layers_z = m_layers_z;
+
+    for(size_t i=0; i<m_layers.size(); i++) {
+        newMultiLayer->m_layers.push_back( new Layer( *m_layers[i] ) );
+    }
+
+    for(size_t i=0; i<m_interfaces.size(); i++) {
+        const Layer *topLayer = newMultiLayer->m_layers[i];
+        const Layer *bottomLayer = newMultiLayer->m_layers[i+1];
+
+        LayerInterface *newInterface = LayerInterface::createRoughInterface(topLayer, bottomLayer, m_interfaces[i]->getRoughness() );
+        newMultiLayer->m_interfaces.push_back( newInterface );
+    }
+
+    return newMultiLayer;
 }
 
 
+/* ************************************************************************* */
+// return pointer to the top interface of the layer
+// (nInterfaces = nLayers-1, first layer in multilayer doesn't have interface)
+/* ************************************************************************* */
 const LayerInterface *MultiLayer::getLayerTopInterface(size_t i_layer)
 {
     return i_layer>0 ? m_interfaces[ check_interface_index(i_layer-1) ] : 0;
 }
 
 
+/* ************************************************************************* */
+// return pointer to the bottom interface of the layer
+// (nInterfaces = nLayers-1, i.e. last layer in multilayer doesn't have interface)
+/* ************************************************************************* */
+const LayerInterface *MultiLayer::getLayerBottomInterface(size_t i_layer)
+{
+    return i_layer<m_interfaces.size() ? m_interfaces[ check_interface_index(i_layer) ] : 0;
+}
+
+
 /* ************************************************************************* */
 // print content of multilayer on the screen
 /* ************************************************************************* */
@@ -108,7 +101,7 @@ void MultiLayer::print()
         if(interface) {
             std::cout << " " << " layers("
                       << " " << std::setw(16) << interface->getLayerTop()
-                      << "," << std::setw(16) << interface->getLayerTop() << ")";
+                      << "," << std::setw(16) << interface->getLayerBottom() << ")";
         }
         std::cout << std::endl;
     }
@@ -121,28 +114,25 @@ void MultiLayer::print()
 /* ************************************************************************* */
 void MultiLayer::addLayerWithTopRoughness(const Layer &layer, const LayerRoughness &roughness)
 {
+    Layer *p_new_layer = new Layer(layer);
     if (getNumberOfLayers())
     {
-        //const Layer *p_last_layer = getLayer( getNumberOfLayers()-1 );
-        const Layer *p_previous_layer = &m_layers[m_layers.size() -1 ];
-        m_layers.push_back(layer);
-        const Layer *p_new_layer = &m_layers[m_layers.size() -1 ];
-        std::cout << "XXX" << p_previous_layer << " " << p_new_layer << std::endl;
-        LayerInterface *interface = LayerInterface::createRoughInterface( p_previous_layer, p_new_layer, roughness);
+        const Layer *p_last_layer = m_layers.back();
+        LayerInterface *interface = LayerInterface::createRoughInterface( p_last_layer, p_new_layer, roughness);
+        m_layers.push_back( p_new_layer );
         m_interfaces.push_back(interface);
         m_layers_z.push_back(m_layers_z.back() - layer.getThickness() );
         return;
     }
-    m_layers.push_back(layer);
+    m_layers.push_back(p_new_layer);
     m_layers_z.push_back(0.0);
 }
 
 
-void MultiLayer::add(const ISample &p_child)
+void MultiLayer::addLayer(const Layer &p_child)
 {
-    LayerRoughness defRough;
-    const Layer &layer = dynamic_cast<const Layer&>(p_child);
-    addLayerWithTopRoughness(layer, defRough);
+    const Layer &layer = dynamic_cast<const Layer &>(p_child);
+    addLayerWithTopRoughness(layer, LayerRoughness());
 }