diff --git a/CMakeLists.txt b/CMakeLists.txt
index f328552d5f0c936002c8d0203b18481741435349..668be0606ffee0eb3ad000017eddd6ff2c519835 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,6 +31,7 @@ include(BornAgainMacros)
 include(SearchInstalledSoftware)
 include(CheckCompiler)
 include(BornAgainConfiguration)
+include(UnitTests)
 
 #--- Recurse into the given subdirectories ---
 if(BORNAGAIN_USERMANUAL)
diff --git a/Core/CMakeLists.txt b/Core/CMakeLists.txt
index 73ef2c0d34f72c2e083795292c8e212314875557..618f620039cf752de0964019dc2d60f6e48d69a1 100644
--- a/Core/CMakeLists.txt
+++ b/Core/CMakeLists.txt
@@ -18,7 +18,7 @@ set(include_dirs
     ${CMAKE_CURRENT_SOURCE_DIR}/InputOutput
     )
 
-  set(bornagain_swig_dir  ${CMAKE_CURRENT_SOURCE_DIR}/../dev-tools/swig)
+set(bornagain_swig_dir ${CMAKE_CURRENT_SOURCE_DIR}/../dev-tools/swig)
 
 
 include_directories(${include_dirs})
@@ -60,7 +60,7 @@ if(BORNAGAIN_PYTHON)
     set(SWIG_FLAGS "")
     list(APPEND SWIG_FLAGS "-c++")
     list(APPEND SWIG_FLAGS "-python")
-    
+
     foreach(dir ${include_dirs})
       list(APPEND SWIG_FLAGS "-I${dir}")
     endforeach(dir)
@@ -74,11 +74,11 @@ if(BORNAGAIN_PYTHON)
       ${bornagain_swig_dir}/shared_pointers.i
       ${bornagain_swig_dir}/warnings.i
       )
-    
+
     add_custom_command (
       OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/PythonAPI/libBornAgainCore.py ${CMAKE_CURRENT_SOURCE_DIR}/PythonAPI/libBornAgainCore_wrap.h ${CMAKE_CURRENT_SOURCE_DIR}/PythonAPI/libBornAgainCore_wrap.cxx
       COMMAND ${SWIG_EXECUTABLE} ${SWIG_FLAGS} ${bornagain_swig_dir}/libBornAgainCore.i
-      COMMAND ${PYTHON_EXECUTABLE} ${bornagain_swig_dir}/tweaks.py ${bornagain_swig_dir}/libBornAgainCore.py ${bornagain_swig_dir}/libBornAgainCore.py 	
+      COMMAND ${PYTHON_EXECUTABLE} ${bornagain_swig_dir}/tweaks.py ${bornagain_swig_dir}/libBornAgainCore.py ${bornagain_swig_dir}/libBornAgainCore.py
       COMMAND ${CMAKE_COMMAND} -E copy ${bornagain_swig_dir}/libBornAgainCore.py ${CMAKE_CURRENT_SOURCE_DIR}/PythonAPI/libBornAgainCore.py
       COMMAND ${CMAKE_COMMAND} -E copy ${bornagain_swig_dir}/libBornAgainCore_wrap.cxx ${CMAKE_CURRENT_SOURCE_DIR}/PythonAPI/libBornAgainCore_wrap.cxx
       COMMAND ${CMAKE_COMMAND} -E copy ${bornagain_swig_dir}/libBornAgainCore_wrap.h ${CMAKE_CURRENT_SOURCE_DIR}/PythonAPI/libBornAgainCore_wrap.h
@@ -91,16 +91,16 @@ if(BORNAGAIN_PYTHON)
     # autogenerate doxygen.i from doxygen comments
     if(BORNAGAIN_GENERATE_PYTHON_DOCS)
       configure_file(${CMAKE_SOURCE_DIR}/Doc/Doxygen/DoxyfileSwig.in ${CMAKE_CURRENT_BINARY_DIR}/PythonAPI/Doxyfile @ONLY)
-      
+
       add_custom_command(
         OUTPUT ${bornagain_swig_dir}/doxygen_core.i
         COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/PythonAPI/Doxyfile
         COMMAND ${PYTHON_EXECUTABLE} ${bornagain_swig_dir}/doxy2swig.py ${CMAKE_CURRENT_BINARY_DIR}/Doc/xml/index.xml ${bornagain_swig_dir}/doxygen_core.i
         DEPENDS ${include_files}
         )
-      
+
     endif(BORNAGAIN_GENERATE_PYTHON_DOCS)
-    
+
   endif(BORNAGAIN_GENERATE_BINDINGS)
 
   add_custom_target (
@@ -112,14 +112,14 @@ if(BORNAGAIN_PYTHON)
   # manually add: if does not exist, will be created by swig
   list(APPEND source_files "PythonAPI/libBornAgainCore_wrap.cxx")
   #list(APPEND include_files "PythonAPI/libBornAgainCore_wrap.h")
-  
+
 
   # add_custom_target(
   #   ${library_name}_python
   #   COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/PythonAPI/libBornAgainCore.py ${CMAKE_BINARY_DIR}/lib/libBornAgainCore.py
   #   )
   configure_file(../dev-tools/python-setup/bornagain/plot_utils.py ${CMAKE_BINARY_DIR}/lib/plot_utils/__init__.py COPYONLY)
-  
+
 endif()
 
 
@@ -211,7 +211,7 @@ if(WIN32)
             ${CMAKE_BINARY_DIR}/bin/${libprefix}${library_name}${libsuffix}
             ${CMAKE_BINARY_DIR}/lib/${libprefix}${library_name}${libsuffix}
         )
-        
+
     endif()
 
     # system libraries
@@ -278,4 +278,3 @@ else()
     install (DIRECTORY ${CMAKE_SOURCE_DIR}/dev-tools/python-setup/bornagain DESTINATION ${destination_libexec} COMPONENT Libraries)
     install (FILES "${destination_runtime_configs}/__init__.py" DESTINATION ${destination_libexec}/bornagain COMPONENT Libraries)
 endif()
-
diff --git a/Doc/Doxygen/Doxyfile.long b/Doc/Doxygen/Doxyfile.long
index a27e26ed844b11ee531466fbb4aa057bf81131f2..105aa2225482a359d327897ea75ccf3de7282305 100644
--- a/Doc/Doxygen/Doxyfile.long
+++ b/Doc/Doxygen/Doxyfile.long
@@ -123,7 +123,7 @@ ALWAYS_DETAILED_SEC    = NO
 # operators of the base classes will not be shown.
 # The default value is: NO.
 
-INLINE_INHERITED_MEMB  = NO
+INLINE_INHERITED_MEMB  = YES
 
 # If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path
 # before files name in the file list and in the header files. If set to NO the
diff --git a/Tests/UnitTests/Core/CVectorTest.h b/Tests/UnitTests/Core/0/CVectorTest.h
similarity index 90%
rename from Tests/UnitTests/Core/CVectorTest.h
rename to Tests/UnitTests/Core/0/CVectorTest.h
index f73bf67befde94857d87edb0ad2de6b3c27df91d..c430ea76f2ed035902e6b8e33ee4c49b728cd5cf 100644
--- a/Tests/UnitTests/Core/CVectorTest.h
+++ b/Tests/UnitTests/Core/0/CVectorTest.h
@@ -1,29 +1,16 @@
 #ifndef CVECTORTEST_H
 #define CVECTORTEST_H
 
-
-#include "Types.h"
-#include <cmath>
-
+#include "Vectors3D.h"
 #include "EigenCore.h"
 
-
 class CVectorTest : public ::testing::Test
 {
  protected:
-    CVectorTest();
-    virtual ~CVectorTest();
+    CVectorTest() {}
+    virtual ~CVectorTest() {}
 };
 
-
-CVectorTest::CVectorTest()
-{
-}
-
-CVectorTest::~CVectorTest()
-{
-}
-
 TEST_F(CVectorTest, TrivialOperations)
 {
     kvector_t vec_k(1.,2.,3.);
@@ -58,5 +45,4 @@ TEST_F(CVectorTest, BasicArithmetics)
                cvector_t(complex_t(1.,5.), complex_t(2.,6), complex_t(3,7)) );
 }
 
-
 #endif // CVECTORTEST_H
diff --git a/Tests/UnitTests/Core/ConstKBinAxisTest.h b/Tests/UnitTests/Core/0/ConstKBinAxisTest.h
similarity index 99%
rename from Tests/UnitTests/Core/ConstKBinAxisTest.h
rename to Tests/UnitTests/Core/0/ConstKBinAxisTest.h
index 32b288fb1bed1d2e734f5e43484aa0eae5f4fa92..85d9cf2ab77d73fbb66106673d74d1b838cd235f 100644
--- a/Tests/UnitTests/Core/ConstKBinAxisTest.h
+++ b/Tests/UnitTests/Core/0/ConstKBinAxisTest.h
@@ -4,7 +4,6 @@
 #include "ConstKBinAxis.h"
 #include "OutputDataIOHelper.h"
 #include "Units.h"
-#include "gtest/gtest.h"
 #include <vector>
 
 class ConstKBinAxisTest: public ::testing::Test
diff --git a/Tests/UnitTests/Core/CustomBinAxisTest.h b/Tests/UnitTests/Core/0/CustomBinAxisTest.h
similarity index 96%
rename from Tests/UnitTests/Core/CustomBinAxisTest.h
rename to Tests/UnitTests/Core/0/CustomBinAxisTest.h
index 3be891535b33abb27cbf66eb357281821dc78c24..d71b808b0511b996a4ed9c928f8831114c98669a 100644
--- a/Tests/UnitTests/Core/CustomBinAxisTest.h
+++ b/Tests/UnitTests/Core/0/CustomBinAxisTest.h
@@ -4,7 +4,6 @@
 #include "CustomBinAxis.h"
 #include "OutputDataIOHelper.h"
 #include "Units.h"
-#include "gtest/gtest.h"
 #include <vector>
 
 class CusomBinAxisTest: public ::testing::Test
diff --git a/Tests/UnitTests/Core/FixedBinAxisTest.h b/Tests/UnitTests/Core/0/FixedBinAxisTest.h
similarity index 99%
rename from Tests/UnitTests/Core/FixedBinAxisTest.h
rename to Tests/UnitTests/Core/0/FixedBinAxisTest.h
index 1a017bdf63ba66bd6ab68b84e46e173e5eb46aa3..10dad02525d3bc3bfa3381f208978d0956cba13f 100644
--- a/Tests/UnitTests/Core/FixedBinAxisTest.h
+++ b/Tests/UnitTests/Core/0/FixedBinAxisTest.h
@@ -3,7 +3,6 @@
 
 #include "FixedBinAxis.h"
 #include "OutputDataIOHelper.h"
-#include "gtest/gtest.h"
 #include <iostream>
 
 class FixedBinAxisTest: public ::testing::Test
diff --git a/Tests/UnitTests/Core/Histogram1DTest.h b/Tests/UnitTests/Core/0/Histogram1DTest.h
similarity index 99%
rename from Tests/UnitTests/Core/Histogram1DTest.h
rename to Tests/UnitTests/Core/0/Histogram1DTest.h
index 5f45a531799168b88b0c22c38229628303d4c4d1..ad8f1062051a63166d7d3950f46718d6c14d2c0e 100644
--- a/Tests/UnitTests/Core/Histogram1DTest.h
+++ b/Tests/UnitTests/Core/0/Histogram1DTest.h
@@ -4,7 +4,6 @@
 #include "Histogram1D.h"
 #include "Exceptions.h"
 #include <memory>
-#include "gtest/gtest.h"
 
 class Histogram1DTest : public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/Histogram2DTest.h b/Tests/UnitTests/Core/0/Histogram2DTest.h
similarity index 99%
rename from Tests/UnitTests/Core/Histogram2DTest.h
rename to Tests/UnitTests/Core/0/Histogram2DTest.h
index bf489cdea6084c56a744e286cd30dfb327f52e2d..8a5b64c6632d041027622865174cce90737dd2e0 100644
--- a/Tests/UnitTests/Core/Histogram2DTest.h
+++ b/Tests/UnitTests/Core/0/Histogram2DTest.h
@@ -3,7 +3,6 @@
 
 #include "Histogram2D.h"
 #include <memory>
-#include "gtest/gtest.h"
 
 class Histogram2DTest : public ::testing::Test
 {
@@ -98,7 +97,6 @@ TEST_F(Histogram2DTest, VariableHist)
     EXPECT_EQ(hist->findGlobalBin(-0.75, 0.5), size_t(0));
     EXPECT_EQ(hist->findGlobalBin(0.0, 1.5), size_t(4));
     EXPECT_EQ(hist->findGlobalBin(1.5, 3.0), size_t(11));
-
 }
 
 // y
@@ -142,7 +140,6 @@ TEST_F(Histogram2DTest, VariableHistFill)
             EXPECT_EQ(1.0, hist->getBinNumberOfEntries(binx, biny));
         }
     }
-
 }
 
 // y
@@ -223,8 +220,6 @@ TEST_F(Histogram2DTest, projectionX)
         EXPECT_EQ(3.0, h1->getBinContent(binx));
         EXPECT_DOUBLE_EQ(std::sqrt(0.25), h1->getBinError(binx));
     }
-
-
 }
 
 // y
@@ -272,8 +267,8 @@ TEST_F(Histogram2DTest, projectionY)
         EXPECT_EQ(4, h1->getBinNumberOfEntries(binx));
         EXPECT_DOUBLE_EQ(0.0, h1->getBinError(binx));
     }
-    EXPECT_EQ(4.0, h1->getBinContent(0));
-    EXPECT_EQ(8.0, h1->getBinContent(1));
+    EXPECT_EQ( 4.0, h1->getBinContent(0));
+    EXPECT_EQ( 8.0, h1->getBinContent(1));
     EXPECT_EQ(12.0, h1->getBinContent(2));
 
     // b) create projection along Y axis at given x(slice)
@@ -423,7 +418,6 @@ TEST_F(Histogram2DTest, CreateOutputData)
     for(size_t i=0; i<data->getAllocatedSize(); ++i) {
         EXPECT_EQ(1.0, (*data)[i]);
     }
-
 }
 
 
@@ -441,9 +435,6 @@ TEST_F(Histogram2DTest, GetMaximumGetMinimum)
     EXPECT_EQ(size_t(0), hist.getMinimumBinIndex());
     EXPECT_EQ(59.0, hist.getMaximum());
     EXPECT_EQ(size_t(49), hist.getMaximumBinIndex());
-
 }
 
-
-
 #endif
diff --git a/Tests/UnitTests/Core/KVectorTest.h b/Tests/UnitTests/Core/0/KVectorTest.h
similarity index 99%
rename from Tests/UnitTests/Core/KVectorTest.h
rename to Tests/UnitTests/Core/0/KVectorTest.h
index 12260100d2741261ede0563fd599970db091d436..f99ec25cee92671186a919264a45aeeb70627f95 100644
--- a/Tests/UnitTests/Core/KVectorTest.h
+++ b/Tests/UnitTests/Core/0/KVectorTest.h
@@ -1,8 +1,8 @@
 #ifndef KVECTORTEST_H
 #define KVECTORTEST_H
 
-#include "Units.h"
-#include "Types.h"
+#include "Vectors3D.h"
+#include "Transform3D.h"
 
 class KVectorTest : public ::testing::Test
 {
@@ -129,4 +129,3 @@ TEST_F(KVectorTest, BasicTransformation)
 }
 
 #endif // KVECTORTEST_H
-
diff --git a/Tests/UnitTests/Core/UtilsTest.h b/Tests/UnitTests/Core/0/UtilsTest.h
similarity index 99%
rename from Tests/UnitTests/Core/UtilsTest.h
rename to Tests/UnitTests/Core/0/UtilsTest.h
index 7a4106b28c11b69ef860b624eeaf824f09b94088..a64b25d683a6065fddacb679e03661c6470659c1 100644
--- a/Tests/UnitTests/Core/UtilsTest.h
+++ b/Tests/UnitTests/Core/0/UtilsTest.h
@@ -3,7 +3,6 @@
 
 #include "Utils.h"
 #include "INamed.h"
-#include "gtest/gtest.h"
 #include <map>
 #include <iostream>
 #include <memory>
diff --git a/Tests/UnitTests/Core/VariableBinAxisTest.h b/Tests/UnitTests/Core/0/VariableBinAxisTest.h
similarity index 99%
rename from Tests/UnitTests/Core/VariableBinAxisTest.h
rename to Tests/UnitTests/Core/0/VariableBinAxisTest.h
index 1a1e4b94ea10e7a7d83925fe947d091e217cb5f7..ea58848efdecf26640b5a44906922e5ab67a8525 100644
--- a/Tests/UnitTests/Core/VariableBinAxisTest.h
+++ b/Tests/UnitTests/Core/0/VariableBinAxisTest.h
@@ -3,7 +3,6 @@
 
 #include "VariableBinAxis.h"
 #include "OutputDataIOHelper.h"
-#include "gtest/gtest.h"
 
 class VariableBinAxisTest: public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/FormFactorTest.h b/Tests/UnitTests/Core/1/FormFactorTest.h
similarity index 59%
rename from Tests/UnitTests/Core/FormFactorTest.h
rename to Tests/UnitTests/Core/1/FormFactorTest.h
index 26ec89def32e2c0ba50686fa55927a1435daffe9..75b54559a6688aaa22894e5633f5c47581b9c5a7 100644
--- a/Tests/UnitTests/Core/FormFactorTest.h
+++ b/Tests/UnitTests/Core/1/FormFactorTest.h
@@ -7,7 +7,7 @@
 //!
 //! @homepage  http://bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2015
+//! @copyright Forschungszentrum Jülich GmbH 2015-16
 //! @authors   Scientific Computing Group at MLZ Garching
 //! @authors   C. Durniak, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
 //
@@ -18,13 +18,21 @@
 
 #include "Units.h"
 #include "BornAgainNamespace.h"
-#include "FormFactors.h"
-#include "gtest/gtest.h"
+#include "IFormFactorBorn.h"
+#include "ParticleShapes.h"
 
 class FormFactorTest : public ::testing::Test
 {
 protected:
-    FormFactorTest(){}
+    FormFactorTest() {}
+    void clone_test( const IFormFactorBorn* ff )
+    {
+        IFormFactorBorn* clone = ff->clone();
+        EXPECT_EQ(clone->getName(), ff->getName());
+        EXPECT_EQ(clone->getVolume(), ff->getVolume());
+        cvector_t q(.1, .2, complex_t(.3, .004));
+        EXPECT_EQ(clone->evaluate_for_q(q), ff->evaluate_for_q(q));
+    }
 };
 
 TEST_F(FormFactorTest, AnisoPyramid)
@@ -34,9 +42,8 @@ TEST_F(FormFactorTest, AnisoPyramid)
     double width = 14.;
     double alpha = 0.8;
     double tga = std::tan(alpha);
-    double volume = height*(length*width
-                            - (length + width)*height/tga
-                            + 4.0/3.0*height*height/(tga*tga));
+    double volume = height*
+        (length*width - (length + width)*height/tga + 4.0/3.0*height*height/(tga*tga));
 
     FormFactorAnisoPyramid anisopyramid(length, width, height, alpha);
 
@@ -47,13 +54,7 @@ TEST_F(FormFactorTest, AnisoPyramid)
     EXPECT_EQ(5., anisopyramid.getHeight());
     EXPECT_EQ(0.8, anisopyramid.getAlpha());
 
-    FormFactorAnisoPyramid *anisopyramidclone = anisopyramid.clone();
-    EXPECT_EQ(BornAgain::FFAnisoPyramidType, anisopyramidclone->getName());
-    EXPECT_DOUBLE_EQ(volume, anisopyramidclone->getVolume());
-    EXPECT_EQ(12., anisopyramidclone->getLength());
-    EXPECT_EQ(14., anisopyramidclone->getWidth());
-    EXPECT_EQ(5., anisopyramidclone->getHeight());
-    EXPECT_EQ(0.8, anisopyramidclone->getAlpha());
+    clone_test( &anisopyramid );
 }
 
 TEST_F(FormFactorTest, HemiEllipsoid)
@@ -72,12 +73,7 @@ TEST_F(FormFactorTest, HemiEllipsoid)
     EXPECT_EQ(5., hemiellipsoid.getHeight());
     EXPECT_DOUBLE_EQ(volume, hemiellipsoid.getVolume());
 
-    FormFactorHemiEllipsoid *hemiellipsoidclone = hemiellipsoid.clone();
-    EXPECT_EQ(BornAgain::FFHemiEllipsoidType, hemiellipsoidclone->getName());
-    EXPECT_EQ(6., hemiellipsoidclone->getRadiusX());
-    EXPECT_EQ(7., hemiellipsoidclone->getRadiusY());
-    EXPECT_EQ(5., hemiellipsoidclone->getHeight());
-    EXPECT_DOUBLE_EQ(volume, hemiellipsoidclone->getVolume());
+    clone_test( &hemiellipsoid );
 }
 
 TEST_F(FormFactorTest, Box)
@@ -95,12 +91,7 @@ TEST_F(FormFactorTest, Box)
     EXPECT_EQ(3., box.getRadius());
     EXPECT_DOUBLE_EQ(volume, box.getVolume());
 
-    FormFactorBox *boxclone = box.clone();
-    EXPECT_EQ(BornAgain::FFBoxType, boxclone->getName());
-    EXPECT_EQ(7., boxclone->getWidth());
-    EXPECT_EQ(5., boxclone->getHeight());
-    EXPECT_EQ(3., boxclone->getRadius());
-    EXPECT_DOUBLE_EQ(volume, boxclone->getVolume());
+    clone_test( &box );
 }
 
 TEST_F(FormFactorTest, Cone)
@@ -121,12 +112,7 @@ TEST_F(FormFactorTest, Cone)
     EXPECT_EQ(0.8, cone.getAlpha());
     EXPECT_DOUBLE_EQ(volume, cone.getVolume());
 
-    FormFactorCone *coneclone = cone.clone();
-    EXPECT_EQ(BornAgain::FFConeType, coneclone->getName());
-    EXPECT_EQ(6., coneclone->getRadius());
-    EXPECT_EQ(5., coneclone->getHeight());
-    EXPECT_EQ(0.8, coneclone->getAlpha());
-    EXPECT_DOUBLE_EQ(volume, coneclone->getVolume());
+    clone_test( &cone );
 }
 
 TEST_F(FormFactorTest, Cone6)
@@ -147,12 +133,7 @@ TEST_F(FormFactorTest, Cone6)
     EXPECT_EQ(0.8, cone6.getAlpha());
     EXPECT_DOUBLE_EQ(volume, cone6.getVolume());
 
-    FormFactorCone6 *cone6clone = cone6.clone();
-    EXPECT_EQ(BornAgain::FFCone6Type, cone6clone->getName());
-    EXPECT_EQ(6., cone6clone->getBaseEdge());
-    EXPECT_EQ(5., cone6clone->getHeight());
-    EXPECT_EQ(0.8, cone6clone->getAlpha());
-    EXPECT_DOUBLE_EQ(volume, cone6clone->getVolume());
+    clone_test( &cone6 );
 }
 
 TEST_F(FormFactorTest, Cuboctahedron)
@@ -166,11 +147,9 @@ TEST_F(FormFactorTest, Cuboctahedron)
     double H2divLtga = height*2./length/tga;
     double ratioH2divLtga = height_ratio*height*2./length/tga;
     double volume = 1./6.*tga*length*length*length*( 2.
-         - (1. - H2divLtga)*(1. - H2divLtga)*(1. - H2divLtga)
-           - (1. - ratioH2divLtga)*(1. - ratioH2divLtga)*(1. - ratioH2divLtga));
+         - (1. - H2divLtga)*(1. - H2divLtga)*(1. - H2divLtga)           - (1. - ratioH2divLtga)*(1. - ratioH2divLtga)*(1. - ratioH2divLtga));
 
-    FormFactorCuboctahedron cuboctahedron(length, height,
-                                          height_ratio, alpha);
+    FormFactorCuboctahedron cuboctahedron(length, height, height_ratio, alpha);
 
     EXPECT_EQ(BornAgain::FFCuboctahedronType, cuboctahedron.getName());
     EXPECT_EQ(4., cuboctahedron.getHeight());
@@ -179,13 +158,7 @@ TEST_F(FormFactorTest, Cuboctahedron)
     EXPECT_EQ(0.8, cuboctahedron.getAlpha());
     EXPECT_DOUBLE_EQ(volume, cuboctahedron.getVolume());
 
-    FormFactorCuboctahedron *cuboctahedronclone = cuboctahedron.clone();
-    EXPECT_EQ(BornAgain::FFCuboctahedronType, cuboctahedronclone->getName());
-    EXPECT_EQ(4., cuboctahedronclone->getHeight());
-    EXPECT_EQ(10., cuboctahedronclone->getLength());
-    EXPECT_EQ(1., cuboctahedronclone->getHeightRatio());
-    EXPECT_EQ(0.8, cuboctahedronclone->getAlpha());
-    EXPECT_DOUBLE_EQ(volume, cuboctahedron.getVolume());
+    clone_test( &cuboctahedron );
 }
 
 TEST_F(FormFactorTest, Cylinder)
@@ -195,16 +168,13 @@ TEST_F(FormFactorTest, Cylinder)
     double volume = Units::PI*radius*radius*height;
 
     FormFactorCylinder cylinder(radius,height);
+
     EXPECT_EQ(BornAgain::FFCylinderType, cylinder.getName());
     EXPECT_EQ(5., cylinder.getHeight());
     EXPECT_EQ(3., cylinder.getRadius());
     EXPECT_DOUBLE_EQ(volume, cylinder.getVolume());
 
-    FormFactorCylinder *cylinderclone = cylinder.clone();
-    EXPECT_EQ(BornAgain::FFCylinderType, cylinderclone->getName());
-    EXPECT_EQ(5., cylinderclone->getHeight());
-    EXPECT_EQ(3., cylinderclone-> getRadius());
-    EXPECT_DOUBLE_EQ(volume, cylinderclone-> getVolume());
+    clone_test( &cylinder );
 }
 
 TEST_F(FormFactorTest, Dodecahedron)
@@ -217,10 +187,7 @@ TEST_F(FormFactorTest, Dodecahedron)
     EXPECT_EQ(edge, dodecahedron.getEdge());
     EXPECT_DOUBLE_EQ(volume, dodecahedron.getVolume());
 
-    FormFactorDodecahedron *dodecahedronclone = dodecahedron.clone();
-    EXPECT_EQ(BornAgain::FFDodecahedronType, dodecahedronclone->getName());
-    EXPECT_EQ(edge, dodecahedronclone->getEdge());
-    EXPECT_DOUBLE_EQ(volume, dodecahedronclone-> getVolume());
+    clone_test( &dodecahedron );
 }
 
 TEST_F(FormFactorTest, EllipsoidalCylinder)
@@ -238,12 +205,7 @@ TEST_F(FormFactorTest, EllipsoidalCylinder)
     EXPECT_EQ(5., ellipscyl.getRadiusY());
     EXPECT_DOUBLE_EQ(volume, ellipscyl.getVolume());
 
-    FormFactorEllipsoidalCylinder *ellipscylclone = ellipscyl.clone();
-    EXPECT_EQ(BornAgain::FFEllipsoidalCylinderType, ellipscylclone->getName());
-    EXPECT_EQ(4., ellipscylclone->getHeight());
-    EXPECT_EQ(3., ellipscylclone->getRadiusX());
-    EXPECT_EQ(5., ellipscylclone->getRadiusY());
-    EXPECT_DOUBLE_EQ(volume, ellipscylclone->getVolume());
+    clone_test( &ellipscyl );
 }
 
 TEST_F(FormFactorTest, FullSphere)
@@ -252,15 +214,11 @@ TEST_F(FormFactorTest, FullSphere)
     double volume = 4./3.*Units::PI*radius*radius*radius;
 
     FormFactorFullSphere fullsphere(radius);
-
     EXPECT_EQ(BornAgain::FFFullSphereType, fullsphere.getName());
     EXPECT_EQ(5., fullsphere.getRadius());
     EXPECT_DOUBLE_EQ(volume, fullsphere.getVolume());
 
-    FormFactorFullSphere *fullsphereclone = fullsphere.clone();
-    EXPECT_EQ(BornAgain::FFFullSphereType, fullsphereclone->getName());
-    EXPECT_EQ(5., fullsphereclone->getRadius());
-    EXPECT_DOUBLE_EQ(volume, fullsphereclone->getVolume());
+    clone_test( &fullsphere );
 }
 
 TEST_F(FormFactorTest, FullSpheroid)
@@ -276,11 +234,7 @@ TEST_F(FormFactorTest, FullSpheroid)
     EXPECT_EQ(5., fullspheroid.getHeight());
     EXPECT_DOUBLE_EQ(volume, fullspheroid.getVolume());
 
-    FormFactorFullSpheroid *fullspheroidclone = fullspheroid.clone();
-    EXPECT_EQ(BornAgain::FFFullSpheroidType, fullspheroidclone->getName());
-    EXPECT_EQ(3., fullspheroidclone->getRadius());
-    EXPECT_EQ(5, fullspheroidclone->getHeight());
-    EXPECT_DOUBLE_EQ(volume, fullspheroidclone->getVolume());
+    clone_test( &fullspheroid );
 }
 
 TEST_F(FormFactorTest, Icosahedron)
@@ -289,14 +243,12 @@ TEST_F(FormFactorTest, Icosahedron)
     double volume = 5*(3+sqrt(5))/12*pow(edge,3);
 
     FormFactorIcosahedron icosahedron(edge);
+
     EXPECT_EQ(BornAgain::FFIcosahedronType, icosahedron.getName());
     EXPECT_EQ(edge, icosahedron.getEdge());
     EXPECT_DOUBLE_EQ(volume, icosahedron.getVolume());
 
-    FormFactorIcosahedron *icosahedronclone = icosahedron.clone();
-    EXPECT_EQ(BornAgain::FFIcosahedronType, icosahedronclone->getName());
-    EXPECT_EQ(edge, icosahedronclone->getEdge());
-    EXPECT_DOUBLE_EQ(volume, icosahedronclone-> getVolume());
+    clone_test( &icosahedron );
 }
 
 TEST_F(FormFactorTest, Prism3)
@@ -312,12 +264,7 @@ TEST_F(FormFactorTest, Prism3)
     EXPECT_EQ(6., prism3.getBaseEdge());
     EXPECT_DOUBLE_EQ(volume, prism3.getVolume());
 
-    FormFactorPrism3 *prism3clone = prism3.clone();
-
-    EXPECT_EQ(BornAgain::FFPrism3Type, prism3clone->getName());
-    EXPECT_EQ(4., prism3clone->getHeight());
-    EXPECT_EQ(6., prism3clone->getBaseEdge());
-    EXPECT_DOUBLE_EQ(volume, prism3clone->getVolume());
+    clone_test( &prism3 );
 }
 
 TEST_F(FormFactorTest, Prism6)
@@ -333,12 +280,7 @@ TEST_F(FormFactorTest, Prism6)
     EXPECT_EQ(3., prism6.getBaseEdge());
     EXPECT_DOUBLE_EQ(volume, prism6.getVolume());
 
-    FormFactorPrism6 *prism6clone = prism6.clone();
-
-    EXPECT_EQ(BornAgain::FFPrism6Type, prism6clone->getName());
-    EXPECT_EQ(4., prism6clone->getHeight());
-    EXPECT_EQ(3., prism6clone->getBaseEdge());
-    EXPECT_DOUBLE_EQ(volume, prism6clone->getVolume());
+    clone_test( &prism6 );
 }
 
 TEST_F(FormFactorTest, Pyramid)
@@ -348,8 +290,8 @@ TEST_F(FormFactorTest, Pyramid)
     double alpha = 0.8;
     double tga = std::tan(alpha);
     double H2divLtga = height*2./length/tga;
-    double volume = 1./6.*tga*length* length*length*( 1.
-             - (1. - H2divLtga)*(1. - H2divLtga)*(1. - H2divLtga));
+    double volume = 1./6.*tga*length* length*length*
+        ( 1. - (1. - H2divLtga)*(1. - H2divLtga)*(1. - H2divLtga));
 
     FormFactorPyramid pyramid(length, height, alpha);
 
@@ -359,12 +301,7 @@ TEST_F(FormFactorTest, Pyramid)
     EXPECT_EQ(0.8, pyramid.getAlpha());
     EXPECT_DOUBLE_EQ(volume, pyramid.getVolume());
 
-    FormFactorPyramid *pyramidclone = pyramid.clone();
-    EXPECT_EQ(BornAgain::FFPyramidType, pyramidclone->getName());
-    EXPECT_EQ(4., pyramidclone->getHeight());
-    EXPECT_EQ(10., pyramidclone->getBaseEdge());
-    EXPECT_EQ(0.8, pyramidclone->getAlpha());
-    EXPECT_DOUBLE_EQ(volume, pyramidclone->getVolume());
+    clone_test( &pyramid );
 }
 
 TEST_F(FormFactorTest, TruncatedSphere)
@@ -372,8 +309,8 @@ TEST_F(FormFactorTest, TruncatedSphere)
     double radius = 5.;
     double height = 3.;
     double HdivR = height/radius;
-    double volume = Units::PI/3.*radius*radius*radius
-            *(3.*HdivR -1. - (HdivR - 1.)*(HdivR - 1.)*(HdivR - 1.));
+    double volume = Units::PI/3.*radius*radius*radius*
+            (3.*HdivR -1. - (HdivR - 1.)*(HdivR - 1.)*(HdivR - 1.));
 
     FormFactorTruncatedSphere trsphere(radius, height);
 
@@ -381,9 +318,7 @@ TEST_F(FormFactorTest, TruncatedSphere)
     EXPECT_EQ(3., trsphere.getHeight());
     EXPECT_DOUBLE_EQ(volume, trsphere.getVolume());
 
-    FormFactorTruncatedSphere *trsphereclone = trsphere.clone();
-    EXPECT_EQ(BornAgain::FFTruncatedSphereType, trsphereclone->getName());
-    EXPECT_DOUBLE_EQ(3., trsphereclone->getHeight());
+    clone_test( &trsphere );
 }
 
 TEST_F(FormFactorTest, TruncatedSpheroid)
@@ -391,8 +326,8 @@ TEST_F(FormFactorTest, TruncatedSpheroid)
     double height = 5.;
     double radius = 3.;
     double flattening = 1.5;
-    double volume = Units::PI*radius*height*height/flattening
-            *(1.-height/(3.*flattening*radius));
+    double volume = Units::PI*radius*height*height/flattening*
+            (1.-height/(3.*flattening*radius));
 
     FormFactorTruncatedSpheroid trspheroid(radius, height,flattening);
 
@@ -401,11 +336,7 @@ TEST_F(FormFactorTest, TruncatedSpheroid)
     EXPECT_EQ(3., trspheroid.getRadius());
     EXPECT_DOUBLE_EQ(volume, trspheroid.getVolume());
 
-    FormFactorTruncatedSpheroid *trspheroidclone = trspheroid.clone();
-    EXPECT_EQ(BornAgain::FFTruncatedSpheroidType, trspheroidclone->getName());
-    EXPECT_EQ(5., trspheroidclone->getHeight());
-    EXPECT_EQ(3., trspheroidclone->getRadius());
-    EXPECT_DOUBLE_EQ(volume, trspheroidclone->getVolume());
+    clone_test( &trspheroid );
 }
 
 TEST_F(FormFactorTest, Tetrahedron)
@@ -426,12 +357,7 @@ TEST_F(FormFactorTest, Tetrahedron)
     EXPECT_EQ(0.8, tetrahedron.getAlpha());
     EXPECT_DOUBLE_EQ(volume, tetrahedron.getVolume());
 
-    FormFactorTetrahedron *tetrahedronclone = tetrahedron.clone();
-    EXPECT_EQ(BornAgain::FFTetrahedronType, tetrahedronclone->getName());
-    EXPECT_EQ(4., tetrahedronclone->getHeight());
-    EXPECT_EQ(16., tetrahedronclone->getBaseEdge());
-    EXPECT_EQ(0.8, tetrahedronclone->getAlpha());
-    EXPECT_DOUBLE_EQ(volume, tetrahedronclone->getVolume());
+    clone_test( &tetrahedron );
 }
 
 TEST_F(FormFactorTest, Ripple1)
@@ -449,12 +375,7 @@ TEST_F(FormFactorTest, Ripple1)
     EXPECT_EQ(100., ripple1.getLength());
     EXPECT_DOUBLE_EQ(volume, ripple1.getVolume());
 
-    FormFactorRipple1 *ripple1clone = ripple1.clone();
-    EXPECT_EQ(BornAgain::FFRipple1Type, ripple1clone->getName());
-    EXPECT_DOUBLE_EQ(4., ripple1clone->getHeight());
-    EXPECT_EQ(20., ripple1clone->getWidth());
-    EXPECT_EQ(100., ripple1clone->getLength());
-    EXPECT_DOUBLE_EQ(volume, ripple1clone->getVolume());
+    clone_test( &ripple1 );
 }
 
 TEST_F(FormFactorTest, Ripple2)
@@ -471,9 +392,7 @@ TEST_F(FormFactorTest, Ripple2)
     EXPECT_EQ(4., ripple2.getHeight());
     EXPECT_DOUBLE_EQ(volume, ripple2.getVolume());
 
-    FormFactorRipple2 *ripple2clone = ripple2.clone();
-    EXPECT_EQ(BornAgain::FFRipple2Type, ripple2clone->getName());
-    EXPECT_DOUBLE_EQ(4., ripple2clone->getHeight());
+    clone_test( &ripple2 );
 }
 
 TEST_F(FormFactorTest, TruncatedCube)
@@ -487,14 +406,9 @@ TEST_F(FormFactorTest, TruncatedCube)
     EXPECT_EQ(BornAgain::FFTruncatedCubeType,trcube.getName());
     EXPECT_EQ(length, trcube.getLength());
     EXPECT_DOUBLE_EQ(t, trcube.getRemovedLength());
-    // length or length -2t
     EXPECT_DOUBLE_EQ(trcube.getVolume(), volume);
 
-    FormFactorTruncatedCube *trcubeclone = trcube.clone();
-    EXPECT_EQ(BornAgain::FFTruncatedCubeType, trcubeclone->getName());
-    EXPECT_EQ(length, trcubeclone->getLength());
-    EXPECT_EQ(t, trcubeclone->getRemovedLength());
-    EXPECT_EQ(trcubeclone->getVolume(), volume);
+    clone_test( &trcube );
 }
 
 #endif // FORMFACTORTEST_H
diff --git a/Tests/UnitTests/Core/LayerRoughnessTest.h b/Tests/UnitTests/Core/1/LayerRoughnessTest.h
similarity index 100%
rename from Tests/UnitTests/Core/LayerRoughnessTest.h
rename to Tests/UnitTests/Core/1/LayerRoughnessTest.h
diff --git a/Tests/UnitTests/Core/LayerTest.h b/Tests/UnitTests/Core/1/LayerTest.h
similarity index 100%
rename from Tests/UnitTests/Core/LayerTest.h
rename to Tests/UnitTests/Core/1/LayerTest.h
diff --git a/Tests/UnitTests/Core/1/MultiLayerTest.h b/Tests/UnitTests/Core/1/MultiLayerTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..059f0812aa3ac29977555873237e3da9cf1ceb8c
--- /dev/null
+++ b/Tests/UnitTests/Core/1/MultiLayerTest.h
@@ -0,0 +1,576 @@
+#ifndef MLAYERTEST_H
+#define MLAYERTEST_H
+
+#include "MultiLayer.h"
+#include "BornAgainNamespace.h"
+#include "Layer.h"
+#include "HomogeneousMaterial.h"
+#include "Materials.h"
+#include "Units.h"
+#include "ParticleLayout.h"
+
+class MultiLayerTest : public ::testing::Test
+{
+protected:
+    MultiLayerTest()
+        : air("air", 0, 1.0)
+        , iron("iron", 0, 1.51)
+        , chromium("chromium", 0, 3.68)
+        , stone("stone", 0, 1.6)
+        , topLayer(air, 0*Units::nanometer)
+        , layer1(iron, 20*Units::nanometer)
+        , layer2(chromium, 40*Units::nanometer)
+        , substrate(stone, 0*Units::nanometer) {}
+    void set_four() {
+        mLayer.addLayer(topLayer);
+        mLayer.addLayer(layer1);
+        mLayer.addLayer(layer2);
+        mLayer.addLayer(substrate);
+    }
+
+    MultiLayer mLayer;
+    const HomogeneousMaterial air, iron, chromium, stone;
+    Layer topLayer, layer1, layer2, substrate;
+};
+
+TEST_F(MultiLayerTest, BasicProperty)
+{
+    //check default properties
+    EXPECT_EQ(BornAgain::MultiLayerType, mLayer.getName());
+    EXPECT_EQ(0.0, mLayer.getCrossCorrLength());
+    EXPECT_EQ(size_t(0), mLayer.getNumberOfLayers());
+    EXPECT_EQ(size_t(0), mLayer.getNumberOfInterfaces());
+
+    //set parameter
+    mLayer.setParameterValue(BornAgain::CrossCorrelationLength, -2.54);
+    EXPECT_EQ(-2.54,mLayer.getCrossCorrLength());
+
+    // adding layers
+    mLayer.addLayer(topLayer);
+    EXPECT_EQ(size_t(1), mLayer.getNumberOfLayers());
+    EXPECT_EQ(size_t(0), mLayer.getNumberOfInterfaces());
+
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+    mLayer.addLayer(substrate);
+    EXPECT_EQ(size_t(4), mLayer.getNumberOfLayers());
+    EXPECT_EQ(size_t(3), mLayer.getNumberOfInterfaces());
+}
+
+TEST_F(MultiLayerTest, LayerThicknesses)
+{
+    set_four();
+
+    //check layer thickness
+    EXPECT_EQ( 0.0, mLayer.getLayerThickness(0));
+    EXPECT_EQ(20.0, mLayer.getLayerThickness(1));
+    EXPECT_EQ(40.0, mLayer.getLayerThickness(2));
+    EXPECT_EQ( 0.0, mLayer.getLayerThickness(3));
+
+    //check bottomZ value
+    EXPECT_EQ(  0.0, mLayer.getLayerBottomZ(0));
+    EXPECT_EQ(-20.0, mLayer.getLayerBottomZ(1));
+    EXPECT_EQ(-60.0, mLayer.getLayerBottomZ(2));
+    EXPECT_EQ(-60.0, mLayer.getLayerBottomZ(3));
+
+    //set layer thickness
+    mLayer.setLayerThickness(1, 45.0);
+    EXPECT_EQ(45.0, mLayer.getLayerThickness(1));
+
+    EXPECT_EQ(  0.0, mLayer.getLayerBottomZ(0));
+    EXPECT_EQ(-45.0, mLayer.getLayerBottomZ(1));
+    EXPECT_EQ(-85.0, mLayer.getLayerBottomZ(2));
+    EXPECT_EQ(-85.0, mLayer.getLayerBottomZ(3));
+}
+
+TEST_F(MultiLayerTest, CheckAllLayers)
+{
+    set_four();
+
+    //check individual layer
+    const Layer* got0 = mLayer.getLayer(0);
+    EXPECT_EQ(BornAgain::LayerType, got0->getName());
+    EXPECT_EQ(0, got0->getThickness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), got0->getMaterial()->getName());
+
+    const Layer* got1 = mLayer.getLayer(1);
+    EXPECT_EQ(BornAgain::LayerType, got1->getName());
+    EXPECT_EQ(20, got1->getThickness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), got1->getMaterial()->getName());
+
+    const Layer* got2 = mLayer.getLayer(2);
+    EXPECT_EQ(BornAgain::LayerType, got2->getName());
+    EXPECT_EQ(40, got2->getThickness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), got2->getMaterial()->getName());
+
+    const Layer* got3 = mLayer.getLayer(3);
+    EXPECT_EQ(BornAgain::LayerType, got3->getName());
+    EXPECT_EQ(0, got3->getThickness());
+    EXPECT_EQ(substrate.getMaterial()->getName(), got3->getMaterial()->getName());
+}
+
+TEST_F(MultiLayerTest, LayerInterfaces)
+{
+    set_four();
+
+    //check interfaces
+    const LayerInterface* interface0 = mLayer.getLayerInterface(0);
+    EXPECT_TRUE(nullptr!=interface0);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
+    EXPECT_EQ(nullptr, interface0->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(),
+              interface0->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(),
+              interface0->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface1 = mLayer.getLayerInterface(1);
+    EXPECT_TRUE(nullptr!=interface1);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
+    EXPECT_EQ(nullptr, interface1->getRoughness());
+    EXPECT_EQ(layer1.getMaterial()->getName(),
+              interface1->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer2.getMaterial()->getName(),
+              interface1->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface2 = mLayer.getLayerInterface(2);
+    EXPECT_TRUE(nullptr!=interface2);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
+    EXPECT_EQ(nullptr, interface2->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(),
+              interface2->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(),
+              interface2->getLayerBottom()->getMaterial()->getName());
+
+    //bottom interface
+    const LayerInterface* interfaceBottom = mLayer.getLayerBottomInterface(0);
+    EXPECT_TRUE(nullptr!=interfaceBottom);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
+    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(),
+              interfaceBottom->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(),
+              interfaceBottom->getLayerBottom()->getMaterial()->getName());
+
+    //top interface
+    const LayerInterface* interfaceTop = mLayer.getLayerTopInterface(3);
+    EXPECT_TRUE(nullptr!=interfaceTop);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
+    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(),
+              interfaceTop->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(),
+              interfaceTop->getLayerBottom()->getMaterial()->getName());
+
+    //null interface
+    const LayerInterface* interfaceTopNull = mLayer.getLayerTopInterface(0);
+    EXPECT_TRUE(nullptr==interfaceTopNull);
+
+    const LayerInterface* interfaceBottomNull = mLayer.getLayerBottomInterface(3);
+    EXPECT_TRUE(nullptr==interfaceBottomNull);
+}
+
+TEST_F(MultiLayerTest, Clone)
+{
+    set_four();
+
+    MultiLayer* mLayerClone = mLayer.clone();
+
+    //check properties
+    EXPECT_EQ(BornAgain::MultiLayerType, mLayerClone->getName());
+    EXPECT_EQ(0.0,mLayerClone->getCrossCorrLength());
+    EXPECT_EQ(size_t(4), mLayerClone->getNumberOfLayers());
+    EXPECT_EQ(size_t(3), mLayerClone->getNumberOfInterfaces());
+
+    //check layer thickness
+    EXPECT_EQ(topLayer.getThickness(), mLayerClone->getLayerThickness(0));
+    EXPECT_EQ(layer1.getThickness(), mLayerClone->getLayerThickness(1));
+    EXPECT_EQ(layer2.getThickness(), mLayerClone->getLayerThickness(2));
+    EXPECT_EQ(substrate.getThickness(), mLayerClone->getLayerThickness(3));
+
+    //check bottomZ value
+    EXPECT_EQ(mLayer.getLayerBottomZ(0), mLayerClone->getLayerBottomZ(0));
+    EXPECT_EQ(mLayer.getLayerBottomZ(1), mLayerClone->getLayerBottomZ(1));
+    EXPECT_EQ(mLayer.getLayerBottomZ(2), mLayerClone->getLayerBottomZ(2));
+    EXPECT_EQ(mLayer.getLayerBottomZ(3), mLayerClone->getLayerBottomZ(3));
+
+    //check individual layer
+    const Layer* layerCopy0 = mLayerClone->getLayer(0);
+    EXPECT_EQ(topLayer.getName(), layerCopy0->getName());
+    EXPECT_EQ(topLayer.getThickness(), layerCopy0->getThickness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), layerCopy0->getMaterial()->getName());
+
+    const Layer* layerCopy1 = mLayerClone->getLayer(1);
+    EXPECT_EQ(layer1.getName(), layerCopy1->getName());
+    EXPECT_EQ(layer1.getThickness(), layerCopy1->getThickness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), layerCopy1->getMaterial()->getName());
+
+    const Layer* layerCopy2 = mLayerClone->getLayer(2);
+    EXPECT_EQ(layer2.getName(), layerCopy2->getName());
+    EXPECT_EQ(layer2.getThickness(), layerCopy2->getThickness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), layerCopy2->getMaterial()->getName());
+
+    const Layer* layerCopy3 = mLayerClone->getLayer(3);
+    EXPECT_EQ(substrate.getName(), layerCopy3->getName());
+    EXPECT_EQ(substrate.getThickness(), layerCopy3->getThickness());
+    EXPECT_EQ(substrate.getMaterial()->getName(), layerCopy3->getMaterial()->getName());
+
+    //check interfaces
+    const LayerInterface* interface0 = mLayerClone->getLayerInterface(0);
+    EXPECT_TRUE(nullptr!=interface0);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
+    EXPECT_EQ(nullptr, interface0->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), interface0->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interface0->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface1 = mLayerClone->getLayerInterface(1);
+    EXPECT_TRUE(nullptr!=interface1);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
+    EXPECT_EQ(nullptr, interface1->getRoughness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interface1->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interface1->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface2 = mLayerClone->getLayerInterface(2);
+    EXPECT_TRUE(nullptr!=interface2);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
+    EXPECT_EQ(nullptr, interface2->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interface2->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(), interface2->getLayerBottom()->getMaterial()->getName());
+
+    //top interface
+    const LayerInterface* interfaceBottom = mLayerClone->getLayerTopInterface(1);
+    EXPECT_TRUE(nullptr!=interfaceBottom);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
+    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), interfaceBottom->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interfaceBottom->getLayerBottom()->getMaterial()->getName());
+
+    //Bottom interface
+    const LayerInterface* interfaceTop = mLayerClone->getLayerBottomInterface(2);
+    EXPECT_TRUE(nullptr!=interfaceTop);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
+    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interfaceTop->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(), interfaceTop->getLayerBottom()->getMaterial()->getName());
+
+    //null interface
+    const LayerInterface* interfaceTopNull = mLayerClone->getLayerTopInterface(0);
+    EXPECT_TRUE(nullptr==interfaceTopNull);
+
+    const LayerInterface* interfaceBottomNull = mLayerClone->getLayerBottomInterface(3);
+    EXPECT_TRUE(nullptr==interfaceBottomNull);
+
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, CloneInvertB)
+{
+    set_four();
+
+    MultiLayer* mLayerClone = mLayer.cloneInvertB();
+
+    //check properties
+    EXPECT_EQ(BornAgain::MultiLayerType, mLayerClone->getName());
+    EXPECT_EQ(0.0,mLayerClone->getCrossCorrLength());
+    EXPECT_EQ(size_t(4), mLayerClone->getNumberOfLayers());
+    EXPECT_EQ(size_t(3), mLayerClone->getNumberOfInterfaces());
+
+    //check layer thickness
+    EXPECT_EQ(topLayer.getThickness(), mLayerClone->getLayerThickness(0));
+    EXPECT_EQ(layer1.getThickness(), mLayerClone->getLayerThickness(1));
+    EXPECT_EQ(layer2.getThickness(), mLayerClone->getLayerThickness(2));
+    EXPECT_EQ(substrate.getThickness(), mLayerClone->getLayerThickness(3));
+
+    //check bottomZ value
+    EXPECT_EQ(mLayer.getLayerBottomZ(0), mLayerClone->getLayerBottomZ(0));
+    EXPECT_EQ(mLayer.getLayerBottomZ(1), mLayerClone->getLayerBottomZ(1));
+    EXPECT_EQ(mLayer.getLayerBottomZ(2), mLayerClone->getLayerBottomZ(2));
+    EXPECT_EQ(mLayer.getLayerBottomZ(3), mLayerClone->getLayerBottomZ(3));
+
+    //check individual layer
+    const Layer* layerCopy0 = mLayerClone->getLayer(0);
+    EXPECT_EQ(topLayer.getName(), layerCopy0->getName());
+    EXPECT_EQ(topLayer.getThickness(), layerCopy0->getThickness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), layerCopy0->getMaterial()->getName());
+
+    const Layer* layerCopy1 = mLayerClone->getLayer(1);
+    EXPECT_EQ(layer1.getName(), layerCopy1->getName());
+    EXPECT_EQ(layer1.getThickness(), layerCopy1->getThickness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), layerCopy1->getMaterial()->getName());
+
+    const Layer* layerCopy2 = mLayerClone->getLayer(2);
+    EXPECT_EQ(layer2.getName(), layerCopy2->getName());
+    EXPECT_EQ(layer2.getThickness(), layerCopy2->getThickness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), layerCopy2->getMaterial()->getName());
+
+    const Layer* layerCopy3 = mLayerClone->getLayer(3);
+    EXPECT_EQ(substrate.getName(), layerCopy3->getName());
+    EXPECT_EQ(substrate.getThickness(), layerCopy3->getThickness());
+    EXPECT_EQ(substrate.getMaterial()->getName(), layerCopy3->getMaterial()->getName());
+
+    //check interfaces
+    const LayerInterface* interface0 = mLayerClone->getLayerInterface(0);
+    EXPECT_TRUE(nullptr!=interface0);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
+    EXPECT_EQ(nullptr, interface0->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), interface0->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interface0->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface1 = mLayerClone->getLayerInterface(1);
+    EXPECT_TRUE(nullptr!=interface1);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
+    EXPECT_EQ(nullptr, interface1->getRoughness());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interface1->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interface1->getLayerBottom()->getMaterial()->getName());
+
+    const LayerInterface* interface2 = mLayerClone->getLayerInterface(2);
+    EXPECT_TRUE(nullptr!=interface2);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
+    EXPECT_EQ(nullptr, interface2->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interface2->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(), interface2->getLayerBottom()->getMaterial()->getName());
+
+    //top interface
+    const LayerInterface* interfaceBottom = mLayerClone->getLayerTopInterface(1);
+    EXPECT_TRUE(nullptr!=interfaceBottom);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
+    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
+    EXPECT_EQ(topLayer.getMaterial()->getName(), interfaceBottom->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(layer1.getMaterial()->getName(), interfaceBottom->getLayerBottom()->getMaterial()->getName());
+
+    //Bottom interface
+    const LayerInterface* interfaceTop = mLayerClone->getLayerBottomInterface(2);
+    EXPECT_TRUE(nullptr!=interfaceTop);
+    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
+    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
+    EXPECT_EQ(layer2.getMaterial()->getName(), interfaceTop->getLayerTop()->getMaterial()->getName());
+    EXPECT_EQ(substrate.getMaterial()->getName(), interfaceTop->getLayerBottom()->getMaterial()->getName());
+
+    //null interface
+    const LayerInterface* interfaceTopNull = mLayerClone->getLayerTopInterface(0);
+    EXPECT_TRUE(nullptr==interfaceTopNull);
+
+    const LayerInterface* interfaceBottomNull = mLayerClone->getLayerBottomInterface(3);
+    EXPECT_TRUE(nullptr==interfaceBottomNull);
+
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, WithRoughness)
+{
+    //LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength);
+    LayerRoughness lr(1.1, -7.3, 0.1);
+    mLayer.addLayer(topLayer);
+    mLayer.addLayerWithTopRoughness(layer1,lr);
+    mLayer.addLayer(substrate);
+
+    const LayerInterface* interface0 = mLayer.getLayerInterface(0);
+    const LayerInterface* interface1 = mLayer.getLayerInterface(1);
+
+    const LayerRoughness* roughness0 = interface0->getRoughness();
+    const LayerRoughness* roughness1 = interface1->getRoughness();
+
+    EXPECT_TRUE(roughness0);
+    EXPECT_EQ(nullptr, roughness1);
+
+    EXPECT_EQ(1.1, roughness0->getSigma());
+    EXPECT_EQ(-7.3, roughness0->getHurstParameter());
+    EXPECT_EQ(0.1, roughness0->getLatteralCorrLength());
+}
+
+TEST_F(MultiLayerTest, CloneWithRoughness)
+{
+    LayerRoughness lr0(-2.1, 7.3, -12.1);
+    LayerRoughness lr1(1.1, -7.3, 0.1);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayerWithTopRoughness(layer1,lr0);
+    mLayer.addLayerWithTopRoughness(substrate,lr1);
+
+    MultiLayer* mLayerClone = mLayer.clone();
+
+    const LayerInterface* interface0 = mLayerClone->getLayerInterface(0);
+    const LayerInterface* interface1 = mLayerClone->getLayerInterface(1);
+    const LayerRoughness* roughness0 = interface0->getRoughness();
+    const LayerRoughness* roughness1 = interface1->getRoughness();
+
+    EXPECT_TRUE(roughness0);
+    EXPECT_TRUE(roughness1);
+
+    EXPECT_EQ( -2.1, roughness0->getSigma());
+    EXPECT_EQ(  7.3, roughness0->getHurstParameter());
+    EXPECT_EQ(-12.1, roughness0->getLatteralCorrLength());
+
+    EXPECT_EQ(  1.1, roughness1->getSigma());
+    EXPECT_EQ( -7.3, roughness1->getHurstParameter());
+    EXPECT_EQ(  0.1, roughness1->getLatteralCorrLength());
+
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, CloneInvertBWithRoughness)
+{
+    Layer layer1(iron, 20*Units::nanometer);
+    Layer layer2(stone, 5*Units::nanometer);
+
+    //LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength);
+    LayerRoughness lr0(-2.1, 7.3, -12.1);
+    LayerRoughness lr1(1.1, -7.3, 0.1);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayerWithTopRoughness(layer1,lr0);
+    mLayer.addLayerWithTopRoughness(layer2,lr1);
+
+    MultiLayer* mLayerClone = mLayer.cloneInvertB();
+
+    const LayerInterface* interface0 = mLayerClone->getLayerInterface(0);
+    const LayerInterface* interface1 = mLayerClone->getLayerInterface(1);
+    const LayerRoughness* roughness0 = interface0->getRoughness();
+    const LayerRoughness* roughness1 = interface1->getRoughness();
+
+    EXPECT_EQ( -2.1, roughness0->getSigma());
+    EXPECT_EQ(  7.3, roughness0->getHurstParameter());
+    EXPECT_EQ(-12.1, roughness0->getLatteralCorrLength());
+
+    EXPECT_EQ(  1.1, roughness1->getSigma());
+    EXPECT_EQ( -7.3, roughness1->getHurstParameter());
+    EXPECT_EQ(  0.1, roughness1->getLatteralCorrLength());
+
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, WithMagneticMaterial)
+{
+    kvector_t magnetic_field(0.0, 0.0, 0.0);
+    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
+    HomogeneousMagneticMaterial magMaterial1("MagMat1", -5.6, 10, magnetic_field);
+
+    Layer layer1(iron, 20*Units::nanometer);
+    Layer layer2(stone, 30*Units::nanometer);
+    Layer layer3(magMaterial0, 20*Units::nanometer);
+    Layer layer4(magMaterial1, 0*Units::nanometer);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+    EXPECT_FALSE(mLayer.containsMagneticMaterial());
+
+    mLayer.addLayer(layer3);
+    mLayer.addLayer(layer4);
+    EXPECT_TRUE(mLayer.containsMagneticMaterial());
+}
+
+TEST_F(MultiLayerTest, CloneWithMagneticMaterial)
+{
+    kvector_t magnetic_field(1.1, 2.1, -5.1);
+    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
+
+    Layer layer1(iron, 20*Units::nanometer);
+    Layer layer2(magMaterial0, 20*Units::nanometer);
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+
+    MultiLayer* mLayerClone = mLayer.clone();
+    EXPECT_TRUE(mLayerClone->containsMagneticMaterial());
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, CloneInvertBMagneticMaterial)
+{
+    kvector_t magnetic_field(0.0, 0.0, 0.0);
+    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
+
+    Layer layer1(iron, 20*Units::nanometer);
+    Layer layer2(magMaterial0, 20*Units::nanometer);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+
+    MultiLayer* mLayerClone = mLayer.cloneInvertB();
+    EXPECT_TRUE(mLayerClone->containsMagneticMaterial());
+    delete mLayerClone;
+}
+
+TEST_F(MultiLayerTest, MultiLayerCompositeTest)
+{
+    MultiLayer mLayer;
+    kvector_t magnetic_field(0.0, 0.0, 0.0);
+    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
+    HomogeneousMagneticMaterial magMaterial1("MagMat1", -5.6, 10, magnetic_field);
+
+    Layer layer1(iron, 10*Units::nanometer);
+    Layer layer2(magMaterial0, 20*Units::nanometer);
+    Layer layer3(magMaterial1, 30*Units::nanometer);
+    Layer layer4(stone, 40*Units::nanometer);
+
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+    mLayer.addLayer(layer3);
+    mLayer.addLayer(layer4);
+
+    std::vector<Layer *> layer_buffer;
+    std::vector<LayerInterface *> interface_buffer;
+    int counter(0);
+    for(size_t index=0; index<mLayer.size();++index)
+    {
+        ISample *sample = mLayer[index];
+        if(counter%2 == 1)
+        {
+            LayerInterface *interface = dynamic_cast<LayerInterface *>(sample);
+            EXPECT_TRUE(nullptr != interface);
+            interface_buffer.push_back(interface);
+        } else {
+            Layer *layer = dynamic_cast<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());
+    for(size_t i=0; i<layer_buffer.size(); ++i) {
+        EXPECT_EQ( double(i*10), layer_buffer[i]->getThickness());
+    }
+    for(size_t i=0; i<interface_buffer.size(); ++i) {
+        EXPECT_EQ( double((i+1)*10), interface_buffer[i]->getLayerBottom()->getThickness());
+    }
+}
+
+TEST_F(MultiLayerTest, MultiLayerZtoIndex)
+{
+    MultiLayer mLayer;
+
+    // index_0
+    // -----------------  0.0
+    // index_1
+    // -----------------  -10.0
+    // index_2
+    // -----------------  -30.0
+    // index_3
+    // -----------------  -60.0
+    // index_4
+    Layer layer1(air, 10*Units::nanometer);
+    Layer layer2(air, 20*Units::nanometer);
+    Layer layer3(air, 30*Units::nanometer);
+    Layer layer4(air, 0*Units::nanometer);
+    mLayer.addLayer(topLayer);
+    mLayer.addLayer(layer1);
+    mLayer.addLayer(layer2);
+    mLayer.addLayer(layer3);
+    mLayer.addLayer(layer4);
+
+    EXPECT_EQ(size_t(0), mLayer.zToLayerIndex(1.0));
+    EXPECT_EQ(size_t(0), mLayer.zToLayerIndex(0.0));
+    EXPECT_EQ(size_t(1), mLayer.zToLayerIndex(-1.0));
+    EXPECT_EQ(size_t(1), mLayer.zToLayerIndex(-9.0));
+    EXPECT_EQ(size_t(1), mLayer.zToLayerIndex(-10.0));
+    EXPECT_EQ(size_t(2), mLayer.zToLayerIndex(-11.0));
+    EXPECT_EQ(size_t(2), mLayer.zToLayerIndex(-30.0));
+    EXPECT_EQ(size_t(3), mLayer.zToLayerIndex(-31.0));
+    EXPECT_EQ(size_t(3), mLayer.zToLayerIndex(-60.0));
+    EXPECT_EQ(size_t(4), mLayer.zToLayerIndex(-61.0));
+}
+
+#endif
diff --git a/Tests/UnitTests/Core/ParticleCompositionTest.h b/Tests/UnitTests/Core/1/ParticleCompositionTest.h
similarity index 100%
rename from Tests/UnitTests/Core/ParticleCompositionTest.h
rename to Tests/UnitTests/Core/1/ParticleCompositionTest.h
diff --git a/Tests/UnitTests/Core/ParticleCoreShellTest.h b/Tests/UnitTests/Core/1/ParticleCoreShellTest.h
similarity index 99%
rename from Tests/UnitTests/Core/ParticleCoreShellTest.h
rename to Tests/UnitTests/Core/1/ParticleCoreShellTest.h
index 1a68088f36dd3fc2e9b8c40ad4daed17a9812acd..d06ce11bab4469160eb8f277c184826572ef46ed 100644
--- a/Tests/UnitTests/Core/ParticleCoreShellTest.h
+++ b/Tests/UnitTests/Core/1/ParticleCoreShellTest.h
@@ -1,6 +1,7 @@
 #ifndef PARTICLECORESHELLTEST_H
 #define PARTICLECORESHELLTEST_H
 
+#include "IFormFactorBorn.h"
 #include "ParticleCoreShell.h"
 #include "BornAgainNamespace.h"
 #include "Units.h"
diff --git a/Tests/UnitTests/Core/ParticleLayoutTest.h b/Tests/UnitTests/Core/1/ParticleLayoutTest.h
similarity index 100%
rename from Tests/UnitTests/Core/ParticleLayoutTest.h
rename to Tests/UnitTests/Core/1/ParticleLayoutTest.h
diff --git a/Tests/UnitTests/Core/ParticleTest.h b/Tests/UnitTests/Core/1/ParticleTest.h
similarity index 100%
rename from Tests/UnitTests/Core/ParticleTest.h
rename to Tests/UnitTests/Core/1/ParticleTest.h
diff --git a/Tests/UnitTests/Core/MatrixRTCoefficientsTest.h b/Tests/UnitTests/Core/2/MatrixRTCoefficientsTest.h
similarity index 98%
rename from Tests/UnitTests/Core/MatrixRTCoefficientsTest.h
rename to Tests/UnitTests/Core/2/MatrixRTCoefficientsTest.h
index 4bca061325ea3d84d39dd139e82748a037c0a1fe..2210aef7650908d053419a12d3175d44e4997582 100644
--- a/Tests/UnitTests/Core/MatrixRTCoefficientsTest.h
+++ b/Tests/UnitTests/Core/2/MatrixRTCoefficientsTest.h
@@ -2,7 +2,6 @@
 #define MATRIXRTCOEFFICIENTSTEST_H
 
 #include "MatrixRTCoefficients.h"
-#include "gtest/gtest.h"
 
 
 class MatrixRTCoefficientsTest : public ::testing :: Test
diff --git a/Tests/UnitTests/Core/MatrixSpecularInfoMapTest.h b/Tests/UnitTests/Core/2/MatrixSpecularInfoMapTest.h
similarity index 99%
rename from Tests/UnitTests/Core/MatrixSpecularInfoMapTest.h
rename to Tests/UnitTests/Core/2/MatrixSpecularInfoMapTest.h
index 83e5e1e4b2d8cd22f5f85aa844dd126407ead49f..fad4b78bd4dfd74c0dedcae275790eaad1a38969 100644
--- a/Tests/UnitTests/Core/MatrixSpecularInfoMapTest.h
+++ b/Tests/UnitTests/Core/2/MatrixSpecularInfoMapTest.h
@@ -4,7 +4,6 @@
 #include "Units.h"
 #include "MatrixRTCoefficients.h"
 #include "MatrixSpecularInfoMap.h"
-#include "gtest/gtest.h"
 
 #include <memory>
 
diff --git a/Tests/UnitTests/Core/ScalarRTCoefficientsTest.h b/Tests/UnitTests/Core/2/ScalarRTCoefficientsTest.h
similarity index 99%
rename from Tests/UnitTests/Core/ScalarRTCoefficientsTest.h
rename to Tests/UnitTests/Core/2/ScalarRTCoefficientsTest.h
index 2ebf708de835768ba533b01b120156ed3dd1015d..1229e3bf9a56bc1ba3494a806721437511bdd34c 100644
--- a/Tests/UnitTests/Core/ScalarRTCoefficientsTest.h
+++ b/Tests/UnitTests/Core/2/ScalarRTCoefficientsTest.h
@@ -2,7 +2,6 @@
 #define SCALARRTCOEFFICIENTS_H
 
 #include "ScalarRTCoefficients.h"
-#include "gtest/gtest.h"
 
 class ScalarRTCoefficientsTest : public ::testing :: Test
 {
diff --git a/Tests/UnitTests/Core/ScalarSpecularInfoMapTest.h b/Tests/UnitTests/Core/2/ScalarSpecularInfoMapTest.h
similarity index 99%
rename from Tests/UnitTests/Core/ScalarSpecularInfoMapTest.h
rename to Tests/UnitTests/Core/2/ScalarSpecularInfoMapTest.h
index 6b1b072e4e79ea2cddae358e8e5f8e6108d96b27..4e88cace43bf717c31ed706f5b67576aab8e0fcc 100644
--- a/Tests/UnitTests/Core/ScalarSpecularInfoMapTest.h
+++ b/Tests/UnitTests/Core/2/ScalarSpecularInfoMapTest.h
@@ -4,7 +4,6 @@
 #include "Units.h"
 #include "ScalarRTCoefficients.h"
 #include "ScalarSpecularInfoMap.h"
-#include "gtest/gtest.h"
 
 #include <memory>
 
diff --git a/Tests/UnitTests/Core/SpecularMatrixTest.h b/Tests/UnitTests/Core/2/SpecularMatrixTest.h
similarity index 96%
rename from Tests/UnitTests/Core/SpecularMatrixTest.h
rename to Tests/UnitTests/Core/2/SpecularMatrixTest.h
index 3c223c89383f3a530a8e9b334083f9651dbec8af..842d91259ba9aeb20807f89bc187f6d3cd192c9d 100644
--- a/Tests/UnitTests/Core/SpecularMatrixTest.h
+++ b/Tests/UnitTests/Core/2/SpecularMatrixTest.h
@@ -2,7 +2,6 @@
 #define SPECULARMATRIXTEST_H
 
 #include "SpecularMatrix.h"
-#include "gtest/gtest.h"
 
 class SpecularMatrixTest : public ::testing :: Test
 {
diff --git a/Tests/UnitTests/Core/SpecularSimulationTest.h b/Tests/UnitTests/Core/2/SpecularSimulationTest.h
similarity index 99%
rename from Tests/UnitTests/Core/SpecularSimulationTest.h
rename to Tests/UnitTests/Core/2/SpecularSimulationTest.h
index acb70ce5126a100b030eb62b6b78d16ef3414033..f0abec9161e16a670d55bb61198335d89e2862ea 100644
--- a/Tests/UnitTests/Core/SpecularSimulationTest.h
+++ b/Tests/UnitTests/Core/2/SpecularSimulationTest.h
@@ -1,7 +1,6 @@
 #ifndef SPECULARSIMULATIONTEST_H
 #define SPECULARSIMULATIONTEST_H
 
-#include "gtest/gtest.h"
 #include "SpecularSimulation.h"
 #include "Exceptions.h"
 #include "FixedBinAxis.h"
diff --git a/Tests/UnitTests/Core/DetectorMaskTest.h b/Tests/UnitTests/Core/3/DetectorMaskTest.h
similarity index 99%
rename from Tests/UnitTests/Core/DetectorMaskTest.h
rename to Tests/UnitTests/Core/3/DetectorMaskTest.h
index ed26ece8c41c2cc26ec168fa46d6ba0a90ee2583..4b857d8edd9bc7af1d242357b59500355c60cee8 100644
--- a/Tests/UnitTests/Core/DetectorMaskTest.h
+++ b/Tests/UnitTests/Core/3/DetectorMaskTest.h
@@ -3,7 +3,7 @@
 
 #include "DetectorMask.h"
 #include "SphericalDetector.h"
-#include "gtest/gtest.h"
+#include "Polygon.h"
 #include <memory>
 
 class DetectorMaskTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/DetectorTest.h b/Tests/UnitTests/Core/3/DetectorTest.h
similarity index 99%
rename from Tests/UnitTests/Core/DetectorTest.h
rename to Tests/UnitTests/Core/3/DetectorTest.h
index 05b9c00bf9efc454e2f26f6737b197f9b31b34a3..720ad398a95b67475cb8aee59d0e57551ad78a1b 100644
--- a/Tests/UnitTests/Core/DetectorTest.h
+++ b/Tests/UnitTests/Core/3/DetectorTest.h
@@ -11,7 +11,6 @@
 #include "Polygon.h"
 #include <memory>
 
-#include "gtest/gtest.h"
 
 
 class DetectorTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/MaskTest.h b/Tests/UnitTests/Core/3/MaskTest.h
similarity index 99%
rename from Tests/UnitTests/Core/MaskTest.h
rename to Tests/UnitTests/Core/3/MaskTest.h
index d8941d2f6ea9f5d7d208523e942f1706ba384dd1..5b7344ae0dcfd03694c0d090ff357d9faf830626 100644
--- a/Tests/UnitTests/Core/MaskTest.h
+++ b/Tests/UnitTests/Core/3/MaskTest.h
@@ -4,7 +4,6 @@
 #include "Mask.h"
 #include "OutputData.h"
 
-#include "gtest/gtest.h"
 
 class MaskTest : public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/PolygonTest.h b/Tests/UnitTests/Core/3/PolygonTest.h
similarity index 99%
rename from Tests/UnitTests/Core/PolygonTest.h
rename to Tests/UnitTests/Core/3/PolygonTest.h
index fd666d4338d3038961838f42d9eb9fbcb93a0796..35d7cb989732ef45f45ee86855bafdf12e507d52 100644
--- a/Tests/UnitTests/Core/PolygonTest.h
+++ b/Tests/UnitTests/Core/3/PolygonTest.h
@@ -2,7 +2,6 @@
 #define POLYGONTEST_H
 
 #include "Polygon.h"
-#include "gtest/gtest.h"
 #include <memory>
 
 class PolygonTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/PrecomputedTest.h b/Tests/UnitTests/Core/3/PrecomputedTest.h
similarity index 97%
rename from Tests/UnitTests/Core/PrecomputedTest.h
rename to Tests/UnitTests/Core/3/PrecomputedTest.h
index 260fc938e18b5ac98588497d7f040ff28427a565..e77740421b4dc88958d13b23b3325bcea67054ba 100644
--- a/Tests/UnitTests/Core/PrecomputedTest.h
+++ b/Tests/UnitTests/Core/3/PrecomputedTest.h
@@ -2,7 +2,6 @@
 #define PRECOMPUTEDTEST_H
 
 #include "Precomputed.h"
-#include "gtest/gtest.h"
 #include <memory>
 
 class PrecomputedTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/RectangularDetectorTest.h b/Tests/UnitTests/Core/3/RectangularDetectorTest.h
similarity index 99%
rename from Tests/UnitTests/Core/RectangularDetectorTest.h
rename to Tests/UnitTests/Core/3/RectangularDetectorTest.h
index 4fbdaa9ae04024cc6b24039f644cf94d1a33e21a..6144c3b64e6953d527a42e373409689028041e77 100644
--- a/Tests/UnitTests/Core/RectangularDetectorTest.h
+++ b/Tests/UnitTests/Core/3/RectangularDetectorTest.h
@@ -1,11 +1,11 @@
 #ifndef RECTANGULARDETECTORTEST_H
 #define RECTANGULARDETECTORTEST_H
 
+#include "Units.h"
 #include "RectangularDetector.h"
 #include "GISASSimulation.h"
 #include "SimulationElement.h"
 #include "Numeric.h"
-#include "gtest/gtest.h"
 #include <memory>
 #include <iostream>
 
diff --git a/Tests/UnitTests/Core/SpecialFunctionsTest.h b/Tests/UnitTests/Core/3/SpecialFunctionsTest.h
similarity index 99%
rename from Tests/UnitTests/Core/SpecialFunctionsTest.h
rename to Tests/UnitTests/Core/3/SpecialFunctionsTest.h
index fc01687a58ce5006caf909be25263df311fb900a..b09c1a27020af62a2b86fc34efb3bd5e4a5580ea 100644
--- a/Tests/UnitTests/Core/SpecialFunctionsTest.h
+++ b/Tests/UnitTests/Core/3/SpecialFunctionsTest.h
@@ -17,7 +17,6 @@
 #define SPECIALFUNCTIONSTEST_H
 
 #include "MathFunctions.h"
-#include "gtest/gtest.h"
 
 #define EXPECT_CNEAR(a,b,epsi) \
   EXPECT_NEAR((a).real(),(b).real(),epsi); EXPECT_NEAR((a).imag(),(b).imag(),epsi);
diff --git a/Tests/UnitTests/Core/AttLimitsTest.h b/Tests/UnitTests/Core/4/AttLimitsTest.h
similarity index 99%
rename from Tests/UnitTests/Core/AttLimitsTest.h
rename to Tests/UnitTests/Core/4/AttLimitsTest.h
index 8d376ece6f9c1fe8dafe5a3977c7ece231bf657b..cc34367a3b0ea36a9c74f338549003c02460cebd 100644
--- a/Tests/UnitTests/Core/AttLimitsTest.h
+++ b/Tests/UnitTests/Core/4/AttLimitsTest.h
@@ -4,7 +4,6 @@
 #include "AttLimits.h"
 #include <limits>
 
-#include "gtest/gtest.h"
 
 
 class AttLimitsTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/BeamTest.h b/Tests/UnitTests/Core/4/BeamTest.h
similarity index 98%
rename from Tests/UnitTests/Core/BeamTest.h
rename to Tests/UnitTests/Core/4/BeamTest.h
index 6af9a88b0c8107edd5745cf780e88d12f84388b9..8d4bdde410dd530016413ff399988400bf5fefb3 100644
--- a/Tests/UnitTests/Core/BeamTest.h
+++ b/Tests/UnitTests/Core/4/BeamTest.h
@@ -5,7 +5,6 @@
 #include "BornAgainNamespace.h"
 #include "Units.h"
 #include "ParameterPool.h"
-#include "gtest/gtest.h"
 
 #include <memory>
 
diff --git a/Tests/UnitTests/Core/ChiSquaredModuleTest.h b/Tests/UnitTests/Core/4/ChiSquaredModuleTest.h
similarity index 99%
rename from Tests/UnitTests/Core/ChiSquaredModuleTest.h
rename to Tests/UnitTests/Core/4/ChiSquaredModuleTest.h
index 4a1309aa6350b0ae28784b6ca4254ac54a655d95..0a344722b2a9e1da810a8b6e78defcd9b8039334 100644
--- a/Tests/UnitTests/Core/ChiSquaredModuleTest.h
+++ b/Tests/UnitTests/Core/4/ChiSquaredModuleTest.h
@@ -5,7 +5,6 @@
 #include "ISquaredFunction.h"
 #include "BornAgainNamespace.h"
 
-#include "gtest/gtest.h"
 
 
 class ChiSquaredModuleTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/CumulativeValueTest.h b/Tests/UnitTests/Core/4/CumulativeValueTest.h
similarity index 98%
rename from Tests/UnitTests/Core/CumulativeValueTest.h
rename to Tests/UnitTests/Core/4/CumulativeValueTest.h
index f23f4029b0493e460056482e0b4640ea94de15aa..98250ee815fb743735b881b333e0d564edfc102c 100644
--- a/Tests/UnitTests/Core/CumulativeValueTest.h
+++ b/Tests/UnitTests/Core/4/CumulativeValueTest.h
@@ -3,7 +3,6 @@
 
 #include "CumulativeValue.h"
 
-#include "gtest/gtest.h"
 
 class CumulativeValueTest : public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/DWBASimulationTest.h b/Tests/UnitTests/Core/4/DWBASimulationTest.h
similarity index 99%
rename from Tests/UnitTests/Core/DWBASimulationTest.h
rename to Tests/UnitTests/Core/4/DWBASimulationTest.h
index 2e01b43b95b5c4a23898e15990f0db35c301e213..d8d162a15aab0efc9474d1d173a6836f4af250bb 100644
--- a/Tests/UnitTests/Core/DWBASimulationTest.h
+++ b/Tests/UnitTests/Core/4/DWBASimulationTest.h
@@ -5,9 +5,6 @@
 #include "DWBASimulation.h"
 #include "MultiLayer.h"
 #include "OutputDataFunctions.h"
-#include "gtest/gtest.h"
-
-
 class DWBASimulationTest : public ::testing::Test
 {
  protected:
diff --git a/Tests/UnitTests/Core/GISASSimulationTest.h b/Tests/UnitTests/Core/4/GISASSimulationTest.h
similarity index 99%
rename from Tests/UnitTests/Core/GISASSimulationTest.h
rename to Tests/UnitTests/Core/4/GISASSimulationTest.h
index 84bbf5fd9f69ae5089b366b0fa3ba05a81c0798b..e3268a83177d2ba26431c7fdb27a96393560abae 100644
--- a/Tests/UnitTests/Core/GISASSimulationTest.h
+++ b/Tests/UnitTests/Core/4/GISASSimulationTest.h
@@ -10,7 +10,6 @@
 
 #include <memory>
 #include <cmath>
-#include "gtest/gtest.h"
 
 
 class GISASSimulationTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/HomogeneousMagneticMaterialTest.h b/Tests/UnitTests/Core/4/HomogeneousMagneticMaterialTest.h
similarity index 99%
rename from Tests/UnitTests/Core/HomogeneousMagneticMaterialTest.h
rename to Tests/UnitTests/Core/4/HomogeneousMagneticMaterialTest.h
index 39f714cd7fff9d0d70553cd69a47504c961fad6f..9678d251e0eeed015c1564722c2ab97871b2c3ee 100644
--- a/Tests/UnitTests/Core/HomogeneousMagneticMaterialTest.h
+++ b/Tests/UnitTests/Core/4/HomogeneousMagneticMaterialTest.h
@@ -2,7 +2,6 @@
 #define HOMOGENEOUSMAGNETICMATERIALTEST_H
 
 #include "HomogeneousMagneticMaterial.h"
-#include "gtest/gtest.h"
 
 class HomogeneousMagneticMaterialTest : public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/HomogeneousMaterialTest.h b/Tests/UnitTests/Core/4/HomogeneousMaterialTest.h
similarity index 99%
rename from Tests/UnitTests/Core/HomogeneousMaterialTest.h
rename to Tests/UnitTests/Core/4/HomogeneousMaterialTest.h
index 8f251376074e30b6523968dfb874d4c56eaa41ac..fed03e8b4b972137ce292db0879938823ae38127 100644
--- a/Tests/UnitTests/Core/HomogeneousMaterialTest.h
+++ b/Tests/UnitTests/Core/4/HomogeneousMaterialTest.h
@@ -2,7 +2,6 @@
 #define HOMOGENEOUSMATERIALTEST_H
 
 #include "HomogeneousMaterial.h"
-#include "gtest/gtest.h"
 
 class HomogeneousMaterialTest : public ::testing :: Test
 {
diff --git a/Tests/UnitTests/Core/InstrumentTest.h b/Tests/UnitTests/Core/4/InstrumentTest.h
similarity index 100%
rename from Tests/UnitTests/Core/InstrumentTest.h
rename to Tests/UnitTests/Core/4/InstrumentTest.h
diff --git a/Tests/UnitTests/Core/Shape2DTest.h b/Tests/UnitTests/Core/4/Shape2DTest.h
similarity index 99%
rename from Tests/UnitTests/Core/Shape2DTest.h
rename to Tests/UnitTests/Core/4/Shape2DTest.h
index cb021a8ef1a5dc2aaf87cd69a4cf28db48fc1324..065b273225d868b4412ae8521dbc61a612402f68 100644
--- a/Tests/UnitTests/Core/Shape2DTest.h
+++ b/Tests/UnitTests/Core/4/Shape2DTest.h
@@ -5,7 +5,6 @@
 #include "Ellipse.h"
 #include "Line.h"
 #include "Units.h"
-#include "gtest/gtest.h"
 #include <memory>
 
 class Shape2DTest : public ::testing::Test
diff --git a/Tests/UnitTests/Core/TRangeTest.h b/Tests/UnitTests/Core/4/TRangeTest.h
similarity index 99%
rename from Tests/UnitTests/Core/TRangeTest.h
rename to Tests/UnitTests/Core/4/TRangeTest.h
index bb964b7461421785578381becb76cdae4196313d..b32bcbca9e01cfa4df607ffade1cf8c914f378bc 100644
--- a/Tests/UnitTests/Core/TRangeTest.h
+++ b/Tests/UnitTests/Core/4/TRangeTest.h
@@ -5,7 +5,6 @@
 #include <algorithm>
 
 
-#include "gtest/gtest.h"
 
 class TRangeTest : public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/ThreadInfoTest.h b/Tests/UnitTests/Core/4/ThreadInfoTest.h
similarity index 97%
rename from Tests/UnitTests/Core/ThreadInfoTest.h
rename to Tests/UnitTests/Core/4/ThreadInfoTest.h
index 2bc17e69c79ff275c6abbc7f8a4f9dc3edfdee2d..9efe1ade6a77b119586d038970794d7003f9a8eb 100644
--- a/Tests/UnitTests/Core/ThreadInfoTest.h
+++ b/Tests/UnitTests/Core/4/ThreadInfoTest.h
@@ -18,7 +18,6 @@
 
 #include "ThreadInfo.h"
 
-#include "gtest/gtest.h"
 
 class ThreadInfoTest : public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/DistributionHandlerTest.h b/Tests/UnitTests/Core/5/DistributionHandlerTest.h
similarity index 100%
rename from Tests/UnitTests/Core/DistributionHandlerTest.h
rename to Tests/UnitTests/Core/5/DistributionHandlerTest.h
diff --git a/Tests/UnitTests/Core/DistributionsTest.h b/Tests/UnitTests/Core/5/DistributionsTest.h
similarity index 100%
rename from Tests/UnitTests/Core/DistributionsTest.h
rename to Tests/UnitTests/Core/5/DistributionsTest.h
diff --git a/Tests/UnitTests/Core/FTDistributionsTest.h b/Tests/UnitTests/Core/5/FTDistributionsTest.h
similarity index 100%
rename from Tests/UnitTests/Core/FTDistributionsTest.h
rename to Tests/UnitTests/Core/5/FTDistributionsTest.h
diff --git a/Tests/UnitTests/Core/IParameterizedTest.h b/Tests/UnitTests/Core/5/IParameterizedTest.h
similarity index 100%
rename from Tests/UnitTests/Core/IParameterizedTest.h
rename to Tests/UnitTests/Core/5/IParameterizedTest.h
diff --git a/Tests/UnitTests/Core/ParameterDistributionTest.h b/Tests/UnitTests/Core/5/ParameterDistributionTest.h
similarity index 100%
rename from Tests/UnitTests/Core/ParameterDistributionTest.h
rename to Tests/UnitTests/Core/5/ParameterDistributionTest.h
diff --git a/Tests/UnitTests/Core/ParameterPoolTest.h b/Tests/UnitTests/Core/5/ParameterPoolTest.h
similarity index 100%
rename from Tests/UnitTests/Core/ParameterPoolTest.h
rename to Tests/UnitTests/Core/5/ParameterPoolTest.h
diff --git a/Tests/UnitTests/Core/RealParameterWrapperTest.h b/Tests/UnitTests/Core/5/RealParameterWrapperTest.h
similarity index 100%
rename from Tests/UnitTests/Core/RealParameterWrapperTest.h
rename to Tests/UnitTests/Core/5/RealParameterWrapperTest.h
diff --git a/Tests/UnitTests/Core/IntensityDataFunctionsTest.h b/Tests/UnitTests/Core/6/IntensityDataFunctionsTest.h
similarity index 99%
rename from Tests/UnitTests/Core/IntensityDataFunctionsTest.h
rename to Tests/UnitTests/Core/6/IntensityDataFunctionsTest.h
index 503dde8fdb219c56c131a7b8bfaea6d08ff6c7fe..d11415041cf53b12773d984e696e4fcc291180a1 100644
--- a/Tests/UnitTests/Core/IntensityDataFunctionsTest.h
+++ b/Tests/UnitTests/Core/6/IntensityDataFunctionsTest.h
@@ -3,7 +3,6 @@
 
 
 
-#include "gtest/gtest.h"
 #include "IntensityDataFunctions.h"
 #include "VariableBinAxis.h"
 
diff --git a/Tests/UnitTests/Core/LLDataTest.h b/Tests/UnitTests/Core/6/LLDataTest.h
similarity index 99%
rename from Tests/UnitTests/Core/LLDataTest.h
rename to Tests/UnitTests/Core/6/LLDataTest.h
index fb5f4456a5d9a111f93bdec3da2f1aa9104e8112..81a88ad8236b2124f2c15a1510745c1c72f95901 100644
--- a/Tests/UnitTests/Core/LLDataTest.h
+++ b/Tests/UnitTests/Core/6/LLDataTest.h
@@ -6,7 +6,6 @@
 #include "IMaterial.h"
 #include "Types.h"
 
-#include "gtest/gtest.h"
 
 class LLDataTest : public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/OutputDataIteratorTest.h b/Tests/UnitTests/Core/6/OutputDataIteratorTest.h
similarity index 99%
rename from Tests/UnitTests/Core/OutputDataIteratorTest.h
rename to Tests/UnitTests/Core/6/OutputDataIteratorTest.h
index 25e560587e0b3b06471b1549ca90f2743430f1c3..7c487eda07de602fa05d7a0a2497dac8deae6f0c 100644
--- a/Tests/UnitTests/Core/OutputDataIteratorTest.h
+++ b/Tests/UnitTests/Core/6/OutputDataIteratorTest.h
@@ -3,7 +3,6 @@
 
 #include "OutputDataIterator.h"
 
-#include "gtest/gtest.h"
 
 class OutputDataIteratorTest : public ::testing::Test
 {
diff --git a/Tests/UnitTests/Core/OutputDataTest.h b/Tests/UnitTests/Core/6/OutputDataTest.h
similarity index 98%
rename from Tests/UnitTests/Core/OutputDataTest.h
rename to Tests/UnitTests/Core/6/OutputDataTest.h
index 3446cb7c47f2980bf6819fe91603d7d54e98aaa4..2efd9d4a57bb8b5db98c5d37591b9999d47f0392 100644
--- a/Tests/UnitTests/Core/OutputDataTest.h
+++ b/Tests/UnitTests/Core/6/OutputDataTest.h
@@ -9,14 +9,10 @@
 #include "FixedBinAxis.h"
 #include "ThreadInfo.h"
 
-
-#include "gtest/gtest.h"
-
 class OutputDataTest : public ::testing::Test
 {
  protected:
     OutputDataTest();
-    virtual ~OutputDataTest();
 
     OutputData<int> int_data_0d;
     OutputData<float> fl_data_1d;
@@ -52,11 +48,6 @@ OutputDataTest::OutputDataTest()
 }
 
 
-OutputDataTest::~OutputDataTest()
-{
-}
-
-
 TEST_F(OutputDataTest, SingleElementAfterConstruction)
 {
     EXPECT_EQ((size_t)1, int_data_0d.getAllocatedSize());
@@ -81,11 +72,11 @@ TEST_F(OutputDataTest, DataInitialization)
     coordinates.push_back(3);
     EXPECT_DOUBLE_EQ((double)1143, db_data_3d[db_data_3d.toGlobalIndex(coordinates)]);
 
-
     std::vector<int> coordinates2;
     coordinates2.push_back(10);
     coordinates2.push_back(5);
-    EXPECT_EQ(Eigen::Matrix2d::Identity(), matrix_data_2d[matrix_data_2d.toGlobalIndex(coordinates2)]);
+    EXPECT_EQ(Eigen::Matrix2d::Identity(),
+              matrix_data_2d[matrix_data_2d.toGlobalIndex(coordinates2)]);
 }
 
 TEST_F(OutputDataTest, isInitialized)
@@ -443,7 +434,6 @@ TEST_F(OutputDataTest, GetAxisBin)
 //}
 
 
-
 TEST_F(OutputDataTest, SetCleared)
 {
     db_data_3d.clear();
@@ -479,5 +469,4 @@ TEST_F(OutputDataTest, MixedTypeOperations)
 // --------------------------------------------
 //   | 0   1   2   3   4   5   6   7   8   9  | x
 
-
 #endif // OUTPUTDATATEST_H
diff --git a/Tests/UnitTests/Core/CMakeLists.txt b/Tests/UnitTests/Core/CMakeLists.txt
index d849cf851b55aadf67ce2aa39fb55a3fa250f054..b4ba5d29986e4d2b8b03a61ac150e1b480ca685b 100644
--- a/Tests/UnitTests/Core/CMakeLists.txt
+++ b/Tests/UnitTests/Core/CMakeLists.txt
@@ -2,41 +2,20 @@
 # CMakeLists.txt file for building and running unit tests
 ############################################################################
 
-enable_testing()
-
-file(GLOB include_files "*.h")
-
-add_executable( TestCore main.cpp ${include_files})
-
-# dependencies
-include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
-target_link_libraries(TestCore gtest)
-
 include_directories(
-    ${Boost_INCLUDE_DIRS}
     ${BornAgainCore_INCLUDE_DIRS}
+    ${Boost_INCLUDE_DIRS}
     ${EIGEN3_INCLUDE_DIR}
     ${GSL_INCLUDE_DIR}
-)
-target_link_libraries(TestCore
-    ${BornAgainCore_LIBRARY}
-    ${Boost_LIBRARIES}
-    ${GSL_LIBRARIES}
-)
-
+    )
 if(BORNAGAIN_OPENMPI)
     include_directories(${MPI_INCLUDE_PATH})
-    target_link_libraries(TestCore ${MPI_LIBRARIES})
 endif()
 
-
-# to build executable right in lib directory to not to have problems with finding libBornAgainCore.dll under Windows
-set_property(TARGET TestCore PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
-
-add_test( TestCore TestCore) # TestName ExeName
-
-# add execution of TestCore just after compilation
-add_custom_command(TARGET TestCore POST_BUILD COMMAND TestCore)
-
-
-
+UNIT_TESTS(TestCore0 "0" ${BornAgainCore_LIBRARY})
+UNIT_TESTS(TestCore1 "1" ${BornAgainCore_LIBRARY})
+UNIT_TESTS(TestCore2 "2" ${BornAgainCore_LIBRARY})
+UNIT_TESTS(TestCore3 "3" ${BornAgainCore_LIBRARY})
+UNIT_TESTS(TestCore4 "4" ${BornAgainCore_LIBRARY})
+UNIT_TESTS(TestCore5 "5" ${BornAgainCore_LIBRARY})
+UNIT_TESTS(TestCore6 "6" ${BornAgainCore_LIBRARY})
diff --git a/Tests/UnitTests/Core/MultiLayerTest.h b/Tests/UnitTests/Core/MultiLayerTest.h
deleted file mode 100644
index 910f8f9431eb526f2f6230a24cd4d39976ee27e0..0000000000000000000000000000000000000000
--- a/Tests/UnitTests/Core/MultiLayerTest.h
+++ /dev/null
@@ -1,688 +0,0 @@
-#ifndef MULTILAYERTEST_H
-#define MULTILAYERTEST_H
-
-#include "MultiLayer.h"
-#include "BornAgainNamespace.h"
-#include "Layer.h"
-#include "HomogeneousMaterial.h"
-#include "Materials.h"
-#include "Units.h"
-#include "ParticleLayout.h"
-
-class MultiLayerTest : public ::testing::Test
-{
-protected:
-    MultiLayerTest(){}
-    virtual ~MultiLayerTest(){}
-};
-
-TEST_F(MultiLayerTest, BasicProperty)
-{
-    MultiLayer multi_layer;
-    //check default properties
-    EXPECT_EQ(BornAgain::MultiLayerType, multi_layer.getName());
-    EXPECT_EQ(0.0, multi_layer.getCrossCorrLength());
-    EXPECT_EQ(size_t(0), multi_layer.getNumberOfLayers());
-    EXPECT_EQ(size_t(0), multi_layer.getNumberOfInterfaces());
-    //set parameter
-    multi_layer.setParameterValue(BornAgain::CrossCorrelationLength, -2.54);
-    EXPECT_EQ(-2.54,multi_layer.getCrossCorrLength());
-
-    // adding layers
-    HomogeneousMaterial air ("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial chromium("chromium",0,3.68);
-    HomogeneousMaterial stone("stone",0,1.6);
-    Layer airLayer(air, 0*Units::nanometer);
-    Layer ironLayer(iron, 20*Units::nanometer);
-    Layer chromiumLayer(chromium, 40*Units::nanometer);
-    Layer stoneLayer(stone, 0*Units::nanometer);
-    multi_layer.addLayer(airLayer);
-    EXPECT_EQ(size_t(1), multi_layer.getNumberOfLayers());
-    EXPECT_EQ(size_t(0), multi_layer.getNumberOfInterfaces());
-
-    multi_layer.addLayer(ironLayer);
-    multi_layer.addLayer(chromiumLayer);
-    multi_layer.addLayer(stoneLayer);
-    EXPECT_EQ(size_t(4), multi_layer.getNumberOfLayers());
-    EXPECT_EQ(size_t(3), multi_layer.getNumberOfInterfaces());
-}
-
-TEST_F(MultiLayerTest, LayerThicknesses)
-{
-    MultiLayer mLayer;
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial chromium("chromium",0,3.68);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer airLayer(air, 0*Units::nanometer);
-    Layer ironLayer(iron, 20*Units::nanometer);
-    Layer chromiumLayer(chromium, 40*Units::nanometer);
-    Layer stoneLayer(stone, 0*Units::nanometer);
-
-    mLayer.addLayer(airLayer);
-    mLayer.addLayer(ironLayer);
-    mLayer.addLayer(chromiumLayer);
-    mLayer.addLayer(stoneLayer);
-
-    //check layer thickness
-    EXPECT_EQ(0.0, mLayer.getLayerThickness(0));
-    EXPECT_EQ(20.0, mLayer.getLayerThickness(1));
-    EXPECT_EQ(40.0, mLayer.getLayerThickness(2));
-    EXPECT_EQ(0.0, mLayer.getLayerThickness(3));
-
-    //check bottomZ value
-    EXPECT_EQ(0.0, mLayer.getLayerBottomZ(0));
-    EXPECT_EQ(-20.0, mLayer.getLayerBottomZ(1));
-    EXPECT_EQ(-60.0, mLayer.getLayerBottomZ(2));
-    EXPECT_EQ(-60.0, mLayer.getLayerBottomZ(3));
-
-    //set layer thickness
-    mLayer.setLayerThickness(1, 45.0);
-    EXPECT_EQ(45.0, mLayer.getLayerThickness(1));
-
-    EXPECT_EQ(0.0, mLayer.getLayerBottomZ(0));
-    EXPECT_EQ(-45.0, mLayer.getLayerBottomZ(1));
-    EXPECT_EQ(-85.0, mLayer.getLayerBottomZ(2));
-    EXPECT_EQ(-85.0, mLayer.getLayerBottomZ(3));
-}
-
-TEST_F(MultiLayerTest, CheckAllLayers)
-{
-    MultiLayer mLayer;
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial chromium("chromium",0,3.68);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer airLayer(air, 0*Units::nanometer);
-    Layer ironLayer(iron, 20*Units::nanometer);
-    Layer chromiumLayer(chromium, 40*Units::nanometer);
-    Layer stoneLayer(stone, 0*Units::nanometer);
-
-    mLayer.addLayer(airLayer);
-    mLayer.addLayer(ironLayer);
-    mLayer.addLayer(chromiumLayer);
-    mLayer.addLayer(stoneLayer);
-
-    //check individual layer
-    const Layer * layer0 = mLayer.getLayer(0);
-    EXPECT_EQ(BornAgain::LayerType, layer0->getName());
-    EXPECT_EQ(0, layer0->getThickness());
-    EXPECT_EQ(airLayer.getMaterial()->getName(), layer0->getMaterial()->getName());
-
-    const Layer * layer1 = mLayer.getLayer(1);
-    EXPECT_EQ(BornAgain::LayerType, layer1->getName());
-    EXPECT_EQ(20, layer1->getThickness());
-    EXPECT_EQ(ironLayer.getMaterial()->getName(), layer1->getMaterial()->getName());
-
-    const Layer * layer2 = mLayer.getLayer(2);
-    EXPECT_EQ(BornAgain::LayerType, layer2->getName());
-    EXPECT_EQ(40, layer2->getThickness());
-    EXPECT_EQ(chromiumLayer.getMaterial()->getName(), layer2->getMaterial()->getName());
-
-    const Layer * layer3 = mLayer.getLayer(3);
-    EXPECT_EQ(BornAgain::LayerType, layer3->getName());
-    EXPECT_EQ(0, layer3->getThickness());
-    EXPECT_EQ(stoneLayer.getMaterial()->getName(), layer3->getMaterial()->getName());
-}
-
-TEST_F(MultiLayerTest, LayerInterfaces)
-{
-    MultiLayer mLayer;
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial chromium("chromium",0,3.68);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(chromium, 40*Units::nanometer);
-    Layer layer3(stone, 0*Units::nanometer);
-
-    mLayer.addLayer(layer0);
-    mLayer.addLayer(layer1);
-    mLayer.addLayer(layer2);
-    mLayer.addLayer(layer3);
-
-    //check interfaces
-    const LayerInterface * interface0 = mLayer.getLayerInterface(0);
-    EXPECT_TRUE(nullptr!=interface0);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
-    EXPECT_EQ(nullptr, interface0->getRoughness());
-    EXPECT_EQ(layer0.getMaterial()->getName(), interface0->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interface0->getLayerBottom()->getMaterial()->getName());
-
-    const LayerInterface * interface1 = mLayer.getLayerInterface(1);
-    EXPECT_TRUE(nullptr!=interface1);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
-    EXPECT_EQ(nullptr, interface1->getRoughness());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interface1->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interface1->getLayerBottom()->getMaterial()->getName());
-
-    const LayerInterface * interface2 = mLayer.getLayerInterface(2);
-    EXPECT_TRUE(nullptr!=interface2);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
-    EXPECT_EQ(nullptr, interface2->getRoughness());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interface2->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer3.getMaterial()->getName(), interface2->getLayerBottom()->getMaterial()->getName());
-
-    //bottom interface
-    const LayerInterface * interfaceBottom = mLayer.getLayerBottomInterface(0);
-    EXPECT_TRUE(nullptr!=interfaceBottom);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
-    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
-    EXPECT_EQ(layer0.getMaterial()->getName(), interfaceBottom->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interfaceBottom->getLayerBottom()->getMaterial()->getName());
-
-    //top interface
-    const LayerInterface * interfaceTop = mLayer.getLayerTopInterface(3);
-    EXPECT_TRUE(nullptr!=interfaceTop);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
-    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interfaceTop->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer3.getMaterial()->getName(), interfaceTop->getLayerBottom()->getMaterial()->getName());
-
-    //null interface
-    const LayerInterface * interfaceTopNull = mLayer.getLayerTopInterface(0);
-    EXPECT_TRUE(nullptr==interfaceTopNull);
-
-    const LayerInterface * interfaceBottomNull = mLayer.getLayerBottomInterface(3);
-    EXPECT_TRUE(nullptr==interfaceBottomNull);
-}
-
-TEST_F(MultiLayerTest, Clone)
-{
-    MultiLayer mLayer;
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial chromium ("chromium",0,3.68);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(chromium, 40*Units::nanometer);
-    Layer layer3(stone, 0*Units::nanometer);
-
-    mLayer.addLayer(layer0);
-    mLayer.addLayer(layer1);
-    mLayer.addLayer(layer2);
-    mLayer.addLayer(layer3);
-
-    MultiLayer * mLayerClone = mLayer.clone();
-
-    //check properties
-    EXPECT_EQ(BornAgain::MultiLayerType, mLayerClone->getName());
-    EXPECT_EQ(0.0,mLayerClone->getCrossCorrLength());
-    EXPECT_EQ(size_t(4), mLayerClone->getNumberOfLayers());
-    EXPECT_EQ(size_t(3), mLayerClone->getNumberOfInterfaces());
-
-    //check layer thickness
-    EXPECT_EQ(layer0.getThickness(), mLayerClone->getLayerThickness(0));
-    EXPECT_EQ(layer1.getThickness(), mLayerClone->getLayerThickness(1));
-    EXPECT_EQ(layer2.getThickness(), mLayerClone->getLayerThickness(2));
-    EXPECT_EQ(layer3.getThickness(), mLayerClone->getLayerThickness(3));
-
-    //check bottomZ value
-    EXPECT_EQ(mLayer.getLayerBottomZ(0), mLayerClone->getLayerBottomZ(0));
-    EXPECT_EQ(mLayer.getLayerBottomZ(1), mLayerClone->getLayerBottomZ(1));
-    EXPECT_EQ(mLayer.getLayerBottomZ(2), mLayerClone->getLayerBottomZ(2));
-    EXPECT_EQ(mLayer.getLayerBottomZ(3), mLayerClone->getLayerBottomZ(3));
-
-    //check individual layer
-    const Layer * layerCopy0 = mLayerClone->getLayer(0);
-    EXPECT_EQ(layer0.getName(), layerCopy0->getName());
-    EXPECT_EQ(layer0.getThickness(), layerCopy0->getThickness());
-    EXPECT_EQ(layer0.getMaterial()->getName(), layerCopy0->getMaterial()->getName());
-
-    const Layer * layerCopy1 = mLayerClone->getLayer(1);
-    EXPECT_EQ(layer1.getName(), layerCopy1->getName());
-    EXPECT_EQ(layer1.getThickness(), layerCopy1->getThickness());
-    EXPECT_EQ(layer1.getMaterial()->getName(), layerCopy1->getMaterial()->getName());
-
-    const Layer * layerCopy2 = mLayerClone->getLayer(2);
-    EXPECT_EQ(layer2.getName(), layerCopy2->getName());
-    EXPECT_EQ(layer2.getThickness(), layerCopy2->getThickness());
-    EXPECT_EQ(layer2.getMaterial()->getName(), layerCopy2->getMaterial()->getName());
-
-    const Layer * layerCopy3 = mLayerClone->getLayer(3);
-    EXPECT_EQ(layer3.getName(), layerCopy3->getName());
-    EXPECT_EQ(layer3.getThickness(), layerCopy3->getThickness());
-    EXPECT_EQ(layer3.getMaterial()->getName(), layerCopy3->getMaterial()->getName());
-
-    //check interfaces
-    const LayerInterface * interface0 = mLayerClone->getLayerInterface(0);
-    EXPECT_TRUE(nullptr!=interface0);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
-    EXPECT_EQ(nullptr, interface0->getRoughness());
-    EXPECT_EQ(layer0.getMaterial()->getName(), interface0->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interface0->getLayerBottom()->getMaterial()->getName());
-
-    const LayerInterface * interface1 = mLayerClone->getLayerInterface(1);
-    EXPECT_TRUE(nullptr!=interface1);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
-    EXPECT_EQ(nullptr, interface1->getRoughness());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interface1->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interface1->getLayerBottom()->getMaterial()->getName());
-
-    const LayerInterface * interface2 = mLayerClone->getLayerInterface(2);
-    EXPECT_TRUE(nullptr!=interface2);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
-    EXPECT_EQ(nullptr, interface2->getRoughness());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interface2->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer3.getMaterial()->getName(), interface2->getLayerBottom()->getMaterial()->getName());
-
-    //top interface
-    const LayerInterface * interfaceBottom = mLayerClone->getLayerTopInterface(1);
-    EXPECT_TRUE(nullptr!=interfaceBottom);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
-    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
-    EXPECT_EQ(layer0.getMaterial()->getName(), interfaceBottom->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interfaceBottom->getLayerBottom()->getMaterial()->getName());
-
-    //Bottom interface
-    const LayerInterface * interfaceTop = mLayerClone->getLayerBottomInterface(2);
-    EXPECT_TRUE(nullptr!=interfaceTop);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
-    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interfaceTop->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer3.getMaterial()->getName(), interfaceTop->getLayerBottom()->getMaterial()->getName());
-
-    //null interface
-    const LayerInterface * interfaceTopNull = mLayerClone->getLayerTopInterface(0);
-    EXPECT_TRUE(nullptr==interfaceTopNull);
-
-    const LayerInterface * interfaceBottomNull = mLayerClone->getLayerBottomInterface(3);
-    EXPECT_TRUE(nullptr==interfaceBottomNull);
-
-    delete mLayerClone;
-}
-
-TEST_F(MultiLayerTest, CloneInvertB)
-{
-    MultiLayer mLayer;
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial chromium("chromium",0,3.68);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(chromium, 40*Units::nanometer);
-    Layer layer3(stone, 0*Units::nanometer);
-
-    mLayer.addLayer(layer0);
-    mLayer.addLayer(layer1);
-    mLayer.addLayer(layer2);
-    mLayer.addLayer(layer3);
-
-    MultiLayer * mLayerClone = mLayer.cloneInvertB();
-
-    //check properties
-    EXPECT_EQ(BornAgain::MultiLayerType, mLayerClone->getName());
-    EXPECT_EQ(0.0,mLayerClone->getCrossCorrLength());
-    EXPECT_EQ(size_t(4), mLayerClone->getNumberOfLayers());
-    EXPECT_EQ(size_t(3), mLayerClone->getNumberOfInterfaces());
-
-    //check layer thickness
-    EXPECT_EQ(layer0.getThickness(), mLayerClone->getLayerThickness(0));
-    EXPECT_EQ(layer1.getThickness(), mLayerClone->getLayerThickness(1));
-    EXPECT_EQ(layer2.getThickness(), mLayerClone->getLayerThickness(2));
-    EXPECT_EQ(layer3.getThickness(), mLayerClone->getLayerThickness(3));
-
-    //check bottomZ value
-    EXPECT_EQ(mLayer.getLayerBottomZ(0), mLayerClone->getLayerBottomZ(0));
-    EXPECT_EQ(mLayer.getLayerBottomZ(1), mLayerClone->getLayerBottomZ(1));
-    EXPECT_EQ(mLayer.getLayerBottomZ(2), mLayerClone->getLayerBottomZ(2));
-    EXPECT_EQ(mLayer.getLayerBottomZ(3), mLayerClone->getLayerBottomZ(3));
-
-    //check individual layer
-    const Layer * layerCopy0 = mLayerClone->getLayer(0);
-    EXPECT_EQ(layer0.getName(), layerCopy0->getName());
-    EXPECT_EQ(layer0.getThickness(), layerCopy0->getThickness());
-    EXPECT_EQ(layer0.getMaterial()->getName(), layerCopy0->getMaterial()->getName());
-
-    const Layer * layerCopy1 = mLayerClone->getLayer(1);
-    EXPECT_EQ(layer1.getName(), layerCopy1->getName());
-    EXPECT_EQ(layer1.getThickness(), layerCopy1->getThickness());
-    EXPECT_EQ(layer1.getMaterial()->getName(), layerCopy1->getMaterial()->getName());
-
-    const Layer * layerCopy2 = mLayerClone->getLayer(2);
-    EXPECT_EQ(layer2.getName(), layerCopy2->getName());
-    EXPECT_EQ(layer2.getThickness(), layerCopy2->getThickness());
-    EXPECT_EQ(layer2.getMaterial()->getName(), layerCopy2->getMaterial()->getName());
-
-    const Layer * layerCopy3 = mLayerClone->getLayer(3);
-    EXPECT_EQ(layer3.getName(), layerCopy3->getName());
-    EXPECT_EQ(layer3.getThickness(), layerCopy3->getThickness());
-    EXPECT_EQ(layer3.getMaterial()->getName(), layerCopy3->getMaterial()->getName());
-
-    //check interfaces
-    const LayerInterface * interface0 = mLayerClone->getLayerInterface(0);
-    EXPECT_TRUE(nullptr!=interface0);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface0->getName());
-    EXPECT_EQ(nullptr, interface0->getRoughness());
-    EXPECT_EQ(layer0.getMaterial()->getName(), interface0->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interface0->getLayerBottom()->getMaterial()->getName());
-
-    const LayerInterface * interface1 = mLayerClone->getLayerInterface(1);
-    EXPECT_TRUE(nullptr!=interface1);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface1->getName());
-    EXPECT_EQ(nullptr, interface1->getRoughness());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interface1->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interface1->getLayerBottom()->getMaterial()->getName());
-
-    const LayerInterface * interface2 = mLayerClone->getLayerInterface(2);
-    EXPECT_TRUE(nullptr!=interface2);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interface2->getName());
-    EXPECT_EQ(nullptr, interface2->getRoughness());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interface2->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer3.getMaterial()->getName(), interface2->getLayerBottom()->getMaterial()->getName());
-
-    //top interface
-    const LayerInterface * interfaceBottom = mLayerClone->getLayerTopInterface(1);
-    EXPECT_TRUE(nullptr!=interfaceBottom);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceBottom->getName());
-    EXPECT_EQ(nullptr, interfaceBottom->getRoughness());
-    EXPECT_EQ(layer0.getMaterial()->getName(), interfaceBottom->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer1.getMaterial()->getName(), interfaceBottom->getLayerBottom()->getMaterial()->getName());
-
-    //Bottom interface
-    const LayerInterface * interfaceTop = mLayerClone->getLayerBottomInterface(2);
-    EXPECT_TRUE(nullptr!=interfaceTop);
-    EXPECT_EQ(BornAgain::LayerInterfaceType, interfaceTop->getName());
-    EXPECT_EQ(nullptr, interfaceTop->getRoughness());
-    EXPECT_EQ(layer2.getMaterial()->getName(), interfaceTop->getLayerTop()->getMaterial()->getName());
-    EXPECT_EQ(layer3.getMaterial()->getName(), interfaceTop->getLayerBottom()->getMaterial()->getName());
-
-    //null interface
-    const LayerInterface * interfaceTopNull = mLayerClone->getLayerTopInterface(0);
-    EXPECT_TRUE(nullptr==interfaceTopNull);
-
-    const LayerInterface * interfaceBottomNull = mLayerClone->getLayerBottomInterface(3);
-    EXPECT_TRUE(nullptr==interfaceBottomNull);
-
-    delete mLayerClone;
-}
-
-TEST_F(MultiLayerTest, WithRoughness)
-{
-    MultiLayer mLayer;
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(stone, 0*Units::nanometer);
-
-    //LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength);
-    LayerRoughness lr(1.1, -7.3, 0.1);
-    mLayer.addLayer(layer0);
-    mLayer.addLayerWithTopRoughness(layer1,lr);
-    mLayer.addLayer(layer2);
-
-    const LayerInterface * interface0 = mLayer.getLayerInterface(0);
-    const LayerInterface * interface1 = mLayer.getLayerInterface(1);
-
-    const LayerRoughness * roughness0 = interface0->getRoughness();
-    const LayerRoughness * roughness1 = interface1->getRoughness();
-
-    EXPECT_TRUE(roughness0);
-    EXPECT_EQ(nullptr, roughness1);
-
-    EXPECT_EQ(1.1, roughness0->getSigma());
-    EXPECT_EQ(-7.3, roughness0->getHurstParameter());
-    EXPECT_EQ(0.1, roughness0->getLatteralCorrLength());
-}
-
-TEST_F(MultiLayerTest, CloneWithRoughness)
-{
-    MultiLayer mLayer;
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(stone, 0*Units::nanometer);
-
-    //LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength);
-    LayerRoughness lr0(-2.1, 7.3, -12.1);
-    LayerRoughness lr1(1.1, -7.3, 0.1);
-
-    mLayer.addLayer(layer0);
-    mLayer.addLayerWithTopRoughness(layer1,lr0);
-    mLayer.addLayerWithTopRoughness(layer2,lr1);
-
-    MultiLayer * mLayerClone = mLayer.clone();
-
-    const LayerInterface * interface0 = mLayerClone->getLayerInterface(0);
-    const LayerInterface * interface1 = mLayerClone->getLayerInterface(1);
-    const LayerRoughness * roughness0 = interface0->getRoughness();
-    const LayerRoughness * roughness1 = interface1->getRoughness();
-
-    EXPECT_TRUE(roughness0);
-    EXPECT_TRUE(roughness1);
-
-    EXPECT_EQ(-2.1, roughness0->getSigma());
-    EXPECT_EQ(7.3, roughness0->getHurstParameter());
-    EXPECT_EQ(-12.1, roughness0->getLatteralCorrLength());
-
-    EXPECT_EQ(1.1, roughness1->getSigma());
-    EXPECT_EQ(-7.3, roughness1->getHurstParameter());
-    EXPECT_EQ(0.1, roughness1->getLatteralCorrLength());
-
-    delete mLayerClone;
-}
-
-TEST_F(MultiLayerTest, CloneInvertBWithRoughness)
-{
-    MultiLayer mLayer;
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(stone, 5*Units::nanometer);
-
-    //LayerRoughness(double sigma, double hurstParameter, double latteralCorrLength);
-    LayerRoughness lr0(-2.1, 7.3, -12.1);
-    LayerRoughness lr1(1.1, -7.3, 0.1);
-
-    mLayer.addLayer(layer0);
-    mLayer.addLayerWithTopRoughness(layer1,lr0);
-    mLayer.addLayerWithTopRoughness(layer2,lr1);
-
-    MultiLayer * mLayerClone = mLayer.cloneInvertB();
-
-    const LayerInterface * interface0 = mLayerClone->getLayerInterface(0);
-    const LayerInterface * interface1 = mLayerClone->getLayerInterface(1);
-    const LayerRoughness * roughness0 = interface0->getRoughness();
-    const LayerRoughness * roughness1 = interface1->getRoughness();
-
-    EXPECT_EQ(-2.1, roughness0->getSigma());
-    EXPECT_EQ(7.3, roughness0->getHurstParameter());
-    EXPECT_EQ(-12.1, roughness0->getLatteralCorrLength());
-
-    EXPECT_EQ(1.1, roughness1->getSigma());
-    EXPECT_EQ(-7.3, roughness1->getHurstParameter());
-    EXPECT_EQ(0.1, roughness1->getLatteralCorrLength());
-
-    delete mLayerClone;
-}
-
-TEST_F(MultiLayerTest, WithMagneticMaterial)
-{
-    MultiLayer mLayer;
-
-    kvector_t magnetic_field(0.0, 0.0, 0.0);
-    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
-    HomogeneousMagneticMaterial magMaterial1("MagMat1", -5.6, 10, magnetic_field);
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(stone, 30*Units::nanometer);
-    Layer layer3(magMaterial0, 20*Units::nanometer);
-    Layer layer4(magMaterial1, 0*Units::nanometer);
-
-    mLayer.addLayer(layer0);
-    mLayer.addLayer(layer1);
-    mLayer.addLayer(layer2);
-    EXPECT_FALSE(mLayer.containsMagneticMaterial());
-
-    mLayer.addLayer(layer3);
-    mLayer.addLayer(layer4);
-    EXPECT_TRUE(mLayer.containsMagneticMaterial());
-}
-
-TEST_F(MultiLayerTest, CloneWithMagneticMaterial)
-{
-    MultiLayer mLayer;
-
-    kvector_t magnetic_field(1.1, 2.1, -5.1);
-    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(magMaterial0, 20*Units::nanometer);
-    mLayer.addLayer(layer0);
-    mLayer.addLayer(layer1);
-    mLayer.addLayer(layer2);
-
-    MultiLayer * mLayerClone = mLayer.clone();
-    EXPECT_TRUE(mLayerClone->containsMagneticMaterial());
-    delete mLayerClone;
-}
-
-TEST_F(MultiLayerTest, CloneInvertBMagneticMaterial)
-{
-    MultiLayer mLayer;
-
-    kvector_t magnetic_field(0.0, 0.0, 0.0);
-    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 20*Units::nanometer);
-    Layer layer2(magMaterial0, 20*Units::nanometer);
-
-    mLayer.addLayer(layer0);
-    mLayer.addLayer(layer1);
-    mLayer.addLayer(layer2);
-
-    MultiLayer * mLayerClone = mLayer.cloneInvertB();
-    EXPECT_TRUE(mLayerClone->containsMagneticMaterial());
-    delete mLayerClone;
-}
-
-TEST_F(MultiLayerTest, MultiLayerCompositeTest)
-{
-    MultiLayer mLayer;
-
-    kvector_t magnetic_field(0.0, 0.0, 0.0);
-    HomogeneousMagneticMaterial magMaterial0("MagMat0", 6e-4, 2e-8, magnetic_field);
-    HomogeneousMagneticMaterial magMaterial1("MagMat1", -5.6, 10, magnetic_field);
-
-    HomogeneousMaterial air("air",0,1.0);
-    HomogeneousMaterial iron("iron",0,1.51);
-    HomogeneousMaterial stone("stone",0,1.6);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(iron, 10*Units::nanometer);
-    Layer layer2(magMaterial0, 20*Units::nanometer);
-    Layer layer3(magMaterial1, 30*Units::nanometer);
-    Layer layer4(stone, 40*Units::nanometer);
-
-    mLayer.addLayer(layer0);
-    mLayer.addLayer(layer1);
-    mLayer.addLayer(layer2);
-    mLayer.addLayer(layer3);
-    mLayer.addLayer(layer4);
-
-    std::vector<Layer *> layer_buffer;
-    std::vector<LayerInterface *> interface_buffer;
-    int counter(0);
-    for(size_t index=0; index<mLayer.size();++index)
-    {
-        ISample *sample = mLayer[index];
-        if(counter%2 == 1)
-        {
-            LayerInterface *interface = dynamic_cast<LayerInterface *>(sample);
-            EXPECT_TRUE(nullptr != interface);
-            interface_buffer.push_back(interface);
-        } else {
-            Layer *layer = dynamic_cast<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());
-    for(size_t i=0; i<layer_buffer.size(); ++i) {
-        EXPECT_EQ( double(i*10), layer_buffer[i]->getThickness());
-    }
-    for(size_t i=0; i<interface_buffer.size(); ++i) {
-        EXPECT_EQ( double((i+1)*10), interface_buffer[i]->getLayerBottom()->getThickness());
-    }
-}
-
-/*
-index_0
------------------  0.0
-index_1
------------------  -10.0
-index_2
------------------  -30.0
-index_3
------------------  -60.0
-index_4
-*/
-
-TEST_F(MultiLayerTest, MultiLayerZtoIndex)
-{
-    MultiLayer multilayer;
-    HomogeneousMaterial air("air",0,1.0);
-
-    Layer layer0(air, 0*Units::nanometer);
-    Layer layer1(air, 10*Units::nanometer);
-    Layer layer2(air, 20*Units::nanometer);
-    Layer layer3(air, 30*Units::nanometer);
-    Layer layer4(air, 0*Units::nanometer);
-    multilayer.addLayer(layer0);
-    multilayer.addLayer(layer1);
-    multilayer.addLayer(layer2);
-    multilayer.addLayer(layer3);
-    multilayer.addLayer(layer4);
-
-    EXPECT_EQ(size_t(0), multilayer.zToLayerIndex(1.0));
-    EXPECT_EQ(size_t(0), multilayer.zToLayerIndex(0.0));
-    EXPECT_EQ(size_t(1), multilayer.zToLayerIndex(-1.0));
-    EXPECT_EQ(size_t(1), multilayer.zToLayerIndex(-9.0));
-    EXPECT_EQ(size_t(1), multilayer.zToLayerIndex(-10.0));
-    EXPECT_EQ(size_t(2), multilayer.zToLayerIndex(-11.0));
-    EXPECT_EQ(size_t(2), multilayer.zToLayerIndex(-30.0));
-    EXPECT_EQ(size_t(3), multilayer.zToLayerIndex(-31.0));
-    EXPECT_EQ(size_t(3), multilayer.zToLayerIndex(-60.0));
-    EXPECT_EQ(size_t(4), multilayer.zToLayerIndex(-61.0));
-}
-
-#endif
diff --git a/Tests/UnitTests/Core/TestCore.pro.user b/Tests/UnitTests/Core/TestCore.pro.user
deleted file mode 100644
index 5243081e5d6ca209b171a4c0ed9e78f6a8dbb6f6..0000000000000000000000000000000000000000
--- a/Tests/UnitTests/Core/TestCore.pro.user
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE QtCreatorProject>
-<!-- Written by Qt Creator 2.6.2, 2013-02-15T11:16:44. -->
-<qtcreator>
- <data>
-  <variable>ProjectExplorer.Project.ActiveTarget</variable>
-  <value type="int">-1</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.EditorSettings</variable>
-  <valuemap type="QVariantMap">
-   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
-   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
-   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
-   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
-    <value type="QString" key="language">Cpp</value>
-    <valuemap type="QVariantMap" key="value">
-     <value type="QString" key="CurrentPreferences">CppGlobal</value>
-    </valuemap>
-   </valuemap>
-   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
-    <value type="QString" key="language">QmlJS</value>
-    <valuemap type="QVariantMap" key="value">
-     <value type="QString" key="CurrentPreferences">QmlJSGlobal</value>
-    </valuemap>
-   </valuemap>
-   <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
-   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
-   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
-   <value type="int" key="EditorConfiguration.IndentSize">4</value>
-   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
-   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
-   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
-   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
-   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
-   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
-   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
-   <value type="int" key="EditorConfiguration.TabSize">8</value>
-   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
-   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
-   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
-   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
-   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
-   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.PluginSettings</variable>
-  <valuemap type="QVariantMap"/>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.TargetCount</variable>
-  <value type="int">0</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
-  <value type="QString">{3d0c9af8-0e2f-45cd-a5b0-a3c87e345188}</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
-  <value type="int">12</value>
- </data>
-</qtcreator>
diff --git a/Tests/UnitTests/Core/main.cpp b/Tests/UnitTests/Core/main.cpp
deleted file mode 100644
index bc51821c600b50e3fc7defa1768c431935bc7cbe..0000000000000000000000000000000000000000
--- a/Tests/UnitTests/Core/main.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifdef _MSC_VER
-#define _VARIADIC_MAX 10
-#endif
-#include "gtest/gtest.h"
-
-#include "AttLimitsTest.h"
-#include "BeamTest.h"
-#include "ChiSquaredModuleTest.h"
-#include "CVectorTest.h"
-#include "DetectorTest.h"
-#include "DistributionsTest.h"
-#include "DistributionHandlerTest.h"
-#include "DWBASimulationTest.h"
-#include "FormFactorTest.h"
-#include "InstrumentTest.h"
-#include "IParameterizedTest.h"
-#include "KVectorTest.h"
-#include "LayerTest.h"
-#include "MaskTest.h"
-#include "OutputDataIteratorTest.h"
-#include "OutputDataTest.h"
-#include "ParameterDistributionTest.h"
-#include "ParameterPoolTest.h"
-#include "ParticleTest.h"
-#include "RealParameterWrapperTest.h"
-#include "GISASSimulationTest.h"
-#include "ThreadInfoTest.h"
-#include "ParticleCompositionTest.h"
-#include "LayerRoughnessTest.h"
-#include "LLDataTest.h"
-#include "TRangeTest.h"
-#include "FTDistributionsTest.h"
-#include "MultiLayerTest.h"
-#include "ParticleLayoutTest.h"
-#include "HomogeneousMaterialTest.h"
-#include "HomogeneousMagneticMaterialTest.h"
-#include "ScalarRTCoefficientsTest.h"
-#include "SpecularMatrixTest.h"
-#include "MatrixRTCoefficientsTest.h"
-#include "ScalarSpecularInfoMapTest.h"
-#include "MatrixSpecularInfoMapTest.h"
-#include "FixedBinAxisTest.h"
-#include "VariableBinAxisTest.h"
-#include "ConstKBinAxisTest.h"
-#include "CustomBinAxisTest.h"
-#include "IntensityDataFunctionsTest.h"
-#include "SpecularSimulationTest.h"
-#include "ParticleCoreShellTest.h"
-#include "ParameterDistributionTest.h"
-#include "UtilsTest.h"
-#include "CumulativeValueTest.h"
-#include "Histogram1DTest.h"
-#include "Histogram2DTest.h"
-#include "PolygonTest.h"
-#include "DetectorMaskTest.h"
-#include "Shape2DTest.h"
-#include "RectangularDetectorTest.h"
-#include "SpecialFunctionsTest.h"
-#include "PrecomputedTest.h"
-
-
-struct ErrorStreamRedirect {
-    ErrorStreamRedirect( std::streambuf * new_buffer )
-        : old( std::cerr.rdbuf( new_buffer ) )
-    { }
-
-    ~ErrorStreamRedirect( ) {
-        std::cerr.rdbuf( old );
-    }
-
-private:
-    std::streambuf * old;
-};
-
-int main(int argc, char** argv)
-{
-    ::testing::InitGoogleTest(&argc, argv);
-
-    // redirect std::cerr stream
-    std::stringstream oss;
-    ErrorStreamRedirect redirecter( oss.rdbuf() );
-    (void)redirecter;
-
-    // run all google tests
-    return RUN_ALL_TESTS();
-}
diff --git a/Tests/UnitTests/Fit/CMakeLists.txt b/Tests/UnitTests/Fit/CMakeLists.txt
index c940629cfcf9b1cd4322fbd44a26cc1ed40cdf67..035af85217f90f60248e5447f3ec1640e046258d 100644
--- a/Tests/UnitTests/Fit/CMakeLists.txt
+++ b/Tests/UnitTests/Fit/CMakeLists.txt
@@ -2,16 +2,6 @@
 # CMakeLists.txt file for building and running unit tests
 ############################################################################
 
-enable_testing()
-
-file(GLOB include_files "*.h")
-
-add_executable( TestFit main.cpp ${include_files})
-
-# dependencies
-include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
-target_link_libraries(TestFit gtest)
-
 include_directories(
     ${Boost_INCLUDE_DIRS}
     ${BornAgainCore_INCLUDE_DIRS}
@@ -20,27 +10,8 @@ include_directories(
     ${GSL_INCLUDE_DIR}
 )
 
-
-target_link_libraries(TestFit
-    ${BornAgainCore_LIBRARY}
-    ${BornAgainFit_LIBRARY}
-    ${Boost_LIBRARIES}
-    ${GSL_LIBRARIES}
-)
-
 if(BORNAGAIN_OPENMPI)
     include_directories(${MPI_INCLUDE_PATH})
-    target_link_libraries(TestFit ${MPI_LIBRARIES})
 endif()
 
-
-# to build executable right in lib directory to not to have problems with finding libBornAgainCore.dll under Windows
-set_property(TARGET TestFit PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
-
-add_test( TestFit TestFit) # TestName ExeName
-
-# add execution of TestCore just after compilation
-add_custom_command(TARGET TestFit POST_BUILD COMMAND TestFit)
-
-
-
+UNIT_TESTS(TestFit0 "." ${BornAgainFit_LIBRARY})
diff --git a/Tests/UnitTests/GUI/CMakeLists.txt b/Tests/UnitTests/GUI/CMakeLists.txt
index f61b458acfa2ebb9b7571714b22a74da5a75ea5d..75481588ed9e0c89bf90fccf449501b89ad83516 100644
--- a/Tests/UnitTests/GUI/CMakeLists.txt
+++ b/Tests/UnitTests/GUI/CMakeLists.txt
@@ -1,11 +1,10 @@
-############################################################################
-# CMakeLists.txt file for building and running unit tests
-############################################################################
+# Here we use QtTest, not gtest ...
+
 if(POLICY CMP0020)
-cmake_policy(SET CMP0020 NEW)
+    cmake_policy(SET CMP0020 NEW)
 endif()
 if(POLICY CMP0043)
-cmake_policy(SET CMP0043 NEW)
+    cmake_policy(SET CMP0043 NEW)
 endif()
 
 enable_testing()
@@ -25,15 +24,11 @@ include_directories(
 )
 
 
-# to build executable right in lib directory to not to have problems with finding libBornAgainCore.dll under Windows
-#set_property(TARGET TestGUI PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
-
 set(CMAKE_AUTOMOC ON)
 
 add_executable(TestGUI ${source_files} ${include_files})
 
 target_link_libraries(TestGUI
-    ${BornAgainCore_LIBRARY}
     ${BornAgainGUI_LIBRARY}
 )
 
@@ -43,4 +38,3 @@ add_test( TestGUI TestGUI) # TestName ExeName
 
 # add execution of TestCore just after compilation
 add_custom_command(TARGET TestGUI POST_BUILD COMMAND TestGUI)
-
diff --git a/cmake/modules/SetUpLinux.cmake b/cmake/modules/SetUpLinux.cmake
index 40de6e260419b2c9154985c09b54894609b559b1..600efaf2756d526241f2ccf7d0279a2d110d60f9 100644
--- a/cmake/modules/SetUpLinux.cmake
+++ b/cmake/modules/SetUpLinux.cmake
@@ -1,8 +1,6 @@
 set(BORNAGAIN_ARCHITECTURE linux)
 set(BORNAGAIN_PLATFORM linux)
 
-
-
 execute_process(COMMAND uname -m OUTPUT_VARIABLE SYSCTL_OUTPUT)
 if(${SYSCTL_OUTPUT} MATCHES x86_64)
     message(STATUS "Found a 64bit system")
diff --git a/cmake/modules/UnitTests.cmake b/cmake/modules/UnitTests.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..19bc0e30b1c0121be8bc6070b33db8d8e110f215
--- /dev/null
+++ b/cmake/modules/UnitTests.cmake
@@ -0,0 +1,51 @@
+#################################################################################
+#
+#  BornAgain: simulate and fit scattering at grazing incidence
+#
+#  @file      cmake/modules/UnitTests
+#  @brief     Implements function UNIT_TESTS(..)
+#
+#  @homepage  http://www.bornagainproject.org
+#  @license   GNU General Public License v3 or higher (see COPYING)
+#  @copyright Forschungszentrum Jülich GmbH 2016
+#  @authors   Scientific Computing Group at MLZ Garching
+#  @authors   J. Fisher, M. Ganeva, G. Pospelov, W. Van Herck, J. Wuttke
+#
+##################################################################################
+
+#  @brief Compile tests given as .h files in SUBDIR, link with LINK_LIB, and execute
+
+function(UNIT_TESTS TEST_NAME SUBDIR LINK_LIB)
+    enable_testing()
+    include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
+
+    file(GLOB INCLUDE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "${SUBDIR}/*.h")
+    list(SORT INCLUDE_FILES)
+
+    # Compose main program (C++ snippets plus #include's of test code from SUBDIR)
+    set(TMP "/* Generated by CMake. Do not edit. Do not put under version control. */\n")
+    file(READ "${CMAKE_MODULE_PATH}/unitTests.cpp.header" TMPTMP)
+    set(TMP "${TMP}\n${TMPTMP}\n")
+    foreach(FILE ${INCLUDE_FILES})
+        set(TMP "${TMP}#include \"${FILE}\"\n")
+    endforeach()
+    file(READ "${CMAKE_MODULE_PATH}/unitTests.cpp.footer" TMPTMP)
+    set(TMP "${TMP}\n${TMPTMP}")
+
+    set(TEST_SRC "_${TEST_NAME}.cpp")
+    file(WRITE ${TEST_SRC} "${TMP}")
+
+    set(EXE ${TEST_NAME})
+    add_executable(${EXE} ${TEST_SRC})
+    target_link_libraries(${EXE} gtest ${LINK_LIB})
+
+    # Build executable in lib directory,
+    # to prevent problems with finding libBornAgainCore.dll under Windows
+    set_property(TARGET ${EXE} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+
+    add_test(${TEST_NAME} ${EXE})
+
+    # Add execution of TestCore just after compilation
+    add_custom_command(TARGET ${TEST_NAME} POST_BUILD COMMAND ${EXE})
+
+endfunction()
diff --git a/Tests/UnitTests/Fit/main.cpp b/cmake/modules/unitTests.cpp.footer
similarity index 71%
rename from Tests/UnitTests/Fit/main.cpp
rename to cmake/modules/unitTests.cpp.footer
index 8169f87b356005bb1a13a873a3b6c84e9754e71e..8d131ad6d166a300f49b7cee44631e60fd1f6b30 100644
--- a/Tests/UnitTests/Fit/main.cpp
+++ b/cmake/modules/unitTests.cpp.footer
@@ -1,13 +1,4 @@
-#ifdef _MSC_VER
-#define _VARIADIC_MAX 10
-#endif
-#include "gtest/gtest.h"
-
-#include "FitParameterTest.h"
-#include "FitParameterLinkedTest.h"
-#include "MinimizerOptionsTest.h"
-#include "FitObjectTest.h"
-
+/* From unitTests.cpp.footer: */
 
 struct ErrorStreamRedirect {
     ErrorStreamRedirect( std::streambuf * new_buffer )
@@ -24,6 +15,7 @@ private:
 
 int main(int argc, char** argv)
 {
+    std::cout << "UnitTest::main ...\n";
     ::testing::InitGoogleTest(&argc, argv);
 
     // redirect std::cerr stream
@@ -34,4 +26,3 @@ int main(int argc, char** argv)
     // run all google tests
     return RUN_ALL_TESTS();
 }
-
diff --git a/cmake/modules/unitTests.cpp.header b/cmake/modules/unitTests.cpp.header
new file mode 100644
index 0000000000000000000000000000000000000000..2a00517bcbab88aca345843c066b1de4b32cf3aa
--- /dev/null
+++ b/cmake/modules/unitTests.cpp.header
@@ -0,0 +1,8 @@
+/* From unitTests.cpp.header: */
+
+#ifdef _MSC_VER
+#define _VARIADIC_MAX 10
+#endif
+#include <gtest/gtest.h>
+
+/* Autogenerated includes (rerun cmake to update): */