diff --git a/Core/Aggregate/InterferenceFunction1DLattice.cpp b/Core/Aggregate/InterferenceFunction1DLattice.cpp
index 7b3e463660865f9384bd7a308f85a4838b9bd8e0..6381a0ab9176db28e9e8195754e9a2d701eb594a 100644
--- a/Core/Aggregate/InterferenceFunction1DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunction1DLattice.cpp
@@ -62,7 +62,7 @@ void InterferenceFunction1DLattice::setDecayFunction(const IFTDecayFunction1D& p
 double InterferenceFunction1DLattice::evaluate(const kvector_t q) const
 {
     if (!mp_pdf)
-        throw Exception::NullPointerException("InterferenceFunction1DLattice::evaluate"
+        throw Exceptions::NullPointerException("InterferenceFunction1DLattice::evaluate"
                                    " -> Error! No probability distribution function defined.");
     double result = 0.0;
     double qxr = q.x();
diff --git a/Core/Aggregate/InterferenceFunction2DLattice.cpp b/Core/Aggregate/InterferenceFunction2DLattice.cpp
index 74e00396e46e44b961ebd8842e62d57c9b6137e9..90cc0153b20f6efedc393aa0a056db112be9429c 100644
--- a/Core/Aggregate/InterferenceFunction2DLattice.cpp
+++ b/Core/Aggregate/InterferenceFunction2DLattice.cpp
@@ -90,7 +90,7 @@ void InterferenceFunction2DLattice::setDecayFunction(const IFTDecayFunction2D &p
 double InterferenceFunction2DLattice::evaluate(const kvector_t q) const
 {
     if (!mp_pdf)
-        throw Exception::NullPointerException("InterferenceFunction2DLattice::evaluate"
+        throw Exceptions::NullPointerException("InterferenceFunction2DLattice::evaluate"
                                    " -> Error! No probability distribution function defined.");
     double result = 0.0;
     double qxr = q.x();
@@ -138,7 +138,7 @@ void InterferenceFunction2DLattice::onChange()
 double InterferenceFunction2DLattice::interferenceAtOneRecLatticePoint(double qx, double qy) const
 {
     if (!mp_pdf)
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "InterferenceFunction2DLattice::interferenceAtOneRecLatticePoint"
             " -> Error! No probability distribution function defined.");
     double qp1, qp2;
@@ -189,7 +189,7 @@ void InterferenceFunction2DLattice::init_parameters()
 void InterferenceFunction2DLattice::initialize_rec_vectors()
 {
     if (m_lattice_params.m_length_1 == 0 || m_lattice_params.m_length_2 == 0)
-        throw Exception::DivisionByZeroException(
+        throw Exceptions::DivisionByZeroException(
             "InterferenceFunction2DLattice::"
             "initialize_rec_vectors() -> Error! Zero parameters"
             " m_lattice_params.m_length1 or m_lattice_params.m_length_2");
@@ -207,7 +207,7 @@ void InterferenceFunction2DLattice::initialize_rec_vectors()
 void InterferenceFunction2DLattice::initialize_calc_factors()
 {
     if (!mp_pdf)
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "InterferenceFunction2DLattice::initialize_calc_factors"
             " -> Error! No probability distribution function defined.");
 
diff --git a/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp b/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
index f76f8ebbd502d5730c0b875ebd4544dd1b5239e2..371df2bf83091ff0a51681ac4e95e5423f25d1d9 100644
--- a/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
+++ b/Core/Aggregate/InterferenceFunction2DParaCrystal.cpp
@@ -186,11 +186,11 @@ double InterferenceFunction2DParaCrystal::interference1D(
     double qx, double qy, double xi, size_t index) const
 {
     if (index > 1)
-        throw Exception::OutOfBoundsException("InterferenceFunction2DParaCrystal::"
+        throw Exceptions::OutOfBoundsException("InterferenceFunction2DParaCrystal::"
                 "interference1D() -> Error! Index of interference function "
                 "probability must be < 2");
     if (!m_pdfs[0] || !m_pdfs[1])
-        throw Exception::NullPointerException("InterferenceFunction2DParaCrystal::"
+        throw Exceptions::NullPointerException("InterferenceFunction2DParaCrystal::"
                 "interference1D() -> Error! Probability distributions for "
                 "interference funtion not properly initialized");
     double result;
diff --git a/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
index 9fe38f2b7e0163c6800228e2906a53f22f0d1c8b..aeaae8e8d91974386632275e429e290b2e77ac30 100644
--- a/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
+++ b/Core/Aggregate/InterferenceFunctionRadialParaCrystal.cpp
@@ -69,7 +69,7 @@ std::string InterferenceFunctionRadialParaCrystal::to_str(int indent) const
 double InterferenceFunctionRadialParaCrystal::evaluate(const kvector_t q) const
 {
     if (!mP_pdf)
-        throw Exception::NullPointerException("InterferenceFunctionRadialParaCrystal::"
+        throw Exceptions::NullPointerException("InterferenceFunctionRadialParaCrystal::"
                 "evaluate() -> Error! Probability distribution for "
                 "interference funtion not properly initialized");
     double result=0.0;
diff --git a/Core/Aggregate/ParticleLayout.cpp b/Core/Aggregate/ParticleLayout.cpp
index fef56c8cf1008e7a6282c0c9ce7c681937dde3f8..be5b1b1a270a7afbeb142b4061cc96898aef3a0a 100644
--- a/Core/Aggregate/ParticleLayout.cpp
+++ b/Core/Aggregate/ParticleLayout.cpp
@@ -133,7 +133,7 @@ void ParticleLayout::addParticle(const IParticle& particle, double abundance,
 const IAbstractParticle* ParticleLayout::getParticle(size_t index) const
 {
     if (index>=m_particles.size())
-        throw Exception::OutOfBoundsException(
+        throw Exceptions::OutOfBoundsException(
             "ParticleLayout::getParticle() -> Error! Not so many particles in this decoration.");
     return m_particles[index];
 }
diff --git a/Core/Basics/Exceptions.cpp b/Core/Basics/Exceptions.cpp
index d3f2bd89bbc82c2d3cd4dbf87802013c494e40c1..029efbc1492cc7d0bf10b866bcb14ff9736427c2 100644
--- a/Core/Basics/Exceptions.cpp
+++ b/Core/Basics/Exceptions.cpp
@@ -16,7 +16,7 @@
 #include "Exceptions.h"
 #include <iostream>
 
-namespace Exception {
+namespace Exceptions {
 
 void LogExceptionMessage(const std::string& message)
 {
@@ -113,4 +113,4 @@ FormatErrorException::FormatErrorException(const std::string& message)
     LogExceptionMessage(message);
 }
 
-} // namespace Exception
+} // namespace Exceptions
diff --git a/Core/Basics/Exceptions.h b/Core/Basics/Exceptions.h
index 18854d80a0e508977c39b49f31b7c87023ff5468..dbdedfe4f29c763c1a07133e2b305f95397f8568 100644
--- a/Core/Basics/Exceptions.h
+++ b/Core/Basics/Exceptions.h
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      Core/Basics/Exceptions.h
-//! @brief     Defines many exception classes in namespace Exceptions.
+//! @brief     Defines many exception classes in namespace Exceptionss.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -29,7 +29,7 @@
 
 //! Different exceptions, all inheriting from std::exception.
 
-namespace Exception {
+namespace Exceptions {
 
 class BA_CORE_API_ NotImplementedException : public std::logic_error
 {
@@ -123,7 +123,7 @@ public:
 
 void LogExceptionMessage(const std::string& message);
 
-} // namespace Exception;
+} // namespace Exceptions;
 
 #ifdef _WIN32
 #ifdef _MSC_VER
diff --git a/Core/Binning/ConstKBinAxis.cpp b/Core/Binning/ConstKBinAxis.cpp
index 3b994833a312c86a8a32e12e3667c60b75e162b0..157a5ac1aa93be71ad75a4af132929a884287671 100644
--- a/Core/Binning/ConstKBinAxis.cpp
+++ b/Core/Binning/ConstKBinAxis.cpp
@@ -31,7 +31,7 @@ ConstKBinAxis::ConstKBinAxis(const std::string &name, size_t nbins, double start
     , m_end(end)
 {
     if(m_start >= m_end)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConstKBinAxis::ConstKBinAxis() -> Error. start >= end is not allowed.");
 
     double start_sin = std::sin(m_start);
@@ -54,7 +54,7 @@ ConstKBinAxis* ConstKBinAxis::clone() const
 ConstKBinAxis* ConstKBinAxis::createClippedAxis(double left, double right) const
 {
     if(left >= right)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConstKBinAxis::createClippedAxis() -> Error. 'left'' should be smaller than 'right'");
 
     if(left < getMin()) left = getBin(0).getMidPoint();
diff --git a/Core/Binning/CustomBinAxis.cpp b/Core/Binning/CustomBinAxis.cpp
index 284d2ba7265faec733ac4c4f6acae052096e7d60..1e2a750b16f069af0e37e98ef6b8d098b4b20943 100644
--- a/Core/Binning/CustomBinAxis.cpp
+++ b/Core/Binning/CustomBinAxis.cpp
@@ -25,7 +25,7 @@ CustomBinAxis::CustomBinAxis(const std::string &name, size_t nbins, double start
     , m_end(end)
 {
     if(m_start >= m_end)
-        throw Exception::LogicErrorException("CustomBinAxis::CustomBinAxis() -> Error."
+        throw Exceptions::LogicErrorException("CustomBinAxis::CustomBinAxis() -> Error."
                                               " start >= end is not allowed.");
 
     double start_sin = std::sin(start);
@@ -54,7 +54,7 @@ CustomBinAxis *CustomBinAxis::clone() const
 Bin1D CustomBinAxis::getBin(size_t index) const
 {
     if(index >= m_nbins)
-        throw Exception::OutOfBoundsException("CustomBinAxis::getBin() -> Error. Wrong index.");
+        throw Exceptions::OutOfBoundsException("CustomBinAxis::getBin() -> Error. Wrong index.");
 
     Bin1D result(m_bin_centers[index], m_bin_centers[index]);
     return result;
@@ -67,7 +67,7 @@ std::vector<double> CustomBinAxis::getBinCenters() const
 
 CustomBinAxis *CustomBinAxis::createClippedAxis(double /* left */, double /* right */) const
 {
-    throw Exception::NotImplementedException("VariableBinAxis::CustomBinAxis() -> Error."
+    throw Exceptions::NotImplementedException("VariableBinAxis::CustomBinAxis() -> Error."
                                               " Not implemented.");
 }
 
diff --git a/Core/Binning/FixedBinAxis.cpp b/Core/Binning/FixedBinAxis.cpp
index 41d9fed0578ffef797ec761cc293da8605270c36..f235831ae314b30636351a9989f619faee3298bf 100644
--- a/Core/Binning/FixedBinAxis.cpp
+++ b/Core/Binning/FixedBinAxis.cpp
@@ -33,7 +33,7 @@ FixedBinAxis *FixedBinAxis::clone() const
 double FixedBinAxis::operator[](size_t index) const
 {
     if(index >= m_nbins)
-        throw Exception::OutOfBoundsException("FixedBinAxis::operator[] -> Error. Wrong index.");
+        throw Exceptions::OutOfBoundsException("FixedBinAxis::operator[] -> Error. Wrong index.");
 
     double step = (m_end - m_start)/m_nbins;
     return m_start + (index + 0.5)*step;
@@ -42,7 +42,7 @@ double FixedBinAxis::operator[](size_t index) const
 Bin1D FixedBinAxis::getBin(size_t index) const
 {
     if(index >= m_nbins)
-        throw Exception::OutOfBoundsException("FixedBinAxis::getBin() -> Error. Wrong index.");
+        throw Exceptions::OutOfBoundsException("FixedBinAxis::getBin() -> Error. Wrong index.");
 
     double step = (m_end - m_start)/m_nbins;
     Bin1D result( m_start + step*index, m_start + step*(index+1) );
@@ -85,7 +85,7 @@ std::vector<double> FixedBinAxis::getBinBoundaries() const
 FixedBinAxis *FixedBinAxis::createClippedAxis(double left, double right) const
 {
     if(left >= right)
-        throw Exception::LogicErrorException("FixedBinAxis::createClippedAxis() -> Error. "
+        throw Exceptions::LogicErrorException("FixedBinAxis::createClippedAxis() -> Error. "
                                   "'left' should be smaller than 'right'");
 
     if(left < getMin()) left = getBin(0).getMidPoint();
diff --git a/Core/Binning/IAxis.cpp b/Core/Binning/IAxis.cpp
index 0fdadc6d72e2d506ef108a5902a5ff1cdad88146..ae2fec415b9e8e4d6778bd645aa8c61397851bdb 100644
--- a/Core/Binning/IAxis.cpp
+++ b/Core/Binning/IAxis.cpp
@@ -18,7 +18,7 @@
 
 IAxis* IAxis::createDoubleBinSize() const
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
                 "IAxis::createDoubleBinSize() -> Error. Not implemented.");
 }
 
@@ -37,18 +37,18 @@ bool IAxis::equals(const IAxis& other) const
 
 std::vector<double> IAxis::getBinCenters() const
 {
-    throw Exception::NotImplementedException("IAxis::getBinCenters() -> Error. Not implemented.");
+    throw Exceptions::NotImplementedException("IAxis::getBinCenters() -> Error. Not implemented.");
 }
 
 std::vector<double> IAxis::getBinBoundaries() const
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "IAxis::getBinBoundaries() -> Error. Not implemented.");
 }
 
 IAxis* IAxis::createClippedAxis(double /* left */, double /* right */) const
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "IAxis::createClippedAxis() -> Error. Not implemented.");
 }
 
diff --git a/Core/Binning/VariableBinAxis.cpp b/Core/Binning/VariableBinAxis.cpp
index 4973c650dec5aee17b5da1c29f696b9f729d1f0f..de5442ada472f4a0f47391dc0cc2bf55d30322a8 100644
--- a/Core/Binning/VariableBinAxis.cpp
+++ b/Core/Binning/VariableBinAxis.cpp
@@ -25,7 +25,7 @@ VariableBinAxis::VariableBinAxis(
     , m_nbins(nbins)
 {
     if(m_nbins != bin_boundaries.size()-1)
-        throw Exception::LogicErrorException("VariableBinAxis::VariableBinAxis() -> Error! "
+        throw Exceptions::LogicErrorException("VariableBinAxis::VariableBinAxis() -> Error! "
             "The size of bin_boundaries should be of size [nbins+1].");
 
     setBinBoundaries(bin_boundaries);
@@ -55,7 +55,7 @@ double VariableBinAxis::operator[](size_t index) const
 Bin1D VariableBinAxis::getBin(size_t index) const
 {
     if(index >= m_nbins)
-        throw Exception::OutOfBoundsException("VariableBinAxis::getBin() -> Error. Wrong index.");
+        throw Exceptions::OutOfBoundsException("VariableBinAxis::getBin() -> Error. Wrong index.");
 
     Bin1D result(m_bin_boundaries[index], m_bin_boundaries[index+1]);
     return result;
@@ -82,7 +82,7 @@ double VariableBinAxis::getBinCenter(size_t index) const
 size_t VariableBinAxis::findClosestIndex(double value) const
 {
     if(m_bin_boundaries.size()<2)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "VariableBinAxis::findClosestIndex() -> Error! "
             "VariableBinAxis not  correctly initialized" );
     if( value < getMin()) {
@@ -112,7 +112,7 @@ VariableBinAxis* VariableBinAxis::createClippedAxis(double left, double right) c
 {
 
     if(left >= right)
-        throw Exception::LogicErrorException("VariableBinAxis::createClippedAxis() -> Error. "
+        throw Exceptions::LogicErrorException("VariableBinAxis::createClippedAxis() -> Error. "
                                   "'left'' should be smaller than 'right'" );
 
     if(left < getMin()) left = getBin(0).getMidPoint();
@@ -165,7 +165,7 @@ void VariableBinAxis::setBinBoundaries(const std::vector<double>& bin_boundaries
     std::sort( vec_sorted.begin(), vec_sorted.end());
     for(size_t i=0; i<bin_boundaries.size(); ++i) {
         if(vec_sorted[i] != bin_boundaries[i])
-            throw Exception::LogicErrorException(
+            throw Exceptions::LogicErrorException(
                 "VariableBinAxis::VariableBinAxis() -> Error. "
                 "Array with bin edges is not sorted." );
     }
@@ -174,7 +174,7 @@ void VariableBinAxis::setBinBoundaries(const std::vector<double>& bin_boundaries
     vec.erase(std::unique(vec.begin(), vec.end()),vec.end());
 
     if(vec.size() != bin_boundaries.size())
-       throw Exception::LogicErrorException(
+       throw Exceptions::LogicErrorException(
            "VariableBinAxis::VariableBinAxis() -> Error. "
            "Array with bin edges contains repeating values." );
 
diff --git a/Core/Export/ExportToPython.cpp b/Core/Export/ExportToPython.cpp
index f6a597a7926f201045f1360dfe09ea1465c52c4e..c5cecb513dc473ab11d53bb1254ad8c673f9b4cb 100644
--- a/Core/Export/ExportToPython.cpp
+++ b/Core/Export/ExportToPython.cpp
@@ -102,7 +102,7 @@ ExportToPython::ExportToPython(const MultiLayer& multilayer)
     for( auto x: multilayer.containedSubclass<IRotation>() )
         m_label->insertRotation(x);
     if( multilayer.containedSubclass<MesoCrystal>().size() )
-        throw Exception::NotImplementedException(
+        throw Exceptions::NotImplementedException(
             "ExportToPython: class MesoCrystal not yet supported!");
 }
 
@@ -183,7 +183,7 @@ std::string ExportToPython::defineMaterials() const
             const HomogeneousMagneticMaterial* p_mag_material
                 = dynamic_cast<const HomogeneousMagneticMaterial*>(p_material);
             if (p_mag_material == 0)
-                throw Exception::RuntimeErrorException(
+                throw Exceptions::RuntimeErrorException(
                     "ExportToPython::defineMaterials: "
                     "Non scalar material should be of type HomogeneousMagneticMaterial");
             kvector_t magnetic_field = p_mag_material->getMagneticField();
@@ -479,7 +479,7 @@ std::string ExportToPython::defineInterferenceFunctions() const
         }
 
         else
-            throw Exception::NotImplementedException(
+            throw Exceptions::NotImplementedException(
                 "Bug: ExportToPython::defineInterferenceFunctions() called with unexpected "
                 "IInterferenceFunction " + interference->getName());
     }
@@ -601,7 +601,7 @@ std::string ExportToPython::defineDetector(const GISASSimulation* simulation) co
     const IDetector2D* iDetector = simulation->getInstrument().getDetector();
 
     if (iDetector->getDimension() != 2)
-        throw Exception::RuntimeErrorException("ExportToPython::defineDetector: "
+        throw Exceptions::RuntimeErrorException("ExportToPython::defineDetector: "
                                                 "detector must be two-dimensional for GISAS");
 
     std::ostringstream result;
@@ -664,13 +664,13 @@ std::string ExportToPython::defineDetector(const GISASSimulation* simulation) co
                    << printDouble(detector->getDirectBeamV0()) << ")\n";
 
         } else
-            throw Exception::RuntimeErrorException(
+            throw Exceptions::RuntimeErrorException(
                 "ExportToPython::defineDetector: unknown alignment");
 
         result << indent() << "simulation.setDetector(detector)\n";
 
     } else
-        throw Exception::RuntimeErrorException("ExportToPython::defineDetector: unknown detector");
+        throw Exceptions::RuntimeErrorException("ExportToPython::defineDetector: unknown detector");
 
     if(iDetector->regionOfInterest()) {
         result << indent() << "simulation.setRegionOfInterest("
@@ -699,12 +699,12 @@ std::string ExportToPython::defineDetectorResolutionFunction(
                 result << printFunc(detector)(resfunc->getSigmaX()) << ", ";
                 result << printFunc(detector)(resfunc->getSigmaY()) << "))\n";
             } else {
-                throw Exception::RuntimeErrorException(
+                throw Exceptions::RuntimeErrorException(
                     "ExportToPython::defineDetectorResolutionFunction() -> Error. "
                     "Unknown detector resolution function");
             }
         } else
-            throw Exception::RuntimeErrorException(
+            throw Exceptions::RuntimeErrorException(
                 "ExportToPython::defineDetectorResolutionFunction() -> Error. "
                 "Not a ConvolutionDetectorResolution function");
     }
@@ -872,7 +872,7 @@ std::function<std::string (double)> printFunc(const IDetector2D *detector)
     } else if(detector->getDefaultAxesUnits() == IDetector2D::RADIANS) {
         result = PythonFormatting::printDegrees;
     } else {
-        throw Exception::RuntimeErrorException("ExportToPython::defineMasks() -> Error. Unknown "
+        throw Exceptions::RuntimeErrorException("ExportToPython::defineMasks() -> Error. Unknown "
                                                 "detector units.");
     }
 
diff --git a/Core/Export/PythonFormatting.cpp b/Core/Export/PythonFormatting.cpp
index 966e890493258330c48baeaeb6cf4f0e7d590f21..23d4547b6e45c7ad4a0f87ea3fe1a3534d0c973d 100644
--- a/Core/Export/PythonFormatting.cpp
+++ b/Core/Export/PythonFormatting.cpp
@@ -118,7 +118,7 @@ std::string representShape2D(const std::string& indent, const Geometry::IShape2D
                << printBool(mask_value) << ")\n";
 
     } else
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "representShape2D(const IShape2D*) -> Error. Unknown shape");
 
     return result.str();
diff --git a/Core/Export/SampleLabelHandler.cpp b/Core/Export/SampleLabelHandler.cpp
index c6107b8569b9fff06ad790bd8168e81ba487252c..6d9338fe7119c7f5096532322d66c90f39f662df 100644
--- a/Core/Export/SampleLabelHandler.cpp
+++ b/Core/Export/SampleLabelHandler.cpp
@@ -64,7 +64,7 @@ std::string SampleLabelHandler::getLabelParticle(const IAbstractParticle* abspar
         return m_ParticleDistributionLabel[particle];
     if (const auto lattice_basis = dynamic_cast<const ParticleComposition*>(absparticle))
         return m_ParticleCompositionLabel[lattice_basis];
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "SampleLabelHandler::getLabel: called for unknown IParticle type");
 }
 
diff --git a/Core/Export/SampleLabelHandler.h b/Core/Export/SampleLabelHandler.h
index b339b1bacd93978448f0513e753549b2610b42cb..0756825a83c1ba8151414f5845372262504d312e 100644
--- a/Core/Export/SampleLabelHandler.h
+++ b/Core/Export/SampleLabelHandler.h
@@ -95,7 +95,7 @@ public:
     const std::string& value(const Key& key) {
         typename map_t::const_iterator mit = m_map.find(key);
         if(mit == m_map.end())
-            throw Exception::RuntimeErrorException("LabelMap::value() -> No such key");
+            throw Exceptions::RuntimeErrorException("LabelMap::value() -> No such key");
         const_iterator it = mit->second;
         return it->second;
     }
diff --git a/Core/Fitting/FitObject.cpp b/Core/Fitting/FitObject.cpp
index 316d48664dfa52c47fff7b89b15c03acd1e4195c..a6a8d215c1f0281c11335acb566036bf9ca1a4d4 100644
--- a/Core/Fitting/FitObject.cpp
+++ b/Core/Fitting/FitObject.cpp
@@ -103,7 +103,7 @@ void FitObject::process_realdata(const OutputData<double> &real_data)
         message << "FitObject::check_realdata() -> Error. Axes of the real data doesn't match "
                 << "the detector. Real data:" << DetectorFunctions::axesToString(real_data)
                         << ", detector:" << DetectorFunctions::axesToString(*detector) << ".";
-        throw Exception::RuntimeErrorException(message.str());
+        throw Exceptions::RuntimeErrorException(message.str());
         }
     } else {
         bool put_masked_areas_to_zero(false);
diff --git a/Core/Fitting/FitStrategyAdjustParameters.cpp b/Core/Fitting/FitStrategyAdjustParameters.cpp
index 3f7fe416eddbb74226facad5824fee080fdf540c..93e96a56b9e5d298ef39f086534b7aba264cc460 100644
--- a/Core/Fitting/FitStrategyAdjustParameters.cpp
+++ b/Core/Fitting/FitStrategyAdjustParameters.cpp
@@ -34,7 +34,7 @@ FitStrategyAdjustParameters::FitStrategyAdjustParameters(const FitStrategyAdjust
 void FitStrategyAdjustParameters::execute()
 {
     if( !m_kernel )
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "FitSuiteStrategyAdjustParameters::execute() -> FitSuite doesn't exists");
     FitParameterSet* fitParameters = m_kernel->fitParameters();
 
diff --git a/Core/Fitting/FitSuiteImpl.cpp b/Core/Fitting/FitSuiteImpl.cpp
index b99a2930759db932d1ac91ad1b8aa1c46fa5849e..0d1d95433f50d72a823fa2189b5640b816e9bfb9 100644
--- a/Core/Fitting/FitSuiteImpl.cpp
+++ b/Core/Fitting/FitSuiteImpl.cpp
@@ -149,9 +149,9 @@ const FitKernel *FitSuiteImpl::kernel() const
 
 bool FitSuiteImpl::check_prerequisites() const
 {
-    if( !m_fit_objects.getNumberOfFitObjects() ) throw Exception::LogicErrorException(
+    if( !m_fit_objects.getNumberOfFitObjects() ) throw Exceptions::LogicErrorException(
         "FitSuite::check_prerequisites() -> Error! No simulation/data description defined");
-    if( m_fit_objects.getSizeOfDataSet() == 0) throw Exception::LogicErrorException(
+    if( m_fit_objects.getSizeOfDataSet() == 0) throw Exceptions::LogicErrorException(
         "FitSuite::check_prerequisites() -> Error! No elements to fit. "
         "Looks like whole detector is masked.");
     return true;
diff --git a/Core/Fitting/FitSuiteObjects.cpp b/Core/Fitting/FitSuiteObjects.cpp
index 1d2db464bc2d5d09bf6a73dd608303adc265babe..502955dbf20b0985bc3f375618f0e01f2de6f57f 100644
--- a/Core/Fitting/FitSuiteObjects.cpp
+++ b/Core/Fitting/FitSuiteObjects.cpp
@@ -84,7 +84,7 @@ void FitSuiteObjects::runSimulations()
     if(getSizeOfDataSet() == 0) {
         std::ostringstream message;
         message << "FitSuiteObjects::runSimulations() -> Error. Zero size of dataset.";
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
 
     m_fit_elements.clear();
@@ -99,7 +99,7 @@ void FitSuiteObjects::runSimulations()
         message << "FitSuiteObjects::runSimulations() -> Error. Dataset size mismatch. "
                 << " m_fit_elements.size():" << m_fit_elements.size()
                 << " getSizeOfDataset():" << getSizeOfDataSet() << std::endl;
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
 
     m_chi_squared_value = calculateChiSquaredValue();
@@ -108,7 +108,7 @@ void FitSuiteObjects::runSimulations()
 double FitSuiteObjects::getResidualValue(size_t global_index)
 {
     if(global_index >= m_fit_elements.size())
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "FitSuiteObjects::getResidualValue() -> Error. Index exceeds size of dataset.");
     return m_fit_elements[global_index].getResidual();
 }
@@ -155,7 +155,7 @@ double FitSuiteObjects::calculateChiSquaredValue()
 
     int fnorm = m_fit_elements.size() - m_nfree_parameters;
     if (fnorm <= 0)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "FitSuiteObjects::calculateChiSquaredValue() -> Error. Normalization is 0");
     return result / fnorm;
 }
@@ -163,6 +163,6 @@ double FitSuiteObjects::calculateChiSquaredValue()
 size_t FitSuiteObjects::check_index(size_t index) const
 {
     if( index >= m_fit_objects.size() )
-        throw Exception::OutOfBoundsException("FitSuiteKit::check() -> Index outside of range");
+        throw Exceptions::OutOfBoundsException("FitSuiteKit::check() -> Index outside of range");
     return index;
 }
diff --git a/Core/Fitting/IFitObserver.cpp b/Core/Fitting/IFitObserver.cpp
index f93b418ae3fa4510dfb7654f4e9b304c953c512d..58fd63d10b717800bd8fe2f48df45dc0938b9005 100644
--- a/Core/Fitting/IFitObserver.cpp
+++ b/Core/Fitting/IFitObserver.cpp
@@ -29,7 +29,7 @@ void IFitObserver::notify(IObservable* subject)
 {
     FitSuite* fit_suite = dynamic_cast<FitSuite*>(subject);
     if( !fit_suite )
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "IFitObserver::update() -> Error! Can't access FitSuite");
 
     bool needs_update(false);
@@ -56,6 +56,6 @@ void IFitObserver::notify(IObservable* subject)
 
 void IFitObserver::update(FitSuite*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "IFitObserver::update(IObservable *subject) -> Error. Not implemented.");
 }
diff --git a/Core/HardParticle/FormFactorAnisoPyramid.cpp b/Core/HardParticle/FormFactorAnisoPyramid.cpp
index 75df7c1bb26c0a4fd3b9cccc8ece80e2226164b5..2060650d4d4ebc6513149640dd8a3b7ce77d4e69 100644
--- a/Core/HardParticle/FormFactorAnisoPyramid.cpp
+++ b/Core/HardParticle/FormFactorAnisoPyramid.cpp
@@ -54,7 +54,7 @@ void FormFactorAnisoPyramid::onChange()
 {
     double cot_alpha = MathFunctions::cot(m_alpha);
     if( !std::isfinite(cot_alpha) || cot_alpha<0 )
-        throw Exception::OutOfBoundsException("AnisoPyramid: angle alpha out of bounds");
+        throw Exceptions::OutOfBoundsException("AnisoPyramid: angle alpha out of bounds");
     double r = cot_alpha*2 * m_height / m_length;
     double s = cot_alpha*2 * m_height / m_width;
     if( r>1 || s>1 ) {
@@ -65,7 +65,7 @@ void FormFactorAnisoPyramid::onChange()
         ostr << " height:" << m_height;
         ostr << " alpha[rad]:" << m_alpha << "\n\n";
         ostr << "Check for '2*height <= (length,width)*tan(alpha)' failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
 
     double D = m_length/2;
diff --git a/Core/HardParticle/FormFactorCone.cpp b/Core/HardParticle/FormFactorCone.cpp
index 4a513ae8e9c5df4e9befa792a441a5e9fd8dbfcf..38fa7dc22a3c46fb7d6a02ebc8781264caefec6f 100644
--- a/Core/HardParticle/FormFactorCone.cpp
+++ b/Core/HardParticle/FormFactorCone.cpp
@@ -30,7 +30,7 @@ FormFactorCone::FormFactorCone(double radius, double height, double alpha)
     setName(BornAgain::FFConeType);
     m_cot_alpha = MathFunctions::cot(m_alpha);
     if( !std::isfinite(m_cot_alpha) || m_cot_alpha<0 )
-        throw Exception::OutOfBoundsException("pyramid angle alpha out of bounds");
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
     if(m_cot_alpha*m_height > m_radius) {
         std::ostringstream ostr;
         ostr << "FormFactorCone() -> Error in class initialization ";
@@ -38,7 +38,7 @@ FormFactorCone::FormFactorCone(double radius, double height, double alpha)
         ostr << " m_height:" << m_height;
         ostr << " alpha[rad]:" << m_alpha << "\n\n";
         ostr << "Check for 'height <= radius*tan(alpha)' failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     registerParameter(BornAgain::Radius, &m_radius).setUnit("nm").setNonnegative();
     registerParameter(BornAgain::Height, &m_height).setUnit("nm").setNonnegative();
diff --git a/Core/HardParticle/FormFactorCone6.cpp b/Core/HardParticle/FormFactorCone6.cpp
index f5e2311eda3f51a5861e73540be38aebc88f8512..84020d46bc6135dd7e149816fce241e926d3caa0 100644
--- a/Core/HardParticle/FormFactorCone6.cpp
+++ b/Core/HardParticle/FormFactorCone6.cpp
@@ -52,7 +52,7 @@ void FormFactorCone6::onChange()
 {
     double cot_alpha = MathFunctions::cot(m_alpha);
     if( !std::isfinite(cot_alpha) || cot_alpha<0 )
-        throw Exception::OutOfBoundsException("pyramid angle alpha out of bounds");
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
     double r = cot_alpha*2/sqrt(3) * m_height / m_base_edge; // L(top)/L(base)
     if ( r > 1 ) {
         std::ostringstream ostr;
@@ -60,7 +60,7 @@ void FormFactorCone6::onChange()
         ostr << "(base_edge=" << m_base_edge;
         ostr << ", height:" << m_height;
         ostr << ", alpha[rad]:" << m_alpha << ")";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
 
     double a = m_base_edge;
diff --git a/Core/HardParticle/FormFactorCuboctahedron.cpp b/Core/HardParticle/FormFactorCuboctahedron.cpp
index f83f987883e8706f053997191959507e1039e6e4..43b880b574b330e7c4f6c946ff76b72f4b1a7bca 100644
--- a/Core/HardParticle/FormFactorCuboctahedron.cpp
+++ b/Core/HardParticle/FormFactorCuboctahedron.cpp
@@ -58,7 +58,7 @@ void FormFactorCuboctahedron::onChange()
 {
     double cot_alpha = MathFunctions::cot(m_alpha);
     if( !std::isfinite(cot_alpha) || cot_alpha<0 )
-        throw Exception::OutOfBoundsException("pyramid angle alpha out of bounds");
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
     double x = m_height_ratio;
     double r = cot_alpha*2 * m_height / m_length;
     if ( std::max(1.,x)*r > 1 ) {
@@ -69,7 +69,7 @@ void FormFactorCuboctahedron::onChange()
         ostr << " height_ratio:" << m_height_ratio;
         ostr << " alpha[rad]:" << m_alpha << "\n\n";
         ostr << "Check for '2.*height <= length*tan(alpha)*min(1.,1.0/height_ratio)' failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     double a = m_length/2 * (1-r);
     double b = m_length/2;
diff --git a/Core/HardParticle/FormFactorLongRipple1Gauss.cpp b/Core/HardParticle/FormFactorLongRipple1Gauss.cpp
index df7743663ddcd930204f9ffd04aaad3577afedf9..102118ab963d5ad4a042bc6df13b0ba7e7d3de4a 100644
--- a/Core/HardParticle/FormFactorLongRipple1Gauss.cpp
+++ b/Core/HardParticle/FormFactorLongRipple1Gauss.cpp
@@ -42,7 +42,7 @@ bool FormFactorLongRipple1Gauss::check_initialization() const
         ostr << " width:" << m_width;
         ostr << " length:" << m_length << "\n\n";
         ostr << "Check for 'height>0.0 && width>0.0 && length>0.0' failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     return result;
 }
diff --git a/Core/HardParticle/FormFactorLongRipple1Lorentz.cpp b/Core/HardParticle/FormFactorLongRipple1Lorentz.cpp
index 52988fa932f593d6bb05559a63bfcd4d75674081..4ae4edbd14b1a915f7c9e2d217add477348a42f2 100644
--- a/Core/HardParticle/FormFactorLongRipple1Lorentz.cpp
+++ b/Core/HardParticle/FormFactorLongRipple1Lorentz.cpp
@@ -42,7 +42,7 @@ bool FormFactorLongRipple1Lorentz::check_initialization() const
         ostr << " width:" << m_width;
         ostr << " length:" << m_length << "\n\n";
         ostr << "Check for 'height>0.0 && width>0.0 && length>0.0' failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     return result;
 }
diff --git a/Core/HardParticle/FormFactorLongRipple2Gauss.cpp b/Core/HardParticle/FormFactorLongRipple2Gauss.cpp
index 817ecddcffe0ed9ec3da1e4317863e45b3f8fadd..ba382a8ea12223b0cfe17eb41eb22b5057a3ae3d 100644
--- a/Core/HardParticle/FormFactorLongRipple2Gauss.cpp
+++ b/Core/HardParticle/FormFactorLongRipple2Gauss.cpp
@@ -58,7 +58,7 @@ bool FormFactorLongRipple2Gauss::check_initialization() const
         ostr << " length:" << m_length;
         ostr << " asymmetry:" << m_d << "\n\n";
         ostr << message;
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     return result;
 }
diff --git a/Core/HardParticle/FormFactorLongRipple2Lorentz.cpp b/Core/HardParticle/FormFactorLongRipple2Lorentz.cpp
index f98e08b8fb6d35f56de9eadc8aa570f1540fe6b3..1ffa17c2671d4a9738411ed6e6ba5699eb366797 100644
--- a/Core/HardParticle/FormFactorLongRipple2Lorentz.cpp
+++ b/Core/HardParticle/FormFactorLongRipple2Lorentz.cpp
@@ -60,7 +60,7 @@ void FormFactorLongRipple2Lorentz::check_parameters() const
     ostr << " length:" << m_length;
     ostr << " asymmetry:" << m_d << "\n\n";
     ostr << message;
-    throw Exception::ClassInitializationException(ostr.str());
+    throw Exceptions::ClassInitializationException(ostr.str());
 }
 
 double FormFactorLongRipple2Lorentz::getRadialExtension() const
diff --git a/Core/HardParticle/FormFactorPyramid.cpp b/Core/HardParticle/FormFactorPyramid.cpp
index 21dd74fbd398157dc572e8f454925827ee29665d..cd326016f18f4f9d8ea45905816f6b71fd72d494 100644
--- a/Core/HardParticle/FormFactorPyramid.cpp
+++ b/Core/HardParticle/FormFactorPyramid.cpp
@@ -51,7 +51,7 @@ void FormFactorPyramid::onChange()
 {
     double cot_alpha = MathFunctions::cot(m_alpha);
     if( !std::isfinite(cot_alpha) || cot_alpha<0 )
-        throw Exception::OutOfBoundsException("pyramid angle alpha out of bounds");
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
     double r = cot_alpha*2 * m_height / m_base_edge; // L(top)/L(base)
     if ( r > 1 ) {
         std::ostringstream ostr;
@@ -60,7 +60,7 @@ void FormFactorPyramid::onChange()
         ostr << " height:" << m_height;
         ostr << " alpha[rad]:" << m_alpha << "\n\n";
         ostr << "Check for 'height <= base_edge*tan(alpha)' failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
 
     double a = m_base_edge/2;
diff --git a/Core/HardParticle/FormFactorRipple1.cpp b/Core/HardParticle/FormFactorRipple1.cpp
index 531dd6c3ea0bdd84d26a7dda6d096996475a841f..09e70083719550c1c453cdc390121adb9a0dab3a 100644
--- a/Core/HardParticle/FormFactorRipple1.cpp
+++ b/Core/HardParticle/FormFactorRipple1.cpp
@@ -44,7 +44,7 @@ bool FormFactorRipple1::check_initialization() const
         ostr << " width:" << m_width;
         ostr << " length:" << m_length << "\n\n";
         ostr << "Check for 'height>0.0 && width>0.0 && length>0.0' failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     return result;
 }
diff --git a/Core/HardParticle/FormFactorRipple2.cpp b/Core/HardParticle/FormFactorRipple2.cpp
index 148d60233c063fb4f56c565a1417e22946b9bd49..72a9e61c8b8308f673784fc7467225a8f4dcf649 100644
--- a/Core/HardParticle/FormFactorRipple2.cpp
+++ b/Core/HardParticle/FormFactorRipple2.cpp
@@ -91,7 +91,7 @@ bool FormFactorRipple2::check_initialization() const
         ostr << " length:" << m_length;
         ostr << " asymmetry:" << m_d << "\n\n";
         ostr << message;
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     return result;
 }
diff --git a/Core/HardParticle/FormFactorTetrahedron.cpp b/Core/HardParticle/FormFactorTetrahedron.cpp
index 15b9017290be0dbe05065e3db7778d22d5f41e84..b46dfef357d8446f76afece4a2fcda7e50245871 100644
--- a/Core/HardParticle/FormFactorTetrahedron.cpp
+++ b/Core/HardParticle/FormFactorTetrahedron.cpp
@@ -51,7 +51,7 @@ void FormFactorTetrahedron::onChange()
 {
     double cot_alpha = MathFunctions::cot(m_alpha);
     if( !std::isfinite(cot_alpha) || cot_alpha<0 )
-        throw Exception::OutOfBoundsException("pyramid angle alpha out of bounds");
+        throw Exceptions::OutOfBoundsException("pyramid angle alpha out of bounds");
     double r = cot_alpha * 2*std::sqrt(3.) * m_height / m_base_edge; // L(top)/L(base)
     if ( r > 1 ) {
         std::ostringstream ostr;
@@ -59,7 +59,7 @@ void FormFactorTetrahedron::onChange()
         ostr << "(base_edge=" << m_base_edge;
         ostr << ", height:" << m_height;
         ostr << ", alpha[rad]:" << m_alpha << ")";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
 
     double a = m_base_edge;
diff --git a/Core/HardParticle/FormFactorTruncatedCube.cpp b/Core/HardParticle/FormFactorTruncatedCube.cpp
index d025c44377850cd34d6d4d256fddbd1d7c9d0fc1..fb1b9439b3b776561e31bb566b4ad430d11fc71f 100644
--- a/Core/HardParticle/FormFactorTruncatedCube.cpp
+++ b/Core/HardParticle/FormFactorTruncatedCube.cpp
@@ -58,7 +58,7 @@ void FormFactorTruncatedCube::onChange()
         ostr << "with parameters 'length':" << m_length;
         ostr << " 'removed_length':" << m_removed_length << "\n\n";
         ostr << "Check for removed_length <= 0.5*length failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
 
     double a = m_length/2;
diff --git a/Core/HardParticle/FormFactorTruncatedSphere.cpp b/Core/HardParticle/FormFactorTruncatedSphere.cpp
index adf24c369260189037ff9085d60bd87346d4e0f0..9937f791467607beaf5e14ca4033d579c1954f01 100644
--- a/Core/HardParticle/FormFactorTruncatedSphere.cpp
+++ b/Core/HardParticle/FormFactorTruncatedSphere.cpp
@@ -42,7 +42,7 @@ bool FormFactorTruncatedSphere::check_initialization() const
         ostr << "::FormFactorTruncatedSphere() -> Error in class initialization ";
         ostr << "with parameters 'radius':" << m_radius << " 'height':" << m_height << "\n\n";
         ostr << "Check for height <= 2.*radius failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     return result;
 }
diff --git a/Core/HardParticle/FormFactorTruncatedSpheroid.cpp b/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
index 6dacf264fdd8c582d816a1ed41b4861713d79830..3a83ff4e6f54fad8c7fd73413f6b35beaee19305 100644
--- a/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
+++ b/Core/HardParticle/FormFactorTruncatedSpheroid.cpp
@@ -43,7 +43,7 @@ bool FormFactorTruncatedSpheroid::check_initialization() const
         ostr << " height:" << m_height;
         ostr << " height_flattening:" << m_height_flattening << "\n\n";
         ostr << "Check for 'height <= 2.*radius*height_flattening' failed.";
-        throw Exception::ClassInitializationException(ostr.str());
+        throw Exceptions::ClassInitializationException(ostr.str());
     }
     return result;
 }
diff --git a/Core/InputOutput/OutputDataIOHelper.cpp b/Core/InputOutput/OutputDataIOHelper.cpp
index dfbcaa3693de4a6f74a009cd9e6660fd179d353c..235b99129a5f58fb3156aa80f96c2f9479822d11 100644
--- a/Core/InputOutput/OutputDataIOHelper.cpp
+++ b/Core/InputOutput/OutputDataIOHelper.cpp
@@ -16,7 +16,7 @@
 #include "OutputDataIOHelper.h"
 #include "ConstKBinAxis.h"
 #include "CustomBinAxis.h"
-#include "FileSystem.h"
+#include "FileUtils.h"
 #include "OutputData.h"
 #include "Utils.h"
 #include <iterator>
@@ -31,12 +31,12 @@ bool OutputDataIOHelper::isCompressed(const std::string& name)
 
 bool OutputDataIOHelper::isGZipped(const std::string& name)
 {
-    return FileSystem::extension(name) == GzipExtention;
+    return FileUtils::extension(name) == GzipExtention;
 }
 
 bool OutputDataIOHelper::isBZipped(const std::string& name)
 {
-    return FileSystem::extension(name) == BzipExtention;
+    return FileUtils::extension(name) == BzipExtention;
 }
 
 
@@ -51,7 +51,7 @@ std::string OutputDataIOHelper::GetFileMainExtension(const std::string& name)
     else if(isBZipped(name)) {
         stripped_name = name.substr(0, name.size()-BzipExtention.size());
     }
-    return FileSystem::extension(stripped_name);
+    return FileUtils::extension(stripped_name);
 }
 
 bool OutputDataIOHelper::isBinaryFile(const std::string& file_name)
@@ -111,7 +111,7 @@ IAxis *OutputDataIOHelper::createAxis(std::istream& input_stream)
         return createVariableBinAxis(line);
     }
     else {
-        throw Exception::LogicErrorException("OutputDataIOHelper::createAxis() -> Error. "
+        throw Exceptions::LogicErrorException("OutputDataIOHelper::createAxis() -> Error. "
                                               "Unknown axis '"+line+"'");
     }
 }
@@ -130,14 +130,14 @@ IAxis *OutputDataIOHelper::createFixedBinAxis(std::string line)
 
     std::istringstream iss(line);
     if( !(iss >> type >> name >> nbins) )
-        throw Exception::FormatErrorException(
+        throw Exceptions::FormatErrorException(
             "OutputDataIOHelper::createFixedBinAxis() -> Error. Can't parse the string.");
 
     std::vector<double> boundaries;
     readLineOfDoubles(boundaries, iss);
 
     if(boundaries.size() != 2)
-        throw Exception::FormatErrorException(
+        throw Exceptions::FormatErrorException(
             "OutputDataIOHelper::createFixedBinAxis() -> Error. Can't parse the string at p2.");
 
     if(type == FixedBinAxisType) {
@@ -150,7 +150,7 @@ IAxis *OutputDataIOHelper::createFixedBinAxis(std::string line)
         return new CustomBinAxis(name, nbins, boundaries[0], boundaries[1]);
     }
     else {
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "OutputDataIOHelper::createOneOfFixedBinAxis() -> Error. Unexpected place.");
     }
 }
@@ -168,12 +168,12 @@ IAxis *OutputDataIOHelper::createVariableBinAxis(std::string line)
 
     std::istringstream iss(line);
     if( !(iss >> type >> name >> nbins) )
-        throw Exception::FormatErrorException(
+        throw Exceptions::FormatErrorException(
             "OutputDataIOHelper::createVariableBinAxis() -> Error. Can't parse the string.");
     std::vector<double> boundaries;
     readLineOfDoubles(boundaries, iss);
     if(boundaries.size() != nbins+1)
-        throw Exception::FormatErrorException(
+        throw Exceptions::FormatErrorException(
             "OutputDataIOHelper::createVariableBinAxis() -> Error. Can't parse the string at p2.");
     return new VariableBinAxis(name, nbins, boundaries);
 }
@@ -196,7 +196,7 @@ void OutputDataIOHelper::fillOutputData(OutputData<double>* data, std::istream&
         }
     }
     if(it!= data->end())
-        throw Exception::FormatErrorException(
+        throw Exceptions::FormatErrorException(
             "OutputDataIOHelper::fillOutputData() -> Error while parsing data.");
 }
 
diff --git a/Core/InputOutput/OutputDataReadFactory.cpp b/Core/InputOutput/OutputDataReadFactory.cpp
index 873e18e367a8090c55f0fea1e318ab8002d494ca..f60e828c94a69384b277dfe444c086fd29f44591 100644
--- a/Core/InputOutput/OutputDataReadFactory.cpp
+++ b/Core/InputOutput/OutputDataReadFactory.cpp
@@ -36,7 +36,7 @@ IOutputDataReadStrategy* OutputDataReadFactory::getReadStrategy(const std::strin
        result = new OutputDataReadTiffStrategy();
 #endif // BORNAGAIN_TIFF_SUPPORT
     else
-        throw Exception::LogicErrorException("OutputDataReadFactory::getReader() -> Error. "
+        throw Exceptions::LogicErrorException("OutputDataReadFactory::getReader() -> Error. "
                 "Don't know how to read file '" + file_name+std::string("'"));
     return result;
 }
diff --git a/Core/InputOutput/OutputDataReader.cpp b/Core/InputOutput/OutputDataReader.cpp
index ef851d0168e98ebefd971cb1163c124b022605d4..10e25a0cc7602c1e81ad6bf9ba1d9b86861b18f0 100644
--- a/Core/InputOutput/OutputDataReader.cpp
+++ b/Core/InputOutput/OutputDataReader.cpp
@@ -26,7 +26,7 @@ OutputDataReader::OutputDataReader(const std::string& file_name)
 OutputData<double>* OutputDataReader::getOutputData()
 {
     if(!m_read_strategy)
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "OutputDataReader::getOutputData() -> Error! No read strategy defined");
 
     std::ifstream fin;
@@ -36,11 +36,11 @@ OutputData<double>* OutputDataReader::getOutputData()
 
     fin.open(m_file_name.c_str(), openmode );
     if(!fin.is_open())
-        throw Exception::FileNotIsOpenException(
+        throw Exceptions::FileNotIsOpenException(
             "OutputDataReader::getOutputData() -> Error. Can't open file '"
             + m_file_name + "' for reading.");
     if (!fin.good())
-        throw Exception::FileIsBadException(
+        throw Exceptions::FileIsBadException(
             "OutputDataReader::getOutputData() -> Error! "
             "File is not good, probably it is a directory.");
     OutputData<double>* result = getFromFilteredStream(fin);
diff --git a/Core/InputOutput/OutputDataWriteFactory.cpp b/Core/InputOutput/OutputDataWriteFactory.cpp
index 3652c0ec73232041f3c2d56c37b2e06f63708306..8670446c8178e6429de5bb669cb8311265718e18 100644
--- a/Core/InputOutput/OutputDataWriteFactory.cpp
+++ b/Core/InputOutput/OutputDataWriteFactory.cpp
@@ -42,7 +42,7 @@ IOutputDataWriteStrategy *OutputDataWriteFactory::getWriteStrategy(const std::st
 #endif // BORNAGAIN_TIFF_SUPPORT
 
     else {
-        throw Exception::LogicErrorException("OutputDataWriteFactory::getWriter() -> Error. "
+        throw Exceptions::LogicErrorException("OutputDataWriteFactory::getWriter() -> Error. "
                 "Don't know how to write file '" + file_name+std::string("'"));
     }
 
diff --git a/Core/InputOutput/OutputDataWriteStrategy.cpp b/Core/InputOutput/OutputDataWriteStrategy.cpp
index 87dd67a28a4f201e894e335b9858be9398f5e227..cc69157575b4caf59a3110eb407f7ac0b58c6465 100644
--- a/Core/InputOutput/OutputDataWriteStrategy.cpp
+++ b/Core/InputOutput/OutputDataWriteStrategy.cpp
@@ -73,7 +73,7 @@ void OutputDataWriteNumpyTXTStrategy::writeOutputData(const OutputData<double>&
                                                       std::ostream& output_stream)
 {
     if(data.getRank() != 2)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "OutputDataWriteNumpyTXTStrategy::writeOutputData -> Error. "
             "Only 2-dim arrays supported");
 
diff --git a/Core/InputOutput/OutputDataWriter.cpp b/Core/InputOutput/OutputDataWriter.cpp
index 8631ea1f4dc4da56a130c8a54a091d296ad9bb64..004d9c5bcec356f82cbd5f1c2cf66a484e7c13d1 100644
--- a/Core/InputOutput/OutputDataWriter.cpp
+++ b/Core/InputOutput/OutputDataWriter.cpp
@@ -27,7 +27,7 @@ OutputDataWriter::OutputDataWriter(const std::string& file_name)
 void OutputDataWriter::writeOutputData(const OutputData<double>& data)
 {
     if(!m_write_strategy)
-        throw Exception::NullPointerException("OutputDataWriter::getOutputData() ->"
+        throw Exceptions::NullPointerException("OutputDataWriter::getOutputData() ->"
                                                " Error! No read strategy defined");
     std::ofstream fout;
     std::ios_base::openmode openmode = std::ios::out;
@@ -36,10 +36,10 @@ void OutputDataWriter::writeOutputData(const OutputData<double>& data)
 
     fout.open(m_file_name.c_str(), openmode );
     if(!fout.is_open())
-        throw Exception::FileNotIsOpenException("OutputDataWriter::writeOutputData() -> Error. "
+        throw Exceptions::FileNotIsOpenException("OutputDataWriter::writeOutputData() -> Error. "
                                                  "Can't open file '"+m_file_name+"' for writing.");
     if (!fout.good())
-        throw Exception::FileIsBadException("OutputDataReader::writeOutputData() -> Error! "
+        throw Exceptions::FileIsBadException("OutputDataReader::writeOutputData() -> Error! "
                                              "File is not good, probably it is a directory.");
     std::stringstream ss;
     m_write_strategy->writeOutputData(data, ss);
diff --git a/Core/InputOutput/TiffHandler.cpp b/Core/InputOutput/TiffHandler.cpp
index d56897b01e94d5a2fb14439a682696a5e2dbba01..8d55a78b54779c5a48aa9a2253bee4685ee412d4 100644
--- a/Core/InputOutput/TiffHandler.cpp
+++ b/Core/InputOutput/TiffHandler.cpp
@@ -41,7 +41,7 @@ void TiffHandler::read(std::istream &input_stream)
 {
     m_tiff = TIFFStreamOpen("MemTIFF", &input_stream);
     if(!m_tiff) {
-        throw Exception::FormatErrorException("TiffHandler::read() -> Can't open the file.");
+        throw Exceptions::FormatErrorException("TiffHandler::read() -> Can't open the file.");
     }
     read_header();
     read_data();
@@ -73,7 +73,7 @@ void TiffHandler::read_header()
     if (!TIFFGetField(m_tiff, TIFFTAG_IMAGEWIDTH, &width)
         || !TIFFGetField(m_tiff, TIFFTAG_IMAGELENGTH, &height)
         || !TIFFGetField(m_tiff, TIFFTAG_PHOTOMETRIC, &photometric)) {
-        throw Exception::FormatErrorException("TiffHandler::read_header() -> Error. "
+        throw Exceptions::FormatErrorException("TiffHandler::read_header() -> Error. "
                                                "Can't read width/height/photometric info.");
     }
 
@@ -99,7 +99,7 @@ void TiffHandler::read_header()
                 << "    TIFFTAG_PHOTOMETRIC: " << photometric << std::endl
                 << "    TIFFTAG_BITSPERSAMPLE: " << bitPerSample << std::endl
                 << "    TIFFTAG_SAMPLESPERPIXEL: " << samplesPerPixel << std::endl;
-        throw Exception::FormatErrorException(message.str());
+        throw Exceptions::FormatErrorException(message.str());
     }
 
 }
@@ -111,11 +111,11 @@ void TiffHandler::read_data()
     tmsize_t buf_size = TIFFScanlineSize(m_tiff);
     tmsize_t expected_size = size_of_int*m_width;
     if(buf_size != expected_size)
-        throw Exception::FormatErrorException(
+        throw Exceptions::FormatErrorException(
             "TiffHandler::read_data() -> Error. Wrong scanline size.");
     tdata_t buf = _TIFFmalloc(buf_size);
     if(!buf)
-        throw Exception::FormatErrorException(
+        throw Exceptions::FormatErrorException(
             "TiffHandler::read_data() -> Error. Can't allocate buffer.");
 
     create_output_data();
@@ -125,7 +125,7 @@ void TiffHandler::read_data()
     std::vector<int> axes_indices(2);
     for (uint32 row = 0; row < (uint32) m_height; row++) {
         if(TIFFReadScanline(m_tiff, buf, row) < 0)
-            throw Exception::FormatErrorException(
+            throw Exceptions::FormatErrorException(
                 "TiffHandler::read_data() -> Error. Error in scanline.");
         memcpy(&line_buf[0], buf, buf_size);
         for(size_t col=0; col<line_buf.size(); ++col) {
@@ -166,7 +166,7 @@ void TiffHandler::write_data()
     tmsize_t buf_size = size_of_int*m_width;;
     tdata_t buf = _TIFFmalloc(buf_size);
     if(!buf)
-        throw Exception::FormatErrorException(
+        throw Exceptions::FormatErrorException(
             "TiffHandler::write_data() -> Error. Can't allocate buffer.");
 
     std::vector<int> line_buf;
@@ -182,7 +182,7 @@ void TiffHandler::write_data()
         memcpy(buf, &line_buf[0], buf_size);
 
         if(TIFFWriteScanline(m_tiff, buf, row) < 0)
-            throw Exception::FormatErrorException(
+            throw Exceptions::FormatErrorException(
                 "TiffHandler::write_data() -> Error. Error in TIFFWriteScanline.");
     }
     _TIFFfree(buf);
diff --git a/Core/Instrument/Beam.cpp b/Core/Instrument/Beam.cpp
index 07e3a1263c07b125235ecc33a29224b4ea93dc44..b2474184dea15c0e56280b7338fcff991f6af298 100644
--- a/Core/Instrument/Beam.cpp
+++ b/Core/Instrument/Beam.cpp
@@ -60,10 +60,10 @@ kvector_t Beam::getCentralK() const
 void Beam::setCentralK(double wavelength, double alpha_i, double phi_i)
 {
     if (wavelength <= 0.0)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "Beam::setCentralK() -> Error. Wavelength can't be negative or zero.");
     if (alpha_i < 0.0)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "Beam::setCentralK() -> Error. Inclination angle alpha_i can't be negative.");
     m_wavelength = wavelength;
     m_alpha = alpha_i;
@@ -73,7 +73,7 @@ void Beam::setCentralK(double wavelength, double alpha_i, double phi_i)
 void Beam::setPolarization(const kvector_t bloch_vector)
 {
     if (bloch_vector.mag() > 1.0)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "Beam::setPolarization: "
             "The given Bloch vector cannot represent a real physical ensemble");
     m_polarization = calculatePolarization(bloch_vector);
diff --git a/Core/Instrument/ConvolutionDetectorResolution.cpp b/Core/Instrument/ConvolutionDetectorResolution.cpp
index c8093bd6b10a93b46096696642d54a7af303f297..48c890dc2830759cc3e8e248d7bea555c01b9e98 100644
--- a/Core/Instrument/ConvolutionDetectorResolution.cpp
+++ b/Core/Instrument/ConvolutionDetectorResolution.cpp
@@ -71,7 +71,7 @@ void ConvolutionDetectorResolution::applyDetectorResolution(
         OutputData<double>* p_intensity_map) const
 {
     if (p_intensity_map->getRank() != m_dimension) {
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "ConvolutionDetectorResolution::applyDetectorResolution() -> Error! "
             "Intensity map must have same dimension as detector resolution function." );
     }
@@ -83,7 +83,7 @@ void ConvolutionDetectorResolution::applyDetectorResolution(
         apply2dConvolution(p_intensity_map);
         break;
     default:
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConvolutionDetectorResolution::applyDetectorResolution() -> Error! "
             "Class ConvolutionDetectorResolution must be initialized with dimension 1 or 2." );
     }
@@ -110,11 +110,11 @@ void ConvolutionDetectorResolution::init_parameters()
 void ConvolutionDetectorResolution::apply1dConvolution(OutputData<double>* p_intensity_map) const
 {
     if (m_res_function_1d==0)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConvolutionDetectorResolution::apply1dConvolution() -> Error! "
             "No 1d resolution function present for convolution of 1d data." );
     if (p_intensity_map->getRank() != 1)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConvolutionDetectorResolution::apply1dConvolution() -> Error! "
             "Number of axes for intensity map does not correspond to the dimension of the map." );
     const IAxis &axis = p_intensity_map->getAxis(0);
@@ -125,7 +125,7 @@ void ConvolutionDetectorResolution::apply1dConvolution(OutputData<double>* p_int
         return; // No convolution for sets of zero or one element
     // Construct kernel vector from resolution function
     if (axis.size() != data_size)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConvolutionDetectorResolution::apply1dConvolution() -> Error! "
             "Size of axis for intensity map does not correspond to size of data in the map." );
     double step_size = std::abs(axis[0]-axis[axis.size()-1])/(data_size-1);
@@ -147,11 +147,11 @@ void ConvolutionDetectorResolution::apply1dConvolution(OutputData<double>* p_int
 void ConvolutionDetectorResolution::apply2dConvolution(OutputData<double>* p_intensity_map) const
 {
     if (mp_res_function_2d==0)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConvolutionDetectorResolution::apply2dConvolution() -> Error! "
             "No 2d resolution function present for convolution of 2d data." );
     if (p_intensity_map->getRank() != 2)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConvolutionDetectorResolution::apply2dConvolution() -> Error! "
             "Number of axes for intensity map does not correspond to the dimension of the map." );
     const IAxis &axis_1 = p_intensity_map->getAxis(0);
@@ -165,7 +165,7 @@ void ConvolutionDetectorResolution::apply2dConvolution(OutputData<double>* p_int
     std::vector<std::vector<double> > source;
     size_t raw_data_size = raw_source_vector.size();
     if (raw_data_size != axis_size_1*axis_size_2)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ConvolutionDetectorResolution::apply2dConvolution() -> Error! "
             "Intensity map data size does not match the product of its axes' sizes" );
     for (auto it=raw_source_vector.begin(); it != raw_source_vector.end();it+=axis_size_2) {
diff --git a/Core/Instrument/Convolve.cpp b/Core/Instrument/Convolve.cpp
index e4561841b781ead7f7807c977725aad3a5e2b906..80a20131a3ae70f513ad6b88b5786aba74b0449c 100644
--- a/Core/Instrument/Convolve.cpp
+++ b/Core/Instrument/Convolve.cpp
@@ -131,7 +131,7 @@ void MathFunctions::Convolve::fftconvolve(
     double2d_t result2d;
     fftconvolve(source2d, kernel2d, result2d);
     if(result2d.size() != 1)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "MathFunctions::Convolve::fftconvolve -> Panic in 1d");
     result = result2d[0];
 }
@@ -146,7 +146,7 @@ void MathFunctions::Convolve::init(int h_src, int w_src, int h_kernel, int w_ker
         std::ostringstream os;
         os << "MathFunctions::Convolve::init() -> Panic! Wrong dimensions " <<
             h_src << " " << w_src << " " << h_kernel << " " << w_kernel << std::endl;
-        throw Exception::RuntimeErrorException(os.str());
+        throw Exceptions::RuntimeErrorException(os.str());
     }
 
     ws.clear();
@@ -254,20 +254,20 @@ void MathFunctions::Convolve::init(int h_src, int w_src, int h_kernel, int w_ker
     ws.p_forw_src = fftw_plan_dft_r2c_2d(ws.h_fftw, ws.w_fftw, ws.in_src,
                                          (fftw_complex*)ws.out_src, FFTW_ESTIMATE);
     if( ws.p_forw_src == nullptr )
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "MathFunctions::Convolve::init() -> Error! Can't initialise p_forw_src plan.");
 
     ws.p_forw_kernel = fftw_plan_dft_r2c_2d(ws.h_fftw, ws.w_fftw, ws.in_kernel,
                                             (fftw_complex*)ws.out_kernel, FFTW_ESTIMATE);
     if( ws.p_forw_kernel == nullptr )
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "MathFunctions::Convolve::init() -> Error! Can't initialise p_forw_kernel plan.");
 
     // The backward FFT takes ws.out_kernel as input
     ws.p_back = fftw_plan_dft_c2r_2d(
         ws.h_fftw, ws.w_fftw, (fftw_complex*)ws.out_kernel, ws.dst_fft, FFTW_ESTIMATE);
     if( ws.p_back == nullptr )
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "MathFunctions::Convolve::init() -> Error! Can't initialise p_back plan.");
 }
 
@@ -280,7 +280,7 @@ void MathFunctions::Convolve::fftw_circular_convolution(
     const double2d_t& src, const double2d_t& kernel)
 {
     if(ws.h_fftw <= 0 || ws.w_fftw <= 0)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "MathFunctions::Convolve::fftw_convolve() -> Panic! Initialisation is missed.");
 
     double * ptr, *ptr_end, *ptr2;
diff --git a/Core/Instrument/DetectionProperties.cpp b/Core/Instrument/DetectionProperties.cpp
index a284e6f5df57244e33b3ef273739a74c4471f67d..23e3c5430920490b7991d4ad11ef3aef07646ca1 100644
--- a/Core/Instrument/DetectionProperties.cpp
+++ b/Core/Instrument/DetectionProperties.cpp
@@ -26,7 +26,7 @@ void DetectionProperties::setAnalyzerProperties(const kvector_t direction, doubl
                                                double total_transmission)
 {
     if (!checkAnalyzerProperties(direction, efficiency, total_transmission))
-        throw Exception::ClassInitializationException("IDetector2D::setAnalyzerProperties: the "
+        throw Exceptions::ClassInitializationException("IDetector2D::setAnalyzerProperties: the "
                                                        "given properties are not physical");
 
     m_analyzer_operator = calculateAnalyzerOperator(direction, efficiency, total_transmission);
diff --git a/Core/Instrument/DetectorFunctions.cpp b/Core/Instrument/DetectorFunctions.cpp
index 9ca1a89c369e4080245fb7354d4339685f8ba017..297d047d620ef47c1d7fdc24cccdc74a33e8b3e5 100644
--- a/Core/Instrument/DetectorFunctions.cpp
+++ b/Core/Instrument/DetectorFunctions.cpp
@@ -72,7 +72,7 @@ std::unique_ptr<OutputData<double>> DetectorFunctions::createDataSet(const Instr
                 << "the detector. Real data:" << DetectorFunctions::axesToString(data)
                         << ", detector:"
                         << DetectorFunctions::axesToString(*instrument.getDetector()) << ".";
-        throw Exception::RuntimeErrorException(message.str());
+        throw Exceptions::RuntimeErrorException(message.str());
     }
 
     std::unique_ptr<OutputData<double>> result(instrument.createDetectorMap(units));
diff --git a/Core/Instrument/DetectorMask.cpp b/Core/Instrument/DetectorMask.cpp
index 8e73266b2b554d1cf197a38cc9f391c91386f3d9..a5cd51ceeae87fe2c854a2007858bd8e2fe1962c 100644
--- a/Core/Instrument/DetectorMask.cpp
+++ b/Core/Instrument/DetectorMask.cpp
@@ -55,7 +55,7 @@ void DetectorMask::addMask(const Geometry::IShape2D& shape, bool mask_value)
 void DetectorMask::initMaskData(const IDetector2D& detector)
 {
     if(detector.getDimension() != 2)
-        throw Exception::RuntimeErrorException("DetectorMask::initMaskData() -> Error. Attempt "
+        throw Exceptions::RuntimeErrorException("DetectorMask::initMaskData() -> Error. Attempt "
                                                 "to add masks to uninitialized detector.");
 
     assert(m_shapes.size() == m_mask_of_shape.size());
@@ -91,7 +91,7 @@ bool DetectorMask::isMasked(size_t index) const
         return false;
 
     if(index >= m_mask_data.getAllocatedSize())
-        throw Exception::RuntimeErrorException("DetectorMask::isMasked() -> Error. "
+        throw Exceptions::RuntimeErrorException("DetectorMask::isMasked() -> Error. "
                                               "Index is out of range "+std::to_string(index));
     return m_mask_data[index];
 }
diff --git a/Core/Instrument/Histogram2D.cpp b/Core/Instrument/Histogram2D.cpp
index 293636f58dd8424c57a975bc1e088b6b230a75bc..3f2e88e2c16d300917163ed4e64fa44b4e908b1d 100644
--- a/Core/Instrument/Histogram2D.cpp
+++ b/Core/Instrument/Histogram2D.cpp
@@ -50,7 +50,7 @@ Histogram2D::Histogram2D(const std::vector<std::vector<double>>& data)
     const size_t ncols = shape.second;
 
     if(nrows == 0 || ncols == 0)
-        throw Exception::LogicErrorException("Histogram2D::Histogram2D() -> Error. "
+        throw Exceptions::LogicErrorException("Histogram2D::Histogram2D() -> Error. "
                                               "Not a two-dimensional numpy array");
 
     m_data.addAxis(FixedBinAxis("x-axis", ncols, 0.0, static_cast<double>(ncols)));
@@ -149,7 +149,7 @@ void Histogram2D::addContent(const std::vector<std::vector<double> > &data)
              << ", " << ncols << "] doesn't mach histogram axes. "
              << "X-axis size: " << m_data.getAxis(BornAgain::X_AXIS_INDEX).size()
              << "Y-axis size: " << m_data.getAxis(BornAgain::Y_AXIS_INDEX).size();
-        throw Exception::LogicErrorException(ostr.str());
+        throw Exceptions::LogicErrorException(ostr.str());
     }
 
     for(size_t row=0; row<nrows; ++row) {
diff --git a/Core/Instrument/IDetector2D.cpp b/Core/Instrument/IDetector2D.cpp
index 9dda82469ebdd9c27f4e44c675b461f7ce70d8f5..9860b60556c45c56fa40040cfe2679652bc33129 100644
--- a/Core/Instrument/IDetector2D.cpp
+++ b/Core/Instrument/IDetector2D.cpp
@@ -51,7 +51,7 @@ const IAxis &IDetector2D::getAxis(size_t index) const
 {
     if (isCorrectAxisIndex(index))
         return *m_axes[index];
-    throw Exception::OutOfBoundsException("Not so many axes in this detector.");
+    throw Exceptions::OutOfBoundsException("Not so many axes in this detector.");
 }
 
 void IDetector2D::setDetectorParameters(size_t n_x, double x_min, double x_max,
@@ -74,7 +74,7 @@ void IDetector2D::setDetectorAxes(const IAxis &axis0, const IAxis &axis1)
 void IDetector2D::applyDetectorResolution(OutputData<double> *p_intensity_map) const
 {
     if (!p_intensity_map)
-        throw Exception::NullPointerException("IDetector2D::applyDetectorResolution() -> "
+        throw Exceptions::NullPointerException("IDetector2D::applyDetectorResolution() -> "
                                    "Error! Null pointer to intensity map");
     if (mP_detector_resolution)
         mP_detector_resolution->applyDetectorResolution(p_intensity_map);
@@ -108,7 +108,7 @@ OutputData<double> *IDetector2D::createDetectorIntensity(
 {
     std::unique_ptr<OutputData<double>> detectorMap(createDetectorMap(beam, units_type));
     if(!detectorMap)
-        throw Exception::RuntimeErrorException("Instrument::getDetectorIntensity() -> Error."
+        throw Exceptions::RuntimeErrorException("Instrument::getDetectorIntensity() -> Error."
                                     "Can't create detector map.");
 
     setDataToDetectorMap(*detectorMap.get(), elements);
@@ -246,7 +246,7 @@ size_t IDetector2D::getAxisBinIndex(size_t index, size_t selected_axis) const
         if(selected_axis == i_axis ) return result;
         remainder /= m_axes[i_axis]->size();
     }
-    throw Exception::LogicErrorException("IDetector2D::getAxisBinIndex() -> "
+    throw Exceptions::LogicErrorException("IDetector2D::getAxisBinIndex() -> "
                                           "Error! No axis with given number");
 }
 
@@ -308,7 +308,7 @@ void IDetector2D::calculateAxisRange(size_t axis_index, const Beam &beam,
         amax = -el_center_top.getQ(0.5, 1.0).z();
 
     } else {
-        throw Exception::RuntimeErrorException("IDetector2D::calculateAxisRange() -> Error. "
+        throw Exceptions::RuntimeErrorException("IDetector2D::calculateAxisRange() -> Error. "
                                                 "Unknown units " +std::to_string(units));
     }
 }
diff --git a/Core/Instrument/IHistogram.cpp b/Core/Instrument/IHistogram.cpp
index 0e5ee7946f4b1d6c58932b6667ee50c27323428a..1245e8815944a48e4cb7ef5c913647ea963410ff 100644
--- a/Core/Instrument/IHistogram.cpp
+++ b/Core/Instrument/IHistogram.cpp
@@ -240,7 +240,7 @@ IHistogram* IHistogram::createHistogram(const OutputData<double>& source)
         message << "IHistogram::createHistogram(const OutputData<double>& source) -> Error. ";
         message << "The rank of source " << source.getRank() << " ";
         message << "is not suitable for creation neither 1-dim nor 2-dim histograms.";
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
 }
 
@@ -260,7 +260,7 @@ void IHistogram::check_x_axis() const
         std::ostringstream message;
         message << "IHistogram::check_x_axis() -> Error. X-xis does not exist. ";
         message << "Rank of histogram " << getRank() << "." << std::endl;
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
 }
 
@@ -270,7 +270,7 @@ void IHistogram::check_y_axis() const
         std::ostringstream message;
         message << "IHistogram::check_y_axis() -> Error. Y-axis does not exist. ";
         message << "Rank of histogram " << getRank() << "." << std::endl;
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
 }
 
@@ -281,7 +281,7 @@ void IHistogram::init_from_data(const OutputData<double>& source)
         message << "IHistogram::IHistogram(const OutputData<double>& data) -> Error. ";
         message << "The dimension of this histogram " << getRank() << " ";
         message << "is differ from the dimension of source " << m_data.getRank() << std::endl;
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
 
     m_data.copyShapeFrom(source);
@@ -302,7 +302,7 @@ double IHistogram::getBinData(size_t i, IHistogram::DataType dataType) const
     } else if(dataType == DataType::NENTRIES) {
         return getBinNumberOfEntries(i);
     } else
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "IHistogram::getBinData() -> Error. Unknown data type.");
 }
 
@@ -321,7 +321,7 @@ std::vector<double> IHistogram::getDataVector(IHistogram::DataType dataType) con
 void IHistogram::copyContentFrom(const IHistogram& other)
 {
     if(!hasSameDimensions(other))
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "IHistogram::copyContentFrom() -> Error. Can't copy the data of different shape.");
     reset();
     for(size_t i=0; i<getTotalNumberOfBins(); ++i) {
@@ -354,7 +354,7 @@ bool IHistogram::hasSameDimensions(const IHistogram& other) const
 const IHistogram& IHistogram::operator+=(const IHistogram& right)
 {
     if(!hasSameDimensions(right))
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "IHistogram::operator+=() -> Error. Histograms have different dimension");
     for(size_t i=0; i<getTotalNumberOfBins(); ++i)
         addBinContent(i, right.getBinContent(i));
@@ -365,7 +365,7 @@ const IHistogram& IHistogram::operator+=(const IHistogram& right)
 IHistogram* IHistogram::relativeDifferenceHistogram(const IHistogram& rhs)
 {
     if(!hasSameDimensions(rhs))
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "IHistogram::relativeDifferenceHistogram() -> Error. "
             "Histograms have different dimensions");
 
diff --git a/Core/Instrument/IIntensityNormalizer.cpp b/Core/Instrument/IIntensityNormalizer.cpp
index 12f5db334fe6c4ea3204fee2395e9abf6cccb281..9c2be9c8d993bfa8a08789098ec627526f1c610c 100644
--- a/Core/Instrument/IIntensityNormalizer.cpp
+++ b/Core/Instrument/IIntensityNormalizer.cpp
@@ -46,7 +46,7 @@ void IntensityNormalizer::apply(OutputData<double>& data) const
         factor = *it;
     }
     if(factor == 0)
-        throw Exception::DivisionByZeroException(
+        throw Exceptions::DivisionByZeroException(
                 "IntensityNormalizer::apply() -> "
                 "Error! Maximum intensity is 0.");
 
diff --git a/Core/Instrument/Instrument.cpp b/Core/Instrument/Instrument.cpp
index 5fddc9cc6a47a68b831468bc58a95ed98d3ac8dd..b7d64d404eac19152f3a62e85e9ad0142bd5f41c 100644
--- a/Core/Instrument/Instrument.cpp
+++ b/Core/Instrument/Instrument.cpp
@@ -83,7 +83,7 @@ std::string Instrument::addParametersToExternalPool(
 void Instrument::initDetector()
 {
     if(!mP_detector)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "Instrument::initDetector() -> Error. Detector is not initialized.");
     getDetector()->init(getBeam());
 }
diff --git a/Core/Instrument/IntensityDataFunctions.cpp b/Core/Instrument/IntensityDataFunctions.cpp
index 1187480299d68779be88e28f4a367e6409fbb944..22d7c897e94b3e6ed96c0d2fc57fbb3e8cd3830f 100644
--- a/Core/Instrument/IntensityDataFunctions.cpp
+++ b/Core/Instrument/IntensityDataFunctions.cpp
@@ -30,7 +30,7 @@ double IntensityDataFunctions::getRelativeDifference(
     diff /= dat.getAllocatedSize();
 
     if (std::isnan(diff))
-        throw Exception::RuntimeErrorException("diff=NaN!");
+        throw Exceptions::RuntimeErrorException("diff=NaN!");
     return diff;
 }
 
@@ -48,7 +48,7 @@ IntensityDataFunctions::createRelativeDifferenceData(const OutputData<double>& d
                                                      const OutputData<double>& reference)
 {
     if(!data.hasSameDimensions(reference))
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "IntensityDataFunctions::createRelativeDifferenceData() -> "
             "Error. Different dimensions of data and reference.");
     OutputData<double> *result = reference.clone();
@@ -62,7 +62,7 @@ OutputData<double>* IntensityDataFunctions::createClippedDataSet(
         const OutputData<double>& origin, double x1, double y1, double x2, double y2)
 {
     if (origin.getRank() != 2)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "IntensityDataFunctions::createClippedData()"
             " -> Error! Works only on two-dimensional data");
 
@@ -101,7 +101,7 @@ OutputData<double>* IntensityDataFunctions::applyDetectorResolution(
     const OutputData<double>& origin, const IResolutionFunction2D& resolution_function)
 {
     if (origin.getRank() != 2)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "IntensityDataFunctions::applyDetectorResolution()"
             " -> Error! Works only on two-dimensional data");
     OutputData<double > *result = origin.clone();
diff --git a/Core/Instrument/IsGISAXSDetector.cpp b/Core/Instrument/IsGISAXSDetector.cpp
index 533bc256c47a3082d8843e34489a20383a40da26..5b9815576d544b4a793a772ca692a8abd82fc6f1 100644
--- a/Core/Instrument/IsGISAXSDetector.cpp
+++ b/Core/Instrument/IsGISAXSDetector.cpp
@@ -55,11 +55,11 @@ void IsGISAXSDetector::print(std::ostream &ostr) const
 IAxis *IsGISAXSDetector::createAxis(size_t index, size_t n_bins, double min, double max) const
 {
     if (max <= min) {
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "IsGISAXSDetector::createAxis() -> Error! max <= min");
     }
     if (n_bins == 0) {
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "IsGISAXSDetector::createAxis() -> Error! Number n_bins can't be zero.");
     }    return new CustomBinAxis(getAxisName(index), n_bins, min, max);
 }
diff --git a/Core/Instrument/LLData.h b/Core/Instrument/LLData.h
index 5362f9a42e8288669055fd9ed72a11a4c1dd85c8..73119f742e88859df81c5fe4204bba5bf006efee 100644
--- a/Core/Instrument/LLData.h
+++ b/Core/Instrument/LLData.h
@@ -148,7 +148,7 @@ inline const T& LLData<T>::atCoordinate(int* coordinate) const
 template<class T> LLData<T>& LLData<T>::operator+=(const LLData<T>& right)
 {
     if (!HaveSameDimensions(*this, right))
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "Operation += on LLData requires both operands to have the same dimensions");
     for (size_t i=0; i<getTotalSize(); ++i) {
         m_data_array[i] += right[i];
@@ -159,7 +159,7 @@ template<class T> LLData<T>& LLData<T>::operator+=(const LLData<T>& right)
 template<class T> LLData<T>& LLData<T>::operator-=(const LLData& right)
 {
     if (!HaveSameDimensions(*this, right))
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "Operation -= on LLData requires both operands to have the same dimensions");
     for (size_t i=0; i<getTotalSize(); ++i) {
         m_data_array[i] -= right[i];
@@ -170,7 +170,7 @@ template<class T> LLData<T>& LLData<T>::operator-=(const LLData& right)
 template<class T> LLData<T>& LLData<T>::operator*=(const LLData& right)
 {
     if (!HaveSameDimensions(*this, right))
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "Operation *= on LLData requires both operands to have the same dimensions");
     for (size_t i=0; i<getTotalSize(); ++i) {
         m_data_array[i] *= right[i];
@@ -181,7 +181,7 @@ template<class T> LLData<T>& LLData<T>::operator*=(const LLData& right)
 template<class T> LLData<T>& LLData<T>::operator/=(const LLData& right)
 {
     if (!HaveSameDimensions(*this, right))
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "Operation /= on LLData requires both operands to have the same dimensions");
     for (size_t i=0; i<getTotalSize(); ++i) {
         double ratio;
@@ -262,7 +262,7 @@ template<class T> void LLData<T>::clear()
 template<class T> inline int LLData<T>::checkPositiveDimension(int dimension) const
 {
     if (dimension<1) {
-        throw Exception::OutOfBoundsException("Dimension must be bigger than zero.");
+        throw Exceptions::OutOfBoundsException("Dimension must be bigger than zero.");
     }
     return dimension;
 }
diff --git a/Core/Instrument/NumpyUtils.cpp b/Core/Instrument/NumpyUtils.cpp
index 824a751687160fde562df8d4892af4207e20a977..8d2eb5744ec617ec41c5c565564100dff66c0a37 100644
--- a/Core/Instrument/NumpyUtils.cpp
+++ b/Core/Instrument/NumpyUtils.cpp
@@ -34,7 +34,7 @@ PyObject* Util::createNumpyArray(const std::vector<double>& data)
     PyObject *pyarray = PyArray_SimpleNew(ndim_numpy, ndimsizes_numpy, NPY_DOUBLE);
     delete [] ndimsizes_numpy;
     if(pyarray == nullptr )
-        throw Exception::RuntimeErrorException("ExportOutputData() -> Panic in PyArray_SimpleNew");
+        throw Exceptions::RuntimeErrorException("ExportOutputData() -> Panic in PyArray_SimpleNew");
     Py_INCREF(pyarray);
 
     // getting pointer to data buffer of numpy array
diff --git a/Core/Instrument/OutputData.cpp b/Core/Instrument/OutputData.cpp
index 3ea73d65766ca8bba9415aa20c439b9728e26de9..7537277de6a5010cb99b5bcf16d90ae43a5baf95 100644
--- a/Core/Instrument/OutputData.cpp
+++ b/Core/Instrument/OutputData.cpp
@@ -46,7 +46,7 @@ PyObject* OutputData<double>::getArray() const
     PyObject* pyarray = PyArray_SimpleNew(ndim_numpy, ndimsizes_numpy, NPY_DOUBLE);
     delete [] ndimsizes_numpy;
     if (pyarray == nullptr)
-        throw Exception::RuntimeErrorException("ExportOutputData() -> Panic in PyArray_SimpleNew");
+        throw Exceptions::RuntimeErrorException("ExportOutputData() -> Panic in PyArray_SimpleNew");
     Py_INCREF(pyarray);
 
     // getting pointer to data buffer of numpy array
diff --git a/Core/Instrument/OutputData.h b/Core/Instrument/OutputData.h
index 589bf598974bb93fb5dceddd9c541954b02a49a2..d34ada8228b885b0b94cc3ce0024bbaac3021161 100644
--- a/Core/Instrument/OutputData.h
+++ b/Core/Instrument/OutputData.h
@@ -329,7 +329,7 @@ template <class T>
 void OutputData<T>::addAxis(const IAxis& new_axis)
 {
     if( axisNameExists(new_axis.getName()) )
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "OutputData<T>::addAxis(const IAxis& new_axis) -> "
             "Error! Attempt to add axis with already existing name '" +
             new_axis.getName() + "'");
@@ -343,7 +343,7 @@ template <class T>
 void OutputData<T>::addAxis(const std::string& name, size_t size, double start, double end)
 {
     if( axisNameExists(name) )
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "OutputData<T>::addAxis(std::string name) -> "
             "Error! Attempt to add axis with already existing name '" +
             name+"'");
@@ -434,7 +434,7 @@ int OutputData<T>::getAxisBinIndex(size_t global_index, size_t i_selected_axis)
         if(i_selected_axis == i_axis ) return result;
         remainder /= m_value_axes[i_axis]->size();
     }
-    throw Exception::LogicErrorException("OutputData<T>::getAxisBinIndex() -> "
+    throw Exceptions::LogicErrorException("OutputData<T>::getAxisBinIndex() -> "
                                           "Error! No axis with given number");
 }
 
@@ -450,7 +450,7 @@ size_t OutputData<T>::toGlobalIndex(const std::vector<int> &axes_indices) const
 {
     assert(mp_ll_data);
     if (axes_indices.size() != mp_ll_data->getRank())
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "size_t OutputData<T>::toGlobalIndex() -> "
             "Error! Number of coordinates must match rank of data structure");
     size_t result = 0;
@@ -462,7 +462,7 @@ size_t OutputData<T>::toGlobalIndex(const std::vector<int> &axes_indices) const
             message << axes_indices[i-1] << " is out of range. Axis ";
             message << m_value_axes[i-1]->getName();
             message << " size " << m_value_axes[i-1]->size() << ".\n";
-            throw Exception::LogicErrorException(message.str());
+            throw Exceptions::LogicErrorException(message.str());
         }
         result += axes_indices[i-1]*step_size;
         step_size *= m_value_axes[i-1]->size();
@@ -475,7 +475,7 @@ size_t OutputData<T>::findGlobalIndex(const std::vector<double> &coordinates) co
 {
     assert(mp_ll_data);
     if (coordinates.size() != mp_ll_data->getRank())
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "OutputData<T>::findClosestIndex() -> "
             "Error! Number of coordinates must match rank of data structure");
     std::vector<int> axes_indexes;
@@ -539,7 +539,7 @@ template <class T>
 void OutputData<T>::setAllTo(const T& value)
 {
     if(!mp_ll_data)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "OutputData::setAllTo() -> Error! Low-level data object was not yet initialized.");
     mp_ll_data->setAll(value);
 }
@@ -548,7 +548,7 @@ template <class T>
 void OutputData<T>::scaleAll(const T& factor)
 {
     if(!mp_ll_data)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "OutputData::scaleAll() -> Error! Low-level data object was not yet initialized.");
     mp_ll_data->scaleAll(factor);
 }
@@ -625,7 +625,7 @@ template<class T>
 inline void OutputData<T>::setRawDataVector(const std::vector<T>& data_vector)
 {
     if (data_vector.size() != getAllocatedSize())
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "OutputData<T>::setRawDataVector() -> Error! "
             "setRawDataVector can only be called with a data vector of the correct size." );
     for (size_t i=0; i<getAllocatedSize(); ++i)
@@ -676,7 +676,7 @@ size_t OutputData<T>::getAxisIndex(const std::string &axis_name) const
 {
     for (size_t i = 0; i < m_value_axes.size(); ++i)
         if (m_value_axes[i]->getName() == axis_name) return i;
-    throw Exception::LogicErrorException(
+    throw Exceptions::LogicErrorException(
         "OutputData<T>::getAxisIndex() -> "
         "Error! Axis with given name not found '"+axis_name+std::string("'"));
 }
diff --git a/Core/Instrument/RectangularDetector.cpp b/Core/Instrument/RectangularDetector.cpp
index 66b729e8e8977df8e2601e1765270a0e1ee351c6..1886a606deba421a5b85f45e58b8d62436c26bab 100644
--- a/Core/Instrument/RectangularDetector.cpp
+++ b/Core/Instrument/RectangularDetector.cpp
@@ -217,10 +217,10 @@ void RectangularDetector::print(std::ostream& ostr) const
 IAxis *RectangularDetector::createAxis(size_t index, size_t n_bins, double min, double max) const
 {
     if (max <= min)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "RectangularDetector::createAxis() -> Error! max <= min");
     if (n_bins == 0)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "RectangularDetector::createAxis() -> Error! Number n_bins can't be zero.");
     return new FixedBinAxis(getAxisName(index), n_bins, min, max);
 }
@@ -270,7 +270,7 @@ std::string RectangularDetector::getAxisName(size_t index) const
     case 1:
         return BornAgain::V_AXIS_NAME;
     default:
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "RectangularDetector::getAxisName(size_t index) -> Error! index > 1");
     }
 }
@@ -303,7 +303,7 @@ void RectangularDetector::setDistanceAndOffset(double distance, double u0, doubl
         std::ostringstream message;
         message << "RectangularDetector::setPerpendicularToSample() -> Error. "
                 << "Distance to sample can't be negative or zero";
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
     m_distance = distance;
     m_u0 = u0;
@@ -337,7 +337,7 @@ void RectangularDetector::initNormalVector(const kvector_t central_k)
     }
 
     else {
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "RectangularDetector::init() -> Unknown detector arrangement");
     }
 }
diff --git a/Core/Instrument/RegionOfInterest.cpp b/Core/Instrument/RegionOfInterest.cpp
index 937cb5db7eba9d09383abe187eef063c78fe7952..8e09de37f9b8ed24c5abc572877720d9f0ce170e 100644
--- a/Core/Instrument/RegionOfInterest.cpp
+++ b/Core/Instrument/RegionOfInterest.cpp
@@ -31,7 +31,7 @@ RegionOfInterest::RegionOfInterest(const OutputData<double> &data,
     : RegionOfInterest(xlow, ylow, xup, yup)
 {
     if(data.getRank() != 2)
-        throw Exception::RuntimeErrorException("RegionOfInterest::RegionOfInterest() -> Error. "
+        throw Exceptions::RuntimeErrorException("RegionOfInterest::RegionOfInterest() -> Error. "
                                                 "Data is not two-dimensional.");
 
     initFrom(data.getAxis(BornAgain::X_AXIS_INDEX), data.getAxis(BornAgain::Y_AXIS_INDEX));
@@ -101,11 +101,11 @@ size_t RegionOfInterest::roiIndex(size_t globalIndex) const
 {
     size_t ny = ycoord(globalIndex, m_detector_dims);
     if(ny < m_ay1 || ny > m_ay2)
-        throw Exception::RuntimeErrorException("RegionOfInterest::roiIndex() -> Error.");
+        throw Exceptions::RuntimeErrorException("RegionOfInterest::roiIndex() -> Error.");
 
     size_t nx = xcoord(globalIndex, m_detector_dims);
     if(nx < m_ax1 || nx > m_ax2)
-        throw Exception::RuntimeErrorException("RegionOfInterest::roiIndex() -> Error.");
+        throw Exceptions::RuntimeErrorException("RegionOfInterest::roiIndex() -> Error.");
 
     return ny - m_ay1 + (nx - m_ax1)*m_roi_dims[1];
 }
diff --git a/Core/Instrument/SimulationArea.cpp b/Core/Instrument/SimulationArea.cpp
index aeb5836c1f9cceacb07181687a1f12e7b64acdec..32a80073a2caf1869c0baa1864794e04f719f72f 100644
--- a/Core/Instrument/SimulationArea.cpp
+++ b/Core/Instrument/SimulationArea.cpp
@@ -27,11 +27,11 @@ SimulationArea::SimulationArea(const IDetector2D *detector)
     , m_max_index(0)
 {
     if(detector == nullptr)
-        throw Exception::RuntimeErrorException("SimulationArea::SimulationArea -> Error. "
+        throw Exceptions::RuntimeErrorException("SimulationArea::SimulationArea -> Error. "
                                                 "Detector nullptr.");
 
     if (m_detector->getDimension()!=2)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "SimulationArea::SimulationArea: detector is not two-dimensional");
 
     if(m_detector->regionOfInterest())
@@ -56,7 +56,7 @@ bool SimulationArea::isMasked(size_t index) const
         std::ostringstream message;
         message << "SimulationArea::isActive() -> Error. Index " << index << " is out of range, "
              << "totalSize=" << totalSize();
-        throw Exception::RuntimeErrorException(message.str());
+        throw Exceptions::RuntimeErrorException(message.str());
     }
 
     return m_detector->getDetectorMask()->isMasked(detectorIndex(index));
diff --git a/Core/Instrument/SimulationAreaIterator.cpp b/Core/Instrument/SimulationAreaIterator.cpp
index dcab09d1c12450ee94f7058ca134fc59a14aaa8b..0f67121063b9c60c67ddca793a6dd02c47a6cc5c 100644
--- a/Core/Instrument/SimulationAreaIterator.cpp
+++ b/Core/Instrument/SimulationAreaIterator.cpp
@@ -23,7 +23,7 @@ SimulationAreaIterator::SimulationAreaIterator(const SimulationArea *area, size_
     , m_element_index(0)
 {
     if(m_index > m_area->totalSize())
-        throw Exception::RuntimeErrorException("SimulationAreaIterator::SimulationAreaIterator() "
+        throw Exceptions::RuntimeErrorException("SimulationAreaIterator::SimulationAreaIterator() "
                                                 "-> Error. Invalid initial index");
 
     if(m_index != m_area->totalSize() && m_area->isMasked(m_index))
diff --git a/Core/Instrument/SphericalDetector.cpp b/Core/Instrument/SphericalDetector.cpp
index 2b496dbe9e098ac461dac16d08ed8e339ccc0814..656fbe4a8dc712377c76b1894e0d6dc03aad653f 100644
--- a/Core/Instrument/SphericalDetector.cpp
+++ b/Core/Instrument/SphericalDetector.cpp
@@ -96,10 +96,10 @@ void SphericalDetector::print(std::ostream& ostr) const
 IAxis* SphericalDetector::createAxis(size_t index, size_t n_bins, double min, double max) const
 {
     if (max <= min)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "SphericalDetector::createAxis() -> Error! max <= min");
     if (n_bins == 0)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "SphericalDetector::createAxis() -> Error! Number n_bins can't be zero.");
     return new FixedBinAxis(getAxisName(index), n_bins, min, max);
 }
@@ -127,7 +127,7 @@ std::string SphericalDetector::getAxisName(size_t index) const
     case 1:
         return BornAgain::ALPHA_AXIS_NAME;
     default:
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "SphericalDetector::getAxisName(size_t index) -> Error! index > 1");
     }
 }
diff --git a/Core/Mask/Ellipse.cpp b/Core/Mask/Ellipse.cpp
index c9591edfb5666ba1a00a5eeb741f1570244c461d..3a6d1c6e49a7540fbeeb8143241f5f5c9b86507a 100644
--- a/Core/Mask/Ellipse.cpp
+++ b/Core/Mask/Ellipse.cpp
@@ -33,7 +33,7 @@ Ellipse::Ellipse(double xcenter, double ycenter, double xradius, double yradius,
     , m_theta(theta)
 {
     if(xradius <= 0.0 || yradius <= 0.0)
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "Ellipse::Ellipse(double xcenter, double ycenter, double xradius, double yradius) "
             "-> Error. Radius can't be negative\n");
 }
diff --git a/Core/Mask/Polygon.cpp b/Core/Mask/Polygon.cpp
index 005e40856f1dc000bf866f871a850edecde18c88..cbb28587491461978282c860a62a567818544f9c 100644
--- a/Core/Mask/Polygon.cpp
+++ b/Core/Mask/Polygon.cpp
@@ -40,7 +40,7 @@ public:
 void PolygonPrivate::init_from(const std::vector<double>& x, const std::vector<double>& y)
 {
     if(x.size() != y.size())
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "Polygon::Polygon(const std::vector<double>& x, const std::vector<double>& y) "
             "Error. Sizes of arrays must conincide.");
     std::vector<point_t> points;
@@ -86,7 +86,7 @@ Polygon::Polygon(const std::vector<std::vector<double>>& points)
     std::vector<double> y;
     for(size_t i=0; i<points.size(); ++i) {
         if(points[i].size() != 2)
-            throw Exception::LogicErrorException(
+            throw Exceptions::LogicErrorException(
                 "Polygon(const std::vector<std::vector<double> >& points) -> Error. "
                 " Should be two-dimensional array with second dimension of 2 size.");
         x.push_back(points[i][0]);
diff --git a/Core/Mask/Rectangle.cpp b/Core/Mask/Rectangle.cpp
index f9cbcff274ac7f6898644ba9f5784c6bc6728b82..eae931583d276b6e183c65f389530315dfd03f38 100644
--- a/Core/Mask/Rectangle.cpp
+++ b/Core/Mask/Rectangle.cpp
@@ -30,13 +30,13 @@ Rectangle::Rectangle(double xlow, double ylow, double xup, double yup)
         std::ostringstream message;
         message << "Rectangle(double xlow, double ylow, double xup, double yup) -> Error. ";
         message << " xup <= xlow" << std::endl;
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
     if(yup <= ylow) {
         std::ostringstream message;
         message << "Rectangle(double xlow, double ylow, double xup, double yup) -> Error. ";
         message << " yup <= ylow" << std::endl;
-        throw Exception::LogicErrorException(message.str());
+        throw Exceptions::LogicErrorException(message.str());
     }
     m_xlow = xlow;
     m_ylow = ylow;
diff --git a/Core/Material/IMaterial.cpp b/Core/Material/IMaterial.cpp
index 7f9d58ac09ce0aff5f2af265a4022829d91af583..f54958c6615f36ea520af11ca51e7c624efac7ab 100644
--- a/Core/Material/IMaterial.cpp
+++ b/Core/Material/IMaterial.cpp
@@ -19,14 +19,14 @@
 
 IMaterial *IMaterial::clone() const
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "IMaterial is an interface and should not be cloned!");
 }
 
 /*
 const IMaterial *IMaterial::createTransformedMaterial(const IRotation&) const
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "IMaterial is an interface and should not be created!");
 }
 */
diff --git a/Core/Multilayer/DecouplingApproximationStrategy.cpp b/Core/Multilayer/DecouplingApproximationStrategy.cpp
index a66f2d9602c11eef2174c157583e79e052a69332..32c1d6a2656818cca28e1beedabb2ee742e9737e 100644
--- a/Core/Multilayer/DecouplingApproximationStrategy.cpp
+++ b/Core/Multilayer/DecouplingApproximationStrategy.cpp
@@ -35,7 +35,7 @@ double DecouplingApproximationStrategy1::evaluateForList(
     for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
         complex_t ff = m_precomputed_ff1[i];
         if (std::isnan(ff.real()))
-            throw Exception::RuntimeErrorException(
+            throw Exceptions::RuntimeErrorException(
                 "DecouplingApproximationStrategy::evaluateForList() -> Error! Amplitude is NaN");
         double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance;
         amplitude += fraction * ff;
@@ -62,7 +62,7 @@ double DecouplingApproximationStrategy2::evaluateForList(
     for (size_t i = 0; i < m_formfactor_wrappers.size(); ++i) {
         Eigen::Matrix2cd ff = m_precomputed_ff2[i];
         if (!ff.allFinite())
-            throw Exception::RuntimeErrorException(
+            throw Exceptions::RuntimeErrorException(
                 "DecouplingApproximationStrategy::evaluateForList() -> "
                 "Error! Form factor contains NaN or infinite");
         double fraction = m_formfactor_wrappers[i]->m_abundance / m_total_abundance;
diff --git a/Core/Multilayer/FormFactorDWBAPol.cpp b/Core/Multilayer/FormFactorDWBAPol.cpp
index b18630c57cf96cb821a74afb12bffde00fc7d4eb..64d99fadda69001cede681358fb29fe3b56a5fcc 100644
--- a/Core/Multilayer/FormFactorDWBAPol.cpp
+++ b/Core/Multilayer/FormFactorDWBAPol.cpp
@@ -46,7 +46,7 @@ FormFactorDWBAPol* FormFactorDWBAPol::clone() const
 
 complex_t FormFactorDWBAPol::evaluate(const WavevectorInfo&) const
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "FormFactorDWBAPol::evaluate: should never be called for matrix interactions");
 }
 
diff --git a/Core/Multilayer/IInterferenceFunctionStrategy.cpp b/Core/Multilayer/IInterferenceFunctionStrategy.cpp
index 7d286fdd52fd77d7f5eb468ee6200f29fb024de9..b05f0b1912cb1c86cc82be4595acd30ac30bc0e1 100644
--- a/Core/Multilayer/IInterferenceFunctionStrategy.cpp
+++ b/Core/Multilayer/IInterferenceFunctionStrategy.cpp
@@ -46,7 +46,7 @@ void IInterferenceFunctionStrategy::init(
     const LayerSpecularInfo& specular_info)
 {
     if (weighted_formfactors.size()==0)
-        throw Exception::ClassInitializationException("Bug: Decorated layer has no formfactors.");
+        throw Exceptions::ClassInitializationException("Bug: Decorated layer has no formfactors.");
     m_formfactor_wrappers = weighted_formfactors;
     mP_iff.reset(iff.clone());
 
diff --git a/Core/Multilayer/ILayerRTCoefficients.h b/Core/Multilayer/ILayerRTCoefficients.h
index 17827fc7f946d56e95423e3efb5ef8a7d8dabbb3..380ace84392ac44ffe4b5feb9f0b8f95bcdb0304 100644
--- a/Core/Multilayer/ILayerRTCoefficients.h
+++ b/Core/Multilayer/ILayerRTCoefficients.h
@@ -47,15 +47,15 @@ public:
     //! be used when the derived object is really scalar
 #endif
     virtual complex_t getScalarT() const {
-        throw Exception::NotImplementedException("ILayerRTCoefficients::"
+        throw Exceptions::NotImplementedException("ILayerRTCoefficients::"
                 "getScalarT(): coefficients are not scalar.");
     }
     virtual complex_t getScalarR() const {
-        throw Exception::NotImplementedException("ILayerRTCoefficients::"
+        throw Exceptions::NotImplementedException("ILayerRTCoefficients::"
                 "getScalarR(): coefficients are not scalar.");
     }
     virtual complex_t getScalarKz() const {
-        throw Exception::NotImplementedException("ILayerRTCoefficients::"
+        throw Exceptions::NotImplementedException("ILayerRTCoefficients::"
                 "getScalarKz(): coefficients are not scalar.");
     }
 };
diff --git a/Core/Multilayer/Layer.cpp b/Core/Multilayer/Layer.cpp
index ae7871f1578011bdb648bc86d4f3f89412d9eed6..470fea0d0bb9406911b9cfe649f3ff41136525e5 100644
--- a/Core/Multilayer/Layer.cpp
+++ b/Core/Multilayer/Layer.cpp
@@ -77,7 +77,7 @@ std::string Layer::to_str(int indent) const
 void Layer::setThickness(double thickness)
 {
     if (thickness < 0.)
-        throw Exception::DomainErrorException("Layer thickness cannot be negative");
+        throw Exceptions::DomainErrorException("Layer thickness cannot be negative");
     m_thickness = thickness;
 }
 
diff --git a/Core/Multilayer/LayerInterface.cpp b/Core/Multilayer/LayerInterface.cpp
index 262dd63475d4d993324eec6b9025f5ca8f97f595..8b0877045de3e9bc2243aa79ff40f8cf7a967f57 100644
--- a/Core/Multilayer/LayerInterface.cpp
+++ b/Core/Multilayer/LayerInterface.cpp
@@ -34,7 +34,7 @@ LayerInterface::~LayerInterface()
 
 LayerInterface* LayerInterface::clone() const
 {
-    throw Exception::NotImplementedException("LayerInterface::clone() -> Not allowed to clone.");
+    throw Exceptions::NotImplementedException("LayerInterface::clone() -> Not allowed to clone.");
 }
 
 LayerInterface* LayerInterface::createSmoothInterface(
diff --git a/Core/Multilayer/LayerStrategyBuilder.cpp b/Core/Multilayer/LayerStrategyBuilder.cpp
index 703d9410e84455f1fd415bed741ab6b728491f2e..c93700cf20299c2776def8ce26594f5ffeab4f1b 100644
--- a/Core/Multilayer/LayerStrategyBuilder.cpp
+++ b/Core/Multilayer/LayerStrategyBuilder.cpp
@@ -66,7 +66,7 @@ IInterferenceFunctionStrategy* LayerStrategyBuilder::createStrategy() const
     {
         double kappa = P_interference_function->getKappa();
         if (kappa<=0.0)
-            throw Exception::ClassInitializationException(
+            throw Exceptions::ClassInitializationException(
                 "SSCA requires a nontrivial interference function "
                 "with a strictly positive coupling coefficient kappa");
         if (m_polarized)
@@ -76,11 +76,11 @@ IInterferenceFunctionStrategy* LayerStrategyBuilder::createStrategy() const
         break;
     }
     default:
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "Unknown interference function approximation");
     }
     if (!p_result)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "Could not create appropriate strategy");
     p_result->init(ff_wrappers, *P_interference_function, *mP_specular_info);
     return p_result;
diff --git a/Core/Multilayer/MultiLayer.cpp b/Core/Multilayer/MultiLayer.cpp
index 23394d3bbbe2738f4c51d74fbeb37bfa40b1a440..e94c410c00ae8cf5748763155ea17ee3b5f5bdef 100644
--- a/Core/Multilayer/MultiLayer.cpp
+++ b/Core/Multilayer/MultiLayer.cpp
@@ -205,7 +205,7 @@ double MultiLayer::getCrossCorrSpectralFun(const kvector_t kvec, size_t j, size_
 void MultiLayer::setLayerThickness(size_t i_layer, double thickness)
 {
     if (thickness < 0.)
-        throw Exception::DomainErrorException("Layer thickness cannot be negative");
+        throw Exceptions::DomainErrorException("Layer thickness cannot be negative");
 
     m_layers[ check_layer_index(i_layer) ]->setThickness(thickness);
     // recalculating z-coordinates of layers
@@ -287,14 +287,14 @@ void MultiLayer::setNLayersInLayers() const
 size_t MultiLayer::check_layer_index(size_t i_layer) const
 {
     if (i_layer >= m_layers.size())
-        throw Exception::OutOfBoundsException("Layer index is out of bounds");
+        throw Exceptions::OutOfBoundsException("Layer index is out of bounds");
     return i_layer;
 }
 
 size_t MultiLayer::check_interface_index(size_t i_interface) const
 {
     if (i_interface >= m_interfaces.size())
-        throw Exception::OutOfBoundsException("Interface index is out of bounds");
+        throw Exceptions::OutOfBoundsException("Interface index is out of bounds");
     return i_interface;
 }
 
@@ -328,6 +328,6 @@ double MultiLayer::getLayerThickness(size_t i_layer) const
 void MultiLayer::setCrossCorrLength(double crossCorrLength)
 {
     if (crossCorrLength<0.0)
-        throw Exception::LogicErrorException("Attempt to set crossCorrLength to negative value");
+        throw Exceptions::LogicErrorException("Attempt to set crossCorrLength to negative value");
     m_crossCorrLength = crossCorrLength;
 }
diff --git a/Core/Multilayer/SSCApproximationStrategy.cpp b/Core/Multilayer/SSCApproximationStrategy.cpp
index b805e98f570350224bcfac53a9a9f5e2abe4453d..55e0d49191385821f0c581b4ab420f0deca44acb 100644
--- a/Core/Multilayer/SSCApproximationStrategy.cpp
+++ b/Core/Multilayer/SSCApproximationStrategy.cpp
@@ -45,7 +45,7 @@ complex_t SSCApproximationStrategy::getCharacteristicDistribution(double qp) con
     const InterferenceFunctionRadialParaCrystal *p_iff
         = dynamic_cast<const InterferenceFunctionRadialParaCrystal*>(mP_iff.get());
     if (p_iff == 0)
-        throw Exception::ClassInitializationException("Wrong interference function for SSCA");
+        throw Exceptions::ClassInitializationException("Wrong interference function for SSCA");
     return p_iff->FTPDF(qp);
 }
 
diff --git a/Core/Parametrization/DistributionHandler.cpp b/Core/Parametrization/DistributionHandler.cpp
index ebddd3c04ff9ee33d8404b94016080a82d798c9d..0834daa9a56faa79ef8e013c3b8ce9c67c4dee3b 100644
--- a/Core/Parametrization/DistributionHandler.cpp
+++ b/Core/Parametrization/DistributionHandler.cpp
@@ -56,7 +56,7 @@ size_t DistributionHandler::getTotalNumberOfSamples() const
 double DistributionHandler::setParameterValues(ParameterPool* p_parameter_pool, size_t index)
 {
     if (index >= m_nbr_combinations)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
                 "DistributionWeighter::setParameterValues: "
                 "index must be smaller than the total number of parameter combinations");
     size_t n_distr = m_distributions.size();
@@ -69,7 +69,7 @@ double DistributionHandler::setParameterValues(ParameterPool* p_parameter_pool,
                 m_distributions[param_index].getMainParameterName(),
                 m_cached_samples[param_index][remainder].value);
         if (changed != 1) {
-            throw Exception::RuntimeErrorException(
+            throw Exceptions::RuntimeErrorException(
                     "DistributionWeighter::setParameterValues: "
                     "parameter name matches nothing or more than "
                     "one parameter");
diff --git a/Core/Parametrization/Distributions.cpp b/Core/Parametrization/Distributions.cpp
index db51a8e156f6ae2d6e63cd944b31b0f023a01288..79e23f53def305f0ddfafedc74c73d8b5c137a94 100644
--- a/Core/Parametrization/Distributions.cpp
+++ b/Core/Parametrization/Distributions.cpp
@@ -24,14 +24,14 @@ using namespace BornAgain;
 
 IDistribution1D* IDistribution1D::clone() const
 {
-    throw Exception::NotImplementedException("IDistribution1D cannot be cloned");
+    throw Exceptions::NotImplementedException("IDistribution1D cannot be cloned");
 }
 
 std::vector<ParameterSample> IDistribution1D::generateSamples(
     size_t nbr_samples, double sigma_factor, const RealLimits &limits) const
 {
     if (nbr_samples == 0)
-        throw Exception::OutOfBoundsException("IDistribution1D::generateSamples: number "
+        throw Exceptions::OutOfBoundsException("IDistribution1D::generateSamples: number "
                                    "of generated samples must be bigger than zero");
     if (isDelta()) {
         std::vector<ParameterSample> result = { getMeanSample() };
@@ -45,7 +45,7 @@ std::vector<ParameterSample> IDistribution1D::generateSamples(
     size_t nbr_samples, double xmin, double xmax) const
 {
     if (nbr_samples == 0)
-        throw Exception::OutOfBoundsException("IDistribution1D::generateSamples: number "
+        throw Exceptions::OutOfBoundsException("IDistribution1D::generateSamples: number "
                                    "of generated samples must be bigger than zero");
     if (isDelta()) {
         std::vector<ParameterSample> result = { getMeanSample() };
@@ -81,7 +81,7 @@ ParameterSample IDistribution1D::getMeanSample() const
 
 void IDistribution1D::SignalBadInitialization(std::string distribution_name)
 {
-    throw Exception::ClassInitializationException(
+    throw Exceptions::ClassInitializationException(
         distribution_name +": not correctly initialized");
 }
 
@@ -94,7 +94,7 @@ void IDistribution1D::adjustMinMaxForLimits(
         std::ostringstream ostr;
         ostr << "IDistribution1D::adjustMinMaxForLimits() -> Error. Can't' adjust ";
         ostr << "xmin:" << xmin << " xmax:" << xmax << " for given limits " << limits << std::endl;
-        throw Exception::DomainErrorException(ostr.str());
+        throw Exceptions::DomainErrorException(ostr.str());
     }
 }
 
@@ -111,7 +111,7 @@ std::vector<ParameterSample> IDistribution1D::generateSamplesFromValues(
         norm_factor += pdf;
     }
     if (norm_factor <= 0.0)
-        throw Exception::RuntimeErrorException("IDistribution1D::generateSamples: "
+        throw Exceptions::RuntimeErrorException("IDistribution1D::generateSamples: "
                                     "total probability must be bigger than zero");
     for (size_t i=0; i<sample_values.size(); ++i) {
         result[i].weight /= norm_factor;
diff --git a/Core/Parametrization/ParameterDistribution.cpp b/Core/Parametrization/ParameterDistribution.cpp
index 76e899de6bd64dd869bfc136774d3c3b37145d61..04f5060d1e798a74e39877515d432a7885b9b151 100644
--- a/Core/Parametrization/ParameterDistribution.cpp
+++ b/Core/Parametrization/ParameterDistribution.cpp
@@ -30,12 +30,12 @@ ParameterDistribution::ParameterDistribution(const std::string &par_name,
 {
     mP_distribution.reset(distribution.clone());
     if (m_sigma_factor < 0.0) {
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
                 "ParameterDistribution::ParameterDistribution() -> Error."
                 "sigma factor cannot be negative");
     }
     if(nbr_samples == 0) {
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
                     "ParameterDistribution::ParameterDistribution() -> Error."
                     "Number of samples can't be zero.");
     }
@@ -53,17 +53,17 @@ ParameterDistribution::ParameterDistribution(const std::string &par_name,
 {
     mP_distribution.reset(distribution.clone());
     if (m_sigma_factor < 0.0) {
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
                 "ParameterDistribution::ParameterDistribution() -> Error."
                 "sigma factor cannot be negative");
     }
     if(nbr_samples == 0) {
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
                     "ParameterDistribution::ParameterDistribution() -> Error."
                     "Number of samples can't be zero.");
     }
     if(xmin >=xmax) {
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
                     "ParameterDistribution::ParameterDistribution() -> Error."
                     "xmin>=xmax");
     }
diff --git a/Core/Particle/ParticleComposition.cpp b/Core/Particle/ParticleComposition.cpp
index 65ceb98e832ffca84c8289bc0e44ddee5f457e14..e7b49174cf00591160f982fa6ba30e89387e7882 100644
--- a/Core/Particle/ParticleComposition.cpp
+++ b/Core/Particle/ParticleComposition.cpp
@@ -146,7 +146,7 @@ kvector_t ParticleComposition::getParticlePosition(size_t index) const
 
 size_t ParticleComposition::check_index(size_t index) const
 {
-    return index < m_particles.size() ? index : throw Exception::OutOfBoundsException(
+    return index < m_particles.size() ? index : throw Exceptions::OutOfBoundsException(
         "ParticleComposition::check_index() -> Index is out of bounds");
 }
 
@@ -154,7 +154,7 @@ void ParticleComposition::checkParticleType(const IParticle &p_particle)
 {
     const ParticleDistribution* p_distr = dynamic_cast<const ParticleDistribution*>(&p_particle);
     if (p_distr)
-        throw Exception::ClassInitializationException("ParticleComposition::checkParticleType: "
+        throw Exceptions::ClassInitializationException("ParticleComposition::checkParticleType: "
                                                        "cannot add ParticleDistribution!");
 }
 
diff --git a/Core/Particle/ParticleDistribution.cpp b/Core/Particle/ParticleDistribution.cpp
index a8c0e45bed2e5c578c3a3f53d832363977da29f1..fdfef3b9a19c2f24262791cf2c2d6402172ba341 100644
--- a/Core/Particle/ParticleDistribution.cpp
+++ b/Core/Particle/ParticleDistribution.cpp
@@ -41,7 +41,7 @@ ParticleDistribution* ParticleDistribution::clone() const
 
 ParticleDistribution* ParticleDistribution::cloneInvertB() const
 {
-    throw Exception::NotImplementedException("ParticleDistribution::"
+    throw Exceptions::NotImplementedException("ParticleDistribution::"
                                               "cloneInvertB: should never be called");
 }
 
@@ -76,7 +76,7 @@ void ParticleDistribution::generateParticles(
     std::vector<RealParameter*> main_par_matches
         = P_pool->getMatchedParameters(main_par_name);
     if (main_par_matches.size() != 1)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "ParticleDistribution::generateParticles: "
             "main parameter name matches nothing or more than one parameter");
     RealParameter* main_par = main_par_matches[0];
@@ -88,7 +88,7 @@ void ParticleDistribution::generateParticles(
         std::vector<RealParameter*> linked_par_matches
             = P_pool->getMatchedParameters(linked_par_names[i]);
         if (linked_par_matches.size() != 1)
-            throw Exception::RuntimeErrorException(
+            throw Exceptions::RuntimeErrorException(
                 "ParticleDistribution::generateParticles: "
                 "linked parameter name matches nothing or more than one parameter");
         RealParameter* linked_par = linked_par_matches[0];
@@ -103,7 +103,7 @@ void ParticleDistribution::generateParticles(
         std::unique_ptr<ParameterPool> P_new_pool(p_particle_clone->createParameterTree());
         int changed = P_new_pool->setMatchedParametersValue(main_par_name, main_sample.value);
         if (changed != 1)
-            throw Exception::RuntimeErrorException(
+            throw Exceptions::RuntimeErrorException(
                 "ParticleDistribution::generateParticles: "
                 "main parameter name matches nothing or more than one parameter");
         for (std::map<std::string, double>::const_iterator it = linked_par_ratio_map.begin();
@@ -111,7 +111,7 @@ void ParticleDistribution::generateParticles(
             double new_linked_value = main_sample.value * it->second;
             changed = P_new_pool->setMatchedParametersValue(it->first, new_linked_value);
             if (changed != 1)
-                throw Exception::RuntimeErrorException(
+                throw Exceptions::RuntimeErrorException(
                     "ParticleDistribution::generateParticles: "
                     "linked parameter name matches nothing or more than one parameter");
         }
diff --git a/Core/Scattering/ICompositeSample.cpp b/Core/Scattering/ICompositeSample.cpp
index b004f8fba4d51de887253f8f2b38927a951dd4fc..1b3835b7a634599f72d1042a4858a24c5e115520 100644
--- a/Core/Scattering/ICompositeSample.cpp
+++ b/Core/Scattering/ICompositeSample.cpp
@@ -25,7 +25,7 @@ ICompositeSample::~ICompositeSample() {}
 void ICompositeSample::registerChild(ISample* sample)
 {
     if(!sample)
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "ICompositeSample::registerChild -> Error. Null pointer.");
     m_samples.push_back(sample);
 }
diff --git a/Core/Scattering/IFormFactor.cpp b/Core/Scattering/IFormFactor.cpp
index ad1c480708d0bf278909af9787d4b4fccfbd3201..491ecf2c1f1f6cfe89457e09db26049ccc289a93 100644
--- a/Core/Scattering/IFormFactor.cpp
+++ b/Core/Scattering/IFormFactor.cpp
@@ -22,7 +22,7 @@ IFormFactor::~IFormFactor() {}
 Eigen::Matrix2cd IFormFactor::evaluatePol(const WavevectorInfo&) const
 {
     // Throws to prevent unanticipated behaviour
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "IFormFactor::evaluatePol: is not implemented by default");
 }
 
diff --git a/Core/Scattering/ISample.cpp b/Core/Scattering/ISample.cpp
index a153a3c95f4119a3978a5cf9ae8a15682b4abc26..fcb34204847e1a9512d22886b72a3e45c46ab708 100644
--- a/Core/Scattering/ISample.cpp
+++ b/Core/Scattering/ISample.cpp
@@ -20,7 +20,7 @@
 
 ISample* ISample::cloneInvertB() const
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISample::cloneInvertB() -> Error! Method is not implemented");
 }
 
diff --git a/Core/Scattering/ISampleIteratorStrategy.cpp b/Core/Scattering/ISampleIteratorStrategy.cpp
index b44c87e5d2732f04ba06614090c03fbad31a1543..8fa586eb3139fd43588873672032005adfc7b814 100644
--- a/Core/Scattering/ISampleIteratorStrategy.cpp
+++ b/Core/Scattering/ISampleIteratorStrategy.cpp
@@ -41,7 +41,7 @@ void SampleIteratorPreorderStrategy::next(IteratorMemento &iterator_stack) const
 {
     const ISample *p_sample = iterator_stack.getCurrent();
     if( !p_sample ) {
-        throw Exception::NullPointerException("CompositeIteratorPreorderStrategy::next(): "
+        throw Exceptions::NullPointerException("CompositeIteratorPreorderStrategy::next(): "
                                    "Error! Null object in the tree of objects");
     }
     std::vector<const ISample*> children = p_sample->getChildren();
diff --git a/Core/Scattering/ISampleVisitor.cpp b/Core/Scattering/ISampleVisitor.cpp
index 4112728a1d084eac7b848fadd3366ef68e1f1ee3..4e35323471ac0f43173d71c2a0b5ef2e60f6cb98 100644
--- a/Core/Scattering/ISampleVisitor.cpp
+++ b/Core/Scattering/ISampleVisitor.cpp
@@ -43,419 +43,419 @@ void VisitSampleTreePostorder(const ISample& sample, ISampleVisitor& visitor)
 
 void ISampleVisitor::visit(const ISample*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const ISample*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const ICompositeSample*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const ICompositeSample*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IClusteredParticles*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IClusteredParticles*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const Crystal*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const Crystal*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const ILayout*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IDecoration*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const ParticleLayout*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const ParticleLayout*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const Layer*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const Layer*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const LayerInterface*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const LayerInterface*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const MultiLayer*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
                 "ISampleVisitor::visit(const MultiLayer*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IAbstractParticle*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IAbstractParticle*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IParticle*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IParticle*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const Particle*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const Particle*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const ParticleDistribution*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const ParticleDistribution*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const ParticleComposition*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const ParticleComposition*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const MesoCrystal*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const MesoCrystal*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const ParticleCoreShell*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const ParticleCoreShell*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IFormFactor*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IFormFactor*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorDWBAPol*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorDWBAPol*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorWeighted*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorWeighted*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IFormFactorBorn*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IFormFactorBorn*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorAnisoPyramid*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorAnisoPyramid*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorBox*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorBox*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorCone*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorCone*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorCone6*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorCone6*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorCuboctahedron*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorCuboctahedron*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorCrystal*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorCrystal*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorCylinder*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorCylinder*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorDodecahedron*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorDodecahedron*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorEllipsoidalCylinder*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorEllipsoid*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorFullSphere*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorFullSphere*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorFullSpheroid*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorFullSpheroid*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorGauss*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorGauss*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorHemiEllipsoid*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit const FormFactorHemiEllipsoid*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorIcosahedron*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorIcosahedron*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorLongBoxGauss*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorLongBoxGauss*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorLongBoxLorentz*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorLongBoxLorentz*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorLorentz*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorLorentz*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorPrism3*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorPrism3*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorPrism6*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorPrism6*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorPyramid*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorPyramid*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorRipple1*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorRipple1*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorRipple2*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorRipple2*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorSphereGaussianRadius*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorSphereGaussianRadius*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorSphereLogNormalRadius*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorSphereLogNormalRadius*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorTetrahedron*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorTetrahedron*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorTrivial*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorTrivial*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorTruncatedCube*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorTruncatedCube*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorTruncatedSphere*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorTruncatedSphere*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorTruncatedSpheroid*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorTruncatedSpheroid*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IFormFactorDecorator*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IFormFactorDecorator*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorDWBA*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorDWBA*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorDecoratorDebyeWaller*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorDecoratorDebyeWaller*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorDecoratorFactor*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorDecoratorFactor*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorDecoratorMaterial*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorDecoratorMaterial*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorDecoratorPositionFactor*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorDecoratorPositionFactor "
         "*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const FormFactorDecoratorRotation*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const FormFactorDecoratorRotation "
         "*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IInterferenceFunction*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IInterferenceFunction*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const InterferenceFunction1DLattice*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const InterferenceFunction1DLattice*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const InterferenceFunctionRadialParaCrystal*)
 {
-    throw Exception::NotImplementedException("ISampleVisitor::visit(const "
+    throw Exceptions::NotImplementedException("ISampleVisitor::visit(const "
                                   "InterferenceFunctionRadialParaCrystal*) -> Error. Not "
                                   "implemented.");
 }
 
 void ISampleVisitor::visit(const InterferenceFunction2DLattice*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const InterferenceFunction2DLattice*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const InterferenceFunction2DParaCrystal*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const InterferenceFunction2DParaCrystal "
         "*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const InterferenceFunctionNone*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const InterferenceFunctionNone*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IRoughness*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IRoughness*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const LayerRoughness*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const LayerRoughness*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const IRotation*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const IRotation*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const RotationX*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const RotationX*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const RotationY*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const RotationY*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const RotationZ*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const RotationZ*) -> Error. Not implemented.");
 }
 
 void ISampleVisitor::visit(const RotationEuler*)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "ISampleVisitor::visit(const RotationEuler*) -> Error. Not implemented.");
 }
 
diff --git a/Core/Simulation/GISASSimulation.cpp b/Core/Simulation/GISASSimulation.cpp
index 6c7962cacafa83ab47cc35910e8af822a44a2b44..c5f9c318d6b2492a07f4cdfcadf98f697a2b6120 100644
--- a/Core/Simulation/GISASSimulation.cpp
+++ b/Core/Simulation/GISASSimulation.cpp
@@ -46,7 +46,7 @@ GISASSimulation::GISASSimulation(const GISASSimulation& other)
 void GISASSimulation::prepareSimulation()
 {
     if (m_instrument.getDetectorDimension() != 2)
-        throw Exception::LogicErrorException("GISASSimulation::prepareSimulation() "
+        throw Exceptions::LogicErrorException("GISASSimulation::prepareSimulation() "
                 "-> Error. The detector was not properly configured.");
     getInstrument().initDetector();
     Simulation::prepareSimulation();
@@ -74,7 +74,7 @@ Histogram2D* GISASSimulation::getIntensityData(IDetector2D::EAxesUnits units_typ
 void GISASSimulation::setBeamParameters(double wavelength, double alpha_i, double phi_i)
 {
     if (wavelength<=0.0)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "Simulation::setBeamParameters() -> Error. Incoming wavelength <= 0.");
     m_instrument.setBeamParameters(wavelength, alpha_i, phi_i);
 }
diff --git a/Core/Simulation/OffSpecSimulation.cpp b/Core/Simulation/OffSpecSimulation.cpp
index 9990ee50b1c0cf8c3adb5f13ccf5b79efe5fb3e6..68a8cef3e5b4d7114c9d09eef7b759e5acafec53 100644
--- a/Core/Simulation/OffSpecSimulation.cpp
+++ b/Core/Simulation/OffSpecSimulation.cpp
@@ -72,7 +72,7 @@ void OffSpecSimulation::setBeamParameters(double lambda, const IAxis& alpha_axis
     delete mp_alpha_i_axis;
     mp_alpha_i_axis = alpha_axis.clone();
     if (alpha_axis.size()<1)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
                 "OffSpecSimulation::prepareSimulation() "
                 "-> Error. Incoming alpha range size < 1.");
     double alpha_start = alpha_axis[0];
@@ -128,7 +128,7 @@ void OffSpecSimulation::transferResultsToIntensityMap()
     const IAxis& phi_axis = m_instrument.getDetectorAxis(0);
     size_t phi_f_size = phi_axis.size();
     if (phi_f_size*m_intensity_map.getAllocatedSize()!=m_sim_elements.size())
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "OffSpecSimulation::transferResultsToIntensityMap: "
             "intensity map size does not conform to number of calculated intensities");
     for (size_t i=0; i<mp_alpha_i_axis->size(); ++i)
@@ -164,19 +164,19 @@ void OffSpecSimulation::transferDetectorImage(int index)
 void OffSpecSimulation::checkInitialization() const
 {
     if (!mp_alpha_i_axis || mp_alpha_i_axis->size()<1)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
                 "OffSpecSimulation::checkInitialization() "
                 "Incoming alpha range not configured.");
     if (m_instrument.getDetectorDimension()!=2)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "OffSpecSimulation::checkInitialization: detector is not two-dimensional");
     const IAxis& phi_axis = m_instrument.getDetectorAxis(0);
     if (phi_axis.getName()!=BornAgain::PHI_AXIS_NAME)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "OffSpecSimulation::checkInitialization: phi-axis is not correct");
     const IAxis& alpha_axis = m_instrument.getDetectorAxis(1);
     if (alpha_axis.getName()!=BornAgain::ALPHA_AXIS_NAME)
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "OffSpecSimulation::checkInitialization: alpha-axis is not correct");
 }
 
diff --git a/Core/Simulation/Simulation.cpp b/Core/Simulation/Simulation.cpp
index f397c8d55c7d798e2b089b124ef6e30d62cc577e..ed03f54113ca4e92a862524eaf3bd78cb2a87169 100644
--- a/Core/Simulation/Simulation.cpp
+++ b/Core/Simulation/Simulation.cpp
@@ -112,7 +112,7 @@ void Simulation::runSimulation()
 {
     updateSample();
     if (!mP_sample)
-        throw Exception::NullPointerException("Simulation::runSimulation() -> Error! No sample.");
+        throw Exceptions::NullPointerException("Simulation::runSimulation() -> Error! No sample.");
 
     prepareSimulation();
 
@@ -169,7 +169,7 @@ void Simulation::setSample(const MultiLayer& sample)
 void Simulation::setSampleBuilder(const std::shared_ptr<class IMultiLayerBuilder> p_sample_builder)
 {
     if (!p_sample_builder)
-        throw Exception::NullPointerException("Simulation::setSampleBuilder() -> "
+        throw Exceptions::NullPointerException("Simulation::setSampleBuilder() -> "
                                    "Error! Attempt to set null sample builder.");
 
     mP_sample_builder = p_sample_builder;
@@ -235,7 +235,7 @@ void Simulation::runSingleSimulation()
         P_dwba_simulation->run(); // the work is done here
         if (!P_dwba_simulation->isCompleted()) {
             std::string message = P_dwba_simulation->getRunMessage();
-            throw Exception::RuntimeErrorException("Simulation::runSimulation() -> Simulation has "
+            throw Exceptions::RuntimeErrorException("Simulation::runSimulation() -> Simulation has "
                                                     "terminated unexpectedly with following error "
                                                     "message.\n" + message);
         }
@@ -291,7 +291,7 @@ void Simulation::runSingleSimulation()
             delete sim;
         }
         if (failure_messages.size())
-            throw Exception::RuntimeErrorException(
+            throw Exceptions::RuntimeErrorException(
                 "Simulation::runSingleSimulation() -> "
                 "At least one simulation thread has terminated unexpectedly.\n"
                 "Messages: " + StringUtil::join(failure_messages, " --- "));
@@ -346,7 +346,7 @@ void Simulation::imposeConsistencyOfBatchNumbers(int& n_batches, int& current_ba
         current_batch = 0;
     }
     if (current_batch >= n_batches)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "Simulation::imposeConsistencyOfBatchNumbers(): Batch number must be smaller than "
             "number of batches.");
 }
diff --git a/Core/Simulation/SpecularSimulation.cpp b/Core/Simulation/SpecularSimulation.cpp
index 49fa3b59108b5222362a97af6e850547702e3ef8..a9312fd3e97201f203463dbe64c9c16f3fa7e742 100644
--- a/Core/Simulation/SpecularSimulation.cpp
+++ b/Core/Simulation/SpecularSimulation.cpp
@@ -76,7 +76,7 @@ void SpecularSimulation::setSample(const ISample &sample)
 void SpecularSimulation::setSampleBuilder(std::shared_ptr<IMultiLayerBuilder> sample_builder)
 {
     if (!sample_builder)
-        throw Exception::NullPointerException("SpecularSimulation::setSampleBuilder() -> "
+        throw Exceptions::NullPointerException("SpecularSimulation::setSampleBuilder() -> "
                                    "Error! Attempt to set null sample builder.");
 
     mP_sample_builder = sample_builder;
@@ -88,13 +88,13 @@ void SpecularSimulation::prepareSimulation()
     updateSample();
 
     if (!m_alpha_i_axis || m_alpha_i_axis->size() < 1)
-        throw Exception::ClassInitializationException("SpecularSimulation::checkSimulation() "
+        throw Exceptions::ClassInitializationException("SpecularSimulation::checkSimulation() "
                                            "-> Error. Incoming alpha range not configured.");
     if (m_lambda <= 0.0)
-        throw Exception::ClassInitializationException("SpecularSimulation::checkSimulation() "
+        throw Exceptions::ClassInitializationException("SpecularSimulation::checkSimulation() "
                                            "-> Error. Incoming wavelength <= 0.");
     if (!mP_sample)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "SpecularSimulation::checkSimulation() -> Error. No sample set");
 
     updateCoefficientDataAxes();
@@ -106,7 +106,7 @@ void SpecularSimulation::runSimulation()
 
     MultiLayer *multilayer = dynamic_cast<MultiLayer*>(mP_sample.get());
     if (!multilayer)
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "SpecularSimulation::runSimulation() -> Error. Not a MultiLayer");
 
     if (multilayer->requiresMatrixRTCoefficients()) {
@@ -185,11 +185,11 @@ SpecularSimulation::LayerRTCoefficients_t
 SpecularSimulation::getLayerRTCoefficients(size_t i_alpha, size_t i_layer) const
 {
     if (i_alpha >= m_data.getAllocatedSize())
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "SpecularSimulation::getLayerRTCoefficients() -> Error. Wrong i_alpha.");
 
     if (i_layer >= m_data[i_alpha].size())
-        throw Exception::RuntimeErrorException(
+        throw Exceptions::RuntimeErrorException(
             "SpecularSimulation::getLayerRTCoefficients() -> Error. Wrong layer index.");
 
     return m_data[i_alpha][i_layer];
@@ -230,14 +230,14 @@ void SpecularSimulation::collectRTCoefficientsScalar(const MultiLayer *multilaye
 
 void SpecularSimulation::collectRTCoefficientsMatrix(const MultiLayer * /*multilayer*/)
 {
-    throw Exception::NotImplementedException(
+    throw Exceptions::NotImplementedException(
         "SpecularSimulation::collectRTCoefficientsMatrix() -> Error. Not implemented.");
 }
 
 void SpecularSimulation::checkCoefficients(size_t i_layer) const
 {
     if (m_data.getAllocatedSize() == 1 || m_data[0].size() == 0)
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
             "SpecularSimulation::checkCoefficients() -> Error. "
             "No coefficients found, check that (1) you have set beam parameters "
             "(2) you have run your simulation.");
@@ -247,7 +247,7 @@ void SpecularSimulation::checkCoefficients(size_t i_layer) const
         message << "SpecularSimulation::checkCoefficients() -> Error. Requested layer index "
                 << i_layer << " is large than or equal to the total number of layers "
                 << m_data[0].size() << std::endl;
-        throw Exception::OutOfBoundsException(message.str());
+        throw Exceptions::OutOfBoundsException(message.str());
     }
 }
 
diff --git a/Core/SoftParticle/FormFactorSphereUniformRadius.cpp b/Core/SoftParticle/FormFactorSphereUniformRadius.cpp
index 53a7912cfe344829234ab7d7bcea3368fbe81f98..1f520db82914a58fc2aeeb8bdd1856eb47c468bc 100644
--- a/Core/SoftParticle/FormFactorSphereUniformRadius.cpp
+++ b/Core/SoftParticle/FormFactorSphereUniformRadius.cpp
@@ -26,7 +26,7 @@ FormFactorSphereUniformRadius::FormFactorSphereUniformRadius(double mean,
     , m_full_width(full_width)
 {
     if(!checkParameters())
-        throw Exception::ClassInitializationException(
+        throw Exceptions::ClassInitializationException(
                 "FormFactorSphereUniformRadius::FormFactorSphereUniformRadius:"
                 " mean radius must be bigger than the half width");
     setName(BornAgain::FormFactorSphereUniformRadiusType);
diff --git a/Core/StandardSamples/IFactory.h b/Core/StandardSamples/IFactory.h
index 4a78215a9ec775a996719736454f68e57b2952fc..5ef4e84e286af18349b92b248531540b5a9038d6 100644
--- a/Core/StandardSamples/IFactory.h
+++ b/Core/StandardSamples/IFactory.h
@@ -48,7 +48,7 @@ public:
             std::ostringstream message;
             message << "IFactory::createItem() -> Error. Unknown item key '"
                     << item_key << "'";
-            throw Exception::RuntimeErrorException(message.str());
+            throw Exceptions::RuntimeErrorException(message.str());
         }
         return (it->second)();
     }
@@ -60,7 +60,7 @@ public:
             std::ostringstream message;
             message << "IFactory::createItem() -> Error. Already registered item key '"
                     << item_key << "'";
-            throw Exception::RuntimeErrorException(message.str());
+            throw Exceptions::RuntimeErrorException(message.str());
         }
         if (itemDescription!="")
             m_descriptions.insert(make_pair(item_key, itemDescription));
diff --git a/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp b/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
index ebabd2b5e7400d8c382c80cd825f54027d4ce25d..25430bdd9ab9bbd65f94e83aed118c2c9a03018b 100644
--- a/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
+++ b/Core/StandardSamples/LayersWithAbsorptionBuilder.cpp
@@ -29,7 +29,7 @@ MultiLayer* LayersWithAbsorptionBuilder::buildSample() const
 {
     const IFormFactor* form_factor = getFormFactor();
     if(!form_factor)
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "LayersWithAbsorptionBuilder::buildSample() -> Error. Form factor is not initialized.");
 
     HomogeneousMaterial mAmbience("Air", 0.0, 0.0);
diff --git a/Core/StandardSamples/ParticleInTheAirBuilder.cpp b/Core/StandardSamples/ParticleInTheAirBuilder.cpp
index 59161ff8a907b6437eb8885012de9e2b80bb8b4a..36cc840fc0885d519b2bdc3c8254497c7371480d 100644
--- a/Core/StandardSamples/ParticleInTheAirBuilder.cpp
+++ b/Core/StandardSamples/ParticleInTheAirBuilder.cpp
@@ -26,7 +26,7 @@ MultiLayer* ParticleInTheAirBuilder::buildSample() const
 {
     const IFormFactor* form_factor = getFormFactor();
     if(!form_factor)
-        throw Exception::NullPointerException("ParticleInTheAirBuilder::buildSample() -> Error. "
+        throw Exceptions::NullPointerException("ParticleInTheAirBuilder::buildSample() -> Error. "
                                    "Form factor is not initialized.");
     MultiLayer* result = new MultiLayer;
 
diff --git a/Core/Tools/FileSystem.cpp b/Core/Tools/FileUtils.cpp
similarity index 76%
rename from Core/Tools/FileSystem.cpp
rename to Core/Tools/FileUtils.cpp
index e1741a5ac1036d5918468bb36918ecca1bf5201f..ebcc802307362e04335d0a4a5b3848facdc15342 100644
--- a/Core/Tools/FileSystem.cpp
+++ b/Core/Tools/FileUtils.cpp
@@ -3,7 +3,7 @@
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
 //! @file      Core/Tools/FileSystem.cpp
-//! @brief     Implements namespace FileSystem
+//! @brief     Implements namespace FileUtils
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -13,7 +13,7 @@
 //
 // ************************************************************************** //
 
-#include "FileSystem.h"
+#include "FileUtils.h"
 #include "Exceptions.h"
 #include <boost/filesystem.hpp>
 #include <cassert>
@@ -21,23 +21,23 @@
 #include <stdexcept>
 
 //! Returns extension of given filename.
-std::string FileSystem::extension(const std::string& name)
+std::string FileUtils::extension(const std::string& name)
 {
     return boost::filesystem::extension(name.c_str());
 }
 
-bool FileSystem::createDirectory(const std::string& dir_name)
+bool FileUtils::createDirectory(const std::string& dir_name)
 {
     assert(dir_name!="");
     return boost::filesystem::create_directory(dir_name);
 }
 
 //! Returns filenames of files in directory
-std::vector<std::string> FileSystem::filesInDirectory(const std::string& dir_name)
+std::vector<std::string> FileUtils::filesInDirectory(const std::string& dir_name)
 {
     std::vector<std::string> ret;
     if (!boost::filesystem::exists(dir_name))
-        throw std::runtime_error("FileSystem::filesInDirectory '" + dir_name + "' does not exist");
+        throw std::runtime_error("FileUtils::filesInDirectory '" + dir_name + "' does not exist");
     boost::filesystem::directory_iterator end_it; // default construction yields past-the-end
     for ( boost::filesystem::directory_iterator it( dir_name );
           it != boost::filesystem::directory_iterator(); ++it ) {
@@ -48,7 +48,7 @@ std::vector<std::string> FileSystem::filesInDirectory(const std::string& dir_nam
     return ret;
 }
 
-std::string FileSystem::jointPath(const std::string& spath1, const std::string& spath2)
+std::string FileUtils::jointPath(const std::string& spath1, const std::string& spath2)
 {
     assert(spath1!="");
     assert(spath2!="");
@@ -60,13 +60,13 @@ std::string FileSystem::jointPath(const std::string& spath1, const std::string&
 }
 
 //! Returns path without directory part ("Foo/Bar/Doz.int.gz" -> "Doz.int.gz")
-std::string FileSystem::filename(const std::string& path)
+std::string FileUtils::filename(const std::string& path)
 {
     return boost::filesystem::path(path).filename().string();
 }
 
 //! Returns file names that agree with a regex glob pattern.
-std::vector<std::string> FileSystem::glob(const std::string& dir, const std::string& pattern)
+std::vector<std::string> FileUtils::glob(const std::string& dir, const std::string& pattern)
 {
     std::vector<std::string> ret;
     for (const std::string& fname: filesInDirectory(dir))
diff --git a/Core/Tools/FileSystem.h b/Core/Tools/FileUtils.h
similarity index 92%
rename from Core/Tools/FileSystem.h
rename to Core/Tools/FileUtils.h
index e513ee7d867072b909da75ca3618a21c8943a665..6d249fbb5e141ec20b6b198b81729772177b42e7 100644
--- a/Core/Tools/FileSystem.h
+++ b/Core/Tools/FileUtils.h
@@ -2,8 +2,8 @@
 //
 //  BornAgain: simulate and fit scattering at grazing incidence
 //
-//! @file      Core/Tools/FileSystem.h
-//! @brief     Defines namespace FileSystem.
+//! @file      Core/Tools/FileUtils.h
+//! @brief     Defines namespace FileUtils.
 //!
 //! @homepage  http://www.bornagainproject.org
 //! @license   GNU General Public License v3 or higher (see COPYING)
@@ -22,7 +22,7 @@
 
 //! Utility functions to deal with file system.
 
-namespace FileSystem {
+namespace FileUtils {
 
     //! Returns extension of given filename.
     BA_CORE_API_ std::string extension(const std::string& fname);
@@ -43,6 +43,6 @@ namespace FileSystem {
     BA_CORE_API_ std::vector<std::string> glob(
         const std::string& dir, const std::string& pattern);
 
-} // namespace FileSystem
+} // namespace FileUtils
 
 #endif // FILESYSTEM_H
diff --git a/Core/Vector/BasicVector3D.cpp b/Core/Vector/BasicVector3D.cpp
index 0f02ef09e52b9cae1d5ca34c695119dfb48426ab..4a32066445006e29cf8111abf9d9605e77e4f8ad 100644
--- a/Core/Vector/BasicVector3D.cpp
+++ b/Core/Vector/BasicVector3D.cpp
@@ -90,7 +90,7 @@ BasicVector3D<double> BasicVector3D<double>::unit() const
 {
     double len = mag();
     if ( len==0.0 )
-        throw Exception::DivisionByZeroException("Cannot normalize zero vector");
+        throw Exceptions::DivisionByZeroException("Cannot normalize zero vector");
     return BasicVector3D<double>(x()/len, y()/len, z()/len);
 }
 
@@ -99,7 +99,7 @@ BasicVector3D<complex_t> BasicVector3D<complex_t>::unit() const
 {
     double len = mag();
     if ( len==0.0 )
-        throw Exception::DivisionByZeroException("Cannot normalize zero vector");
+        throw Exceptions::DivisionByZeroException("Cannot normalize zero vector");
     return BasicVector3D<complex_t>(x()/len, y()/len, z()/len);
 }
 
diff --git a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
index 8b2ae00e80317fcc1f726b9b6413aac15828e2e8..f631da60cab135b6cbc6f5b26bb0f5b71230b07c 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/HorizontalSlicePlot.cpp
@@ -113,7 +113,7 @@ void HorizontalSlicePlot::plotItem(IntensityDataItem *intensityItem)
     if(!data) return;
 
     if(data->getRank() != 2) {
-        throw Exception::NullPointerException("NHistogramPlot::plotItem::Draw() -> Error. Zero pointer to the data to draw");
+        throw Exceptions::NullPointerException("NHistogramPlot::plotItem::Draw() -> Error. Zero pointer to the data to draw");
     }
 
     m_customPlot->axisRect()->setupFullAxesBox(true);
diff --git a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
index 790c38911a6e5bd95ceba7ed93e48627f6586a0e..c7ac75018a8019aef386b7e4b9bdbb3b89011c9d 100644
--- a/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
+++ b/GUI/coregui/Views/IntensityDataWidgets/VerticalSlicePlot.cpp
@@ -113,7 +113,7 @@ void VerticalSlicePlot::plotItem(IntensityDataItem *intensityItem)
     if(!data) return;
 
     if(data->getRank() != 2) {
-        throw Exception::NullPointerException("NHistogramPlot::plotItem::Draw() -> Error. Zero pointer to the data to draw");
+        throw Exceptions::NullPointerException("NHistogramPlot::plotItem::Draw() -> Error. Zero pointer to the data to draw");
     }
 
     m_customPlot->axisRect()->setupFullAxesBox(true);
diff --git a/Tests/Functional/Core/CoreTest.cpp b/Tests/Functional/Core/CoreTest.cpp
index 0bbce07547dcac3e535347f86eaf6d6bf9e4c9b6..faf306bc5d19875b171d116e2c3bd63403ef6b4f 100644
--- a/Tests/Functional/Core/CoreTest.cpp
+++ b/Tests/Functional/Core/CoreTest.cpp
@@ -14,7 +14,7 @@
 // ************************************************************************** //
 
 #include "CoreTest.h"
-#include "FileSystem.h"
+#include "FileUtils.h"
 #include "GISASSimulation.h"
 #include "IntensityDataFunctions.h"
 #include "IntensityDataIOFactory.h"
@@ -38,7 +38,7 @@ bool CoreTest::runTest()
     // Load reference if available
     try {
         m_reference = IntensityDataIOFactory::readOutputData(
-            FileSystem::jointPath(CORE_STD_REF_DIR, getName() + ".int.gz"));
+            FileUtils::jointPath(CORE_STD_REF_DIR, getName() + ".int.gz"));
     } catch(const std::exception& ex) {
         m_reference = nullptr;
         std::cout << "No reference found, but we proceed with the simulation to create a new one\n";
@@ -56,8 +56,8 @@ bool CoreTest::runTest()
         success = compareIntensityMaps(*result_data.get(), *m_reference);
     // Save simulation if different from reference.
     if (!success) {
-        FileSystem::createDirectory(CORE_STD_OUT_DIR);
-        std::string out_fname = FileSystem::jointPath(CORE_STD_OUT_DIR, getName() + ".int");
+        FileUtils::createDirectory(CORE_STD_OUT_DIR);
+        std::string out_fname = FileUtils::jointPath(CORE_STD_OUT_DIR, getName() + ".int");
         IntensityDataIOFactory::writeOutputData(*result_data, out_fname);
         std::cout << "New simulation result stored in " << out_fname << ".\n"
                   << "To visualize an intensity map, use " << BUILD_BIN_DIR << "/view1.py;"
diff --git a/Tests/Functional/Core/PolDWBAMagCylinders2.cpp b/Tests/Functional/Core/PolDWBAMagCylinders2.cpp
index 3351038965197d4c4456efef246f87d1dad6eb5a..cf375d6768fcbfc24f58a575a2d9cd68a75b0b7a 100644
--- a/Tests/Functional/Core/PolDWBAMagCylinders2.cpp
+++ b/Tests/Functional/Core/PolDWBAMagCylinders2.cpp
@@ -2,12 +2,12 @@
 #include "IntensityDataFunctions.h"
 #include "IntensityDataIOFactory.h"
 #include "SimulationFactory.h"
-#include "FileSystem.h"
+#include "FileUtils.h"
 #include <memory>
 
 int main(int, char**)
 {
-    const std::string trunc = FileSystem::jointPath(CORE_SPECIAL_REF_DIR,
+    const std::string trunc = FileUtils::jointPath(CORE_SPECIAL_REF_DIR,
                                                              "/polmagcylinders2_reference_");
     const std::unique_ptr<OutputData<double> >
         P_reference00(IntensityDataIOFactory::readOutputData(trunc + "00.int.gz"));
diff --git a/Tests/Functional/GUI/GUITest.cpp b/Tests/Functional/GUI/GUITest.cpp
index 71be23624a0f31b5a000d1a588b4f89c0c033e9c..5459ddfed1572eb2e56f0cf4e67417941a7c76de 100644
--- a/Tests/Functional/GUI/GUITest.cpp
+++ b/Tests/Functional/GUI/GUITest.cpp
@@ -42,7 +42,7 @@ GUITest::~GUITest()
 bool GUITest::runTest()
 {
     if (!m_reference_simulation)
-        throw Exception::NullPointerException(
+        throw Exceptions::NullPointerException(
             "GUITest::runTest() -> Error. Uninitialized simulation object.");
 
     m_reference_simulation->runSimulation();
diff --git a/Tests/Functional/PyCore/export/PyExportTest.cpp b/Tests/Functional/PyCore/export/PyExportTest.cpp
index c4faa6d1641aa1c5bd26a50786122e2c1573d1f1..3af1c786c1fa2c1701f7fc8b0aadad61d261c84d 100644
--- a/Tests/Functional/PyCore/export/PyExportTest.cpp
+++ b/Tests/Functional/PyCore/export/PyExportTest.cpp
@@ -14,7 +14,7 @@
 // ************************************************************************** //
 
 #include "PyExportTest.h"
-#include "FileSystem.h"
+#include "FileUtils.h"
 #include "GISASSimulation.h"
 #include "IntensityDataFunctions.h"
 #include "IntensityDataIOFactory.h"
@@ -44,13 +44,13 @@ PyExportTest::~PyExportTest()
 bool PyExportTest::runTest()
 {
     // Set output data filename, and remove old output files
-    std::string output_name = FileSystem::jointPath(PYEXPORT_TMP_DIR, getName());
+    std::string output_name = FileUtils::jointPath(PYEXPORT_TMP_DIR, getName());
     std::string output_path = output_name + ".ref.int";
     std::remove( output_path.c_str() );
     std::cout << "Removed old output " << output_path << "n";
 
     // Generate Python script
-    std::string pyscript_filename = FileSystem::jointPath(PYEXPORT_TMP_DIR, getName() + ".py");
+    std::string pyscript_filename = FileUtils::jointPath(PYEXPORT_TMP_DIR, getName() + ".py");
     std::ofstream pythonFile(pyscript_filename);
     pythonFile << PythonFormatting::simulationToPython(m_reference_simulation);
     pythonFile.close();
diff --git a/Tests/Functional/PyCore/persistence/PyPersistenceTest.cpp b/Tests/Functional/PyCore/persistence/PyPersistenceTest.cpp
index 058db0faaa38ea4d241200e531bfc02f7a936013..71a88176f1d82165dd1f59e6a47966f0c1e4d64c 100644
--- a/Tests/Functional/PyCore/persistence/PyPersistenceTest.cpp
+++ b/Tests/Functional/PyCore/persistence/PyPersistenceTest.cpp
@@ -14,7 +14,7 @@
 // ************************************************************************** //
 
 #include "PyPersistenceTest.h"
-#include "FileSystem.h"
+#include "FileUtils.h"
 #include "GISASSimulation.h"
 #include "IntensityDataFunctions.h"
 #include "IntensityDataIOFactory.h"
@@ -38,14 +38,14 @@ bool PyPersistenceTest::runTest()
 {
     // Remove old output
     for (const std::string& fname:
-             FileSystem::glob(PYPERSIST_OUT_DIR, getName()+"\\.\\w+\\..+")) {
+             FileUtils::glob(PYPERSIST_OUT_DIR, getName()+"\\.\\w+\\..+")) {
         std::remove( fname.c_str() );
         std::cout << "Removed old output " << fname.c_str() << "\n";
     }
 
     // Run Python script
-    std::string pyscript_filename = FileSystem::jointPath(m_directory, getName()+".py");
-    std::string dat_stem = FileSystem::jointPath(PYPERSIST_OUT_DIR, getName());
+    std::string pyscript_filename = FileUtils::jointPath(m_directory, getName()+".py");
+    std::string dat_stem = FileUtils::jointPath(PYPERSIST_OUT_DIR, getName());
     if (!runPython(pyscript_filename + " " + dat_stem))
         return false;
 
@@ -63,8 +63,8 @@ bool PyPersistenceTest::runTest()
     // Compare files one by one
     for (auto const& it: dat)
         if (!compareFilePair(
-                FileSystem::jointPath(PYPERSIST_OUT_DIR, it.second),
-                FileSystem::jointPath(PYPERSIST_REF_DIR, ref[it.first])))
+                FileUtils::jointPath(PYPERSIST_OUT_DIR, it.second),
+                FileUtils::jointPath(PYPERSIST_REF_DIR, ref[it.first])))
             return false;
     return true;
 }
@@ -75,9 +75,9 @@ std::map<const std::string, const std::string>
 PyPersistenceTest::glob2map(const std::string& dir, const std::string& stem)
 {
     std::map<const std::string, const std::string> ret;
-    for (const std::string& fname: FileSystem::glob(dir, stem+"\\.\\w+\\..+")) {
+    for (const std::string& fname: FileUtils::glob(dir, stem+"\\.\\w+\\..+")) {
         std::vector<std::string> fname_segments =
-            StringUtil::split(FileSystem::filename(fname), ".");
+            StringUtil::split(FileUtils::filename(fname), ".");
         ret.insert(make_pair(fname_segments[1]+"."+fname_segments[2], fname));
     }
     return ret;
@@ -113,7 +113,7 @@ bool PyPersistenceTest::compareFilePair(
     const std::string& dat_fpath, const std::string& ref_fpath)
 {
     std::cout << "Comparing dat='" << dat_fpath << "' with ref='" << ref_fpath << "':\n";
-    const std::string extension = StringUtil::split(FileSystem::filename(dat_fpath), ".")[2];
+    const std::string extension = StringUtil::split(FileUtils::filename(dat_fpath), ".")[2];
     if ( extension=="int" )
         return compareIntensityPair( dat_fpath, ref_fpath );
     if ( extension=="yaml" )
diff --git a/Tests/Functional/TestMachinery/IRegistry.h b/Tests/Functional/TestMachinery/IRegistry.h
index 5e67421526157fc237fb80a85f6a0aea943c80b5..8cf14b1c6e6c268970a3d23397b31699d4001715 100644
--- a/Tests/Functional/TestMachinery/IRegistry.h
+++ b/Tests/Functional/TestMachinery/IRegistry.h
@@ -33,7 +33,7 @@ public:
     const ValueType* getItem(const std::string& key) const {
         auto it = m_data.find(key);
         if(it == m_data.end())
-            throw Exception::UnknownClassRegistrationException(
+            throw Exceptions::UnknownClassRegistrationException(
                 "IRegistry::createItem() -> Error. Not existing item key '" + key + "'");
         return it->second.get();
     }
@@ -48,7 +48,7 @@ public:
 protected:
     void add(const std::string& key, ValueType* item) {
         if(m_data.find(key) != m_data.end())
-            throw Exception::ExistingClassRegistrationException(
+            throw Exceptions::ExistingClassRegistrationException(
                 "IRegistry::createItem() -> Error. Already existing item with key '" + key + "'");
         m_data[key] = std::unique_ptr<ValueType>(item);
     }
diff --git a/Tests/Functional/TestMachinery/IStandardTest.cpp b/Tests/Functional/TestMachinery/IStandardTest.cpp
index 37d9f49acd0edeec723f10afa401501da3b75878..86cc02619bdc0b2e18932e360a736a558ebce81b 100644
--- a/Tests/Functional/TestMachinery/IStandardTest.cpp
+++ b/Tests/Functional/TestMachinery/IStandardTest.cpp
@@ -34,7 +34,7 @@ bool IStandardTest::execute(int argc, char** argv) {
         test_name = std::string(argv[1]);
     m_info = StandardSimulationsRegistry::instance().getItemOrExplain(test_name, getName());
     if( !m_info )
-        throw Exception::RuntimeErrorException("IStandardTest -> Error in look up.");
+        throw Exceptions::RuntimeErrorException("IStandardTest -> Error in look up.");
 
     if (m_info->m_subtest_type == "None")
         return execute_onetest();
@@ -62,7 +62,7 @@ bool IStandardTest::execute_subtests()
     } else if(m_info->m_subtest_type == "FTDistributions2D") {
         subtest_registry = new SubtestRegistryFTDistribution2D;
     } else
-        throw Exception::RuntimeErrorException("IStandardTest -> Error. "
+        throw Exceptions::RuntimeErrorException("IStandardTest -> Error. "
                                     "Unknown factory '"+m_info->m_subtest_type+"'.");
     subtest_names = subtest_registry->keys();
     size_t n_subtests = subtest_names.size();
diff --git a/Tests/Functional/TestMachinery/StandardSimulationsRegistry.cpp b/Tests/Functional/TestMachinery/StandardSimulationsRegistry.cpp
index 14a5f6ccec0f2d035d061e190203aa4a1b0ac653..72f44591adf9a426e85e87e437e0a856f2499982 100644
--- a/Tests/Functional/TestMachinery/StandardSimulationsRegistry.cpp
+++ b/Tests/Functional/TestMachinery/StandardSimulationsRegistry.cpp
@@ -353,7 +353,7 @@ void StandardSimulationsRegistry::add(
     const std::string& subtest_type, double threshold )
 {
     if( m_catalogue.find(test_name) != m_catalogue.end() )
-        throw Exception::ExistingClassRegistrationException(
+        throw Exceptions::ExistingClassRegistrationException(
             "StandardSimulationsRegistry::add() -> Error. Existing item " + test_name);
     m_catalogue[test_name] = SimulationInfo(
         test_name, test_description, simulation_name,
diff --git a/unused/OMPISimulation.cpp b/unused/OMPISimulation.cpp
index c7e1cc44d7befd84e8ea5603f0073228e8fc4e1f..b0ac330ea5e869150e942feba25ae35543bf775d 100644
--- a/unused/OMPISimulation.cpp
+++ b/unused/OMPISimulation.cpp
@@ -86,7 +86,7 @@ void OMPISimulation::runSimulation(Simulation * simulation)
 
 void OMPISimulation::runSimulation(Simulation * /* simulation */)
 {
-    throw Exception::RuntimeErrorException(
+    throw Exceptions::RuntimeErrorException(
         "OMPISimulation::runSimulation() -> Error! Can't run OpenMPI simulation. "
         "The package was compiled without OpenMPI support (compile with -DBORNAGAIN_OPENMPI=ON)" );
 }
diff --git a/unused/ScanningMinimizer.cpp b/unused/ScanningMinimizer.cpp
index 9c962f58522e319124826a09cdfad071f67b6a8d..c81ba0bf6b07c433d0ee6e4cac15e19aab5efb13 100644
--- a/unused/ScanningMinimizer.cpp
+++ b/unused/ScanningMinimizer.cpp
@@ -57,7 +57,7 @@ void ScanningMinimizer::construct_fcnvalues_map()
         }
     }
     if( !m_fcnvalues_map->getRank() )
-        throw Exception::LogicErrorException(
+        throw Exceptions::LogicErrorException(
             "ScanningMinimizer::construct_parameter_map() -> Error! "
             "No parameters with TAttLimit::limited(left,right) attribute were found.");
     m_fcnvalues_map->setAllTo(0.0);