diff --git a/Core/Export/PyGenTools.cpp b/Core/Export/PyGenTools.cpp
index aa7cbbe117aee290ce7c584e02384b4292df822c..217d2eeee64d37efa81c88669ccb5d6528b7d6d8 100644
--- a/Core/Export/PyGenTools.cpp
+++ b/Core/Export/PyGenTools.cpp
@@ -26,6 +26,7 @@
 #include "Polygon.h"
 #include "PyGenVisitor.h"
 #include "Rectangle.h"
+#include "Units.h"
 #include <iomanip>
 GCC_DIAG_OFF(missing-field-initializers)
 GCC_DIAG_OFF(unused-parameter)
diff --git a/Core/Multilayer/ISampleBuilder.h b/Core/Multilayer/ISampleBuilder.h
index 4fb9f2e8aee29cf03b1a8dd873c1905b883504a0..8786b0b39fddabdf2bda5f374bed3873658a5fc3 100644
--- a/Core/Multilayer/ISampleBuilder.h
+++ b/Core/Multilayer/ISampleBuilder.h
@@ -16,8 +16,7 @@
 #ifndef ISAMPLEBUILDER_H
 #define ISAMPLEBUILDER_H
 
-#include "FTDistributions.h"
-#include "IFormFactor.h"
+#include "IParameterized.h"
 
 //! @class ISampleBuilder
 //! @ingroup simulation_internal
@@ -32,13 +31,10 @@ public:
     virtual class ISample* buildSample() const = 0;
 
     void set_subtest(const class IParameterized* subtest_item) { m_subtest_item = subtest_item; }
-    const class IParameterized* m_subtest_item;
+    const IParameterized* m_subtest_item;
 
-    const IFormFactor* getFormFactor() const {
-        return dynamic_cast<const IFormFactor*>(m_subtest_item); }
-
-    const IFTDistribution2D* getFTDistribution2D() const {
-        return dynamic_cast<const IFTDistribution2D*>(m_subtest_item); }
+    const class IFormFactor* getFormFactor() const;
+    const class IFTDistribution2D* getFTDistribution2D() const;
 };
 
 #endif // ISAMPLEBUILDER_H
diff --git a/Core/Simulation/DWBASimulation.cpp b/Core/Simulation/DWBASimulation.cpp
index 118dda6efc6134bb1124e2b5efc242d88c3cc38c..b825ceb4e01cec9b8a1fc0417c6f92d588ddd49d 100644
--- a/Core/Simulation/DWBASimulation.cpp
+++ b/Core/Simulation/DWBASimulation.cpp
@@ -14,7 +14,7 @@
 // ************************************************************************** //
 
 #include "DWBASimulation.h"
-
+#include "ISample.h"
 
 DWBASimulation::DWBASimulation()
     : mp_simulation(nullptr)
diff --git a/Core/Simulation/GISASSimulation.cpp b/Core/Simulation/GISASSimulation.cpp
index ed20d15010f28f1cf9c71aba633d033184f80c72..a7589396516f8566ec499f5f69a91dee19b46072 100644
--- a/Core/Simulation/GISASSimulation.cpp
+++ b/Core/Simulation/GISASSimulation.cpp
@@ -13,10 +13,10 @@
 //
 // ************************************************************************** //
 
+#include "GISASSimulation.h"
 #include "BornAgainNamespace.h"
 #include "Histogram2D.h"
-#include "GISASSimulation.h"
-
+#include "ISample.h"
 
 GISASSimulation::GISASSimulation()
 {
diff --git a/Core/Simulation/GISASSimulation.h b/Core/Simulation/GISASSimulation.h
index a11025ad8534c7fe40b001039729f9c08fef1cb2..c304a21bf0a54503cfaf392fa9b2d59333cde7da 100644
--- a/Core/Simulation/GISASSimulation.h
+++ b/Core/Simulation/GISASSimulation.h
@@ -27,7 +27,7 @@ class BA_CORE_API_ GISASSimulation : public Simulation
 {
 public:
     GISASSimulation();
-    GISASSimulation(const ISample& p_sample);
+    GISASSimulation(const class ISample& p_sample);
     GISASSimulation(std::shared_ptr<class ISampleBuilder> p_sample_builder);
 
     virtual ~GISASSimulation() {}
diff --git a/Core/Simulation/MultiLayerRoughnessDWBASimulation.cpp b/Core/Simulation/MultiLayerRoughnessDWBASimulation.cpp
index ca342232ea889a2c2e327dbd597afcad13a93cd9..eb2b054a0cdea6f20391706bca514823b7d247db 100644
--- a/Core/Simulation/MultiLayerRoughnessDWBASimulation.cpp
+++ b/Core/Simulation/MultiLayerRoughnessDWBASimulation.cpp
@@ -17,6 +17,7 @@
 #include "DWBADiffuseReflection.h"
 #include "Faddeeva.hh"
 #include "MultiLayer.h"
+#include "Units.h"
 
 // Diffuse scattering from rough interfaces is modelled after
 // Phys. Rev. B, vol. 51 (4), p. 2311 (1995)
diff --git a/Core/Simulation/OffSpecSimulation.cpp b/Core/Simulation/OffSpecSimulation.cpp
index 28691ccc934621c77fae3be8e6d59e008ffebe07..ac40f0ab6d999b23b27501c8cc4d2ff0242627d9 100644
--- a/Core/Simulation/OffSpecSimulation.cpp
+++ b/Core/Simulation/OffSpecSimulation.cpp
@@ -13,9 +13,10 @@
 //
 // ************************************************************************** //
 
+#include "OffSpecSimulation.h"
 #include "BornAgainNamespace.h"
 #include "Histogram2D.h"
-#include "OffSpecSimulation.h"
+#include "ISample.h"
 
 OffSpecSimulation::OffSpecSimulation()
     : mp_alpha_i_axis(0)
diff --git a/Core/Simulation/OffSpecSimulation.h b/Core/Simulation/OffSpecSimulation.h
index cb5f8745a2d41db96cd62804886cf8b73ee407a4..598f3b37dc516376d778abc7098250e73029275a 100644
--- a/Core/Simulation/OffSpecSimulation.h
+++ b/Core/Simulation/OffSpecSimulation.h
@@ -49,7 +49,7 @@ public:
         (void) units_type; return m_intensity_map.clone(); }
 
     //! Returns clone of the detector intensity map in the form of 2D histogram.
-    Histogram2D* getIntensityData() const;
+    class Histogram2D* getIntensityData() const;
 
     //! Sets the instrument containing beam and detector information
     void setInstrument(const Instrument& instrument);
diff --git a/Core/Simulation/Simulation.cpp b/Core/Simulation/Simulation.cpp
index 21295c6d1083345574206fe172a34f4211b46278..a5fdb6cef05ad70eae36b5aa9aa8742bd18fb079 100644
--- a/Core/Simulation/Simulation.cpp
+++ b/Core/Simulation/Simulation.cpp
@@ -13,10 +13,11 @@
 //
 // ************************************************************************** //
 
+#include "Simulation.h"
 #include "DWBASimulation.h"
 #include "MessageService.h"
 #include "OMPISimulation.h"
-#include "Simulation.h"
+#include "ISample.h"
 #include <thread>
 #include <gsl/gsl_errno.h>
 
@@ -26,6 +27,8 @@ Simulation::Simulation()
     init_parameters();
 }
 
+Simulation::~Simulation() {} // forward class declaration prevents move to .h
+
 Simulation::Simulation(const ISample& p_sample)
     : IParameterized("Simulation")
 {
diff --git a/Core/Simulation/Simulation.h b/Core/Simulation/Simulation.h
index 51aecaf2a419a4d6f8995da22b3c31f0f5e2f4a7..5c12f0e410d7d9e1b5dfda1171eaf5c9358bef1e 100644
--- a/Core/Simulation/Simulation.h
+++ b/Core/Simulation/Simulation.h
@@ -32,9 +32,9 @@ class BA_CORE_API_ Simulation : public ICloneable, public IParameterized
 {
 public:
     Simulation();
-    Simulation(const ISample& p_sample);
+    Simulation(const class ISample& p_sample);
     Simulation(std::shared_ptr<class ISampleBuilder> p_sample_builder);
-    virtual ~Simulation() {}
+    virtual ~Simulation();
 
     virtual Simulation* clone() const=0;
 
@@ -48,10 +48,10 @@ public:
     void runOMPISimulation();
 
     //! Sets the sample to be tested
-    void setSample(const ISample& sample);
+    void setSample(const class ISample& sample);
 
     //! Returns the sample
-    ISample* getSample() const { return mP_sample.get(); }
+    class ISample* getSample() const { return mP_sample.get(); }
 
     //! Sets the sample builder
     void setSampleBuilder(std::shared_ptr<class ISampleBuilder> sample_builder);
@@ -130,7 +130,7 @@ protected:
     //! Returns the end iterator of simulation elements for the current batch
     std::vector<SimulationElement>::iterator getBatchEnd(int n_batches, int current_batch);
 
-    std::unique_ptr<ISample> mP_sample;
+    std::unique_ptr<class ISample> mP_sample;
     std::shared_ptr<class ISampleBuilder> mp_sample_builder;
     SimulationOptions m_options;
     DistributionHandler m_distribution_handler;
diff --git a/Core/StandardSamples/BoxCompositionBuilder.h b/Core/StandardSamples/BoxCompositionBuilder.h
index 1b746a181c7a812569d2bb5bb9033c8c5dd07246..b6f33c16e5917d53f22a6ec584382dcb05c11818 100644
--- a/Core/StandardSamples/BoxCompositionBuilder.h
+++ b/Core/StandardSamples/BoxCompositionBuilder.h
@@ -30,7 +30,7 @@ public:
     virtual ~BoxCompositionBuilder();
 
 protected:
-    class MultiLayer* createMultiLayer(const ParticleComposition &composition) const;
+    class MultiLayer* createMultiLayer(const class ParticleComposition& composition) const;
     const class HomogeneousMaterial* m_particleMaterial;
     const double m_layer_thickness;
     const double m_length;
diff --git a/Core/StandardSamples/MesoCrystalBuilder.h b/Core/StandardSamples/MesoCrystalBuilder.h
index 7a9be6e974722b17f70dc10c97a89c82575518be..399e274163aff920e6339f8ac8ec62cee99eedba 100644
--- a/Core/StandardSamples/MesoCrystalBuilder.h
+++ b/Core/StandardSamples/MesoCrystalBuilder.h
@@ -16,6 +16,7 @@
 #ifndef MESOCRYSTALBUILDER_H
 #define MESOCRYSTALBUILDER_H
 
+#include "Complex.h"
 #include "ISampleBuilder.h"
 
 //! @class MesoCrystalBuilder
diff --git a/Core/StandardSamples/MultiLayerWithRoughnessBuilder.cpp b/Core/StandardSamples/MultiLayerWithRoughnessBuilder.cpp
index a49936255c4c1eccaddabb6af71e7dabef7ac42a..b46003a3bcfc28d0f02862cf590ebe3fa4dfa2e9 100644
--- a/Core/StandardSamples/MultiLayerWithRoughnessBuilder.cpp
+++ b/Core/StandardSamples/MultiLayerWithRoughnessBuilder.cpp
@@ -16,6 +16,7 @@
 #include "MultiLayerWithRoughnessBuilder.h"
 #include "HomogeneousMaterial.h"
 #include "MultiLayer.h"
+#include "Units.h"
 
 MultiLayerWithRoughnessBuilder::MultiLayerWithRoughnessBuilder()
     : m_thicknessA(2.5*Units::nanometer)
diff --git a/Core/StandardSamples/SimulationFactory.cpp b/Core/StandardSamples/SimulationFactory.cpp
index 2296ee81da3d6ecfb6e42028ca0f561159054aad..fea9549a05961a7b938133061e9431d9577ce69d 100644
--- a/Core/StandardSamples/SimulationFactory.cpp
+++ b/Core/StandardSamples/SimulationFactory.cpp
@@ -13,8 +13,9 @@
 //
 // ************************************************************************** //
 
-#include "StandardSimulations.h"
 #include "SimulationFactory.h"
+#include "GISASSimulation.h"
+#include "StandardSimulations.h"
 
 SimulationFactory::SimulationFactory()
 {
diff --git a/Core/StandardSamples/SimulationFactory.h b/Core/StandardSamples/SimulationFactory.h
index 0b28512345495ecdc84dffc062b840b89739c3fc..ba4e095895ab881a494496e5eaab197e1f65e544 100644
--- a/Core/StandardSamples/SimulationFactory.h
+++ b/Core/StandardSamples/SimulationFactory.h
@@ -16,7 +16,6 @@
 #ifndef SIMULATIONFACTORY_H
 #define SIMULATIONFACTORY_H
 
-#include "GISASSimulation.h"
 #include "IFactory.h"
 
 //! @class SimulationFactory
@@ -24,7 +23,7 @@
 //! @brief Registry to create standard pre-defined simulations.
 //! Used in functional tests, performance measurements, etc.
 
-class BA_CORE_API_ SimulationFactory : public IFactory<std::string, GISASSimulation>
+class BA_CORE_API_ SimulationFactory : public IFactory<std::string, class GISASSimulation>
 {
 public:
     SimulationFactory();
diff --git a/Core/StandardSamples/StandardSimulations.cpp b/Core/StandardSamples/StandardSimulations.cpp
index d400a488150ddc8fda332e3309eb61269f245da2..2f3f8b8b936064c736f8873d8c3ad86566d882ec 100644
--- a/Core/StandardSamples/StandardSimulations.cpp
+++ b/Core/StandardSamples/StandardSimulations.cpp
@@ -13,6 +13,7 @@
 //
 // ************************************************************************** //
 
+#include "StandardSimulations.h"
 #include "BornAgainNamespace.h"
 #include "Distributions.h"
 #include "Ellipse.h"
@@ -24,7 +25,7 @@
 #include "RectangularDetector.h"
 #include "ResolutionFunction2DGaussian.h"
 #include "SampleBuilderFactory.h"
-#include "StandardSimulations.h"
+#include "Units.h"
 
 using namespace BornAgain;
 
diff --git a/Core/TestMachinery/FunctionalTestSuite.cpp b/Core/TestMachinery/FunctionalTestSuite.cpp
index 7e8d964f46f3b062e9e7b83437f49ea4edbc9486..d3bab78d1bd9582b1c29bbdb9d9c8b7b9c22a44c 100644
--- a/Core/TestMachinery/FunctionalTestSuite.cpp
+++ b/Core/TestMachinery/FunctionalTestSuite.cpp
@@ -13,13 +13,13 @@
 //
 // ************************************************************************** //
 
-
+#include "FunctionalTestSuite.h"
 #include "FunctionalTestRegistry.h"
+#include "GISASSimulation.h"
 #include "IFunctionalTest.h"
 #include "SampleBuilderFactory.h"
 #include "SimulationFactory.h"
 #include "SubtestRegistry.h"
-#include "FunctionalTestSuite.h"
 
 // ************************************************************************** //
 //  Test execution
diff --git a/Core/TestMachinery/IRegistry.h b/Core/TestMachinery/IRegistry.h
index e7bbe826553f15ea8975720a69360e099e0c5147..dc9da0f8a44b80e255b5239f697550af5f4b7427 100644
--- a/Core/TestMachinery/IRegistry.h
+++ b/Core/TestMachinery/IRegistry.h
@@ -16,6 +16,7 @@
 #ifndef IREGISTRY_H
 #define IREGISTRY_H
 
+#include <memory>
 
 //! @class IRegistry
 //! @ingroup tools_internal
@@ -27,12 +28,9 @@ class IRegistry
 public:
     const ValueType* getItem(const std::string& key) const {
         auto it = m_data.find(key);
-        if(it == m_data.end()) {
-            std::ostringstream message;
-            message << "IRegistry::createItem() -> Error. Not existing item key "
-                    << "'" << key << "'";
-            throw Exceptions::UnknownClassRegistrationException(message.str());
-        }
+        if(it == m_data.end())
+            throw Exceptions::UnknownClassRegistrationException(
+                "IRegistry::createItem() -> Error. Not existing item key '" + key + "'");
         return it->second.get();
     }
 
@@ -45,12 +43,9 @@ public:
 
 protected:
     void add(const std::string& key, ValueType* item) {
-        if(m_data.find(key) != m_data.end()) {
-            std::ostringstream message;
-            message << "IRegistry::createItem() -> Error. Already existing item with key "
-                    << "'" << key << "'";
-            throw Exceptions::ExistingClassRegistrationException(message.str());
-        }
+        if(m_data.find(key) != m_data.end())
+            throw Exceptions::ExistingClassRegistrationException(
+                "IRegistry::createItem() -> Error. Already existing item with key '" + key + "'");
         m_data[key] = std::unique_ptr<ValueType>(item);
     }
 
diff --git a/Core/TestMachinery/PySuiteTest.cpp b/Core/TestMachinery/PySuiteTest.cpp
index 9ed2fe1d1424a38fa2144b6564806125a7fd4e48..c4869bb5224d18a97a94a577de54b3189600a629 100644
--- a/Core/TestMachinery/PySuiteTest.cpp
+++ b/Core/TestMachinery/PySuiteTest.cpp
@@ -13,15 +13,16 @@
 //
 // ************************************************************************** //
 
+#include "PySuiteTest.h"
 #include "BAPython.h"
 #include "FileSystem.h"
+#include "GISASSimulation.h"
 #include "IntensityDataFunctions.h"
 #include "IntensityDataIOFactory.h"
 #include "PyGenTools.h"
 #include "SimulationFactory.h"
 #include "TestConfig.h"
 #include "Utils.h"
-#include "PySuiteTest.h"
 #include <fstream>
 
 PySuiteTest::PySuiteTest(
diff --git a/Core/TestMachinery/PySuiteTest.h b/Core/TestMachinery/PySuiteTest.h
index e557d56666879cd82431fa092f4a396564e67e78..850a37e523a8da1dfe28f5ad9ee697dce4a64972 100644
--- a/Core/TestMachinery/PySuiteTest.h
+++ b/Core/TestMachinery/PySuiteTest.h
@@ -19,7 +19,6 @@
 #include "IFunctionalTest.h"
 #include "OutputData.h"
 
-
 //! @class PySuiteTest
 //! @ingroup standard_samples
 //! @brief Test whether Python dumps yields the same image as a direct computation.
@@ -28,7 +27,7 @@ class BA_CORE_API_ PySuiteTest : public IFunctionalTest
 {
 public:
     PySuiteTest(const std::string& name, const std::string& description,
-                   GISASSimulation* reference_simulation, double threshold);
+                class GISASSimulation* reference_simulation, double threshold);
     virtual ~PySuiteTest();
 
     virtual void runTest();
@@ -36,15 +35,15 @@ public:
 
     const OutputData<double>* getOutputData() const;
 
-    double getDifference() const { return m_difference;}
+    double getDifference() const { return m_difference; }
 
     virtual void printResults(std::ostream& ostr) const;
 
 private:
     std::string getPySuiteFileNameAndPath() const;
 
-    GISASSimulation* m_reference_simulation;
-    GISASSimulation* m_domain_simulation;
+    class GISASSimulation* m_reference_simulation;
+    class GISASSimulation* m_domain_simulation;
     double m_threshold;
     double m_difference;
     std::string m_pyscript_filename;
diff --git a/Fit/StandardFits/IMinimizerTest.cpp b/Fit/StandardFits/IMinimizerTest.cpp
index a16669eed126ac6ec83ef6d779e4edc895372240..e5bf1ffdb7fea5b99f61a64c6847892a7dc38370 100644
--- a/Fit/StandardFits/IMinimizerTest.cpp
+++ b/Fit/StandardFits/IMinimizerTest.cpp
@@ -14,10 +14,13 @@
 // ************************************************************************** //
 
 #include "FitSuite.h"
+#include "GISASSimulation.h"
+#include "IMinimizerTest.h"
+#include "ISample.h"
 #include "MinimizerFactory.h"
 #include "SampleBuilderFactory.h"
 #include "SimulationFactory.h"
-#include "IMinimizerTest.h"
+#include "Units.h"
 #include <boost/format.hpp>
 
 IMinimizerTest::TestParameter::TestParameter(const std::string &name, double real_value,
diff --git a/Fit/StandardFits/RectDetectorFitTest.cpp b/Fit/StandardFits/RectDetectorFitTest.cpp
index 376f6e4b1bbf8aff316a23ec925dd215fa5bb028..4f80437be674873e25494bb6559afd1d99aabbda 100644
--- a/Fit/StandardFits/RectDetectorFitTest.cpp
+++ b/Fit/StandardFits/RectDetectorFitTest.cpp
@@ -13,16 +13,16 @@
 //
 // ************************************************************************** //
 
+#include "RectDetectorFitTest.h"
 #include "GISASSimulation.h"
 #include "Histogram2D.h"
 #include "Rectangle.h"
 #include "RectangularDetector.h"
-#include "RectDetectorFitTest.h"
+#include "Units.h"
 
 RectDetectorFitTest::RectDetectorFitTest()
     : IMinimizerTest("Minuit2", "Migrad")
 {
-
 }
 
 std::unique_ptr<GISASSimulation> RectDetectorFitTest::createSimulation()
diff --git a/GUI/coregui/Models/GUIObjectBuilder.cpp b/GUI/coregui/Models/GUIObjectBuilder.cpp
index 1b8908c8f68d3ff2ff5b9a5e6294bdde3e3866aa..0613e60df5eaa34a19c50c89832ef8db9803896a 100644
--- a/GUI/coregui/Models/GUIObjectBuilder.cpp
+++ b/GUI/coregui/Models/GUIObjectBuilder.cpp
@@ -171,13 +171,11 @@ void GUIObjectBuilder::visit(const Layer* sample)
     SessionItem* parent = m_levelToParentItem[getLevel()-1];
     Q_ASSERT(parent);
 
-    const MultiLayer* multilayer =
-            dynamic_cast<const MultiLayer*>(m_itemToSample[parent]);
+    const MultiLayer* multilayer = dynamic_cast<const MultiLayer*>(m_itemToSample[parent]);
     Q_ASSERT(multilayer);
     int layer_index = multilayer->getIndexOfLayer(sample);
     Q_ASSERT(layer_index != -1);
-    const LayerInterface* interface =
-            multilayer->getLayerTopInterface(layer_index);
+    const LayerInterface* interface = multilayer->getLayerTopInterface(layer_index);
 
     SessionItem* layerItem = m_sampleModel->insertNewItem(
         Constants::LayerType, m_sampleModel->indexOfItem(parent));
@@ -191,8 +189,7 @@ void GUIObjectBuilder::visit(const Layer* sample)
 
 void GUIObjectBuilder::visit(const LayerInterface*)
 {
-    qDebug() << "GUIObjectBuilder::visit(const LayerInterface*)"  << getLevel();
-
+    qDebug() << "GUIObjectBuilder::visit(const LayerInterface*)" << getLevel();
 }
 
 void GUIObjectBuilder::visit(const MultiLayer* sample)
diff --git a/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp b/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp
index 412eb715d0f66da332e57191e83ec1de85545d4e..b191129f78a28ad6d2d5ad6a308988cd68107dfe 100644
--- a/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp
+++ b/GUI/coregui/Views/MaskWidgets/MaskEditor.cpp
@@ -14,7 +14,10 @@
 //
 // ************************************************************************** //
 
+#include "MaskEditor.h"
+#include "GISASSimulation.h"
 #include "GUIHelpers.h"
+#include "ISample.h"
 #include "IntensityDataItem.h"
 #include "MaskEditorActions.h"
 #include "MaskEditorCanvas.h"
@@ -26,14 +29,12 @@
 #include "SampleBuilderFactory.h"
 #include "SessionModel.h"
 #include "SimulationFactory.h"
-#include "MaskEditor.h"
 #include <QBoxLayout>
 #include <QContextMenuEvent>
 #include <QDebug>
 #include <QMenu>
 #include <QSplitter>
 
-
 MaskEditor::MaskEditor(QWidget* parent)
     : QMainWindow(parent)
     , m_itemActions(new MaskEditorActions(this))
diff --git a/Tests/Functional/Core/BatchSimulation.cpp b/Tests/Functional/Core/BatchSimulation.cpp
index 1333b62fd45c9243c2b915faac0a9215ae1ad13d..4cc5035f702fc03189e643ce3a392d0aa34cfee4 100644
--- a/Tests/Functional/Core/BatchSimulation.cpp
+++ b/Tests/Functional/Core/BatchSimulation.cpp
@@ -1,3 +1,4 @@
+#include "GISASSimulation.h"
 #include "SimulationFactory.h"
 #include "IFunctionalTest.h"
 #include "IntensityDataFunctions.h"
diff --git a/Tests/Functional/Core/PolDWBAMagCylinders2.cpp b/Tests/Functional/Core/PolDWBAMagCylinders2.cpp
index aee5c1c6c4112efba5cbf5467990046b5d4462c4..ba2486790c2da78a6aff28d090ebb1e707d97ecb 100644
--- a/Tests/Functional/Core/PolDWBAMagCylinders2.cpp
+++ b/Tests/Functional/Core/PolDWBAMagCylinders2.cpp
@@ -1,3 +1,4 @@
+#include "GISASSimulation.h"
 #include "IntensityDataFunctions.h"
 #include "IntensityDataIOFactory.h"
 #include "SimulationFactory.h"
diff --git a/auto/Wrap/doxygen_core.i b/auto/Wrap/doxygen_core.i
index 38cd5f744187df11a26e41f02911c2c6c93bfdba..17f99e16e476286d1e4de06b1f5e1e24ba20a734 100644
--- a/auto/Wrap/doxygen_core.i
+++ b/auto/Wrap/doxygen_core.i
@@ -4374,7 +4374,7 @@ overloaded in (Core|Py|GUI)Suite.cpp
 %feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation()
 ";
 
-%feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(const ISample &p_sample)
+%feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(const class ISample &p_sample)
 ";
 
 %feature("docstring")  GISASSimulation::GISASSimulation "GISASSimulation::GISASSimulation(std::shared_ptr< class ISampleBuilder > p_sample_builder)
@@ -6676,7 +6676,7 @@ C++ includes: IIntensityFunction.h
 %feature("docstring")  IntensityFunctionLog::clone "virtual IntensityFunctionLog* IntensityFunctionLog::clone() const 
 ";
 
-%feature("docstring")  IntensityFunctionLog::evaluate "virtual double IntensityFunctionLog::evaluate(double value) const 
+%feature("docstring")  IntensityFunctionLog::evaluate "double IntensityFunctionLog::evaluate(double value) const 
 ";
 
 
@@ -6694,7 +6694,7 @@ C++ includes: IIntensityFunction.h
 %feature("docstring")  IntensityFunctionSqrt::clone "virtual IntensityFunctionSqrt* IntensityFunctionSqrt::clone() const 
 ";
 
-%feature("docstring")  IntensityFunctionSqrt::evaluate "virtual double IntensityFunctionSqrt::evaluate(double value) const 
+%feature("docstring")  IntensityFunctionSqrt::evaluate "double IntensityFunctionSqrt::evaluate(double value) const 
 ";
 
 
@@ -7439,10 +7439,10 @@ C++ includes: ISampleBuilder.h
 %feature("docstring")  ISampleBuilder::set_subtest "void ISampleBuilder::set_subtest(const class IParameterized *subtest_item)
 ";
 
-%feature("docstring")  ISampleBuilder::getFormFactor "const IFormFactor* ISampleBuilder::getFormFactor() const 
+%feature("docstring")  ISampleBuilder::getFormFactor "const IFormFactor * ISampleBuilder::getFormFactor() const 
 ";
 
-%feature("docstring")  ISampleBuilder::getFTDistribution2D "const IFTDistribution2D* ISampleBuilder::getFTDistribution2D() const 
+%feature("docstring")  ISampleBuilder::getFTDistribution2D "const IFTDistribution2D * ISampleBuilder::getFTDistribution2D() const 
 ";
 
 
@@ -8128,7 +8128,7 @@ C++ includes: Layer.h
 Constructs empty layer. 
 ";
 
-%feature("docstring")  Layer::Layer "Layer::Layer(const IMaterial &material, double thickness=0)
+%feature("docstring")  Layer::Layer "Layer::Layer(const class IMaterial &material, double thickness=0)
 
 Constructs layer made of  material with  thickness in nanometers and decoration. 
 ";
@@ -8146,7 +8146,7 @@ Returns a clone of this  ISample object.
 Returns a clone with inverted magnetic fields. 
 ";
 
-%feature("docstring")  Layer::accept "void Layer::accept(ISampleVisitor *visitor) const
+%feature("docstring")  Layer::accept "void Layer::accept(class ISampleVisitor *visitor) const
 
 Calls the  ISampleVisitor's visit method. 
 ";
@@ -8161,17 +8161,17 @@ Sets layer thickness in nanometers.
 Returns layer thickness in nanometers. 
 ";
 
-%feature("docstring")  Layer::setMaterial "void Layer::setMaterial(const IMaterial &material)
+%feature("docstring")  Layer::setMaterial "void Layer::setMaterial(const class IMaterial &material)
 
 Sets  material of the layer. 
 ";
 
-%feature("docstring")  Layer::setMaterialAndThickness "void Layer::setMaterialAndThickness(const IMaterial &material, double thickness)
+%feature("docstring")  Layer::setMaterialAndThickness "void Layer::setMaterialAndThickness(const class IMaterial &material, double thickness)
 
 Sets  material and  thickness. 
 ";
 
-%feature("docstring")  Layer::getMaterial "virtual const IMaterial* Layer::getMaterial() const
+%feature("docstring")  Layer::getMaterial "virtual const class IMaterial* Layer::getMaterial() const
 
 Returns layer's material. 
 ";
@@ -8186,7 +8186,7 @@ Returns refractive index of the layer's material.
 Returns squared refractive index of the layer's material. 
 ";
 
-%feature("docstring")  Layer::addLayout "void Layer::addLayout(const ILayout &decoration)
+%feature("docstring")  Layer::addLayout "void Layer::addLayout(const class ILayout &decoration)
 
 sets particle layout 
 ";
@@ -10762,7 +10762,7 @@ Test whether Python dumps yields the same image as a direct computation.
 C++ includes: PySuiteTest.h
 ";
 
-%feature("docstring")  PySuiteTest::PySuiteTest "PySuiteTest::PySuiteTest(const std::string &name, const std::string &description, GISASSimulation *reference_simulation, double threshold)
+%feature("docstring")  PySuiteTest::PySuiteTest "PySuiteTest::PySuiteTest(const std::string &name, const std::string &description, class GISASSimulation *reference_simulation, double threshold)
 ";
 
 %feature("docstring")  PySuiteTest::~PySuiteTest "PySuiteTest::~PySuiteTest()
@@ -12090,13 +12090,13 @@ C++ includes: GISASSimulation.h
 %feature("docstring")  Simulation::Simulation "Simulation::Simulation()
 ";
 
-%feature("docstring")  Simulation::Simulation "Simulation::Simulation(const ISample &p_sample)
+%feature("docstring")  Simulation::Simulation "Simulation::Simulation(const class ISample &p_sample)
 ";
 
 %feature("docstring")  Simulation::Simulation "Simulation::Simulation(std::shared_ptr< class ISampleBuilder > p_sample_builder)
 ";
 
-%feature("docstring")  Simulation::~Simulation "virtual Simulation::~Simulation()
+%feature("docstring")  Simulation::~Simulation "Simulation::~Simulation()
 ";
 
 %feature("docstring")  Simulation::clone "virtual Simulation* Simulation::clone() const =0
@@ -12119,14 +12119,14 @@ Run simulation with possible averaging over parameter distributions.
 Run an OpenMPI simulation. 
 ";
 
-%feature("docstring")  Simulation::setSample "void Simulation::setSample(const ISample &sample)
+%feature("docstring")  Simulation::setSample "void Simulation::setSample(const class ISample &sample)
 
 Sets the sample to be tested.
 
 The  ISample object will not be owned by the  Simulation object. 
 ";
 
-%feature("docstring")  Simulation::getSample "ISample* Simulation::getSample() const
+%feature("docstring")  Simulation::getSample "class ISample* Simulation::getSample() const
 
 Returns the sample. 
 ";
@@ -13131,16 +13131,16 @@ C++ includes: WavevectorInfo.h
 // File: classMathFunctions_1_1Convolve_1_1Workspace.xml
 
 
-// File: namespace_0D249.xml
+// File: namespace_0D269.xml
 
 
-// File: namespace_0D333.xml
+// File: namespace_0D335.xml
 
 
-// File: namespace_0D402.xml
+// File: namespace_0D404.xml
 
 
-// File: namespace_0D416.xml
+// File: namespace_0D418.xml
 
 
 // File: namespaceboost_1_1geometry.xml
@@ -13858,6 +13858,9 @@ global helper function for comparison of axes
 // File: IHistogram_8h.xml
 
 
+// File: IIntensityFunction_8cpp.xml
+
+
 // File: IIntensityFunction_8h.xml
 
 
@@ -14015,6 +14018,60 @@ Set all element intensities to given value.
 // File: SampleLabelHandler_8h.xml
 
 
+// File: FormFactorDecoratorDebyeWaller_8cpp.xml
+
+
+// File: FormFactorDecoratorDebyeWaller_8h.xml
+
+
+// File: FormFactorDecoratorFactor_8h.xml
+
+
+// File: FormFactorDecoratorMaterial_8cpp.xml
+
+
+// File: FormFactorDecoratorMaterial_8h.xml
+
+
+// File: FormFactorDecoratorMultiPositionFactor_8cpp.xml
+
+
+// File: FormFactorDecoratorMultiPositionFactor_8h.xml
+
+
+// File: FormFactorDecoratorPositionFactor_8h.xml
+
+
+// File: FormFactorDecoratorRotation_8cpp.xml
+
+
+// File: FormFactorDecoratorRotation_8h.xml
+
+
+// File: FormFactorDWBA_8cpp.xml
+
+
+// File: FormFactorDWBA_8h.xml
+
+
+// File: FormFactorDWBAPol_8cpp.xml
+
+
+// File: FormFactorDWBAPol_8h.xml
+
+
+// File: FormFactors_8h.xml
+
+
+// File: FormFactorTools_8cpp.xml
+
+
+// File: FormFactorTools_8h.xml
+
+
+// File: IFormFactorDecorator_8h.xml
+
+
 // File: FormFactorAnisoPyramid_8cpp.xml
 
 
@@ -14322,6 +14379,9 @@ The mathematics implemented here is described in full detail in a paper by Joach
 // File: IRoughness_8h.xml
 
 
+// File: ISampleBuilder_8cpp.xml
+
+
 // File: ISampleBuilder_8h.xml
 
 
@@ -14449,39 +14509,6 @@ The mathematics implemented here is described in full detail in a paper by Joach
 // File: FormFactorCrystal_8h.xml
 
 
-// File: FormFactorDecoratorDebyeWaller_8cpp.xml
-
-
-// File: FormFactorDecoratorDebyeWaller_8h.xml
-
-
-// File: FormFactorDecoratorFactor_8h.xml
-
-
-// File: FormFactorDecoratorMaterial_8cpp.xml
-
-
-// File: FormFactorDecoratorMaterial_8h.xml
-
-
-// File: FormFactorDecoratorMultiPositionFactor_8cpp.xml
-
-
-// File: FormFactorDecoratorMultiPositionFactor_8h.xml
-
-
-// File: FormFactorDecoratorPositionFactor_8h.xml
-
-
-// File: FormFactorDecoratorRotation_8cpp.xml
-
-
-// File: FormFactorDecoratorRotation_8h.xml
-
-
-// File: FormFactors_8h.xml
-
-
 // File: FormFactorWeighted_8cpp.xml
 
 
@@ -14491,9 +14518,6 @@ The mathematics implemented here is described in full detail in a paper by Joach
 // File: IClusteredParticles_8h.xml
 
 
-// File: IFormFactorDecorator_8h.xml
-
-
 // File: IParticle_8cpp.xml
 
 
@@ -14547,24 +14571,6 @@ Returns concatenated rotation (first right, then left).
 ";
 
 
-// File: FormFactorDWBA_8cpp.xml
-
-
-// File: FormFactorDWBA_8h.xml
-
-
-// File: FormFactorDWBAPol_8cpp.xml
-
-
-// File: FormFactorDWBAPol_8h.xml
-
-
-// File: FormFactorTools_8cpp.xml
-
-
-// File: FormFactorTools_8h.xml
-
-
 // File: ICompositeSample_8cpp.xml
 
 
@@ -15041,6 +15047,9 @@ David N. Williams
 // File: dir_cca9b87b2505f372a6ce58947a507789.xml
 
 
+// File: dir_c8e420540f3cc673520907fed872650b.xml
+
+
 // File: dir_43bf4f843b6e885b1bee2bc28b8e4b1a.xml
 
 
diff --git a/auto/Wrap/libBornAgainCore.py b/auto/Wrap/libBornAgainCore.py
index 7bdf42e2430cabbc86886941285eae946d37f0d0..d18cf65cc6fb1150461280f5aec390d5c28ec499 100644
--- a/auto/Wrap/libBornAgainCore.py
+++ b/auto/Wrap/libBornAgainCore.py
@@ -4648,7 +4648,7 @@ class ISampleBuilder(IParameterized):
         """
         getFormFactor(ISampleBuilder self) -> IFormFactor
 
-        const IFormFactor* ISampleBuilder::getFormFactor() const 
+        const IFormFactor * ISampleBuilder::getFormFactor() const 
 
         """
         return _libBornAgainCore.ISampleBuilder_getFormFactor(self)
@@ -4658,7 +4658,7 @@ class ISampleBuilder(IParameterized):
         """
         getFTDistribution2D(ISampleBuilder self) -> IFTDistribution2D
 
-        const IFTDistribution2D* ISampleBuilder::getFTDistribution2D() const 
+        const IFTDistribution2D * ISampleBuilder::getFTDistribution2D() const 
 
         """
         return _libBornAgainCore.ISampleBuilder_getFTDistribution2D(self)
@@ -12652,7 +12652,7 @@ class Simulation(ICloneable, IParameterized):
         """
         setSample(Simulation self, ISample sample)
 
-        void Simulation::setSample(const ISample &sample)
+        void Simulation::setSample(const class ISample &sample)
 
         Sets the sample to be tested.
 
@@ -12666,7 +12666,7 @@ class Simulation(ICloneable, IParameterized):
         """
         getSample(Simulation self) -> ISample
 
-        ISample* Simulation::getSample() const
+        class ISample* Simulation::getSample() const
 
         Returns the sample. 
 
@@ -17719,7 +17719,7 @@ class Layer(ICompositeSample):
         __init__(Layer self, IMaterial material, double thickness=0) -> Layer
         __init__(Layer self, IMaterial material) -> Layer
 
-        Layer::Layer(const IMaterial &material, double thickness=0)
+        Layer::Layer(const class IMaterial &material, double thickness=0)
 
         Constructs layer made of  material with  thickness in nanometers and decoration. 
 
@@ -17760,7 +17760,7 @@ class Layer(ICompositeSample):
         """
         accept(Layer self, ISampleVisitor visitor)
 
-        void Layer::accept(ISampleVisitor *visitor) const
+        void Layer::accept(class ISampleVisitor *visitor) const
 
         Calls the  ISampleVisitor's visit method. 
 
@@ -17796,7 +17796,7 @@ class Layer(ICompositeSample):
         """
         setMaterial(Layer self, IMaterial material)
 
-        void Layer::setMaterial(const IMaterial &material)
+        void Layer::setMaterial(const class IMaterial &material)
 
         Sets  material of the layer. 
 
@@ -17808,7 +17808,7 @@ class Layer(ICompositeSample):
         """
         setMaterialAndThickness(Layer self, IMaterial material, double thickness)
 
-        void Layer::setMaterialAndThickness(const IMaterial &material, double thickness)
+        void Layer::setMaterialAndThickness(const class IMaterial &material, double thickness)
 
         Sets  material and  thickness. 
 
@@ -17820,7 +17820,7 @@ class Layer(ICompositeSample):
         """
         getMaterial(Layer self) -> IMaterial
 
-        virtual const IMaterial* Layer::getMaterial() const
+        virtual const class IMaterial* Layer::getMaterial() const
 
         Returns layer's material. 
 
@@ -17856,7 +17856,7 @@ class Layer(ICompositeSample):
         """
         addLayout(Layer self, ILayout decoration)
 
-        void Layer::addLayout(const ILayout &decoration)
+        void Layer::addLayout(const class ILayout &decoration)
 
         sets particle layout 
 
@@ -19384,7 +19384,7 @@ class IntensityFunctionLog(IIntensityFunction):
         """
         evaluate(IntensityFunctionLog self, double value) -> double
 
-        virtual double IntensityFunctionLog::evaluate(double value) const 
+        double IntensityFunctionLog::evaluate(double value) const 
 
         """
         return _libBornAgainCore.IntensityFunctionLog_evaluate(self, value)
@@ -19444,7 +19444,7 @@ class IntensityFunctionSqrt(IIntensityFunction):
         """
         evaluate(IntensityFunctionSqrt self, double value) -> double
 
-        virtual double IntensityFunctionSqrt::evaluate(double value) const 
+        double IntensityFunctionSqrt::evaluate(double value) const 
 
         """
         return _libBornAgainCore.IntensityFunctionSqrt_evaluate(self, value)
diff --git a/auto/Wrap/libBornAgainCore_wrap.cpp b/auto/Wrap/libBornAgainCore_wrap.cpp
index 8626f832f0e0fa7e7d1d137ae628ff77b9a61f53..d6879448baf706e65845fb7ec1be4c51a585ac8d 100644
--- a/auto/Wrap/libBornAgainCore_wrap.cpp
+++ b/auto/Wrap/libBornAgainCore_wrap.cpp
@@ -92783,13 +92783,13 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"ISampleBuilder_getFormFactor", _wrap_ISampleBuilder_getFormFactor, METH_VARARGS, (char *)"\n"
 		"ISampleBuilder_getFormFactor(ISampleBuilder self) -> IFormFactor\n"
 		"\n"
-		"const IFormFactor* ISampleBuilder::getFormFactor() const \n"
+		"const IFormFactor * ISampleBuilder::getFormFactor() const \n"
 		"\n"
 		""},
 	 { (char *)"ISampleBuilder_getFTDistribution2D", _wrap_ISampleBuilder_getFTDistribution2D, METH_VARARGS, (char *)"\n"
 		"ISampleBuilder_getFTDistribution2D(ISampleBuilder self) -> IFTDistribution2D\n"
 		"\n"
-		"const IFTDistribution2D* ISampleBuilder::getFTDistribution2D() const \n"
+		"const IFTDistribution2D * ISampleBuilder::getFTDistribution2D() const \n"
 		"\n"
 		""},
 	 { (char *)"ISampleBuilder_registerParameter", _wrap_ISampleBuilder_registerParameter, METH_VARARGS, (char *)"\n"
@@ -97100,7 +97100,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"delete_Simulation", _wrap_delete_Simulation, METH_VARARGS, (char *)"\n"
 		"delete_Simulation(Simulation self)\n"
 		"\n"
-		"virtual Simulation::~Simulation()\n"
+		"Simulation::~Simulation()\n"
 		"\n"
 		""},
 	 { (char *)"Simulation_clone", _wrap_Simulation_clone, METH_VARARGS, (char *)"\n"
@@ -97138,7 +97138,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Simulation_setSample", _wrap_Simulation_setSample, METH_VARARGS, (char *)"\n"
 		"Simulation_setSample(Simulation self, ISample sample)\n"
 		"\n"
-		"void Simulation::setSample(const ISample &sample)\n"
+		"void Simulation::setSample(const class ISample &sample)\n"
 		"\n"
 		"Sets the sample to be tested.\n"
 		"\n"
@@ -97148,7 +97148,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Simulation_getSample", _wrap_Simulation_getSample, METH_VARARGS, (char *)"\n"
 		"Simulation_getSample(Simulation self) -> ISample\n"
 		"\n"
-		"ISample* Simulation::getSample() const\n"
+		"class ISample* Simulation::getSample() const\n"
 		"\n"
 		"Returns the sample. \n"
 		"\n"
@@ -99992,7 +99992,7 @@ static PyMethodDef SwigMethods[] = {
 		"Layer(IMaterial material, double thickness=0)\n"
 		"new_Layer(IMaterial material) -> Layer\n"
 		"\n"
-		"Layer::Layer(const IMaterial &material, double thickness=0)\n"
+		"Layer::Layer(const class IMaterial &material, double thickness=0)\n"
 		"\n"
 		"Constructs layer made of  material with  thickness in nanometers and decoration. \n"
 		"\n"
@@ -100022,7 +100022,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Layer_accept", _wrap_Layer_accept, METH_VARARGS, (char *)"\n"
 		"Layer_accept(Layer self, ISampleVisitor visitor)\n"
 		"\n"
-		"void Layer::accept(ISampleVisitor *visitor) const\n"
+		"void Layer::accept(class ISampleVisitor *visitor) const\n"
 		"\n"
 		"Calls the  ISampleVisitor's visit method. \n"
 		"\n"
@@ -100046,7 +100046,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Layer_setMaterial", _wrap_Layer_setMaterial, METH_VARARGS, (char *)"\n"
 		"Layer_setMaterial(Layer self, IMaterial material)\n"
 		"\n"
-		"void Layer::setMaterial(const IMaterial &material)\n"
+		"void Layer::setMaterial(const class IMaterial &material)\n"
 		"\n"
 		"Sets  material of the layer. \n"
 		"\n"
@@ -100054,7 +100054,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Layer_setMaterialAndThickness", _wrap_Layer_setMaterialAndThickness, METH_VARARGS, (char *)"\n"
 		"Layer_setMaterialAndThickness(Layer self, IMaterial material, double thickness)\n"
 		"\n"
-		"void Layer::setMaterialAndThickness(const IMaterial &material, double thickness)\n"
+		"void Layer::setMaterialAndThickness(const class IMaterial &material, double thickness)\n"
 		"\n"
 		"Sets  material and  thickness. \n"
 		"\n"
@@ -100062,7 +100062,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Layer_getMaterial", _wrap_Layer_getMaterial, METH_VARARGS, (char *)"\n"
 		"Layer_getMaterial(Layer self) -> IMaterial\n"
 		"\n"
-		"virtual const IMaterial* Layer::getMaterial() const\n"
+		"virtual const class IMaterial* Layer::getMaterial() const\n"
 		"\n"
 		"Returns layer's material. \n"
 		"\n"
@@ -100086,7 +100086,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"Layer_addLayout", _wrap_Layer_addLayout, METH_VARARGS, (char *)"\n"
 		"Layer_addLayout(Layer self, ILayout decoration)\n"
 		"\n"
-		"void Layer::addLayout(const ILayout &decoration)\n"
+		"void Layer::addLayout(const class ILayout &decoration)\n"
 		"\n"
 		"sets particle layout \n"
 		"\n"
@@ -100956,7 +100956,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"IntensityFunctionLog_evaluate", _wrap_IntensityFunctionLog_evaluate, METH_VARARGS, (char *)"\n"
 		"IntensityFunctionLog_evaluate(IntensityFunctionLog self, double value) -> double\n"
 		"\n"
-		"virtual double IntensityFunctionLog::evaluate(double value) const \n"
+		"double IntensityFunctionLog::evaluate(double value) const \n"
 		"\n"
 		""},
 	 { (char *)"new_IntensityFunctionLog", _wrap_new_IntensityFunctionLog, METH_VARARGS, (char *)"\n"
@@ -100985,7 +100985,7 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"IntensityFunctionSqrt_evaluate", _wrap_IntensityFunctionSqrt_evaluate, METH_VARARGS, (char *)"\n"
 		"IntensityFunctionSqrt_evaluate(IntensityFunctionSqrt self, double value) -> double\n"
 		"\n"
-		"virtual double IntensityFunctionSqrt::evaluate(double value) const \n"
+		"double IntensityFunctionSqrt::evaluate(double value) const \n"
 		"\n"
 		""},
 	 { (char *)"new_IntensityFunctionSqrt", _wrap_new_IntensityFunctionSqrt, METH_VARARGS, (char *)"\n"