diff --git a/Core/Multilayer/IMultiLayerBuilder.h b/Core/Multilayer/IMultiLayerBuilder.h
index 00bf90dd3e3e13b0cc3b73b33648db97d0350912..6d1cc7e58823bd1144931f3b573076144ce45c10 100644
--- a/Core/Multilayer/IMultiLayerBuilder.h
+++ b/Core/Multilayer/IMultiLayerBuilder.h
@@ -44,6 +44,9 @@ public:
 
     // Without duplication below PythonBindings doesn't work for shared_ptr<IMultiLayerBuilder>
     virtual void onChange() {}
+
+    virtual MultiLayer* createSample(size_t index=0) { (void)index; return buildSample(); }
+    virtual size_t size() { return 1;}
 };
 
 #endif // IMULTILAYERBUILDER_H
diff --git a/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp b/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
index 558d9a856bc48e6f2e91eab51a509e883a806e6e..9c42ca71615a7da746ce63ad99666b92f73256bd 100644
--- a/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
+++ b/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
@@ -24,6 +24,7 @@
 #include "ParticleLayout.h"
 #include "RealParameter.h"
 #include "Units.h"
+#include "SubtestRegistry.h"
 
 MultiLayer* LayersWithAbsorptionBuilder::buildSample() const
 {
@@ -60,3 +61,30 @@ MultiLayer* LayersWithAbsorptionBuilder::buildSample() const
     multi_layer->addLayer(substrate);
     return multi_layer;
 }
+
+MultiLayer* LayersWithAbsorptionBuilder::createSample(size_t index)
+{
+    if(index >= size())
+        throw std::runtime_error("ParticleInTheAirBuilder::createSample() -> Error. "
+                                 "Sample index is out of range.");
+
+    auto ff_names = ff_registry().keys();
+    m_subtest_item = ff_registry().getItem(ff_names[index]);
+
+    setName(ff_names[index]);
+
+    return buildSample();
+}
+
+size_t LayersWithAbsorptionBuilder::size()
+{
+    static size_t result = ff_registry().keys().size();
+    return result;
+}
+
+SubtestRegistryFormFactor& LayersWithAbsorptionBuilder::ff_registry()
+{
+    static SubtestRegistryFormFactor result = SubtestRegistryFormFactor();
+    return result;
+}
+
diff --git a/Core/StandardSamples/LayersWithAbsorptionBuilder.h b/Core/StandardSamples/LayersWithAbsorptionBuilder.h
index 226d381f9e1d94399eedbf5857aa3d87bd4fc8d5..cdf83a89a8445c1ffc330e68c1b1bfdfe1189171 100644
--- a/Core/StandardSamples/LayersWithAbsorptionBuilder.h
+++ b/Core/StandardSamples/LayersWithAbsorptionBuilder.h
@@ -17,6 +17,7 @@
 #define LAYERSWITHABSORPTIONBUILDER_H
 
 #include "IMultiLayerBuilder.h"
+class SubtestRegistryFormFactor;
 
 //! The LayersWithAbsorptionBuilder class generates a multilayer with 3 layers with
 //! absorption (refractive index has imaginary part).
@@ -31,6 +32,12 @@ public:
     LayersWithAbsorptionBuilder() {}
     virtual ~LayersWithAbsorptionBuilder() {}
     virtual MultiLayer* buildSample() const;
+
+    MultiLayer* createSample(size_t index=0);
+    size_t size();
+
+private:
+    SubtestRegistryFormFactor& ff_registry();
 };
 
 #endif // LAYERSWITHABSORPTIONBUILDER_H
diff --git a/Core/StandardSamples/ParaCrystalBuilder.cpp b/Core/StandardSamples/ParaCrystalBuilder.cpp
index 044e3471e244c763a57e3f1d7eae6ab5f4a3efd6..a2f30b516377693159e0c2c74582bbbe617220df 100644
--- a/Core/StandardSamples/ParaCrystalBuilder.cpp
+++ b/Core/StandardSamples/ParaCrystalBuilder.cpp
@@ -24,6 +24,7 @@
 #include "ParticleLayout.h"
 #include "RealParameter.h"
 #include "Units.h"
+#include "SubtestRegistry.h"
 
 RadialParaCrystalBuilder::RadialParaCrystalBuilder()
     : m_corr_peak_distance(20.0*Units::nanometer)
@@ -129,6 +130,32 @@ MultiLayer* Basic2DParaCrystalBuilder::buildSample() const
     return multi_layer;
 }
 
+MultiLayer* Basic2DParaCrystalBuilder::createSample(size_t index)
+{
+    if(index >= size())
+        throw std::runtime_error("Basic2DParaCrystalBuilder::createSample() -> Error. "
+                                 "Sample index is out of range.");
+
+    auto names = pdf_registry().keys();
+    m_subtest_item = pdf_registry().getItem(names[index]);
+
+    setName(names[index]);
+
+    return buildSample();
+}
+
+size_t Basic2DParaCrystalBuilder::size()
+{
+    static size_t result = pdf_registry().keys().size();
+    return result;
+}
+
+SubtestRegistryFTDistribution2D& Basic2DParaCrystalBuilder::pdf_registry()
+{
+    static SubtestRegistryFTDistribution2D result = SubtestRegistryFTDistribution2D();
+    return result;
+}
+
 
 
 // -----------------------------------------------------------------------------
diff --git a/Core/StandardSamples/ParaCrystalBuilder.h b/Core/StandardSamples/ParaCrystalBuilder.h
index 1c40c87c4e1416a333e319c9e54355fcad821db3..fa3a2e07bdd6f2565cab70c999cf3a0aa28a08db 100644
--- a/Core/StandardSamples/ParaCrystalBuilder.h
+++ b/Core/StandardSamples/ParaCrystalBuilder.h
@@ -21,6 +21,7 @@
 
 class IFTDistribution2D;
 class ISample;
+class SubtestRegistryFTDistribution2D;
 
 //! @ingroup standard_samples
 //! Builds sample: cylinders with 1DDL structure factor (IsGISAXS example #4).
@@ -52,7 +53,12 @@ public:
     Basic2DParaCrystalBuilder();
     virtual ~Basic2DParaCrystalBuilder();
     virtual MultiLayer* buildSample() const;
+
+    MultiLayer* createSample(size_t index=0);
+    size_t size();
+
 private:
+    SubtestRegistryFTDistribution2D& pdf_registry();
     std::unique_ptr<IFTDistribution2D> m_pdf1;
     std::unique_ptr<IFTDistribution2D> m_pdf2;
 };
diff --git a/Core/StandardSamples/ParticleInTheAirBuilder.cpp b/Core/StandardSamples/ParticleInTheAirBuilder.cpp
index e0f65197e459ca926461631efd7e98f772e33584..89adc8b79ac3a8322988b7ad0abb8335bfa55932 100644
--- a/Core/StandardSamples/ParticleInTheAirBuilder.cpp
+++ b/Core/StandardSamples/ParticleInTheAirBuilder.cpp
@@ -21,6 +21,7 @@
 #include "Particle.h"
 #include "ParticleLayout.h"
 #include "RealParameter.h"
+#include "SubtestRegistry.h"
 
 MultiLayer* ParticleInTheAirBuilder::buildSample() const
 {
@@ -43,3 +44,29 @@ MultiLayer* ParticleInTheAirBuilder::buildSample() const
 
     return result;
 }
+
+MultiLayer* ParticleInTheAirBuilder::createSample(size_t index)
+{
+    if(index >= size())
+        throw std::runtime_error("ParticleInTheAirBuilder::createSample() -> Error. "
+                                 "Sample index is out of range.");
+
+    auto ff_names = ff_registry().keys();
+    m_subtest_item = ff_registry().getItem(ff_names[index]);
+
+    setName(ff_names[index]);
+
+    return buildSample();
+}
+
+size_t ParticleInTheAirBuilder::size()
+{
+    static size_t result = ff_registry().keys().size();
+    return result;
+}
+
+SubtestRegistryFormFactor& ParticleInTheAirBuilder::ff_registry()
+{
+    static SubtestRegistryFormFactor result = SubtestRegistryFormFactor();
+    return result;
+}
diff --git a/Core/StandardSamples/ParticleInTheAirBuilder.h b/Core/StandardSamples/ParticleInTheAirBuilder.h
index 49d1b13273e3d857e0e61ad777a1621b4228b137..6b790a88e266a6dfb6a3ca5815dc3e5391363497 100644
--- a/Core/StandardSamples/ParticleInTheAirBuilder.h
+++ b/Core/StandardSamples/ParticleInTheAirBuilder.h
@@ -18,6 +18,8 @@
 
 #include "IMultiLayerBuilder.h"
 
+class SubtestRegistryFormFactor;
+
 //! The ParticleInTheAirBuilder class generates a multilayer with single air layer
 //! populated with particles of certain types.
 //! Requires IComponentService which generates form factors, used for bulk form factors testing.
@@ -29,6 +31,12 @@ public:
     ParticleInTheAirBuilder() {}
     virtual ~ParticleInTheAirBuilder() {}
     virtual MultiLayer* buildSample() const;
+
+    MultiLayer* createSample(size_t index=0);
+    size_t size();
+
+private:
+    SubtestRegistryFormFactor& ff_registry();
 };
 
 #endif // PARTICLEINTHEAIRBUILDER_H