diff --git a/Core/Computation/DWBAComputation.cpp b/Core/Computation/DWBAComputation.cpp
index ac38916a9420654d78e190334970045a4ead673c..5680edfeb473833a66afcdbf1c71bc560f1efb0a 100644
--- a/Core/Computation/DWBAComputation.cpp
+++ b/Core/Computation/DWBAComputation.cpp
@@ -14,14 +14,31 @@
 
 #include "Core/Computation/DWBAComputation.h"
 #include "Base/Pixel/DiffuseElement.h"
+#include "Base/Progress/DelayedProgressCounter.h"
 #include "Base/Progress/ProgressHandler.h"
-#include "Core/Term/DWBATerm.h"
+#include "Core/Contrib/GISASSpecularContribution.h"
+#include "Core/Contrib/ParticleLayoutContribution.h"
+#include "Core/Contrib/RoughMultiLayerContribution.h"
+#include "Resample/Options/SimulationOptions.h"
+#include "Resample/Processed/ProcessedLayout.h"
 #include "Resample/Processed/ProcessedSample.h"
 
-static_assert(std::is_copy_constructible<DWBAComputation>::value == false,
-              "DWBAComputation should not be copy constructable");
-static_assert(std::is_copy_assignable<DWBAComputation>::value == false,
-              "DWBAComputation should not be copy assignable");
+namespace {
+
+std::vector<std::unique_ptr<const ParticleLayoutContribution>>
+makeLayoutComputation(const std::vector<ProcessedLayout>& layouts, const SimulationOptions& options,
+                      bool polarized)
+{
+    std::vector<std::unique_ptr<const ParticleLayoutContribution>> result;
+
+    for (const ProcessedLayout& layout : layouts)
+        result.emplace_back(new ParticleLayoutContribution(layout, options, polarized));
+
+    return result;
+}
+
+} // namespace
+
 
 DWBAComputation::DWBAComputation(std::unique_ptr<const ProcessedSample>&& re_sample,
                                  const SimulationOptions& options, ProgressHandler& progress,
@@ -30,7 +47,14 @@ DWBAComputation::DWBAComputation(std::unique_ptr<const ProcessedSample>&& re_sam
     : IComputation(std::move(re_sample), options, progress)
     , m_begin_it(begin_it)
     , m_end_it(end_it)
-    , m_term(std::make_unique<DWBATerm>(*m_re_sample, options))
+    , m_fresnel_map(m_re_sample->fresnelMap())
+    , m_specular_contrib(options.includeSpecular() ? new GISASSpecularContribution() : nullptr)
+    , m_roughness_contrib(m_re_sample->hasRoughness()
+                          ? new RoughMultiLayerContribution(*m_re_sample)
+                          : nullptr)
+    , m_layout_contribs(
+          makeLayoutComputation(m_re_sample->layouts(), options,
+                                m_re_sample->containsMagneticMaterial()))
 {
 }
 
@@ -43,12 +67,22 @@ DWBAComputation::~DWBAComputation() = default;
 // This allows them to be added and normalized together to the beam afterwards
 void DWBAComputation::runProtected()
 {
-    if (!m_progress->alive())
-        return;
-    m_term->setProgressHandler(m_progress);
     for (auto it = m_begin_it; it != m_end_it; ++it) {
         if (!m_progress->alive())
             break;
-        m_term->computeTerm(*it);
+        DiffuseElement& ele = *it;
+
+        ele.setFresnelMap(m_fresnel_map);
+
+        for (auto& contrib : m_layout_contribs)
+            contrib->compute(ele);
+
+        if (m_roughness_contrib)
+            m_roughness_contrib->compute(ele);
+
+        if (m_specular_contrib)
+            m_specular_contrib->compute(ele);
+
+        stepProgress();
     }
 }
diff --git a/Core/Computation/DWBAComputation.h b/Core/Computation/DWBAComputation.h
index b5fc4f55d5ef7991e6df2528c0f70c159a673459..bd8580a60859e5720988cf47d2bd430ed97ef0a5 100644
--- a/Core/Computation/DWBAComputation.h
+++ b/Core/Computation/DWBAComputation.h
@@ -24,8 +24,13 @@
 #include <memory>
 #include <vector>
 
-class DWBATerm;
 class DiffuseElement;
+class GISASSpecularContribution;
+class IFresnelMap;
+class ParticleLayoutContribution;
+class ProcessedSample;
+class RoughMultiLayerContribution;
+class SimulationOptions;
 
 //! Provides function that performs a single-threaded DWBA computation
 //! for a range of DiffuseElement%s.
@@ -49,7 +54,10 @@ private:
     void runProtected() override;
 
     std::vector<DiffuseElement>::iterator m_begin_it, m_end_it;
-    const std::unique_ptr<DWBATerm> m_term;
+    const IFresnelMap* const m_fresnel_map;
+    const std::unique_ptr<const GISASSpecularContribution> m_specular_contrib;
+    const std::unique_ptr<const RoughMultiLayerContribution> m_roughness_contrib;
+    const std::vector<std::unique_ptr<const ParticleLayoutContribution>> m_layout_contribs;
 };
 
 #endif // BORNAGAIN_CORE_COMPUTATION_DWBACOMPUTATION_H
diff --git a/Core/Computation/DepthProbeComputation.cpp b/Core/Computation/DepthProbeComputation.cpp
index e081847dfa27b8ebd8eb6c42688202bb5a52b546..485b6de88e4712b241c5e4afc2d91742652a56ac 100644
--- a/Core/Computation/DepthProbeComputation.cpp
+++ b/Core/Computation/DepthProbeComputation.cpp
@@ -13,16 +13,13 @@
 //  ************************************************************************************************
 
 #include "Core/Computation/DepthProbeComputation.h"
+#include "Base/Axis/IAxis.h"
 #include "Base/Progress/ProgressHandler.h"
 #include "Core/Element/DepthProbeElement.h"
-#include "Core/Term/DepthProbeTerm.h"
+#include "Resample/Flux/IFlux.h"
+#include "Resample/Fresnel/IFresnelMap.h"
 #include "Resample/Processed/ProcessedSample.h"
 
-static_assert(std::is_copy_constructible<DepthProbeComputation>::value == false,
-              "DepthProbeComputation should not be copy constructible");
-static_assert(std::is_copy_assignable<DepthProbeComputation>::value == false,
-              "DepthProbeComputation should not be copy assignable");
-
 DepthProbeComputation::DepthProbeComputation(std::unique_ptr<const ProcessedSample>&& re_sample,
                                              const SimulationOptions& options,
                                              ProgressHandler& progress,
@@ -31,7 +28,6 @@ DepthProbeComputation::DepthProbeComputation(std::unique_ptr<const ProcessedSamp
     : IComputation(std::move(re_sample), options, progress)
     , m_begin_it(begin_it)
     , m_end_it(end_it)
-    , m_term(std::make_unique<DepthProbeTerm>(*m_re_sample))
 {
 }
 
@@ -39,9 +35,43 @@ DepthProbeComputation::~DepthProbeComputation() = default;
 
 void DepthProbeComputation::runProtected()
 {
-    if (!m_progress->alive())
-        return;
-    m_term->setProgressHandler(m_progress);
-    for (auto it = m_begin_it; it != m_end_it; ++it)
-        m_term->computeTerm(*it);
+    for (auto it = m_begin_it; it != m_end_it; ++it) {
+        DepthProbeElement& ele = *it;
+        if (!ele.isCalculated())
+            continue;
+
+        const IAxis& z_positions = *ele.getZPositions();
+        const size_t n_z = z_positions.size();
+        const size_t n_layers = m_re_sample->numberOfSlices();
+        size_t start_z_ind = n_z;
+        std::valarray<double> intensities(0.0, n_z);
+
+        double z_layer_bottom(0.0);
+        double z_layer_top(0.0);
+        for (size_t i_layer = 0; i_layer < n_layers && start_z_ind != 0; ++i_layer) {
+            z_layer_bottom = m_re_sample->sliceBottomZ(i_layer);
+            z_layer_top = i_layer ? m_re_sample->sliceTopZ(i_layer) : 0;
+
+            // get R & T coefficients for current layer
+            const auto flux = m_re_sample->fresnelMap()->getInFlux(ele.getKi(), i_layer);
+            const complex_t R = flux->getScalarR();
+            const complex_t T = flux->getScalarT();
+            const complex_t kz_out = flux->getScalarKz();
+            const complex_t kz_in = -kz_out;
+
+            // Compute intensity for z's of the layer
+            size_t ip1_z = start_z_ind;
+            for (; ip1_z > 0; --ip1_z) {
+                const size_t i_z = ip1_z - 1;
+                if (i_layer + 1 != n_layers && z_positions[i_z] <= z_layer_bottom)
+                    break;
+                const double z = z_positions[i_z] - z_layer_top;
+                intensities[i_z] = std::norm(R * exp_I(kz_out * z) + T * exp_I(kz_in * z));
+            }
+            start_z_ind = ip1_z;
+        }
+        ele.setIntensities(std::move(intensities));
+
+        stepProgress();
+    }
 }
diff --git a/Core/Computation/DepthProbeComputation.h b/Core/Computation/DepthProbeComputation.h
index 253606a491e39cf5ba97fd434280c9d2b856ba7c..8a234494c5b8e875ed27139a546e7e2b07ba3600 100644
--- a/Core/Computation/DepthProbeComputation.h
+++ b/Core/Computation/DepthProbeComputation.h
@@ -23,7 +23,6 @@
 #include "Core/Computation/IComputation.h"
 
 class DepthProbeElement;
-class DepthProbeTerm;
 class ProcessedSample;
 
 //! Performs a single-threaded depth probe computation with given sample.
@@ -43,7 +42,6 @@ private:
     void runProtected() override;
 
     DepthProbeElementIter m_begin_it, m_end_it;
-    std::unique_ptr<DepthProbeTerm> m_term;
 };
 
 #endif // BORNAGAIN_CORE_COMPUTATION_DEPTHPROBECOMPUTATION_H
diff --git a/Core/Computation/IComputation.cpp b/Core/Computation/IComputation.cpp
index f29004c982dfc2587eb8ce3752e24bc9b9b7efe0..76f093650ce11be222ff78f34675382e6ba4af61 100644
--- a/Core/Computation/IComputation.cpp
+++ b/Core/Computation/IComputation.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "Core/Computation/IComputation.h"
+#include "Base/Progress/DelayedProgressCounter.h"
 #include "Base/Progress/ProgressHandler.h"
 #include "Resample/Processed/ProcessedSample.h"
 
@@ -24,11 +25,27 @@ IComputation::IComputation(std::unique_ptr<const ProcessedSample>&& re_sample,
 
 IComputation::~IComputation() = default;
 
+void IComputation::setProgressHandler(ProgressHandler* progress) const
+{
+    m_progress_counter = std::make_unique<DelayedProgressCounter>(progress, 100);
+}
+
+void IComputation::stepProgress() const
+{
+    if (m_progress_counter)
+        m_progress_counter->stepProgress();
+}
+
 void IComputation::run() noexcept
 {
     m_status.setRunning();
     try {
-        runProtected();
+        if (!m_progress->alive())
+            return;
+        setProgressHandler(m_progress);
+
+        runProtected(); // <--- here the main work is done
+
         m_status.setCompleted();
     } catch (const std::exception& ex) {
         m_status.setFailed(ex.what());
diff --git a/Core/Computation/IComputation.h b/Core/Computation/IComputation.h
index 28fdecffc2ef25a1588a1fbad879877cdcd551ec..84e04a4a8128200d6b9adb13f72d27b17efc5223 100644
--- a/Core/Computation/IComputation.h
+++ b/Core/Computation/IComputation.h
@@ -24,6 +24,7 @@
 #include <memory>
 #include <vector>
 
+class DelayedProgressCounter;
 class MultiLayer;
 class ProcessedSample;
 class ProgressHandler;
@@ -47,6 +48,9 @@ public:
     std::string errorMessage() const { return m_status.errorMessage(); }
 
 protected:
+    void setProgressHandler(ProgressHandler* progress) const;
+    void stepProgress() const;
+
     const std::unique_ptr<const ProcessedSample> m_re_sample;
     const SimulationOptions& m_options;
     ProgressHandler* m_progress;
@@ -55,6 +59,8 @@ protected:
 private:
     //! Runs computation. May throw. To be called from run(), which catches exceptions.
     virtual void runProtected() = 0;
+
+    mutable std::unique_ptr<DelayedProgressCounter> m_progress_counter;
 };
 
 #endif // BORNAGAIN_CORE_COMPUTATION_ICOMPUTATION_H
diff --git a/Core/Computation/SpecularComputation.cpp b/Core/Computation/SpecularComputation.cpp
index a9a8f5bc64d43e8e8763be0905d485d9fd6d75c5..7804e0ddfe89d00512fa113d9aa1a823456698f3 100644
--- a/Core/Computation/SpecularComputation.cpp
+++ b/Core/Computation/SpecularComputation.cpp
@@ -15,14 +15,25 @@
 #include "Core/Computation/SpecularComputation.h"
 #include "Base/Progress/ProgressHandler.h"
 #include "Core/Element/SpecularElement.h"
-#include "Core/Term/SpecularTerm.h"
+#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"
 
-static_assert(std::is_copy_constructible<SpecularComputation>::value == false,
-              "SpecularComputation should not be copy constructible");
-static_assert(std::is_copy_assignable<SpecularComputation>::value == false,
-              "SpecularComputation should not be copy assignable");
+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(std::unique_ptr<const ProcessedSample>&& re_sample,
                                          const SimulationOptions& options,
@@ -31,9 +42,7 @@ SpecularComputation::SpecularComputation(std::unique_ptr<const ProcessedSample>&
     : IComputation(std::move(re_sample), options, progress)
     , m_begin_it(begin_it)
     , m_end_it(end_it)
-    , m_term(m_re_sample->polarizing()
-                 ? (ISpecularTerm*)new SpecularMatrixTerm(m_re_sample->sample().roughnessModel())
-                 : (ISpecularTerm*)new SpecularScalarTerm(m_re_sample->sample().roughnessModel()))
+    , m_strategy(sample2strategy(*m_re_sample))
 {
 }
 
@@ -41,11 +50,29 @@ SpecularComputation::~SpecularComputation() = default;
 
 void SpecularComputation::runProtected()
 {
-    if (!m_progress->alive())
-        return;
-
-    m_term->setProgressHandler(m_progress);
     auto& slices = m_re_sample->averageSlices();
-    for (auto it = m_begin_it; it != m_end_it; ++it)
-        m_term->computeTerm(*it, slices);
+    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)));
+
+            const auto& polarization = ele.polarizationHandler().getPolarization();
+            const auto& analyzer = ele.polarizationHandler().getAnalyzerOperator();
+
+            const complex_t trace = (polarization * R.adjoint() * analyzer * R).trace();
+
+            ele.setIntensity(std::abs(trace));
+
+        } else {
+            const auto R = std::get<complex_t>(
+                m_strategy->computeTopLayerR(slices, ele.produceKz(slices)));
+            ele.setIntensity(std::norm(R));
+        }
+
+        stepProgress();
+    }
 }
diff --git a/Core/Computation/SpecularComputation.h b/Core/Computation/SpecularComputation.h
index 7abb64dd4bee08235545f766dbdb591daf741d1a..32089000c0d304d8bfa7ea9ed8a36976a6e34328 100644
--- a/Core/Computation/SpecularComputation.h
+++ b/Core/Computation/SpecularComputation.h
@@ -21,8 +21,9 @@
 #define BORNAGAIN_CORE_COMPUTATION_SPECULARCOMPUTATION_H
 
 #include "Core/Computation/IComputation.h"
+#include <memory>
 
-class ISpecularTerm;
+class ISpecularStrategy;
 class SpecularElement;
 
 //! Performs a single-threaded specular computation with given sample.
@@ -43,7 +44,7 @@ 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<ISpecularTerm> m_term;
+    const std::unique_ptr<ISpecularStrategy> m_strategy;
 };
 
 #endif // BORNAGAIN_CORE_COMPUTATION_SPECULARCOMPUTATION_H
diff --git a/Core/Term/GISASSpecularContribution.cpp b/Core/Contrib/GISASSpecularContribution.cpp
similarity index 92%
rename from Core/Term/GISASSpecularContribution.cpp
rename to Core/Contrib/GISASSpecularContribution.cpp
index 037a1e761572f4587f21d7ffb0de9f934ff826b3..86c3e77ab7ab4b81fc3dba5acfc4f9890f4d9d24 100644
--- a/Core/Term/GISASSpecularContribution.cpp
+++ b/Core/Contrib/GISASSpecularContribution.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Core/Term/GISASSpecularContribution.cpp
+//! @file      Core/Contrib/GISASSpecularContribution.cpp
 //! @brief     Implements class GISASSpecularContribution.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 //  ************************************************************************************************
 
-#include "Core/Term/GISASSpecularContribution.h"
+#include "Core/Contrib/GISASSpecularContribution.h"
 #include "Base/Pixel/DiffuseElement.h"
 #include "Base/Utils/Assert.h"
 #include "Resample/Flux/IFlux.h"
diff --git a/Core/Term/GISASSpecularContribution.h b/Core/Contrib/GISASSpecularContribution.h
similarity index 79%
rename from Core/Term/GISASSpecularContribution.h
rename to Core/Contrib/GISASSpecularContribution.h
index 4208a0338777003c2f1bc06fb3e8128198f80b6c..2b10d708f26af02683705115a9e9d562170c5c63 100644
--- a/Core/Term/GISASSpecularContribution.h
+++ b/Core/Contrib/GISASSpecularContribution.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Core/Term/GISASSpecularContribution.h
+//! @file      Core/Contrib/GISASSpecularContribution.h
 //! @brief     Defines class GISASSpecularContribution.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -17,8 +17,8 @@
 #endif
 
 #ifndef USER_API
-#ifndef BORNAGAIN_CORE_TERM_GISASSPECULARCONTRIBUTION_H
-#define BORNAGAIN_CORE_TERM_GISASSPECULARCONTRIBUTION_H
+#ifndef BORNAGAIN_CORE_CONTRIB_GISASSPECULARCONTRIBUTION_H
+#define BORNAGAIN_CORE_CONTRIB_GISASSPECULARCONTRIBUTION_H
 
 class IFresnelMap;
 class DiffuseElement;
@@ -32,5 +32,5 @@ public:
     void compute(DiffuseElement& ele) const;
 };
 
-#endif // BORNAGAIN_CORE_TERM_GISASSPECULARCONTRIBUTION_H
+#endif // BORNAGAIN_CORE_CONTRIB_GISASSPECULARCONTRIBUTION_H
 #endif // USER_API
diff --git a/Core/Term/ParticleLayoutContribution.cpp b/Core/Contrib/ParticleLayoutContribution.cpp
similarity index 95%
rename from Core/Term/ParticleLayoutContribution.cpp
rename to Core/Contrib/ParticleLayoutContribution.cpp
index d04602a16b975555e92515db7f0be713e9f82400..aa7dee75dab457b3186cf42a2db04ac8338831f4 100644
--- a/Core/Term/ParticleLayoutContribution.cpp
+++ b/Core/Contrib/ParticleLayoutContribution.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Core/Term/ParticleLayoutContribution.cpp
+//! @file      Core/Contrib/ParticleLayoutContribution.cpp
 //! @brief     Implements class ParticleLayoutContribution.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 //  ************************************************************************************************
 
-#include "Core/Term/ParticleLayoutContribution.h"
+#include "Core/Contrib/ParticleLayoutContribution.h"
 #include "Base/Pixel/DiffuseElement.h"
 #include "Resample/Interparticle/DecouplingApproximationStrategy.h"
 #include "Resample/Interparticle/SSCAStrategy.h"
diff --git a/Core/Term/ParticleLayoutContribution.h b/Core/Contrib/ParticleLayoutContribution.h
similarity index 84%
rename from Core/Term/ParticleLayoutContribution.h
rename to Core/Contrib/ParticleLayoutContribution.h
index 39b3cafc7e824c7c2e59fc20b7d24e76dc7a50f0..3132ad1e0f6f773e2cf2954d1f70d8c94cb8e0d1 100644
--- a/Core/Term/ParticleLayoutContribution.h
+++ b/Core/Contrib/ParticleLayoutContribution.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Core/Term/ParticleLayoutContribution.h
+//! @file      Core/Contrib/ParticleLayoutContribution.h
 //! @brief     Defines class ParticleLayoutContribution.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -17,8 +17,8 @@
 #endif
 
 #ifndef USER_API
-#ifndef BORNAGAIN_CORE_TERM_PARTICLELAYOUTCONTRIBUTION_H
-#define BORNAGAIN_CORE_TERM_PARTICLELAYOUTCONTRIBUTION_H
+#ifndef BORNAGAIN_CORE_CONTRIB_PARTICLELAYOUTCONTRIBUTION_H
+#define BORNAGAIN_CORE_CONTRIB_PARTICLELAYOUTCONTRIBUTION_H
 
 #include <memory>
 
@@ -43,5 +43,5 @@ private:
     const std::unique_ptr<const IInterparticleStrategy> m_interparticle_strategy;
 };
 
-#endif // BORNAGAIN_CORE_TERM_PARTICLELAYOUTCONTRIBUTION_H
+#endif // BORNAGAIN_CORE_CONTRIB_PARTICLELAYOUTCONTRIBUTION_H
 #endif // USER_API
diff --git a/Core/Term/RoughMultiLayerContribution.cpp b/Core/Contrib/RoughMultiLayerContribution.cpp
similarity index 98%
rename from Core/Term/RoughMultiLayerContribution.cpp
rename to Core/Contrib/RoughMultiLayerContribution.cpp
index 2873d1d775f70101f068c87d55b35c58beca967d..2cede55ee054b178a73fc3a9157ea16982503cb1 100644
--- a/Core/Term/RoughMultiLayerContribution.cpp
+++ b/Core/Contrib/RoughMultiLayerContribution.cpp
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Core/Term/RoughMultiLayerContribution.cpp
+//! @file      Core/Contrib/RoughMultiLayerContribution.cpp
 //! @brief     Implements class RoughMultiLayerContribution.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -12,7 +12,7 @@
 //
 //  ************************************************************************************************
 
-#include "Core/Term/RoughMultiLayerContribution.h"
+#include "Core/Contrib/RoughMultiLayerContribution.h"
 #include "Base/Math/Constants.h"
 #include "Base/Pixel/DiffuseElement.h"
 #include "Resample/Flux/IFlux.h"
diff --git a/Core/Term/RoughMultiLayerContribution.h b/Core/Contrib/RoughMultiLayerContribution.h
similarity index 83%
rename from Core/Term/RoughMultiLayerContribution.h
rename to Core/Contrib/RoughMultiLayerContribution.h
index 952c014d8236d447e55a2aad234e05b27be6b12c..a26edb13807eb78b0ecffac6a959f12295bd7544 100644
--- a/Core/Term/RoughMultiLayerContribution.h
+++ b/Core/Contrib/RoughMultiLayerContribution.h
@@ -2,7 +2,7 @@
 //
 //  BornAgain: simulate and fit reflection and scattering
 //
-//! @file      Core/Term/RoughMultiLayerContribution.h
+//! @file      Core/Contrib/RoughMultiLayerContribution.h
 //! @brief     Defines class RoughMultiLayerContribution.
 //!
 //! @homepage  http://www.bornagainproject.org
@@ -17,8 +17,8 @@
 #endif
 
 #ifndef USER_API
-#ifndef BORNAGAIN_CORE_TERM_ROUGHMULTILAYERCONTRIBUTION_H
-#define BORNAGAIN_CORE_TERM_ROUGHMULTILAYERCONTRIBUTION_H
+#ifndef BORNAGAIN_CORE_CONTRIB_ROUGHMULTILAYERCONTRIBUTION_H
+#define BORNAGAIN_CORE_CONTRIB_ROUGHMULTILAYERCONTRIBUTION_H
 
 #include "Base/Types/Complex.h"
 
@@ -41,5 +41,5 @@ private:
     complex_t get_sum8terms(size_t ilayer, const DiffuseElement& sim_element) const;
 };
 
-#endif // BORNAGAIN_CORE_TERM_ROUGHMULTILAYERCONTRIBUTION_H
+#endif // BORNAGAIN_CORE_CONTRIB_ROUGHMULTILAYERCONTRIBUTION_H
 #endif // USER_API
diff --git a/Core/Term/DWBATerm.cpp b/Core/Term/DWBATerm.cpp
deleted file mode 100644
index 46ce3b14bae00b92fd5778aaedc23e8ed4c06fd4..0000000000000000000000000000000000000000
--- a/Core/Term/DWBATerm.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Term/DWBATerm.cpp
-//! @brief     Implements class DWBATerm.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Core/Term/DWBATerm.h"
-#include "Base/Pixel/DiffuseElement.h"
-#include "Base/Progress/DelayedProgressCounter.h"
-#include "Core/Term/GISASSpecularContribution.h"
-#include "Core/Term/ParticleLayoutContribution.h"
-#include "Core/Term/RoughMultiLayerContribution.h"
-#include "Resample/Options/SimulationOptions.h"
-#include "Resample/Processed/ProcessedLayout.h"
-#include "Resample/Processed/ProcessedSample.h"
-
-namespace {
-
-std::vector<std::unique_ptr<const ParticleLayoutContribution>>
-makeLayoutComputation(const std::vector<ProcessedLayout>& layouts, const SimulationOptions& options,
-                      bool polarized)
-{
-    std::vector<std::unique_ptr<const ParticleLayoutContribution>> result;
-
-    for (const ProcessedLayout& layout : layouts)
-        result.emplace_back(new ParticleLayoutContribution(layout, options, polarized));
-
-    return result;
-}
-
-} // namespace
-
-
-DWBATerm::DWBATerm(const ProcessedSample& re_sample, const SimulationOptions& options)
-    : m_fresnel_map(re_sample.fresnelMap())
-    , m_specular_contrib(options.includeSpecular() ? new GISASSpecularContribution() : nullptr)
-    , m_roughness_contrib(re_sample.hasRoughness() ? new RoughMultiLayerContribution(re_sample)
-                                                   : nullptr)
-    , m_layout_contribs(
-          makeLayoutComputation(re_sample.layouts(), options, re_sample.containsMagneticMaterial()))
-{
-}
-
-DWBATerm::~DWBATerm() = default;
-
-void DWBATerm::computeTerm(DiffuseElement& ele) const
-{
-    ele.setFresnelMap(m_fresnel_map);
-
-    for (auto& contrib : m_layout_contribs)
-        contrib->compute(ele);
-
-    if (m_roughness_contrib)
-        m_roughness_contrib->compute(ele);
-
-    if (m_specular_contrib)
-        m_specular_contrib->compute(ele);
-
-    stepProgress();
-}
diff --git a/Core/Term/DWBATerm.h b/Core/Term/DWBATerm.h
deleted file mode 100644
index f60806730f798bcb427a5e27c6ff9bd47931053b..0000000000000000000000000000000000000000
--- a/Core/Term/DWBATerm.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Term/DWBATerm.h
-//! @brief     Defines class DWBATerm.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifdef SWIG
-#error no need to expose this header to Swig
-#endif
-
-#ifndef USER_API
-#ifndef BORNAGAIN_CORE_TERM_DWBATERM_H
-#define BORNAGAIN_CORE_TERM_DWBATERM_H
-
-#include "Core/Term/ITerm.h"
-#include <memory>
-#include <vector>
-
-class GISASSpecularContribution;
-class IFresnelMap;
-class ParticleLayoutContribution;
-class ProcessedSample;
-class RoughMultiLayerContribution;
-class DiffuseElement;
-class SimulationOptions;
-
-//! Infrastructure for computing the scattering into given detector bin.
-//!
-//! Called by DWBASimulation for each detector bin.
-
-class DWBATerm : public ITerm {
-public:
-    DWBATerm(const ProcessedSample&, const SimulationOptions&);
-    ~DWBATerm();
-
-    void computeTerm(DiffuseElement& ele) const;
-
-private:
-    const IFresnelMap* const m_fresnel_map;
-    const std::unique_ptr<const GISASSpecularContribution> m_specular_contrib;
-    const std::unique_ptr<const RoughMultiLayerContribution> m_roughness_contrib;
-    const std::vector<std::unique_ptr<const ParticleLayoutContribution>> m_layout_contribs;
-};
-
-#endif // BORNAGAIN_CORE_TERM_DWBATERM_H
-#endif // USER_API
diff --git a/Core/Term/DepthProbeTerm.cpp b/Core/Term/DepthProbeTerm.cpp
deleted file mode 100644
index a64629425c5e61169bf21faaf152cdd0e2e8feda..0000000000000000000000000000000000000000
--- a/Core/Term/DepthProbeTerm.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Term/DepthProbeTerm.cpp
-//! @brief     Implements functor DepthProbeTerm.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Core/Term/DepthProbeTerm.h"
-#include "Base/Axis/IAxis.h"
-#include "Core/Element/DepthProbeElement.h"
-#include "Resample/Flux/IFlux.h"
-#include "Resample/Fresnel/IFresnelMap.h"
-#include "Resample/Processed/ProcessedSample.h"
-
-DepthProbeTerm::DepthProbeTerm(const ProcessedSample& re_sample) : m_re_sample{re_sample} {}
-
-DepthProbeTerm::~DepthProbeTerm() = default;
-
-void DepthProbeTerm::computeTerm(DepthProbeElement& ele) const
-{
-    if (ele.isCalculated()) {
-        const IAxis& z_positions = *ele.getZPositions();
-        const size_t n_z = z_positions.size();
-        const size_t n_layers = m_re_sample.numberOfSlices();
-        size_t start_z_ind = n_z;
-        std::valarray<double> intensities(0.0, n_z);
-
-        double z_layer_bottom(0.0);
-        double z_layer_top(0.0);
-        for (size_t i_layer = 0; i_layer < n_layers && start_z_ind != 0; ++i_layer) {
-            z_layer_bottom = m_re_sample.sliceBottomZ(i_layer);
-            z_layer_top = i_layer ? m_re_sample.sliceTopZ(i_layer) : 0;
-
-            // get R & T coefficients for current layer
-            const auto flux = m_re_sample.fresnelMap()->getInFlux(ele.getKi(), i_layer);
-            const complex_t R = flux->getScalarR();
-            const complex_t T = flux->getScalarT();
-            const complex_t kz_out = flux->getScalarKz();
-            const complex_t kz_in = -kz_out;
-
-            // Compute intensity for z's of the layer
-            size_t ip1_z = start_z_ind;
-            for (; ip1_z > 0; --ip1_z) {
-                const size_t i_z = ip1_z - 1;
-                if (i_layer + 1 != n_layers && z_positions[i_z] <= z_layer_bottom)
-                    break;
-                const double z = z_positions[i_z] - z_layer_top;
-                intensities[i_z] = std::norm(R * exp_I(kz_out * z) + T * exp_I(kz_in * z));
-            }
-            start_z_ind = ip1_z;
-        }
-        ele.setIntensities(std::move(intensities));
-    }
-    stepProgress();
-}
diff --git a/Core/Term/DepthProbeTerm.h b/Core/Term/DepthProbeTerm.h
deleted file mode 100644
index 4cf93344241119ef82d9a3f9576cdcc2333f5614..0000000000000000000000000000000000000000
--- a/Core/Term/DepthProbeTerm.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Term/DepthProbeTerm.h
-//! @brief     Defines functor DepthProbeTerm.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifdef SWIG
-#error no need to expose this header to Swig
-#endif
-
-#ifndef USER_API
-#ifndef BORNAGAIN_CORE_TERM_DEPTHPROBETERM_H
-#define BORNAGAIN_CORE_TERM_DEPTHPROBETERM_H
-
-#include "Core/Term/ITerm.h"
-#include <memory>
-
-class ProcessedSample;
-class DepthProbeElement;
-
-class DepthProbeTerm : public ITerm {
-public:
-    DepthProbeTerm(const ProcessedSample& re_sample);
-    ~DepthProbeTerm();
-
-    void computeTerm(DepthProbeElement& ele) const;
-
-private:
-    const ProcessedSample& m_re_sample;
-};
-
-#endif // BORNAGAIN_CORE_TERM_DEPTHPROBETERM_H
-#endif // USER_API
diff --git a/Core/Term/ITerm.cpp b/Core/Term/ITerm.cpp
deleted file mode 100644
index f4eff9c619e26b078d3166831e4633a198b12396..0000000000000000000000000000000000000000
--- a/Core/Term/ITerm.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Term/ITerm.cpp
-//! @brief     Defines class ITerm.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Core/Term/ITerm.h"
-#include "Base/Progress/DelayedProgressCounter.h"
-
-ITerm::ITerm() = default;
-
-ITerm::~ITerm() = default;
-
-void ITerm::setProgressHandler(ProgressHandler* progress) const
-{
-    m_progress_counter = std::make_unique<DelayedProgressCounter>(progress, 100);
-}
-
-void ITerm::stepProgress() const
-{
-    if (m_progress_counter)
-        m_progress_counter->stepProgress();
-}
diff --git a/Core/Term/ITerm.h b/Core/Term/ITerm.h
deleted file mode 100644
index 0473cefe3269fed7f696fcffc43c07f6f3e26456..0000000000000000000000000000000000000000
--- a/Core/Term/ITerm.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Term/ITerm.h
-//! @brief     Defines class ITerm.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifdef SWIG
-#error no need to expose this header to Swig
-#endif
-
-#ifndef USER_API
-#ifndef BORNAGAIN_CORE_TERM_ITERM_H
-#define BORNAGAIN_CORE_TERM_ITERM_H
-
-#include <memory>
-
-class DelayedProgressCounter;
-// class IFresnelMap;
-class ProgressHandler;
-
-//! Infrastructure for computing the scattering into given detector bin.
-//!
-//! Called by DWBASimulation for each detector bin.
-
-class ITerm {
-public:
-    void setProgressHandler(ProgressHandler* progress) const;
-
-protected:
-    ITerm();
-    ITerm(const ITerm&) = delete;
-    virtual ~ITerm();
-
-    void stepProgress() const;
-
-private:
-    mutable std::unique_ptr<DelayedProgressCounter> m_progress_counter;
-};
-
-#endif // BORNAGAIN_CORE_TERM_ITERM_H
-#endif // USER_API
diff --git a/Core/Term/SpecularTerm.cpp b/Core/Term/SpecularTerm.cpp
deleted file mode 100644
index bb5f83a912060d820aa688ead38263d2f7b52722..0000000000000000000000000000000000000000
--- a/Core/Term/SpecularTerm.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Term/SpecularTerm.cpp
-//! @brief     Implements functor SpecularTerm.
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#include "Core/Term/SpecularTerm.h"
-#include "Base/Progress/DelayedProgressCounter.h"
-#include "Core/Element/SpecularElement.h"
-#include "Resample/Flux/IFlux.h"
-#include "Resample/Specular/SpecularStrategyBuilder.h"
-
-//  ************************************************************************************************
-//  class SpecularTerm
-//  ************************************************************************************************
-
-ISpecularTerm::ISpecularTerm(std::unique_ptr<ISpecularStrategy> strategy)
-    : m_strategy(std::move(strategy))
-{
-}
-
-void ISpecularTerm::computeTerm(SpecularElement& ele, const SliceStack& slices) const
-{
-    if (!ele.isCalculated())
-        return;
-
-    eval(ele, slices);
-
-    stepProgress();
-}
-
-//  ************************************************************************************************
-//  class SpecularScalarTerm
-//  ************************************************************************************************
-
-SpecularScalarTerm::SpecularScalarTerm(const RoughnessModel& rm)
-    : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildScalar(rm))
-{
-}
-
-void SpecularScalarTerm::eval(SpecularElement& ele, const SliceStack& slices) const
-{
-    const auto R = std::get<complex_t>(m_strategy->computeTopLayerR(slices, ele.produceKz(slices)));
-    ele.setIntensity(std::norm(R));
-}
-
-//  ************************************************************************************************
-//  class SpecularMatrixTerm
-//  ************************************************************************************************
-
-SpecularMatrixTerm::SpecularMatrixTerm(const RoughnessModel& rm)
-    : ISpecularTerm(SampleUtils::SpecularStrategyBuilder::buildMagnetic(rm))
-{
-}
-
-void SpecularMatrixTerm::eval(SpecularElement& ele, const SliceStack& slices) const
-{
-    const auto R =
-        std::get<Eigen::Matrix2cd>(m_strategy->computeTopLayerR(slices, ele.produceKz(slices)));
-
-    const auto& polarization = ele.polarizationHandler().getPolarization();
-    const auto& analyzer = ele.polarizationHandler().getAnalyzerOperator();
-
-    const complex_t trace = (polarization * R.adjoint() * analyzer * R).trace();
-
-    ele.setIntensity(std::abs(trace));
-}
diff --git a/Core/Term/SpecularTerm.h b/Core/Term/SpecularTerm.h
deleted file mode 100644
index 31b24bd368014039ed48e41f713a88f812bc94a1..0000000000000000000000000000000000000000
--- a/Core/Term/SpecularTerm.h
+++ /dev/null
@@ -1,73 +0,0 @@
-//  ************************************************************************************************
-//
-//  BornAgain: simulate and fit reflection and scattering
-//
-//! @file      Core/Term/SpecularTerm.h
-//! @brief     Defines classes SpecularTerm, SpecularScalarTerm, SpecularMatrixTerm
-//!
-//! @homepage  http://www.bornagainproject.org
-//! @license   GNU General Public License v3 or higher (see COPYING)
-//! @copyright Forschungszentrum Jülich GmbH 2018
-//! @authors   Scientific Computing Group at MLZ (see CITATION, AUTHORS)
-//
-//  ************************************************************************************************
-
-#ifdef SWIG
-#error no need to expose this header to Swig
-#endif
-
-#ifndef USER_API
-#ifndef BORNAGAIN_CORE_TERM_SPECULARTERM_H
-#define BORNAGAIN_CORE_TERM_SPECULARTERM_H
-
-#include "Core/Term/ITerm.h"
-#include "Resample/Specular/ISpecularStrategy.h"
-#include "Sample/Multilayer/RoughnessModels.h"
-#include <memory>
-#include <vector>
-
-class MatrixFlux_v2;
-class SpecularElement;
-class SliceStack;
-
-//! Computes the specular scattering.
-//! Used by SpecularComputation.
-//!
-//! Abstract base class of SpecularScalarTerm, SpecularMatrixTerm
-
-class ISpecularTerm : public ITerm {
-public:
-    ISpecularTerm(std::unique_ptr<ISpecularStrategy> strategy);
-
-    void computeTerm(SpecularElement& ele, const SliceStack& slices) const;
-
-protected:
-    virtual void eval(SpecularElement& ele, const SliceStack& slices) const = 0;
-
-    const std::unique_ptr<ISpecularStrategy> m_strategy;
-};
-
-//! Computes the specular scattering for a scalar sample
-//! Used by SpecularComputation.
-
-class SpecularScalarTerm : public ISpecularTerm {
-public:
-    SpecularScalarTerm(const RoughnessModel& rm);
-
-private:
-    void eval(SpecularElement& ele, const SliceStack& slices) const override;
-};
-
-//! Computes the specular scattering for a magnetic sample
-//! Used by SpecularComputation.
-
-class SpecularMatrixTerm : public ISpecularTerm {
-public:
-    SpecularMatrixTerm(const RoughnessModel& rm);
-
-private:
-    void eval(SpecularElement& ele, const SliceStack& slices) const override;
-};
-
-#endif // BORNAGAIN_CORE_TERM_SPECULARTERM_H
-#endif // USER_API
diff --git a/Resample/Specular/SpecularStrategyBuilder.cpp b/Resample/Specular/SpecularStrategyBuilder.cpp
index 7c95e0d42c9bd16abb8f8259a0fa20854128ca93..fcbf51f8707a2c4fdd6b35cac0ed1f5474e29bf5 100644
--- a/Resample/Specular/SpecularStrategyBuilder.cpp
+++ b/Resample/Specular/SpecularStrategyBuilder.cpp
@@ -13,6 +13,7 @@
 //  ************************************************************************************************
 
 #include "Resample/Specular/SpecularStrategyBuilder.h"
+#include "Base/Utils/Assert.h"
 #include "Resample/Specular/SpecularMagneticNCStrategy.h"
 #include "Resample/Specular/SpecularMagneticTanhStrategy.h"
 #include "Resample/Specular/SpecularScalarNCStrategy.h"
@@ -21,27 +22,23 @@
 std::unique_ptr<SpecularScalarStrategy>
 SampleUtils::SpecularStrategyBuilder::buildScalar(const RoughnessModel& rm)
 {
-    const RoughnessModel& roughnessModel = rm;
-
-    if (roughnessModel == RoughnessModel::TANH || roughnessModel == RoughnessModel::DEFAULT)
+    if (rm == RoughnessModel::TANH || rm == RoughnessModel::DEFAULT)
         return std::make_unique<SpecularScalarTanhStrategy>();
 
-    if (roughnessModel == RoughnessModel::NEVOT_CROCE)
+    if (rm == RoughnessModel::NEVOT_CROCE)
         return std::make_unique<SpecularScalarNCStrategy>();
 
-    throw std::logic_error("Invalid roughness model");
+    ASSERT(0);
 }
 
 std::unique_ptr<SpecularMagneticStrategy>
 SampleUtils::SpecularStrategyBuilder::buildMagnetic(const RoughnessModel& rm)
 {
-    const RoughnessModel& roughnessModel = rm;
-
-    if (roughnessModel == RoughnessModel::TANH || roughnessModel == RoughnessModel::DEFAULT)
+    if (rm == RoughnessModel::TANH || rm == RoughnessModel::DEFAULT)
         return std::make_unique<SpecularMagneticTanhStrategy>();
 
-    if (roughnessModel == RoughnessModel::NEVOT_CROCE)
+    if (rm == RoughnessModel::NEVOT_CROCE)
         return std::make_unique<SpecularMagneticNCStrategy>();
 
-    throw std::logic_error("Invalid roughness model");
+    ASSERT(0);
 }
diff --git a/auto/Wrap/doxygenCore.i b/auto/Wrap/doxygenCore.i
index c0804674be535094a3e2060c9206d07eac3f97f9..26c150391726c2e5a5293e4a2b5b865b640561e5 100644
--- a/auto/Wrap/doxygenCore.i
+++ b/auto/Wrap/doxygenCore.i
@@ -393,25 +393,12 @@ Returns the total number of the intensity values in the simulation result.
 ";
 
 
-// File: classDepthProbeTerm.xml
-%feature("docstring") DepthProbeTerm "";
-
-%feature("docstring")  DepthProbeTerm::DepthProbeTerm "DepthProbeTerm::DepthProbeTerm(const ProcessedSample &re_sample)
-";
-
-%feature("docstring")  DepthProbeTerm::~DepthProbeTerm "DepthProbeTerm::~DepthProbeTerm()
-";
-
-%feature("docstring")  DepthProbeTerm::computeTerm "void DepthProbeTerm::computeTerm(DepthProbeElement &ele) const
-";
-
-
 // File: classDWBAComputation.xml
 %feature("docstring") DWBAComputation "
 
 Provides function that performs a single-threaded DWBA computation for a range of DiffuseElements.
 
-Handles progress counter and interrupts, runs loop over DiffuseElements, delegates all further work to  DWBATerm.
+Handles progress counter and interrupts, runs loop over DiffuseElements, delegates all further work to DWBATerm.
 
 Controlled by the multi-threading machinery in ISimulation::runSingleSimulation().
 
@@ -425,26 +412,6 @@ C++ includes: DWBAComputation.h
 ";
 
 
-// File: classDWBATerm.xml
-%feature("docstring") DWBATerm "
-
-Infrastructure for computing the scattering into given detector bin.
-
-Called by DWBASimulation for each detector bin.
-
-C++ includes: DWBATerm.h
-";
-
-%feature("docstring")  DWBATerm::DWBATerm "DWBATerm::DWBATerm(const ProcessedSample &, const SimulationOptions &)
-";
-
-%feature("docstring")  DWBATerm::~DWBATerm "DWBATerm::~DWBATerm()
-";
-
-%feature("docstring")  DWBATerm::computeTerm "void DWBATerm::computeTerm(DiffuseElement &ele) const
-";
-
-
 // File: classFitObjective.xml
 %feature("docstring") FitObjective "
 
@@ -1224,23 +1191,6 @@ Returns intensity vector corresponding to convolution of given simulation elemen
 ";
 
 
-// File: classISpecularTerm.xml
-%feature("docstring") ISpecularTerm "
-
-Computes the specular scattering. Used by  SpecularComputation.
-
-Abstract base class of  SpecularScalarTerm,  SpecularMatrixTerm
-
-C++ includes: SpecularTerm.h
-";
-
-%feature("docstring")  ISpecularTerm::ISpecularTerm "ISpecularTerm::ISpecularTerm(std::unique_ptr< ISpecularStrategy > strategy)
-";
-
-%feature("docstring")  ISpecularTerm::computeTerm "void ISpecularTerm::computeTerm(SpecularElement &ele, const SliceStack &slices) const
-";
-
-
 // File: classIterationInfo.xml
 %feature("docstring") IterationInfo "
 
@@ -1272,20 +1222,6 @@ Returns map of fit parameter names and its current values.
 ";
 
 
-// File: classITerm.xml
-%feature("docstring") ITerm "
-
-Infrastructure for computing the scattering into given detector bin.
-
-Called by DWBASimulation for each detector bin.
-
-C++ includes: ITerm.h
-";
-
-%feature("docstring")  ITerm::setProgressHandler "void ITerm::setProgressHandler(ProgressHandler *progress) const
-";
-
-
 // File: classIVarianceFunction.xml
 %feature("docstring") IVarianceFunction "
 
@@ -2073,30 +2009,6 @@ Returns kz values for Abeles computation of reflection/transition coefficients.
 ";
 
 
-// File: classSpecularMatrixTerm.xml
-%feature("docstring") SpecularMatrixTerm "
-
-Computes the specular scattering for a magnetic sample Used by  SpecularComputation.
-
-C++ includes: SpecularTerm.h
-";
-
-%feature("docstring")  SpecularMatrixTerm::SpecularMatrixTerm "SpecularMatrixTerm::SpecularMatrixTerm(const RoughnessModel &rm)
-";
-
-
-// File: classSpecularScalarTerm.xml
-%feature("docstring") SpecularScalarTerm "
-
-Computes the specular scattering for a scalar sample Used by  SpecularComputation.
-
-C++ includes: SpecularTerm.h
-";
-
-%feature("docstring")  SpecularScalarTerm::SpecularScalarTerm "SpecularScalarTerm::SpecularScalarTerm(const RoughnessModel &rm)
-";
-
-
 // File: classSpecularSimulation.xml
 %feature("docstring") SpecularSimulation "
 
@@ -2189,46 +2101,49 @@ C++ includes: VarianceFunctions.h
 ";
 
 
-// File: namespace_0d21.xml
+// File: namespace_0d13.xml
 
 
-// File: namespace_0d34.xml
+// File: namespace_0d17.xml
 
 
-// File: namespace_0d36.xml
+// File: namespace_0d19.xml
 
 
-// File: namespace_0d41.xml
+// File: namespace_0d27.xml
 
 
-// File: namespace_0d48.xml
+// File: namespace_0d40.xml
 
 
-// File: namespace_0d50.xml
+// File: namespace_0d42.xml
+
+
+// File: namespace_0d47.xml
 
 
 // File: namespace_0d54.xml
 
 
-// File: namespace_0d64.xml
+// File: namespace_0d56.xml
 
 
-// File: namespace_0d69.xml
+// File: namespace_0d60.xml
 
 
-// File: namespace_0d74.xml
+// File: namespace_0d70.xml
 
 
-// File: namespace_0d82.xml
+// File: namespace_0d75.xml
 
 
-// File: namespace_0d86.xml
+// File: namespace_0d80.xml
 
 
-// File: namespace_0d92.xml
+// File: namespace_0d88.xml
 
 
-// File: namespace_0d94.xml
+// File: namespace_0d9.xml
 
 
 // File: namespacemumufit.xml
@@ -2562,6 +2477,24 @@ GISAS simulation with an extra long wavelength.
 // File: SpecularComputation_8h.xml
 
 
+// File: GISASSpecularContribution_8cpp.xml
+
+
+// File: GISASSpecularContribution_8h.xml
+
+
+// File: ParticleLayoutContribution_8cpp.xml
+
+
+// File: ParticleLayoutContribution_8h.xml
+
+
+// File: RoughMultiLayerContribution_8cpp.xml
+
+
+// File: RoughMultiLayerContribution_8h.xml
+
+
 // File: DepthProbeElement_8cpp.xml
 
 
@@ -2769,54 +2702,15 @@ GISAS simulation with an extra long wavelength.
 // File: SpecularSimulation_8h.xml
 
 
-// File: DepthProbeTerm_8cpp.xml
-
-
-// File: DepthProbeTerm_8h.xml
-
-
-// File: DWBATerm_8cpp.xml
-
-
-// File: DWBATerm_8h.xml
-
-
-// File: GISASSpecularContribution_8cpp.xml
-
-
-// File: GISASSpecularContribution_8h.xml
-
-
-// File: ITerm_8cpp.xml
-
-
-// File: ITerm_8h.xml
-
-
-// File: ParticleLayoutContribution_8cpp.xml
-
-
-// File: ParticleLayoutContribution_8h.xml
-
-
-// File: RoughMultiLayerContribution_8cpp.xml
-
-
-// File: RoughMultiLayerContribution_8h.xml
-
-
-// File: SpecularTerm_8cpp.xml
-
-
-// File: SpecularTerm_8h.xml
-
-
 // File: dir_6ecf29fa58e9675bf8930c35e73daa86.xml
 
 
 // File: dir_7de90f35ae2a2c7b4fa95823d333cc96.xml
 
 
+// File: dir_cca0c631914022590087d818ecb26afc.xml
+
+
 // File: dir_c6310732a22f63c0c2fc5595561e68f1.xml
 
 
@@ -2840,6 +2734,3 @@ GISAS simulation with an extra long wavelength.
 
 // File: dir_d7a24665a95cfc15308ebd7b07b5ebd6.xml
 
-
-// File: dir_52128420a621ebf8ad4a4626c50b78b3.xml
-