diff --git a/Core/Multilayer/LayoutStrategyBuilder.cpp b/Core/Multilayer/LayoutStrategyBuilder.cpp
index 99f2d90b2f899495ddde93ec3e3d288794138339..a623ffa9e17f13882da5c30d82a843e62e31f6de 100644
--- a/Core/Multilayer/LayoutStrategyBuilder.cpp
+++ b/Core/Multilayer/LayoutStrategyBuilder.cpp
@@ -14,17 +14,18 @@
 // ************************************************************************** //
 
 #include "LayoutStrategyBuilder.h"
+#include "DecouplingApproximationStrategy.h"
 #include "Exceptions.h"
 #include "FormFactorCoherentSum.h"
 #include "FormFactorDWBA.h"
 #include "FormFactorDWBAPol.h"
+#include "IFresnelMap.h"
 #include "ILayout.h"
 #include "IParticle.h"
 #include "InterferenceFunctionNone.h"
 #include "MultiLayer.h"
 #include "Layer.h"
-#include "IFresnelMap.h"
-#include "DecouplingApproximationStrategy.h"
+#include "SlicedFormFactorList.h"
 #include "SSCApproximationStrategy.h"
 
 LayoutStrategyBuilder::LayoutStrategyBuilder(
@@ -93,32 +94,29 @@ SafePointerVector<class FormFactorCoherentSum> LayoutStrategyBuilder::collectFor
 FormFactorCoherentSum* LayoutStrategyBuilder::createFormFactorCoherentSum(
     const IParticle* particle) const
 {
-    const std::unique_ptr<IFormFactor> P_ff_particle{ particle->createFormFactor() };
-    std::unique_ptr<IFormFactor> P_ff_framework;
-    if (mp_multilayer->getNumberOfLayers()>1) {
-        if (m_polarized)
-            P_ff_framework.reset(new FormFactorDWBAPol(*P_ff_particle));
-        else
-            P_ff_framework.reset(new FormFactorDWBA(*P_ff_particle));
-    } else
-        P_ff_framework.reset(P_ff_particle->clone());
+    std::unique_ptr<FormFactorCoherentSum> P_result(
+                new FormFactorCoherentSum(particle->getAbundance()));
+    auto sliced_ffs = particle->createSlicedFormFactors(
+                          *mp_multilayer, mp_multilayer->getLayerTopZ(m_layer_index));
+    for (size_t i=0; i < sliced_ffs.size(); ++i) {
+        auto ff_pair = sliced_ffs[i];
+        std::unique_ptr<IFormFactor> P_ff_framework;
+        if (mp_multilayer->getNumberOfLayers()>1) {
+            if (m_polarized)
+                P_ff_framework.reset(new FormFactorDWBAPol(*ff_pair.first));
+            else
+                P_ff_framework.reset(new FormFactorDWBA(*ff_pair.first));
+        } else
+            P_ff_framework.reset(ff_pair.first->clone());
 
-    size_t layer_index = findLayerIndex(*P_ff_framework);
-    const IMaterial* p_layer_material = mp_multilayer->getLayer(layer_index)->getMaterial();
-    P_ff_framework->setAmbientMaterial(*p_layer_material);
+        size_t layer_index = ff_pair.second;
+        const IMaterial* p_layer_material = mp_multilayer->getLayer(layer_index)->getMaterial();
+        P_ff_framework->setAmbientMaterial(*p_layer_material);
 
-    auto part = FormFactorCoherentPart(P_ff_framework.release());
-    part.setSpecularInfo(mp_fresnel_map, layer_index);
+        auto part = FormFactorCoherentPart(P_ff_framework.release());
+        part.setSpecularInfo(mp_fresnel_map, layer_index);
 
-    std::unique_ptr<FormFactorCoherentSum> P_result(
-                new FormFactorCoherentSum(particle->getAbundance()));
-    P_result->addCoherentPart(part);
+        P_result->addCoherentPart(part);
+    }
     return P_result.release();
 }
-
-size_t LayoutStrategyBuilder::findLayerIndex(const IFormFactor& ff) const
-{
-    std::unique_ptr<IRotation> P_rot(IRotation::createIdentity());
-    double zmin = ff.bottomZ(*P_rot) + mp_multilayer->getLayerTopZ(m_layer_index);
-    return mp_multilayer->bottomZToLayerIndex(zmin);
-}
diff --git a/Core/Multilayer/LayoutStrategyBuilder.h b/Core/Multilayer/LayoutStrategyBuilder.h
index ac903413e1c07d60fa042f65a661d270f1d255b8..57bfa2969272fb3bf009896008689a89559f429b 100644
--- a/Core/Multilayer/LayoutStrategyBuilder.h
+++ b/Core/Multilayer/LayoutStrategyBuilder.h
@@ -47,7 +47,6 @@ public:
 private:
     SafePointerVector<class FormFactorCoherentSum> collectFormFactorList() const;
     FormFactorCoherentSum* createFormFactorCoherentSum(const IParticle* particle) const;
-    size_t findLayerIndex(const IFormFactor& ff) const;
 
     const MultiLayer* mp_multilayer;
     const ILayout* mp_layout;
diff --git a/Core/Particle/IParticle.h b/Core/Particle/IParticle.h
index 8b60b639bdbc0092abbbb69964eed8d5cc1d0769..45d5ec432f258e37511bd562455bb61b2e70e957 100644
--- a/Core/Particle/IParticle.h
+++ b/Core/Particle/IParticle.h
@@ -48,8 +48,8 @@ public:
         const IRotation* p_rotation, kvector_t translation) const =0;
 
     //! Create list of form factors and corresponding layer indices
-    SlicedFormFactorList createSlicedFormFactors(const MultiLayer& multilayer,
-                                                 double position_offset=0.0) const;
+    virtual SlicedFormFactorList createSlicedFormFactors(const MultiLayer& multilayer,
+                                                         double position_offset=0.0) const;
 
     //! Returns particle position.
     kvector_t getPosition() const { return m_position; }
diff --git a/Core/Particle/ParticleComposition.cpp b/Core/Particle/ParticleComposition.cpp
index 0789ecf15b95371ff71c475c871de2ba0250da93..75b9af04102719b2d9f4924eb283139f50733f5a 100644
--- a/Core/Particle/ParticleComposition.cpp
+++ b/Core/Particle/ParticleComposition.cpp
@@ -90,8 +90,8 @@ void ParticleComposition::addParticle(const IParticle& particle, kvector_t posit
     addParticlePointer(np);
 }
 
-// Please note, that positions is not const reference here. This is intentionally to
-// python lists to std::vector
+// Please note, that positions is not const reference here. This is intentional, to
+// enable python lists to std::vector conversion
 void ParticleComposition::addParticles(const IParticle& particle,
         std::vector<kvector_t > positions)
 {