diff --git a/App/src/TestDetectorResolution.cpp b/App/src/TestDetectorResolution.cpp
index 1f9a8768bdc62e61a387296e56d8c1552ad348f7..962b44165fbda23a7eee0237b6cb3687307c51b8 100644
--- a/App/src/TestDetectorResolution.cpp
+++ b/App/src/TestDetectorResolution.cpp
@@ -9,6 +9,7 @@
 #include "LayerDecorator.h"
 #include "ParticleDecoration.h"
 #include "MathFunctions.h"
+#include "ResolutionFunction2DSimple.h"
 
 namespace
 {
@@ -41,7 +42,8 @@ void TestDetectorResolution::execute()
     experiment.setSample(mp_sample);
     experiment.setDetectorParameters(100, 0.0*Units::degree, 2.0*Units::degree
             ,100, 0.0*Units::degree, 2.0*Units::degree);
-    experiment.setDetectorResolutionFunction(&testResolutionFunction);
+    IResolutionFunction2D *p_resolution_function = new ResolutionFunction2DSimple(0.001, 0.001);
+    experiment.setDetectorResolutionFunction(p_resolution_function);
     experiment.setBeamParameters(1.0*Units::angstrom, -0.2*Units::degree, 0.0*Units::degree);
     experiment.runSimulation();
     mp_intensity_output = experiment.getOutputDataClone();
diff --git a/App/src/TestMesoCrystal1.cpp b/App/src/TestMesoCrystal1.cpp
index 05201afc253bf4f2d1ca65cbc4ea5b67a6c97278..a8402837e9e804728fc7d7489892799d584565e6 100644
--- a/App/src/TestMesoCrystal1.cpp
+++ b/App/src/TestMesoCrystal1.cpp
@@ -14,19 +14,11 @@
 #include "MathFunctions.h"
 #include "Utils.h"
 #include "FormFactorDecoratorDebyeWaller.h"
+#include "ResolutionFunction2DSimple.h"
 
 /* ************************************************************************* */
 // global functions
 /* ************************************************************************* */
-namespace {
-    double testResolutionFunction(double u, double v)
-    {
-        double sigma_u = 0.0002;
-        double sigma_v = 0.0002;
-        return MathFunctions::IntegratedGaussian(u, 0.0, sigma_u)
-                * MathFunctions::IntegratedGaussian(v, 0.0, sigma_v);
-    }
-}
 
 /* ************************************************************************* */
 // TestMesoCrystal1 member definitions
@@ -53,7 +45,7 @@ void TestMesoCrystal1::execute()
            , 256, -0.4*Units::degree, 0.066);
 //    experiment.setDetectorParameters(2, 0.96*Units::degree, 0.962*Units::degree
 //           , 2 , 0.376*Units::degree, 0.378*Units::degree);
-    experiment.setDetectorResolutionFunction(&testResolutionFunction);
+    experiment.setDetectorResolutionFunction(new ResolutionFunction2DSimple(0.0002, 0.0002));
     experiment.setBeamParameters(1.77*Units::angstrom, -0.4*Units::degree, 0.0*Units::degree);
     experiment.setBeamIntensity(8e12);
 
@@ -77,26 +69,26 @@ void TestMesoCrystal1::execute()
 // MesoCrystalBuilder member definitions
 /* ************************************************************************* */
 MesoCrystalBuilder::MesoCrystalBuilder()
-: m_meso_radius(1000*Units::nanometer)
-, m_surface_filling_ratio(0.25)
-, m_meso_height(0.5*Units::micrometer)
-, m_sigma_meso_height(4*Units::nanometer)
-, m_sigma_meso_radius(50*Units::nanometer)
-, m_lattice_length_a(6.2*Units::nanometer)
-, m_nanoparticle_radius(4.3*Units::nanometer)
-, m_sigma_nanoparticle_radius(0.14*Units::nanometer)
-, m_sigma_lattice_length_a(1.5*Units::nanometer)
-, m_roughness(1.0*Units::nanometer)
 //: m_meso_radius(1000*Units::nanometer)
-//, m_surface_filling_ratio(0.100013)
+//, m_surface_filling_ratio(0.25)
 //, m_meso_height(0.5*Units::micrometer)
-//, m_sigma_meso_height(199.989*Units::nanometer)
-//, m_sigma_meso_radius(3.11584*Units::nanometer)
-//, m_lattice_length_a(6.2128*Units::nanometer)
-//, m_nanoparticle_radius(3.82322*Units::nanometer)
-//, m_sigma_nanoparticle_radius(0.371165*Units::nanometer)
-//, m_sigma_lattice_length_a(1.2186*Units::nanometer)
-//, m_roughness(49.979*Units::nanometer)
+//, m_sigma_meso_height(4*Units::nanometer)
+//, m_sigma_meso_radius(50*Units::nanometer)
+//, m_lattice_length_a(6.2*Units::nanometer)
+//, m_nanoparticle_radius(4.3*Units::nanometer)
+//, m_sigma_nanoparticle_radius(0.14*Units::nanometer)
+//, m_sigma_lattice_length_a(1.5*Units::nanometer)
+//, m_roughness(1.0*Units::nanometer)
+: m_meso_radius(570.103*Units::nanometer)
+, m_surface_filling_ratio(0.113898)
+, m_meso_height(423.33*Units::nanometer)
+, m_sigma_meso_height(10.0608*Units::nanometer)
+, m_sigma_meso_radius(10.0882*Units::nanometer)
+, m_lattice_length_a(6.21014*Units::nanometer)
+, m_nanoparticle_radius(5.99176*Units::nanometer)
+, m_sigma_nanoparticle_radius(0.0681535*Units::nanometer)
+, m_sigma_lattice_length_a(2.61389*Units::nanometer)
+, m_roughness(28.0626*Units::nanometer)
 {
     init_parameters();
 }
diff --git a/App/src/TestMesoCrystal2.cpp b/App/src/TestMesoCrystal2.cpp
index a27b41030b08543cd05b4c2f939310872c77689b..823b2e3284d941a9e73886d36c86971b7614c9c3 100644
--- a/App/src/TestMesoCrystal2.cpp
+++ b/App/src/TestMesoCrystal2.cpp
@@ -29,19 +29,11 @@
 
 #include "TCanvas.h"
 #include "TH2D.h"
+#include "ResolutionFunction2DSimple.h"
 
 /* ************************************************************************* */
 // global functions
 /* ************************************************************************* */
-namespace {
-    double testResolutionFunction(double u, double v)
-    {
-        double sigma_u = 0.0002;
-        double sigma_v = 0.0002;
-        return MathFunctions::IntegratedGaussian(u, 0.0, sigma_u)
-                * MathFunctions::IntegratedGaussian(v, 0.0, sigma_v);
-    }
-}
 
 /* ************************************************************************* */
 // TestMesoCrystal2 member definitions
@@ -112,12 +104,17 @@ void TestMesoCrystal2::execute()
             TRange<double>(0.1, 0.4) );
     fitSuite->addFitParameter("*/roughness", 1.0*Units::nanometer, 0.1*Units::nanometer,
             TRange<double>(0.01*Units::nanometer, 50.0*Units::nanometer) );
+    fitSuite->addFitParameter("*/ResolutionFunction2D/sigma_x", 0.0002, 0.00001,
+            TRange<double>(0.0, 0.002) );
+    fitSuite->addFitParameter("*/ResolutionFunction2D/sigma_y", 0.0002, 0.00001,
+            TRange<double>(0.0, 0.002) );
 
     IsGISAXSTools::setMinimum(1e2);
-    FitSuiteObserverWriteTree *writeTreeObserver = new FitSuiteObserverWriteTree("~/fitmeso003.tree");
+    std::string tree_file_name = Utils::FileSystem::GetHomePath()+"Examples/MesoCrystals/ex02_fitspheres/mesofit.tree";
+    FitSuiteObserverWriteTree *writeTreeObserver = new FitSuiteObserverWriteTree(tree_file_name);
     fitSuite->attachObserver(writeTreeObserver);
-//    FitSuiteObserverDraw *drawObserver = new FitSuiteObserverDraw(canvas_name);
-//    fitSuite->attachObserver(drawObserver);
+    FitSuiteObserverDraw *drawObserver = new FitSuiteObserverDraw(canvas_name);
+    fitSuite->attachObserver(drawObserver);
 
     fitSuite->runFit();
 
@@ -137,7 +134,7 @@ void TestMesoCrystal2::initializeExperiment(const OutputData<double> *output_dat
     mp_experiment->setSampleBuilder( mp_sample_builder );
     mp_experiment->setBeamParameters(1.77*Units::angstrom, -0.4*Units::degree, 0.0*Units::degree);
     mp_experiment->setBeamIntensity(8e12);
-    mp_experiment->setDetectorResolutionFunction(&testResolutionFunction);
+    mp_experiment->setDetectorResolutionFunction(new ResolutionFunction2DSimple(0.0002, 0.0002));
 
     if( !output_data ) {
         // initialize default detector
diff --git a/Core/Algorithms/inc/ConvolutionDetectorResolution.h b/Core/Algorithms/inc/ConvolutionDetectorResolution.h
index ecd9c131cb7b74789915f509817fc1b2d7a4ab24..8eddafb51948cbca7b72538576f1603439d307ec 100644
--- a/Core/Algorithms/inc/ConvolutionDetectorResolution.h
+++ b/Core/Algorithms/inc/ConvolutionDetectorResolution.h
@@ -15,6 +15,7 @@
 //! @date   Jul 10, 2012
 
 #include "IDetectorResolution.h"
+#include "IResolutionFunction2D.h"
 
 //- -------------------------------------------------------------------
 //! @class ConvolutionDetectorResolution
@@ -26,20 +27,27 @@ class ConvolutionDetectorResolution : public IDetectorResolution
 {
 public:
     typedef double (*cumulative_DF_1d)(double);
-    typedef double (*cumulative_DF_2d)(double, double);
     //! Constructor taking a 1 dimensional resolution function as argument
     ConvolutionDetectorResolution(cumulative_DF_1d res_function_1d);
     //! Constructor taking a 2 dimensional resolution function as argument
-    ConvolutionDetectorResolution(cumulative_DF_2d res_function_2d);
+    ConvolutionDetectorResolution(IResolutionFunction2D *p_res_function_2d);
     //! Destructor
     virtual ~ConvolutionDetectorResolution();
 
     //! Apply the encapsulated resolution function to the given intensity map by using a convolution
     virtual void applyDetectorResolution(OutputData<double> *p_intensity_map) const;
+
+    //! add parameters from local pool to external pool and call recursion over direct children
+    virtual std::string addParametersToExternalPool(std::string path, ParameterPool *external_pool, int copy_number=-1) const;
+
+protected:
+    //! initialize pool parameters, i.e. register some of class members for later access via parameter pool
+    virtual void init_parameters();
+
 private:
     size_t m_dimension;
     cumulative_DF_1d m_res_function_1d;
-    cumulative_DF_2d m_res_function_2d;
+    IResolutionFunction2D *mp_res_function_2d;
     void apply1dConvolution(const std::vector<NamedVectorBase *> &axes, OutputData<double> *p_intensity_map) const;
     void apply2dConvolution(const std::vector<NamedVectorBase *> &axes, OutputData<double> *p_intensity_map) const;
     double getIntegratedPDF1d(double x, double step) const;
diff --git a/Core/Algorithms/inc/Detector.h b/Core/Algorithms/inc/Detector.h
index e4816d4bf4ef19696a139c19aa8dde609df9c198..d65e5886b98a37a36b7f5feacf7c5f7c99bc35a9 100644
--- a/Core/Algorithms/inc/Detector.h
+++ b/Core/Algorithms/inc/Detector.h
@@ -34,6 +34,9 @@ public:
 	void setDetectorResolution(IDetectorResolution *p_detector_resolution) { mp_detector_resolution = p_detector_resolution; }
 	void applyDetectorResolution(OutputData<double> *p_intensity_map) const;
 
+	//! add parameters from local pool to external pool and call recursion over direct children
+    virtual std::string addParametersToExternalPool(std::string path, ParameterPool *external_pool, int copy_number=-1) const;
+
 protected:
     //! initialize pool parameters, i.e. register some of class members for later access via parameter pool
     virtual void init_parameters();
diff --git a/Core/Algorithms/inc/GISASExperiment.h b/Core/Algorithms/inc/GISASExperiment.h
index 778919bdf0f7406d172bed03b1a5236da9e04e57..15b105aac2e4ca15dc37cc47f353c1f4d69b607a 100644
--- a/Core/Algorithms/inc/GISASExperiment.h
+++ b/Core/Algorithms/inc/GISASExperiment.h
@@ -16,7 +16,7 @@
 
 
 #include "Experiment.h"
-#include "ConvolutionDetectorResolution.h"
+#include "IResolutionFunction2D.h"
 
 
 class GISASExperiment : public Experiment
@@ -31,7 +31,7 @@ public:
     void setDetectorParameters(size_t n_phi, double phi_f_min, double phi_f_max,
             size_t n_alpha, double alpha_f_min, double alpha_f_max, bool isgisaxs_style=false);
 
-	void setDetectorResolutionFunction(ConvolutionDetectorResolution::cumulative_DF_2d resolution_function);
+	void setDetectorResolutionFunction(IResolutionFunction2D *p_resolution_function);
 
 	void smearIntensityFromZAxisTilting();
 private:
diff --git a/Core/Algorithms/inc/IDetectorResolution.h b/Core/Algorithms/inc/IDetectorResolution.h
index 9301508d7c60e6ec2671b3c3dd3fe700ca55d787..6d2c29ccd6a32359cce16edb00baa754f855b75f 100644
--- a/Core/Algorithms/inc/IDetectorResolution.h
+++ b/Core/Algorithms/inc/IDetectorResolution.h
@@ -16,8 +16,9 @@
 //! @date   Jul 10, 2012
 
 #include "OutputData.h"
+#include "IParameterized.h"
 
-class IDetectorResolution
+class IDetectorResolution : public IParameterized
 {
 public:
     //! Destructor
diff --git a/Core/Algorithms/inc/IResolutionFunction2D.h b/Core/Algorithms/inc/IResolutionFunction2D.h
new file mode 100644
index 0000000000000000000000000000000000000000..065be7821bbbeba4344cc6ad2eff6ab36f71c2df
--- /dev/null
+++ b/Core/Algorithms/inc/IResolutionFunction2D.h
@@ -0,0 +1,27 @@
+#ifndef IRESOLUTIONFUNCTION2D_H_
+#define IRESOLUTIONFUNCTION2D_H_
+// ********************************************************************
+// * The BornAgain project                                            *
+// * Simulation of neutron and x-ray scattering at grazing incidence  *
+// *                                                                  *
+// * LICENSE AND DISCLAIMER                                           *
+// * Lorem ipsum dolor sit amet, consectetur adipiscing elit.  Mauris *
+// * eget quam orci. Quisque  porta  varius  dui,  quis  posuere nibh *
+// * mollis quis. Mauris commodo rhoncus porttitor.                   *
+// ********************************************************************
+//! @file   IResolutionFunction2D.h
+//! @brief  Definition of IResolutionFunction2D interface
+//! @author Scientific Computing Group at FRM II
+//! @date   Oct 16, 2012
+
+#include "IParameterized.h"
+
+class IResolutionFunction2D : public IParameterized
+{
+public:
+    virtual ~IResolutionFunction2D() {}
+
+    virtual double evaluateCDF(double x, double y) const=0;
+};
+
+#endif /* IRESOLUTIONFUNCTION2D_H_ */
diff --git a/Core/Algorithms/inc/ResolutionFunction2DSimple.h b/Core/Algorithms/inc/ResolutionFunction2DSimple.h
new file mode 100644
index 0000000000000000000000000000000000000000..f4dae33431ccbdbeab57214ed0baedc26c69cd86
--- /dev/null
+++ b/Core/Algorithms/inc/ResolutionFunction2DSimple.h
@@ -0,0 +1,34 @@
+#ifndef RESOLUTIONFUNCTION2DSIMPLE_H_
+#define RESOLUTIONFUNCTION2DSIMPLE_H_
+// ********************************************************************
+// * The BornAgain project                                            *
+// * Simulation of neutron and x-ray scattering at grazing incidence  *
+// *                                                                  *
+// * LICENSE AND DISCLAIMER                                           *
+// * Lorem ipsum dolor sit amet, consectetur adipiscing elit.  Mauris *
+// * eget quam orci. Quisque  porta  varius  dui,  quis  posuere nibh *
+// * mollis quis. Mauris commodo rhoncus porttitor.                   *
+// ********************************************************************
+//! @file   ResolutionFunction2DSimple.h
+//! @brief  Definition of ResolutionFunction2DSimple class
+//! @author Scientific Computing Group at FRM II
+//! @date   Oct 16, 2012
+
+#include "IResolutionFunction2D.h"
+
+class ResolutionFunction2DSimple : public IResolutionFunction2D
+{
+public:
+    ResolutionFunction2DSimple(double sigma_x, double sigma_y);
+    virtual ~ResolutionFunction2DSimple();
+
+    virtual double evaluateCDF(double x, double y) const;
+protected:
+    virtual void init_parameters();
+private:
+    double m_sigma_x;
+    double m_sigma_y;
+};
+
+
+#endif /* RESOLUTIONFUNCTION2DSIMPLE_H_ */
diff --git a/Core/Algorithms/src/ConvolutionDetectorResolution.cpp b/Core/Algorithms/src/ConvolutionDetectorResolution.cpp
index 7c092acd789a2639ddcf3650ec6c6cf4f328ff85..6999dbc6cbc722a6637349c05745fbf72db3976d 100644
--- a/Core/Algorithms/src/ConvolutionDetectorResolution.cpp
+++ b/Core/Algorithms/src/ConvolutionDetectorResolution.cpp
@@ -9,20 +9,23 @@ ConvolutionDetectorResolution::ConvolutionDetectorResolution(
         cumulative_DF_1d res_function_1d)
 : m_dimension(1)
 , m_res_function_1d(res_function_1d)
-, m_res_function_2d(0)
+, mp_res_function_2d(0)
 {
+    setName("ConvolutionDetectorResolution");
 }
 
 ConvolutionDetectorResolution::ConvolutionDetectorResolution(
-        cumulative_DF_2d res_function_2d)
+        IResolutionFunction2D *p_res_function_2d)
 : m_dimension(2)
 , m_res_function_1d(0)
-, m_res_function_2d(res_function_2d)
+, mp_res_function_2d(p_res_function_2d)
 {
+    setName("ConvolutionDetectorResolution");
 }
 
 ConvolutionDetectorResolution::~ConvolutionDetectorResolution()
 {
+    delete mp_res_function_2d;
 }
 
 void ConvolutionDetectorResolution::applyDetectorResolution(
@@ -44,6 +47,24 @@ void ConvolutionDetectorResolution::applyDetectorResolution(
     }
 }
 
+std::string ConvolutionDetectorResolution::addParametersToExternalPool(
+        std::string path, ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string  new_path = IParameterized::addParametersToExternalPool(path, external_pool, copy_number);
+
+    // add parameters of the 2D resolution function
+    if (mp_res_function_2d) {
+        mp_res_function_2d->addParametersToExternalPool(new_path, external_pool, -1);
+    }
+
+    return new_path;
+}
+
+void ConvolutionDetectorResolution::init_parameters()
+{
+}
+
 void ConvolutionDetectorResolution::apply1dConvolution(
         const std::vector<NamedVectorBase*>& axes,
         OutputData<double>* p_intensity_map) const
@@ -83,7 +104,7 @@ void ConvolutionDetectorResolution::apply2dConvolution(
         const std::vector<NamedVectorBase*>& axes,
         OutputData<double>* p_intensity_map) const
 {
-    if (m_res_function_2d==0) {
+    if (mp_res_function_2d==0) {
         throw LogicErrorException("No 2d resolution function present for convolution of 2d data.");
     }
     if (axes.size() != 2) {
@@ -158,7 +179,7 @@ double ConvolutionDetectorResolution::getIntegratedPDF2d(double x,
     double xmax = x + halfstepx;
     double ymin = y - halfstepy;
     double ymax = y + halfstepy;
-    double result = m_res_function_2d(xmax, ymax) - m_res_function_2d(xmax, ymin)
-            - m_res_function_2d(xmin, ymax) + m_res_function_2d(xmin, ymin);
+    double result = mp_res_function_2d->evaluateCDF(xmax, ymax) - mp_res_function_2d->evaluateCDF(xmax, ymin)
+            - mp_res_function_2d->evaluateCDF(xmin, ymax) + mp_res_function_2d->evaluateCDF(xmin, ymin);
     return result;
 }
diff --git a/Core/Algorithms/src/Detector.cpp b/Core/Algorithms/src/Detector.cpp
index 49b1eca66341412c727c532081b1d4ed87417a76..20e1944befd006fa3f43140bb57cce7ed6980ce3 100644
--- a/Core/Algorithms/src/Detector.cpp
+++ b/Core/Algorithms/src/Detector.cpp
@@ -38,6 +38,18 @@ void Detector::applyDetectorResolution(
     }
 }
 
+std::string Detector::addParametersToExternalPool(std::string path,
+        ParameterPool* external_pool, int copy_number) const
+{
+    // add own parameters
+    std::string  new_path = IParameterized::addParametersToExternalPool(path, external_pool, copy_number);
+
+    // add parameters of the resolution function
+    mp_detector_resolution->addParametersToExternalPool(new_path, external_pool, -1);
+
+    return new_path;
+}
+
 void Detector::init_parameters()
 {
 }
diff --git a/Core/Algorithms/src/Experiment.cpp b/Core/Algorithms/src/Experiment.cpp
index db9baed1389558f11489b5578b4e077f5034a575..0e377fcf75b7308cad5d125adf23215d592fed2b 100644
--- a/Core/Algorithms/src/Experiment.cpp
+++ b/Core/Algorithms/src/Experiment.cpp
@@ -138,10 +138,6 @@ std::string Experiment::addParametersToExternalPool(std::string path,
         mp_sample->addParametersToExternalPool(sample_path, external_pool, -1);
     }
 
-    // Output parameterpool
-//    for(ParameterPool::iterator_t ip=external_pool->begin(); ip!=external_pool->end(); ip++) {
-//        std::cout << (*ip).first << " " << (*ip).second << std::endl;
-//    }
     return new_path;
 }
 
diff --git a/Core/Algorithms/src/GISASExperiment.cpp b/Core/Algorithms/src/GISASExperiment.cpp
index 394920138a893101c6777b122c5e407676ee1cf7..53b117805f04bbd0f68be664cd17b159ef5d6dd0 100644
--- a/Core/Algorithms/src/GISASExperiment.cpp
+++ b/Core/Algorithms/src/GISASExperiment.cpp
@@ -5,6 +5,8 @@
 #include "DoubleToComplexInterpolatingFunction.h"
 #include "MathFunctions.h"
 #include "ProgramOptions.h"
+#include "ConvolutionDetectorResolution.h"
+
 #include <boost/thread.hpp>
 
 
@@ -107,10 +109,9 @@ void GISASExperiment::setDetectorParameters(size_t n_phi, double phi_f_min, doub
     updateIntensityMapAxes();
 }
 
-void GISASExperiment::setDetectorResolutionFunction(
-        ConvolutionDetectorResolution::cumulative_DF_2d resolution_function)
+void GISASExperiment::setDetectorResolutionFunction(IResolutionFunction2D *p_resolution_function)
 {
-    m_detector.setDetectorResolution(new ConvolutionDetectorResolution(resolution_function));
+    m_detector.setDetectorResolution(new ConvolutionDetectorResolution(p_resolution_function));
 }
 
 void GISASExperiment::smearIntensityFromZAxisTilting()
diff --git a/Core/Algorithms/src/ResolutionFunction2DSimple.cpp b/Core/Algorithms/src/ResolutionFunction2DSimple.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..fddad91f54ce0d89144c01f18bc46f6c08ecd333
--- /dev/null
+++ b/Core/Algorithms/src/ResolutionFunction2DSimple.cpp
@@ -0,0 +1,28 @@
+#include "ResolutionFunction2DSimple.h"
+#include "MathFunctions.h"
+
+ResolutionFunction2DSimple::ResolutionFunction2DSimple(double sigma_x,
+        double sigma_y)
+: m_sigma_x(sigma_x)
+, m_sigma_y(sigma_y)
+{
+    setName("ResolutionFunction2D");
+    init_parameters();
+}
+
+ResolutionFunction2DSimple::~ResolutionFunction2DSimple()
+{
+}
+
+double ResolutionFunction2DSimple::evaluateCDF(double x, double y) const
+{
+    return MathFunctions::IntegratedGaussian(x, 0.0, m_sigma_x)
+                * MathFunctions::IntegratedGaussian(y, 0.0, m_sigma_y);
+}
+
+void ResolutionFunction2DSimple::init_parameters()
+{
+    getParameterPool()->clear();
+    getParameterPool()->registerParameter("sigma_x", &m_sigma_x);
+    getParameterPool()->registerParameter("sigma_y", &m_sigma_y);
+}
diff --git a/Core/Core.pro b/Core/Core.pro
index 32568c7165ec4beb91ccf6468e908534a0dfa298..510ae680ae4e9512070ae6a34e1847bec55b141b 100644
--- a/Core/Core.pro
+++ b/Core/Core.pro
@@ -34,6 +34,7 @@ SOURCES += \
     Algorithms/src/MultiLayerDWBASimulation.cpp \
     Algorithms/src/MultiLayerRoughnessDWBASimulation.cpp \
     Algorithms/src/OpticalFresnel.cpp \
+    Algorithms/src/ResolutionFunction2DSimple.cpp \
     \
     FormFactors/src/FormFactorDWBA.cpp \
     FormFactors/src/FormFactorDWBAConstZ.cpp \
@@ -126,16 +127,18 @@ HEADERS += \
     Algorithms/inc/GISASExperiment.h \
     Algorithms/inc/IDetectorResolution.h \
     Algorithms/inc/IFittingDataSelector.h \
+    Algorithms/inc/IInterferenceFunctionStrategy.h \
+    Algorithms/inc/IResolutionFunction2D.h \
     Algorithms/inc/ISampleBuilder.h \
     Algorithms/inc/ISimulation.h \
     Algorithms/inc/ISquaredFunction.h \
-    Algorithms/inc/IInterferenceFunctionStrategy.h \
     Algorithms/inc/LayerDecoratorDWBASimulation.h \
     Algorithms/inc/LayerDWBASimulation.h \
     Algorithms/inc/LocalMonodisperseApproximationStrategy.h \
     Algorithms/inc/MultiLayerDWBASimulation.h \
     Algorithms/inc/MultiLayerRoughnessDWBASimulation.h \
     Algorithms/inc/OpticalFresnel.h \
+    Algorithms/inc/ResolutionFunction2DSimple.h \
     \
     FormFactors/inc/FormFactorDWBA.h \
     FormFactors/inc/FormFactorDWBAConstZ.h \
diff --git a/Core/Tools/inc/Types.h b/Core/Tools/inc/Types.h
index a6f322988b6d442c45074fa98ee2260f4107888e..f2af0f6c7166dfcfd8f55bb306950e397700a045 100644
--- a/Core/Tools/inc/Types.h
+++ b/Core/Tools/inc/Types.h
@@ -30,7 +30,7 @@ typedef std::pair<complex_t, complex_t > complexpair_t;
 
 
 /* ************************************************************************* */
-// container for holding kvectors with optimied location/deallocation
+// container for holding kvectors with optimised location/deallocation
 /* ************************************************************************* */
 class KVectorContainer {
 public:
diff --git a/XCode_GISASFW.xcodeproj/project.pbxproj b/XCode_GISASFW.xcodeproj/project.pbxproj
index 0cd64643d75e9ade428f6c9a42e05741f60d6877..af290b66b4dc9cce72b7ef5a572a08fe909f8db5 100644
--- a/XCode_GISASFW.xcodeproj/project.pbxproj
+++ b/XCode_GISASFW.xcodeproj/project.pbxproj
@@ -42,15 +42,6 @@
 		62224814160CB853008205AC /* Point3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6222229E160CB745008205AC /* Point3D.cpp */; };
 		62224815160CB853008205AC /* Transform3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6222229F160CB745008205AC /* Transform3D.cpp */; };
 		62224816160CB853008205AC /* Vector3D.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222A0160CB745008205AC /* Vector3D.cpp */; };
-		62224821160CB853008205AC /* PythonInterface_classes_1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222AE160CB745008205AC /* PythonInterface_classes_1.cpp */; };
-		62224822160CB853008205AC /* PythonInterface_classes_2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222AF160CB745008205AC /* PythonInterface_classes_2.cpp */; };
-		62224823160CB853008205AC /* PythonInterface_classes_3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222B0160CB745008205AC /* PythonInterface_classes_3.cpp */; };
-		62224824160CB853008205AC /* PythonInterface_free_functions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222B1160CB745008205AC /* PythonInterface_free_functions.cpp */; };
-		62224825160CB853008205AC /* PythonInterface_global_variables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222B2160CB745008205AC /* PythonInterface_global_variables.cpp */; };
-		62224826160CB853008205AC /* PythonListConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222B3160CB745008205AC /* PythonListConverter.cpp */; };
-		62224827160CB853008205AC /* PythonModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222B4160CB745008205AC /* PythonModule.cpp */; };
-		62224828160CB853008205AC /* PythonOutputData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222B5160CB745008205AC /* PythonOutputData.cpp */; };
-		62224829160CB853008205AC /* PythonPlusplusHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222B6160CB745008205AC /* PythonPlusplusHelper.cpp */; };
 		6222484A160CB853008205AC /* Crystal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222DA160CB745008205AC /* Crystal.cpp */; };
 		6222484B160CB853008205AC /* DiffuseParticleInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222DB160CB745008205AC /* DiffuseParticleInfo.cpp */; };
 		6222484C160CB853008205AC /* HomogeneousMaterial.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 622222DC160CB745008205AC /* HomogeneousMaterial.cpp */; };
@@ -166,6 +157,10 @@
 		62EA737F1628422200656B41 /* OutputDataReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62EA73781628422200656B41 /* OutputDataReader.cpp */; };
 		62EA73801628422200656B41 /* OutputDataWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62EA73791628422200656B41 /* OutputDataWriter.cpp */; };
 		62EA73811628422200656B41 /* ParameterPool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62EA737A1628422200656B41 /* ParameterPool.cpp */; };
+		62F3A3B4162D9966007FEE73 /* libboost_iostreams.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 62F3A3B3162D9966007FEE73 /* libboost_iostreams.dylib */; };
+		62F3A3BB162D99E4007FEE73 /* FitSuiteHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62F3A3B8162D99E4007FEE73 /* FitSuiteHelper.cpp */; };
+		62F3A3BC162D99E4007FEE73 /* ROOTMinimizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62F3A3B9162D99E4007FEE73 /* ROOTMinimizer.cpp */; };
+		62F3A3BD162D99E4007FEE73 /* TreeEventStructure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62F3A3BA162D99E4007FEE73 /* TreeEventStructure.cpp */; };
 		62F77E261619992B00C8F15E /* TestMesoCrystal1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62F77E241619992B00C8F15E /* TestMesoCrystal1.cpp */; };
 		62F77E271619992B00C8F15E /* TestMesoCrystal2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62F77E251619992B00C8F15E /* TestMesoCrystal2.cpp */; };
 		62FDC05C1615E39200D28B08 /* ProgramOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62FDC05B1615E39200D28B08 /* ProgramOptions.cpp */; };
@@ -217,7 +212,6 @@
 		622221EB160CB745008205AC /* AppLinkDef.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppLinkDef.h; sourceTree = "<group>"; };
 		622221EC160CB745008205AC /* CommandLine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommandLine.h; sourceTree = "<group>"; };
 		622221ED160CB745008205AC /* DrawHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DrawHelper.h; sourceTree = "<group>"; };
-		622221EE160CB745008205AC /* EventFrame.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EventFrame.h; sourceTree = "<group>"; };
 		622221EF160CB745008205AC /* FunctionalTestFactory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FunctionalTestFactory.h; sourceTree = "<group>"; };
 		622221F0160CB745008205AC /* IFunctionalTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IFunctionalTest.h; sourceTree = "<group>"; };
 		622221F1160CB745008205AC /* IsGISAXSTools.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IsGISAXSTools.h; sourceTree = "<group>"; };
@@ -1078,6 +1072,13 @@
 		62EA73791628422200656B41 /* OutputDataWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OutputDataWriter.cpp; sourceTree = "<group>"; };
 		62EA737A1628422200656B41 /* ParameterPool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParameterPool.cpp; sourceTree = "<group>"; };
 		62EA73821628425600656B41 /* ISampleBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ISampleBuilder.h; sourceTree = "<group>"; };
+		62F3A3B3162D9966007FEE73 /* libboost_iostreams.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libboost_iostreams.dylib; path = ../../../../../opt/local/lib/libboost_iostreams.dylib; sourceTree = "<group>"; };
+		62F3A3B5162D99D5007FEE73 /* FitSuiteHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FitSuiteHelper.h; sourceTree = "<group>"; };
+		62F3A3B6162D99D5007FEE73 /* ROOTMinimizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ROOTMinimizer.h; sourceTree = "<group>"; };
+		62F3A3B7162D99D5007FEE73 /* TreeEventStructure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeEventStructure.h; sourceTree = "<group>"; };
+		62F3A3B8162D99E4007FEE73 /* FitSuiteHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FitSuiteHelper.cpp; sourceTree = "<group>"; };
+		62F3A3B9162D99E4007FEE73 /* ROOTMinimizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ROOTMinimizer.cpp; sourceTree = "<group>"; };
+		62F3A3BA162D99E4007FEE73 /* TreeEventStructure.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TreeEventStructure.cpp; sourceTree = "<group>"; };
 		62F77E241619992B00C8F15E /* TestMesoCrystal1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestMesoCrystal1.cpp; sourceTree = "<group>"; };
 		62F77E251619992B00C8F15E /* TestMesoCrystal2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestMesoCrystal2.cpp; sourceTree = "<group>"; };
 		62F77E281619993B00C8F15E /* TestMesoCrystal1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestMesoCrystal1.h; sourceTree = "<group>"; };
@@ -1138,6 +1139,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				62F3A3B4162D9966007FEE73 /* libboost_iostreams.dylib in Frameworks */,
 				62FDC0641615F1CB00D28B08 /* libboost_program_options.dylib in Frameworks */,
 				62224887160CBD55008205AC /* libgsl.0.dylib in Frameworks */,
 				62224888160CBD55008205AC /* libgslcblas.0.dylib in Frameworks */,
@@ -1176,6 +1178,9 @@
 		622221E9160CB745008205AC /* inc */ = {
 			isa = PBXGroup;
 			children = (
+				62F3A3B5162D99D5007FEE73 /* FitSuiteHelper.h */,
+				62F3A3B6162D99D5007FEE73 /* ROOTMinimizer.h */,
+				62F3A3B7162D99D5007FEE73 /* TreeEventStructure.h */,
 				6218B467161B25B2007FFA5C /* TestIsGISAXS11.h */,
 				62F77E281619993B00C8F15E /* TestMesoCrystal1.h */,
 				62F77E291619993B00C8F15E /* TestMesoCrystal2.h */,
@@ -1184,7 +1189,6 @@
 				622221EB160CB745008205AC /* AppLinkDef.h */,
 				622221EC160CB745008205AC /* CommandLine.h */,
 				622221ED160CB745008205AC /* DrawHelper.h */,
-				622221EE160CB745008205AC /* EventFrame.h */,
 				622221EF160CB745008205AC /* FunctionalTestFactory.h */,
 				622221F0160CB745008205AC /* IFunctionalTest.h */,
 				622221F1160CB745008205AC /* IsGISAXSTools.h */,
@@ -1213,6 +1217,9 @@
 		62222224160CB745008205AC /* src */ = {
 			isa = PBXGroup;
 			children = (
+				62F3A3B8162D99E4007FEE73 /* FitSuiteHelper.cpp */,
+				62F3A3B9162D99E4007FEE73 /* ROOTMinimizer.cpp */,
+				62F3A3BA162D99E4007FEE73 /* TreeEventStructure.cpp */,
 				6218B468161B25BC007FFA5C /* TestIsGISAXS11.cpp */,
 				62F77E241619992B00C8F15E /* TestMesoCrystal1.cpp */,
 				62F77E251619992B00C8F15E /* TestMesoCrystal2.cpp */,
@@ -68192,6 +68199,7 @@
 		627C2C58160B4937004C1B11 = {
 			isa = PBXGroup;
 			children = (
+				62F3A3B3162D9966007FEE73 /* libboost_iostreams.dylib */,
 				62FDC0631615F1CB00D28B08 /* libboost_program_options.dylib */,
 				622248A8160CC56B008205AC /* gtest.framework */,
 				622221E4160CB745008205AC /* App */,
@@ -68416,6 +68424,9 @@
 				62F77E261619992B00C8F15E /* TestMesoCrystal1.cpp in Sources */,
 				62F77E271619992B00C8F15E /* TestMesoCrystal2.cpp in Sources */,
 				6218B469161B25BC007FFA5C /* TestIsGISAXS11.cpp in Sources */,
+				62F3A3BB162D99E4007FEE73 /* FitSuiteHelper.cpp in Sources */,
+				62F3A3BC162D99E4007FEE73 /* ROOTMinimizer.cpp in Sources */,
+				62F3A3BD162D99E4007FEE73 /* TreeEventStructure.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -68459,15 +68470,6 @@
 				62224814160CB853008205AC /* Point3D.cpp in Sources */,
 				62224815160CB853008205AC /* Transform3D.cpp in Sources */,
 				62224816160CB853008205AC /* Vector3D.cpp in Sources */,
-				62224821160CB853008205AC /* PythonInterface_classes_1.cpp in Sources */,
-				62224822160CB853008205AC /* PythonInterface_classes_2.cpp in Sources */,
-				62224823160CB853008205AC /* PythonInterface_classes_3.cpp in Sources */,
-				62224824160CB853008205AC /* PythonInterface_free_functions.cpp in Sources */,
-				62224825160CB853008205AC /* PythonInterface_global_variables.cpp in Sources */,
-				62224826160CB853008205AC /* PythonListConverter.cpp in Sources */,
-				62224827160CB853008205AC /* PythonModule.cpp in Sources */,
-				62224828160CB853008205AC /* PythonOutputData.cpp in Sources */,
-				62224829160CB853008205AC /* PythonPlusplusHelper.cpp in Sources */,
 				6222484A160CB853008205AC /* Crystal.cpp in Sources */,
 				6222484B160CB853008205AC /* DiffuseParticleInfo.cpp in Sources */,
 				6222484C160CB853008205AC /* HomogeneousMaterial.cpp in Sources */,