diff --git a/Core/Computation/SpecularComputation.cpp b/Core/Computation/SpecularComputation.cpp
index 8913655a1d62591c767a4088e51f1b1ae728a1cc..a4110873660e476bb672ad1dc3533ea1f684feb9 100644
--- a/Core/Computation/SpecularComputation.cpp
+++ b/Core/Computation/SpecularComputation.cpp
@@ -18,22 +18,8 @@
 #include "Resample/Flux/IFlux.h"
 #include "Resample/Processed/ProcessedSample.h"
 #include "Resample/Specular/ISpecularStrategy.h"
-#include "Resample/Specular/SpecularStrategyBuilder.h"
 #include "Sample/Multilayer/MultiLayer.h"
 
-namespace {
-
-std::unique_ptr<ISpecularStrategy> sample2strategy(const ProcessedSample& re_sample)
-{
-    if (re_sample.polarizing())
-        return SampleUtils::SpecularStrategyBuilder::buildMagnetic(
-            re_sample.sample().roughnessModel());
-    return SampleUtils::SpecularStrategyBuilder::buildScalar(re_sample.sample().roughnessModel());
-}
-
-} // namespace
-
-
 SpecularComputation::SpecularComputation(const ProcessedSample& re_sample,
                                          const SimulationOptions& options,
                                          ProgressHandler& progress, SpecularElementIter begin_it,
@@ -41,7 +27,6 @@ SpecularComputation::SpecularComputation(const ProcessedSample& re_sample,
     : IComputation(std::move(re_sample), options, progress)
     , m_begin_it(begin_it)
     , m_end_it(end_it)
-    , m_strategy(sample2strategy(m_re_sample))
 {
 }
 
@@ -49,14 +34,15 @@ SpecularComputation::~SpecularComputation() = default;
 
 void SpecularComputation::runProtected()
 {
-    auto& slices = m_re_sample.averageSlices();
+    const SliceStack& slices = m_re_sample.averageSlices();
+    const ISpecularStrategy* strategy = m_re_sample.getSpecularStrategy();
     for (auto it = m_begin_it; it != m_end_it; ++it) {
         SpecularElement& ele = *it;
         if (!ele.isCalculated())
             continue;
         if (m_re_sample.polarizing()) {
             const auto R = std::get<Eigen::Matrix2cd>(
-                m_strategy->computeTopLayerR(slices, ele.produceKz(slices)));
+                strategy->computeTopLayerR(slices, ele.produceKz(slices)));
 
             const auto& polarization = ele.polarizationHandler().getPolarization();
             const auto& analyzer = ele.polarizationHandler().getAnalyzerOperator();
@@ -67,7 +53,7 @@ void SpecularComputation::runProtected()
 
         } else {
             const auto R =
-                std::get<complex_t>(m_strategy->computeTopLayerR(slices, ele.produceKz(slices)));
+                std::get<complex_t>(strategy->computeTopLayerR(slices, ele.produceKz(slices)));
             ele.setIntensity(std::norm(R));
         }
 
diff --git a/Core/Computation/SpecularComputation.h b/Core/Computation/SpecularComputation.h
index d6fc5f51a3db8c74ebad1562e7a778040efde263..b0cb162cef0aed570b6a076e93073765a91eb878 100644
--- a/Core/Computation/SpecularComputation.h
+++ b/Core/Computation/SpecularComputation.h
@@ -44,7 +44,6 @@ private:
 
     //! these iterators define the span of detector bins this simulation will work on
     const SpecularElementIter m_begin_it, m_end_it;
-    const std::unique_ptr<ISpecularStrategy> m_strategy;
 };
 
 #endif // BORNAGAIN_CORE_COMPUTATION_SPECULARCOMPUTATION_H
diff --git a/Resample/Processed/ProcessedSample.cpp b/Resample/Processed/ProcessedSample.cpp
index 2fb09e3db33fc0fad092d3f704f18bb06761f6a0..25a5d0e2e37f319c2c8972ebd31746f8d85a8097 100644
--- a/Resample/Processed/ProcessedSample.cpp
+++ b/Resample/Processed/ProcessedSample.cpp
@@ -285,6 +285,11 @@ const std::vector<ProcessedLayout>& ProcessedSample::layouts() const
     return m_layouts;
 }
 
+const ISpecularStrategy* ProcessedSample::getSpecularStrategy() const
+{
+    return m_specular_strategy.get();
+}
+
 const IFresnelMap* ProcessedSample::fresnelMap() const
 {
     return m_fresnel_map.get();
diff --git a/Resample/Processed/ProcessedSample.h b/Resample/Processed/ProcessedSample.h
index ad5724ccf9df08516d9da8823c2e9bc8caf6b432..2ac626b39c5e22d76641c8b5e096dcc7990ef091 100644
--- a/Resample/Processed/ProcessedSample.h
+++ b/Resample/Processed/ProcessedSample.h
@@ -50,6 +50,7 @@ public:
     const SliceStack& averageSlices() const;
     const Slice& avgeSlice(size_t i) const;
     const std::vector<ProcessedLayout>& layouts() const;
+    const ISpecularStrategy* getSpecularStrategy() const;
     const IFresnelMap* fresnelMap() const;
     double sliceTopZ(size_t i) const;
     double sliceBottomZ(size_t i) const;