diff --git a/Core/StandardSamples/IsGISAXS07Builder.cpp b/Core/StandardSamples/IsGISAXS07Builder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1e7d44c983bc85cce676ee36d4bfec31f0381f1d
--- /dev/null
+++ b/Core/StandardSamples/IsGISAXS07Builder.cpp
@@ -0,0 +1,122 @@
+#include "IsGISAXS07Builder.h"
+#include "MultiLayer.h"
+#include "ParticleDecoration.h"
+#include "MaterialManager.h"
+#include "Rotate3D.h"
+#include "FormFactorBox.h"
+#include "Simulation.h"
+#include "OutputDataIOFactory.h"
+#include "PositionParticleInfo.h"
+#include "Utils.h"
+#include "Units.h"
+#include "MathFunctions.h"
+#include <iostream>
+#include <cmath>
+
+IsGISAXS07Builder::IsGISAXS07Builder()
+{
+}
+
+
+ISample *IsGISAXS07Builder::buildSample() const
+{
+
+    // building sample
+    MultiLayer* multi_layer = new MultiLayer();
+    const IMaterial *p_air_material = MaterialManager::getHomogeneousMaterial("Air", 0.0, 0.0);
+    complex_t n_particle(1.0-6e-4, 2e-8);
+    const IMaterial *particle_material =
+            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+
+    Layer air_layer;
+    air_layer.setMaterial(p_air_material);
+
+
+    ParticleDecoration particle_decoration;
+
+    // add particle number 1:
+    FormFactorBox ff1(2.0*Units::nanometer, 2.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos1(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0);
+    PositionParticleInfo particle_info1(new Particle(particle_material, ff1),
+            pos1, 0.5);
+    particle_decoration.addParticleInfo(particle_info1);
+    // add particle number 2:
+    FormFactorBox ff2(2.0*Units::nanometer, 4.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos2(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m2(10*Units::degree);
+    PositionParticleInfo particle_info2(
+            new Particle(particle_material, ff2, m2), pos2, 0.5);
+    particle_decoration.addParticleInfo(particle_info2);
+    // add particle number 3:
+    FormFactorBox ff3(2.0*Units::nanometer, 6.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos3(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m3(20*Units::degree);
+    PositionParticleInfo particle_info3(
+            new Particle(particle_material, ff3, m3), pos3, 0.5);
+    particle_decoration.addParticleInfo(particle_info3);
+    // add particle number 4:
+    FormFactorBox ff4(2.0*Units::nanometer, 8.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos4(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m4(30*Units::degree);
+    PositionParticleInfo particle_info4(
+            new Particle(particle_material, ff4, m4), pos4, 0.5);
+    particle_decoration.addParticleInfo(particle_info4);
+    // add particle number 5:
+    FormFactorBox ff5(2.0*Units::nanometer, 10.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos5(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m5(40*Units::degree);
+    PositionParticleInfo particle_info5(
+            new Particle(particle_material, ff5, m5), pos5, 0.5);
+    particle_decoration.addParticleInfo(particle_info5);
+    // add particle number 6:
+    FormFactorBox ff6(2.0*Units::nanometer, 2.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos6(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m6(50*Units::degree);
+    PositionParticleInfo particle_info6(
+            new Particle(particle_material, ff6, m6), pos6, 0.5);
+    particle_decoration.addParticleInfo(particle_info6);
+    // add particle number 7:
+    FormFactorBox ff7(2.0*Units::nanometer, 4.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos7(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m7(60*Units::degree);
+    PositionParticleInfo particle_info7(
+            new Particle(particle_material, ff7, m7), pos7, 0.5);
+    particle_decoration.addParticleInfo(particle_info7);
+    // add particle number 8:
+    FormFactorBox ff8(2.0*Units::nanometer, 6.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos8(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m8(70*Units::degree);
+    PositionParticleInfo particle_info8(
+            new Particle(particle_material, ff8, m8), pos8, 0.5);
+    particle_decoration.addParticleInfo(particle_info8);
+    // add particle number 9:
+    FormFactorBox ff9(2.0*Units::nanometer, 8.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos9(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m9(80*Units::degree);
+    PositionParticleInfo particle_info9(
+            new Particle(particle_material, ff9, m9), pos9, 0.5);
+    particle_decoration.addParticleInfo(particle_info9);
+    // add particle number 10:
+    FormFactorBox ff10(2.0*Units::nanometer, 10.0*Units::nanometer,
+            1.0*Units::nanometer);
+    kvector_t pos10(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
+    Geometry::RotateZ_3D m10(90*Units::degree);
+    PositionParticleInfo particle_info10(
+            new Particle(particle_material, ff10, m10), pos10, 0.5);
+    particle_decoration.addParticleInfo(particle_info10);
+
+    air_layer.setDecoration(particle_decoration);
+    multi_layer->addLayer(air_layer);
+
+    return multi_layer;
+}
+
diff --git a/Core/StandardSamples/IsGISAXS07Builder.h b/Core/StandardSamples/IsGISAXS07Builder.h
new file mode 100644
index 0000000000000000000000000000000000000000..724e30ee7b353ff4bd5c73fe64b93159d1bdbea5
--- /dev/null
+++ b/Core/StandardSamples/IsGISAXS07Builder.h
@@ -0,0 +1,15 @@
+#ifndef ISGISAXS07BUILDER_H
+#define ISGISAXS07BUILDER_H
+
+#include "ISampleBuilder.h"
+
+//! The IsGISAXS07Builder class to build sample: Mixture of different particles
+//! (IsGISAXS example #7)
+class IsGISAXS07Builder : public ISampleBuilder
+{
+public:
+    IsGISAXS07Builder();
+    ISample *buildSample() const;
+};
+
+#endif // ISGISAXS07BUILDER_H
diff --git a/Core/StandardSamples/SampleBuilderFactory.cpp b/Core/StandardSamples/SampleBuilderFactory.cpp
index 91f80ff90c582873056b2d269180ffa3ff360178..0c5c03d775be1a15839764aed04047aa6f6cdd32 100644
--- a/Core/StandardSamples/SampleBuilderFactory.cpp
+++ b/Core/StandardSamples/SampleBuilderFactory.cpp
@@ -4,6 +4,7 @@
 #include "IsGISAXS03Builder.h"
 #include "IsGISAXS04Builder.h"
 #include "IsGISAXS06Builder.h"
+#include "IsGISAXS07Builder.h"
 #include "IsGISAXS09Builder.h"
 #include "MesoCrystal01Builder.h"
 #include "PolarizedDWBAZeroMagBuilder.h"
@@ -61,6 +62,10 @@ SampleBuilderFactory::SampleBuilderFactory()
         IFactoryCreateFunction<IsGISAXS06Lattice4Builder, ISampleBuilder>,
         "2D lattice variants");
 
+    registerItem(
+        "isgisaxs07",
+        IFactoryCreateFunction<IsGISAXS07Builder, ISampleBuilder>,
+        "Mixture of different particles");
 
     registerItem(
         "isgisaxs09",
diff --git a/Core/StandardSamples/SimulationRegistry.cpp b/Core/StandardSamples/SimulationRegistry.cpp
index 2f2a9b841400e46c721719f5d96a45eed0d18b53..373714bd259274d7226a983712524c45c989225d 100644
--- a/Core/StandardSamples/SimulationRegistry.cpp
+++ b/Core/StandardSamples/SimulationRegistry.cpp
@@ -47,6 +47,10 @@ SimulationRegistry::SimulationRegistry()
         "isgisaxs06_lattice4", StandardSimulations::IsGISAXS06L4,
         "IsGISAXS06 example, 2D lattice variants");
 
+    registerItem(
+        "isgisaxs07", StandardSimulations::IsGISAXS07,
+        "Mixture of different particles defined in morphology file");
+
     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 d552a3d29af1e618329e660d8b1ee87ca3b9a2f8..ffcb9d4f532a546775b2c4b40f5cc09e3ed30be7 100644
--- a/Core/StandardSamples/StandardSimulations.cpp
+++ b/Core/StandardSamples/StandardSimulations.cpp
@@ -216,6 +216,26 @@ Simulation *StandardSimulations::IsGISAXS06L4()
     return result;
 }
 
+Simulation *StandardSimulations::IsGISAXS07()
+{
+    SampleBuilderFactory factory;
+    ISampleBuilder *builder = factory.createBuilder("isgisaxs07");
+
+    Simulation *result = new Simulation();
+
+    result->setDetectorParameters(100, 0.0*Units::degree, 1.0*Units::degree,
+                100, 0.0*Units::degree, 1.0*Units::degree, true);
+    result->setBeamParameters(1.0*Units::angstrom, 0.0*Units::degree, 0.0*Units::degree);
+
+    SimulationParameters sim_params;
+    sim_params.me_if_approx = SimulationParameters::ISGISAXSMOR;
+    result->setSimulationParameters(sim_params);
+
+    result->setSampleBuilder( builder );
+
+    return result;
+}
+
 Simulation *StandardSimulations::MesoCrystal01()
 {
     SampleBuilderFactory factory;
diff --git a/Core/StandardSamples/StandardSimulations.h b/Core/StandardSamples/StandardSimulations.h
index 18ba01dbb0975cd36894d325a81f4bce26f12b46..8f281f430a959008a0cbbd39ba7bccbe5236fa0c 100644
--- a/Core/StandardSamples/StandardSimulations.h
+++ b/Core/StandardSamples/StandardSimulations.h
@@ -19,7 +19,7 @@ Simulation *IsGISAXS06L1();
 Simulation *IsGISAXS06L2();
 Simulation *IsGISAXS06L3();
 Simulation *IsGISAXS06L4();
-//Simulation *IsGISAXS07();
+Simulation *IsGISAXS07();
 //Simulation *IsGISAXS08();
 //Simulation *IsGISAXS09();
 //Simulation *IsGISAXS10();
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp
index 1f700bf93ae84dc0185b2a952eb8d4c29a407cb9..e540d38eeb5f22652a272569eab48fcf4b2159bc 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.cpp
@@ -10,6 +10,7 @@
 #include "Utils.h"
 #include "Units.h"
 #include "MathFunctions.h"
+#include "SimulationRegistry.h"
 #include <iostream>
 #include <cmath>
 
@@ -17,143 +18,32 @@ FunctionalTests::IsGISAXS07::IsGISAXS07()
     : m_name("IsGISAXS07")
     , m_description("Mixture of different particles defined in morphology file")
     , m_result(0)
+	, m_reference(0)
 { }
 
 
-void FunctionalTests::IsGISAXS07::run()
+void FunctionalTests::IsGISAXS07::run(const std::string &path_to_data)
 {
-    // building sample
-    MultiLayer multi_layer;
-    const IMaterial *p_air_material = MaterialManager::getHomogeneousMaterial("Air", 0.0, 0.0);
-    complex_t n_particle(1.0-6e-4, 2e-8);
-    const IMaterial *particle_material =
-            MaterialManager::getHomogeneousMaterial("Particle", n_particle);
+	SimulationRegistry sim_registry;
+    Simulation *simulation = sim_registry.createSimulation("isgisaxs07");
 
-    Layer air_layer;
-    air_layer.setMaterial(p_air_material);
-
-
-    ParticleDecoration particle_decoration;
-
-    // add particle number 1:
-    FormFactorBox ff1(2.0*Units::nanometer, 2.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos1(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0);
-    PositionParticleInfo particle_info1(new Particle(particle_material, ff1),
-            pos1, 0.5);
-    particle_decoration.addParticleInfo(particle_info1);
-    // add particle number 2:
-    FormFactorBox ff2(2.0*Units::nanometer, 4.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos2(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m2(10*Units::degree);
-    PositionParticleInfo particle_info2(
-            new Particle(particle_material, ff2, m2), pos2, 0.5);
-    particle_decoration.addParticleInfo(particle_info2);
-    // add particle number 3:
-    FormFactorBox ff3(2.0*Units::nanometer, 6.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos3(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m3(20*Units::degree);
-    PositionParticleInfo particle_info3(
-            new Particle(particle_material, ff3, m3), pos3, 0.5);
-    particle_decoration.addParticleInfo(particle_info3);
-    // add particle number 4:
-    FormFactorBox ff4(2.0*Units::nanometer, 8.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos4(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m4(30*Units::degree);
-    PositionParticleInfo particle_info4(
-            new Particle(particle_material, ff4, m4), pos4, 0.5);
-    particle_decoration.addParticleInfo(particle_info4);
-    // add particle number 5:
-    FormFactorBox ff5(2.0*Units::nanometer, 10.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos5(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m5(40*Units::degree);
-    PositionParticleInfo particle_info5(
-            new Particle(particle_material, ff5, m5), pos5, 0.5);
-    particle_decoration.addParticleInfo(particle_info5);
-    // add particle number 6:
-    FormFactorBox ff6(2.0*Units::nanometer, 2.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos6(0.0*Units::nanometer, 0.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m6(50*Units::degree);
-    PositionParticleInfo particle_info6(
-            new Particle(particle_material, ff6, m6), pos6, 0.5);
-    particle_decoration.addParticleInfo(particle_info6);
-    // add particle number 7:
-    FormFactorBox ff7(2.0*Units::nanometer, 4.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos7(5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m7(60*Units::degree);
-    PositionParticleInfo particle_info7(
-            new Particle(particle_material, ff7, m7), pos7, 0.5);
-    particle_decoration.addParticleInfo(particle_info7);
-    // add particle number 8:
-    FormFactorBox ff8(2.0*Units::nanometer, 6.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos8(-5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m8(70*Units::degree);
-    PositionParticleInfo particle_info8(
-            new Particle(particle_material, ff8, m8), pos8, 0.5);
-    particle_decoration.addParticleInfo(particle_info8);
-    // add particle number 9:
-    FormFactorBox ff9(2.0*Units::nanometer, 8.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos9(5.0*Units::nanometer, -5.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m9(80*Units::degree);
-    PositionParticleInfo particle_info9(
-            new Particle(particle_material, ff9, m9), pos9, 0.5);
-    particle_decoration.addParticleInfo(particle_info9);
-    // add particle number 10:
-    FormFactorBox ff10(2.0*Units::nanometer, 10.0*Units::nanometer,
-            1.0*Units::nanometer);
-    kvector_t pos10(-5.0*Units::nanometer, 5.0*Units::nanometer, 0.0);
-    Geometry::RotateZ_3D m10(90*Units::degree);
-    PositionParticleInfo particle_info10(
-            new Particle(particle_material, ff10, m10), pos10, 0.5);
-    particle_decoration.addParticleInfo(particle_info10);
-
-    air_layer.setDecoration(particle_decoration);
-    multi_layer.addLayer(air_layer);
-
-    // ---------------------
-    // building simulation
-    // ---------------------
-    Simulation simulation;
-    simulation.setDetectorParameters(100, 0.0*Units::degree, 1.0*Units::degree,
-                100, 0.0*Units::degree, 1.0*Units::degree, true);
-    simulation.setBeamParameters(1.0*Units::angstrom, 0.0*Units::degree, 0.0*Units::degree);
-
-    SimulationParameters sim_params;
-    sim_params.me_if_approx = SimulationParameters::ISGISAXSMOR;
-    simulation.setSimulationParameters(sim_params);
+    // loading reference data
+    std::string filename = path_to_data + "isgisaxs07_reference.ima.gz";
+    m_reference = OutputDataIOFactory::readIntensityData(filename);
 
-    // ---------------------
-    // running simulation
-    // ---------------------
-    simulation.setSample(multi_layer);
-    simulation.runSimulation();
+    simulation->runSimulation();
 
-    // ---------------------
-    // copying data
-    // ---------------------
-    m_result = simulation.getIntensityData();
+    m_result = simulation->getIntensityData();
+    delete simulation;
 }
 
-int FunctionalTests::IsGISAXS07::analyseResults(const std::string &path_to_data)
+int FunctionalTests::IsGISAXS07::analyseResults()
 {
     const double threshold(2e-10);
 
-    // retrieving reference data
-    std::string filename = path_to_data + "isgisaxs07_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(); it!=m_result->end(); ++it) {
@@ -162,7 +52,7 @@ int FunctionalTests::IsGISAXS07::analyseResults(const std::string &path_to_data)
     diff /= m_result->getAllocatedSize();
 
     bool status_ok(true);
-    if( diff > threshold || MathFunctions::isnan(diff)) status_ok=false;
+    if( diff > threshold || std::isnan(diff)) status_ok=false;
 
     std::cout << m_name << " " << m_description << " " << (status_ok ? "[OK]" : "[FAILED]") << std::endl;
     return (status_ok ? 0 : 1);
@@ -178,8 +68,8 @@ std::string GetPathToData(int argc, char **argv)
 int main(int argc, char **argv)
 {
     FunctionalTests::IsGISAXS07 test;
-    test.run();
+    test.run(GetPathToData(argc, argv));
 
-    return test.analyseResults(GetPathToData(argc, argv));
+    return test.analyseResults();
 }
 #endif
diff --git a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.h b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.h
index bc1a5e98e3b16994c02be626564d2f94e5fa9d8d..d08a988663a6d75a8cf49fe83fa49b19ca744fe1 100644
--- a/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.h
+++ b/Tests/FunctionalTests/TestCore/IsGISAXS07/IsGISAXS07.h
@@ -1,7 +1,7 @@
 #ifndef FUNCTIONALTESTS_ISGISAXS07_H
 #define FUNCTIONALTESTS_ISGISAXS07_H
 
-
+#include "ISampleBuilder.h"
 #include <string>
 #include "OutputData.h"
 
@@ -13,14 +13,15 @@ class IsGISAXS07
 {
  public:
     IsGISAXS07();
-    ~IsGISAXS07() { delete m_result; }
-    void run();
-    int analyseResults(const std::string &path_to_data = std::string());
+    ~IsGISAXS07() { delete m_result; delete m_reference;}
+    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;
 };
 
 }