diff --git a/Core/Multilayer/DecouplingApproximationStrategy.cpp b/Core/Multilayer/DecouplingApproximationStrategy.cpp
index 0fd17cb442118318e54effeec65942125cc64e30..68ad745bd2cd3cbc7809b105c2b42adc229440ca 100644
--- a/Core/Multilayer/DecouplingApproximationStrategy.cpp
+++ b/Core/Multilayer/DecouplingApproximationStrategy.cpp
@@ -37,14 +37,14 @@ void DecouplingApproximationStrategy::init(
 //! for one layer (implied by the given particle form factors).
 //! For each IParticle in the layer layout, the precomputed form factor must be provided.
 double DecouplingApproximationStrategy::evaluateForList(
-    const SimulationElement& sim_element, const std::vector<complex_t>& ff_list) const
+    const SimulationElement& sim_element) const
 {
     double intensity = 0.0;
     complex_t amplitude = complex_t(0.0, 0.0);
     if (m_total_abundance <= 0.0)
         return 0.0;
     for (size_t i = 0; i < m_weighted_ffs.size(); ++i) {
-        complex_t ff = ff_list[i];
+        complex_t ff = m_ff[i];
         if (std::isnan(ff.real()))
             throw Exceptions::RuntimeErrorException(
                 "DecouplingApproximationStrategy::evaluateForList() -> Error! Amplitude is NaN");
@@ -63,7 +63,7 @@ double DecouplingApproximationStrategy::evaluateForList(
 //! This is the polarized variant of evaluateForList. Each form factor must be
 //! precomputed for polarized beam and detector.
 double DecouplingApproximationStrategy::evaluateForMatrixList(
-    const SimulationElement& sim_element, const matrixFFVector_t& ff_list) const
+    const SimulationElement& sim_element) const
 {
     Eigen::Matrix2cd mean_intensity = Eigen::Matrix2cd::Zero();
     Eigen::Matrix2cd mean_amplitude = Eigen::Matrix2cd::Zero();
@@ -71,7 +71,7 @@ double DecouplingApproximationStrategy::evaluateForMatrixList(
     if (m_total_abundance <= 0.0)
         return 0.0;
     for (size_t i = 0; i < m_weighted_ffs.size(); ++i) {
-        Eigen::Matrix2cd ff = ff_list[i];
+        Eigen::Matrix2cd ff = m_ff_pol[i];
         if (!ff.allFinite())
             throw Exceptions::RuntimeErrorException(
                 "DecouplingApproximationStrategy::evaluateForList() -> "
diff --git a/Core/Multilayer/DecouplingApproximationStrategy.h b/Core/Multilayer/DecouplingApproximationStrategy.h
index 3ec70aaa537b16707fcf6216f914ebf282c4d8c0..7efebdcb11899e6589645d3817481e3639c1b4ff 100644
--- a/Core/Multilayer/DecouplingApproximationStrategy.h
+++ b/Core/Multilayer/DecouplingApproximationStrategy.h
@@ -34,11 +34,8 @@ public:
               const IInterferenceFunction& iff) final;
 
 private:
-    double evaluateForList(const SimulationElement& sim_element,
-                           const std::vector<complex_t>& ff_list) const final;
-
-    double evaluateForMatrixList(const SimulationElement& sim_element,
-                                 const matrixFFVector_t& ff_list) const final;
+    double evaluateForList(const SimulationElement& sim_element) const final;
+    double evaluateForMatrixList(const SimulationElement& sim_element) const final;
 };
 
 #endif // DECOUPLINGAPPROXIMATIONSTRATEGY_H
diff --git a/Core/Multilayer/IInterferenceFunctionStrategy.cpp b/Core/Multilayer/IInterferenceFunctionStrategy.cpp
index 8d3066804a985521ccaae4d91c8c6400a40d85d0..bc3afe4d304587aa5fc59099fad092e89252207e 100644
--- a/Core/Multilayer/IInterferenceFunctionStrategy.cpp
+++ b/Core/Multilayer/IInterferenceFunctionStrategy.cpp
@@ -62,7 +62,7 @@ double IInterferenceFunctionStrategy::evaluate(const SimulationElement& sim_elem
     if (m_options.isIntegrate() && (sim_element.getSolidAngle() > 0.0))
         return MCIntegratedEvaluate(sim_element);
     calculateFormFactorList(sim_element);
-    return evaluateForList(sim_element, m_ff);
+    return evaluateForList(sim_element);
 }
 
 double IInterferenceFunctionStrategy::evaluatePol(const SimulationElement& sim_element) const
@@ -70,7 +70,7 @@ double IInterferenceFunctionStrategy::evaluatePol(const SimulationElement& sim_e
     if (m_options.isIntegrate()) // TODO: consider testing solid angle as in scalar case
         return MCIntegratedEvaluatePol(sim_element);
     calculateFormFactorListPol(sim_element);
-    return evaluateForMatrixList(sim_element, m_ff_pol);
+    return evaluateForMatrixList(sim_element);
 }
 
 //! Precomputes scalar form factors.
@@ -149,7 +149,7 @@ double IInterferenceFunctionStrategy::evaluate_for_fixed_angles(
 
     SimulationElement sim_element(*pars, par0, par1);
     calculateFormFactorList(sim_element);
-    return pars->getIntegrationFactor(par0, par1) * evaluateForList(sim_element, m_ff);
+    return pars->getIntegrationFactor(par0, par1) * evaluateForList(sim_element);
 }
 
 double IInterferenceFunctionStrategy::evaluate_for_fixed_angles_pol(
@@ -162,5 +162,5 @@ double IInterferenceFunctionStrategy::evaluate_for_fixed_angles_pol(
 
     SimulationElement sim_element(*pars, par0, par1);
     calculateFormFactorListPol(sim_element);
-    return pars->getIntegrationFactor(par0, par1) * evaluateForMatrixList(sim_element, m_ff_pol);
+    return pars->getIntegrationFactor(par0, par1) * evaluateForMatrixList(sim_element);
 }
diff --git a/Core/Multilayer/IInterferenceFunctionStrategy.h b/Core/Multilayer/IInterferenceFunctionStrategy.h
index f27e61dad48539fbe9470a8f8424f032f94f51e0..79c138f4657253d841ca9694d78f92f31c782d03 100644
--- a/Core/Multilayer/IInterferenceFunctionStrategy.h
+++ b/Core/Multilayer/IInterferenceFunctionStrategy.h
@@ -58,19 +58,19 @@ public:
 
 protected:
     //! Evaluates the intensity for given list of evaluated form factors
-    virtual double evaluateForList(const SimulationElement& sim_element,
-                                   const std::vector<complex_t>& ff_list) const = 0;
+    virtual double evaluateForList(const SimulationElement& sim_element) const = 0;
 
     //! Evaluates the intensity for given list of evaluated form factors
     //! in the presence of polarization of beam and detector
-    virtual double evaluateForMatrixList(const SimulationElement& sim_element,
-                                         const matrixFFVector_t& ff_list) const = 0;
+    virtual double evaluateForMatrixList(const SimulationElement& sim_element) const = 0;
 
     double m_total_abundance; //!< cached sum of particle abundances, computed by init()
     SafePointerVector<WeightedFormFactor> m_weighted_ffs;
     std::unique_ptr<IInterferenceFunction> mP_iff;
     SimulationOptions m_options;
     std::unique_ptr<LayerSpecularInfo> mP_specular_info; //!< R and T coefficients for DWBA
+    mutable std::vector<complex_t> m_ff; //!< cached form factor evaluations
+    mutable matrixFFVector_t m_ff_pol; //!< cached polarized form factors
 
 private:
     void calculateFormFactorList   (const SimulationElement& sim_element) const;
@@ -86,8 +86,6 @@ private:
     double evaluate_for_fixed_angles    (double* fractions, size_t dim, void* params) const;
     double evaluate_for_fixed_angles_pol(double* fractions, size_t dim, void* params) const;
 
-    mutable std::vector<complex_t> m_ff; //!< cached form factor evaluations
-    mutable matrixFFVector_t m_ff_pol; //!< cached polarized form factors
 #ifndef SWIG
     std::unique_ptr<IntegratorMCMiser<IInterferenceFunctionStrategy>> mP_integrator;
     std::unique_ptr<IntegratorMCMiser<IInterferenceFunctionStrategy>> mP_integrator_pol;
diff --git a/Core/Multilayer/SizeSpacingCorrelationApproximationStrategy.cpp b/Core/Multilayer/SizeSpacingCorrelationApproximationStrategy.cpp
index 2401fc20ed8d103ec5092392cb5e2da1122fdc4f..1a07bb882de6460c0d081a43d8074a27740c32ec 100644
--- a/Core/Multilayer/SizeSpacingCorrelationApproximationStrategy.cpp
+++ b/Core/Multilayer/SizeSpacingCorrelationApproximationStrategy.cpp
@@ -42,19 +42,19 @@ void SizeSpacingCorrelationApproximationStrategy::init(
 //! for one layer (implied by the given particle form factors).
 //! For each IParticle in the layer layout, the precomputed form factor must be provided.
 double SizeSpacingCorrelationApproximationStrategy::evaluateForList(
-    const SimulationElement& sim_element, const std::vector<complex_t>& ff_list) const
+    const SimulationElement& sim_element) const
 {
     double qp = sim_element.getMeanQ().magxy();
     double diffuse_intensity = 0.0;
     if (m_total_abundance <= 0.0)
         return 0.0;
     for (size_t i = 0; i < m_weighted_ffs.size(); ++i) {
-        complex_t ff = ff_list[i];
+        complex_t ff = m_ff[i];
         double fraction = m_weighted_ffs[i]->m_abundance / m_total_abundance;
         diffuse_intensity += fraction * std::norm(ff);
     }
-    complex_t mcff  = getMeanCharacteristicFF    (qp, ff_list);
-    complex_t mcffc = getMeanConjCharacteristicFF(qp, ff_list);
+    complex_t mcff  = getMeanCharacteristicFF    (qp, m_ff);
+    complex_t mcffc = getMeanConjCharacteristicFF(qp, m_ff);
     complex_t p2kappa = getCharacteristicSizeCoupling(qp, 2.0 * m_kappa);
     complex_t omega = getCharacteristicDistribution(qp);
     double interference_intensity = 2.0 * (mcff * mcffc * omega / (1.0 - p2kappa * omega)).real();
@@ -67,19 +67,19 @@ double SizeSpacingCorrelationApproximationStrategy::evaluateForList(
 //! This is the polarized variant of evaluateForList. Each form factor must be
 //! precomputed for polarized beam and detector.
 double SizeSpacingCorrelationApproximationStrategy::evaluateForMatrixList(
-    const SimulationElement& sim_element, const matrixFFVector_t& ff_list) const
+    const SimulationElement& sim_element) const
 {
     double qp = sim_element.getMeanQ().magxy();
     Eigen::Matrix2cd diffuse_matrix = Eigen::Matrix2cd::Zero();
     if (m_total_abundance <= 0.0)
         return 0.0;
     for (size_t i = 0; i < m_weighted_ffs.size(); ++i) {
-        Eigen::Matrix2cd ff = ff_list[i];
+        Eigen::Matrix2cd ff = m_ff_pol[i];
         double fraction = m_weighted_ffs[i]->m_abundance / m_total_abundance;
         diffuse_matrix += fraction * (ff * sim_element.getPolarization() * ff.adjoint());
     }
-    Eigen::Matrix2cd mcff  = getMeanCharacteristicMatrixFF    (sim_element.getMeanQ(), ff_list);
-    Eigen::Matrix2cd mcffc = getMeanConjCharacteristicMatrixFF(sim_element.getMeanQ(), ff_list);
+    Eigen::Matrix2cd mcff  = getMeanCharacteristicMatrixFF    (sim_element.getMeanQ(), m_ff_pol);
+    Eigen::Matrix2cd mcffc = getMeanConjCharacteristicMatrixFF(sim_element.getMeanQ(), m_ff_pol);
     complex_t p2kappa = getCharacteristicSizeCoupling(qp, 2.0 * m_kappa);
     complex_t omega = getCharacteristicDistribution(qp);
     Eigen::Matrix2cd interference_matrix
diff --git a/Core/Multilayer/SizeSpacingCorrelationApproximationStrategy.h b/Core/Multilayer/SizeSpacingCorrelationApproximationStrategy.h
index 83bcceefe93d747ca207c5f15fb11c80c3cf313a..46f72e582a54ec08d778ac5eed7285e82632557b 100644
--- a/Core/Multilayer/SizeSpacingCorrelationApproximationStrategy.h
+++ b/Core/Multilayer/SizeSpacingCorrelationApproximationStrategy.h
@@ -33,10 +33,8 @@ public:
               const IInterferenceFunction& iff) final;
 
 private:
-    double evaluateForList(const SimulationElement& sim_element,
-                           const std::vector<complex_t>& ff_list) const final;
-    double evaluateForMatrixList(const SimulationElement& sim_element,
-                                 const matrixFFVector_t& ff_list) const final;
+    double evaluateForList(const SimulationElement& sim_element) const final;
+    double evaluateForMatrixList(const SimulationElement& sim_element) const final;
 
     complex_t getMeanCharacteristicFF(
         double qp, const std::vector<complex_t>& ff_list) const;