diff --git a/Core/StandardSamples/IsGISAXS10Builder.cpp b/Core/StandardSamples/IsGISAXS10Builder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ec54ca65fb82cb352c26170ec8f2ef265c7c9a8a
--- /dev/null
+++ b/Core/StandardSamples/IsGISAXS10Builder.cpp
@@ -0,0 +1,53 @@
+#include "IsGISAXS10Builder.h"
+#include "MultiLayer.h"
+#include "ParticleDecoration.h"
+#include "MaterialManager.h"
+#include "FormFactorCylinder.h"
+#include "InterferenceFunction1DParaCrystal.h"
+#include "Units.h"
+
+IsGISAXS10Builder::IsGISAXS10Builder()
+    : m_cylinder_height(5*Units::nanometer)
+    , m_cylinder_radius(5*Units::nanometer)
+{
+    init_parameters();
+}
+
+
+void IsGISAXS10Builder::init_parameters()
+{
+    clearParameterPool();
+    registerParameter("cylinder_height", &m_cylinder_height);
+    registerParameter("cylinder_raduis", &m_cylinder_radius);
+}
+
+
+ISample *IsGISAXS10Builder::buildSample() const
+{
+    MultiLayer *multi_layer = new MultiLayer();
+
+	const IMaterial *p_air_material =
+            MaterialManager::getHomogeneousMaterial("Air10", 0.0, 0.0);
+    const IMaterial *p_substrate_material =
+            MaterialManager::getHomogeneousMaterial("Substrate10", 5e-6, 2e-8);
+    Layer air_layer;
+    air_layer.setMaterial(p_air_material);
+    Layer substrate_layer;
+    substrate_layer.setMaterial(p_substrate_material);
+
+    IInterferenceFunction *p_interference_function =
+            new InterferenceFunction1DParaCrystal(20.0*Units::nanometer,
+                    7*Units::nanometer, 1e7*Units::nanometer);
+    const IMaterial *particle_material = MaterialManager::getHomogeneousMaterial("Particle", 5e-5, 2e-8);
+
+    ParticleDecoration particle_decoration(new Particle(particle_material,
+            new FormFactorCylinder(m_cylinder_height, m_cylinder_radius)));
+    particle_decoration.addInterferenceFunction(p_interference_function);
+
+    air_layer.setDecoration(particle_decoration);
+
+    multi_layer->addLayer(air_layer);
+    multi_layer->addLayer(substrate_layer);
+    return multi_layer;
+}
+
diff --git a/Core/StandardSamples/IsGISAXS10Builder.h b/Core/StandardSamples/IsGISAXS10Builder.h
new file mode 100644
index 0000000000000000000000000000000000000000..ae1d5fe12e4e535693a5317efdfc54968ebff46b
--- /dev/null
+++ b/Core/StandardSamples/IsGISAXS10Builder.h
@@ -0,0 +1,22 @@
+#ifndef ISGISAXS10BUILDER_H
+#define ISGISAXS10BUILDER_H
+
+#include "ISampleBuilder.h"
+
+//! The IsGISAXS10Builder class to build sample: cylinders on top of substrate
+//! with interference (IsGISAXS example #10)
+class IsGISAXS10Builder : public ISampleBuilder
+{
+public:
+    IsGISAXS10Builder();
+    ISample *buildSample() const;
+
+protected:
+    void init_parameters();
+
+private:
+    double m_cylinder_height;
+    double m_cylinder_radius;
+};
+
+#endif // ISGISAXS10BUILDER_H
diff --git a/Core/StandardSamples/SampleBuilderFactory.cpp b/Core/StandardSamples/SampleBuilderFactory.cpp
index df1464ed5d8b34711f9d1ecd77f8a89a8bf81354..27f2255a52c9547d5a8ea2df37bfbf02fc1a324e 100644
--- a/Core/StandardSamples/SampleBuilderFactory.cpp
+++ b/Core/StandardSamples/SampleBuilderFactory.cpp
@@ -7,6 +7,7 @@
 #include "IsGISAXS07Builder.h"
 #include "IsGISAXS08Builder.h"
 #include "IsGISAXS09Builder.h"
+#include "IsGISAXS10Builder.h"
 #include "MesoCrystal01Builder.h"
 #include "PolarizedDWBAZeroMagBuilder.h"
 
@@ -87,6 +88,11 @@ SampleBuilderFactory::SampleBuilderFactory()
         IFactoryCreateFunction<IsGISAXS09RotatedBuilder, ISampleBuilder>,
         "Rotated pyramids on top of substrate");
 
+    registerItem(
+        "isgisaxs10",
+        IFactoryCreateFunction<IsGISAXS10Builder, ISampleBuilder>,
+        "Cylinders on top of substrate with interference");
+
     registerItem(
         "mesocrystal01",
         IFactoryCreateFunction<MesoCrystal01Builder, ISampleBuilder>,
diff --git a/Core/StandardSamples/SimulationRegistry.cpp b/Core/StandardSamples/SimulationRegistry.cpp
index 1bc820ca78396b272a487d6296566838c825fdbb..b19f3d499e971efe98d0bedf1e42a4aee8bf73f2 100644
--- a/Core/StandardSamples/SimulationRegistry.cpp
+++ b/Core/StandardSamples/SimulationRegistry.cpp
@@ -68,6 +68,10 @@ SimulationRegistry::SimulationRegistry()
         "isgisaxs09_rotated", StandardSimulations::IsGISAXS09R,
         "IsGISAXS09 example, Rotated pyramids on top of substrate");
 
+    registerItem(
+        "isgisaxs10", StandardSimulations::IsGISAXS10,
+        "IsGISAXS10 example, Cylinders on top of substrate with interference");
+
     registerItem(
         "mesocrystal01", StandardSimulations::MesoCrystal01,
         "mesocrystals of cylindrical shape composed by spherical nanoparticles");
diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/StandardSamples/StandardSimulations.cpp
index f28993398cce890ab69c535a13623f918d5a085a..79dc2c9d92fad91e0d185424305960dd3d156584 100644
--- a/Core/StandardSamples/StandardSimulations.cpp
+++ b/Core/StandardSamples/StandardSimulations.cpp
@@ -306,6 +306,23 @@ Simulation *StandardSimulations::IsGISAXS09R()
     return result;
 }
 
+Simulation *StandardSimulations::IsGISAXS10()
+{
+    SampleBuilderFactory factory;
+    ISampleBuilder *builder = factory.createBuilder("isgisaxs10");
+
+    Simulation *result = new Simulation();
+
+    result->setDetectorParameters(100, 0.0*Units::degree, 2.0*Units::degree,
+            100, 0.0*Units::degree, 2.0*Units::degree, true);
+    result->setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree,
+            0.0*Units::degree);
+
+    result->setSampleBuilder( builder );
+
+    return result;
+}
+
 Simulation *StandardSimulations::MesoCrystal01()
 {
     SampleBuilderFactory factory;
diff --git a/Core/StandardSamples/StandardSimulations.h b/Core/StandardSamples/StandardSimulations.h
index 41694e3bb9714ad8e63a9a979d2c23b6f4d35847..11bba884d43c30a2d92e36efc192bd9a2efd145e 100644
--- a/Core/StandardSamples/StandardSimulations.h
+++ b/Core/StandardSamples/StandardSimulations.h
@@ -24,7 +24,7 @@ Simulation *IsGISAXS082DDL();
 Simulation *IsGISAXS082DDL2();
 Simulation *IsGISAXS09();
 Simulation *IsGISAXS09R();
-//Simulation *IsGISAXS10();
+Simulation *IsGISAXS10();
 //Simulation *IsGISAXS11();
 //Simulation *IsGISAXS15();
 Simulation *MesoCrystal01();
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.cpp
index ed3e2381b355055d84da5951da9398e9e28a44a6..fb1e0d6f250af2d0f3456f80c30d38fdc9980da4 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.cpp
@@ -9,6 +9,7 @@
 #include "Units.h"
 #include "Utils.h"
 #include "MathFunctions.h"
+#include "SimulationRegistry.h"
 
 #include <iostream>
 #include <cmath>
@@ -18,62 +19,33 @@ FunctionalTests::IsGISAXS10::IsGISAXS10()
     : m_name("IsGISAXS10")
     , m_description("Cylinders with interference on top of substrate")
     , m_result(0)
+    , m_reference(0)
 { }
 
 
-void FunctionalTests::IsGISAXS10::run()
+void FunctionalTests::IsGISAXS10::run(const std::string &path_to_data)
 {
-    // building sample
-    MultiLayer multi_layer;
-    const IMaterial *p_air_material =
-            MaterialManager::getHomogeneousMaterial("Air10", 0.0, 0.0);
-    const IMaterial *p_substrate_material =
-            MaterialManager::getHomogeneousMaterial("Substrate10", 5e-6, 2e-8);
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-    Layer substrate_layer;
-    substrate_layer.setMaterial(p_substrate_material);
-
-    IInterferenceFunction *p_interference_function =
-            new InterferenceFunction1DParaCrystal(20.0*Units::nanometer,
-                    7*Units::nanometer, 1e7*Units::nanometer);
-    const IMaterial *particle_material = MaterialManager::getHomogeneousMaterial("Particle", 5e-5, 2e-8);
-
-    ParticleDecoration particle_decoration(new Particle(particle_material,
-            new FormFactorCylinder(5*Units::nanometer, 5*Units::nanometer)));
-    particle_decoration.addInterferenceFunction(p_interference_function);
-
-    air_layer.setDecoration(particle_decoration);
-
-    multi_layer.addLayer(air_layer);
-    multi_layer.addLayer(substrate_layer);
-
-    // building simulation
-    Simulation simulation;
-    simulation.setDetectorParameters(100, 0.0*Units::degree, 2.0*Units::degree,
-            100, 0.0*Units::degree, 2.0*Units::degree, true);
-    simulation.setBeamParameters(1.0*Units::angstrom, 0.2*Units::degree,
-            0.0*Units::degree);
-    simulation.setSample(multi_layer);
-
-    // running simulation and copying data
-    simulation.runSimulation();
-    m_result = simulation.getIntensityData();
+    SimulationRegistry sim_registry;
+    Simulation *simulation = sim_registry.createSimulation("isgisaxs10");
+
+    // loading reference data
+    std::string filename = path_to_data + "isgisaxs10_reference.ima.gz";
+    m_reference = OutputDataIOFactory::readIntensityData(filename);
+
+    simulation->runSimulation();
+
+    m_result = simulation->getIntensityData();
+    delete simulation;
 }
 
 
-int FunctionalTests::IsGISAXS10::analyseResults(const std::string &path_to_data)
+int FunctionalTests::IsGISAXS10::analyseResults()
 {
     const double threshold(2e-10);
 
-    // retrieving reference data
-    std::string filename = path_to_data + "isgisaxs10_reference.ima.gz";
-    OutputData<double > *reference = OutputDataIOFactory::readIntensityData(filename);
-
     // calculating average relative difference
-    *m_result -= *reference;
-    *m_result /= *reference;
-    delete reference;
+    *m_result -= *m_reference;
+    *m_result /= *m_reference;
 
     double diff(0);
     for(OutputData<double>::const_iterator it=m_result->begin();
@@ -101,8 +73,8 @@ std::string GetPathToData(int argc, char **argv)
 int main(int argc, char **argv)
 {
     FunctionalTests::IsGISAXS10 test;
-    test.run();
-    return test.analyseResults(GetPathToData(argc, argv));
+    test.run(GetPathToData(argc, argv));
+    return test.analyseResults();
 }
 #endif
 
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.h b/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.h
index e5471ebe6eca309b1e90d531fa1ccca9067f4f51..cbbddaa3ab17ca18734dfda66186a98169d10b25 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.h
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS10/IsGISAXS10.h
@@ -1,7 +1,7 @@
 #ifndef FUNCTIONALTESTS_ISGISAXS10_H
 #define FUNCTIONALTESTS_ISGISAXS10_H
 
-
+#include "ISampleBuilder.h"
 #include <string>
 #include "OutputData.h"
 
@@ -12,16 +12,17 @@ class IsGISAXS10
 {
 public :
     IsGISAXS10();
-    ~IsGISAXS10() { delete m_result; }
+    ~IsGISAXS10() { delete m_result; delete m_reference; }
 
-    void run();
-    int analyseResults(const std::string &path_to_data = std::string());
+    void run(const std::string &path_to_data = std::string());
+    int analyseResults();
 
     const OutputData<double> *getOutputData() { return m_result; }
  private:
     std::string m_name;
     std::string m_description;
     OutputData<double> *m_result;
+    OutputData<double> *m_reference;
 };
 
 }