diff --git a/App/inc/TestIsGISAXS12.h b/App/inc/TestIsGISAXS12.h
index c4a5c010bd9d3d4b5b21531f03e7a1f243612025..a7db5cc02005af6ff2df625a29bc2715e5d55be2 100644
--- a/App/inc/TestIsGISAXS12.h
+++ b/App/inc/TestIsGISAXS12.h
@@ -51,10 +51,11 @@ private:
     protected:
         //! initialize pool parameters, i.e. register some of class members for later access via parameter pool
         virtual void init_parameters();
-        double m_particle_probability;
+        double m_particle_probability1;
         double m_particle_radius1;
         double m_dispersion_radius1;
         double m_height_aspect_ratio1;
+        double m_particle_probability2;
         double m_particle_radius2;
         double m_dispersion_radius2;
         double m_height_aspect_ratio2;
@@ -125,8 +126,8 @@ private:
     //! convert isgisaxs 1d scan to output data 2d object
     OutputData<double> *convert_isgi_scan(std::vector<IsgiData > &isgi_data);
 
-    //! run test fit
-    void run_test_fit();
+    //! run test minimizer to check whole chain
+    void run_test_minimizer();
 
     void print_axes(DataSet &data);
 
diff --git a/App/src/DrawHelper.cpp b/App/src/DrawHelper.cpp
index 4c189752f1dc185334c1c8773bce6daa6e2e839b..8b8387ab48ddef7c568fbdec332175de406a530f 100644
--- a/App/src/DrawHelper.cpp
+++ b/App/src/DrawHelper.cpp
@@ -62,7 +62,7 @@ void DrawHelper::SetMagnifier(TCanvas *canvas)
 void DrawHelper::ExecuteMagnifier(int event, int px, int py, TObject *sel)
 {
   (void)sel;
-  if ( (event == kButton1Double) ) {
+  if ( event == kButton1Double ) {
     TCanvas *c = (TCanvas *) gTQSender;
     char cname[256];
     sprintf(cname,"%s_%d",c->GetTitle(),(int)time(0));
diff --git a/App/src/TestDetectorResolution.cpp b/App/src/TestDetectorResolution.cpp
index f7f3a5382c7947288843ab77cb2648937fc0b604..a0e7129b66c2efdb8a875111434da103cabc8b95 100644
--- a/App/src/TestDetectorResolution.cpp
+++ b/App/src/TestDetectorResolution.cpp
@@ -13,13 +13,13 @@
 
 namespace
 {
-double testResolutionFunction(double u, double v)
-{
-    double sigma_u = 0.001;
-    double sigma_v = 0.001;
-    return MathFunctions::IntegratedGaussian(u, 0.0, sigma_u)
-            * MathFunctions::IntegratedGaussian(v, 0.0, sigma_v);
-}
+//double testResolutionFunction(double u, double v)
+//{
+//    double sigma_u = 0.001;
+//    double sigma_v = 0.001;
+//    return MathFunctions::IntegratedGaussian(u, 0.0, sigma_u)
+//            * MathFunctions::IntegratedGaussian(v, 0.0, sigma_v);
+//}
 }
 
 TestDetectorResolution::TestDetectorResolution()
diff --git a/App/src/TestIsGISAXS12.cpp b/App/src/TestIsGISAXS12.cpp
index 976df02a3934c6fe962a607f6723e4510de2617b..5713c5f8db21d6a57fe2b009b43d8bb88958fdcd 100644
--- a/App/src/TestIsGISAXS12.cpp
+++ b/App/src/TestIsGISAXS12.cpp
@@ -36,6 +36,7 @@
 #include "TH2D.h"
 #include "TLine.h"
 #include "TROOT.h"
+#include "TLegend.h"
 
 
 
@@ -77,11 +78,12 @@ void TestIsGISAXS12::execute()
     // plot isgisaxs data
     plot_isgisaxs_data();
 
+    // run test fit
+    run_test_minimizer();
+
     // run isgisaxs ex-12 style fit
-    //run_isgisaxs_fit();
+    run_isgisaxs_fit();
 
-    // run test fit
-    //run_test_fit();
 
 }
 
@@ -94,7 +96,6 @@ void TestIsGISAXS12::run_isgisaxs_comparison()
 {
     // run simulation for default sample parameters
     m_experiment->runSimulation();
-    m_experiment->normalize();
     IsGISAXSTools::writeOutputDataToFile(*(m_experiment->getOutputData()), m_data_path+"this_fitconstraints.ima");
 
     // plotting results of comparison we/isgisaxs for the sample with default parameters
@@ -104,15 +105,10 @@ void TestIsGISAXS12::run_isgisaxs_comparison()
     // -------------
     // plot results
     // -------------
-    OutputData<double> *isgi_data_orig = IsGISAXSTools::readOutputDataFromFile(isgi_file);
-    OutputData<double> *our_data_orig = IsGISAXSTools::readOutputDataFromFile(this_file);
-
-    OutputDataNormalizerScaleAndShift mr(1.0, 0.0);
-    OutputData<double> *isgi_data = mr.createNormalizedData(*isgi_data_orig);
-    OutputData<double> *our_data = mr.createNormalizedData(*our_data_orig);
+    OutputData<double> *isgi_data = IsGISAXSTools::readOutputDataFromFile(isgi_file);
+    OutputData<double> *our_data = IsGISAXSTools::readOutputDataFromFile(this_file);
 
     TCanvas *c1 = DrawHelper::instance().createAndRegisterCanvas("TestIsGISAXS12_c1", "ex-12: Mixture of cylindrical particles with different size distribution");
-
     c1->Divide(2,2);
 
 //    IsGISAXSTools::setMinimum(1.);
@@ -127,8 +123,8 @@ void TestIsGISAXS12::run_isgisaxs_comparison()
 
     // difference
     c1->cd(3);
-//    IsGISAXSTools::setMinimum(-0.0001);
-//    IsGISAXSTools::setMaximum(0.0001);
+    IsGISAXSTools::setMinimum(-0.0001);
+    IsGISAXSTools::setMaximum(0.0001);
     IsGISAXSTools::drawOutputDataRelativeDifference2D(*our_data, *isgi_data, "CONT4 Z", "2D Difference map");
 
     // difference
@@ -137,10 +133,10 @@ void TestIsGISAXS12::run_isgisaxs_comparison()
     IsGISAXSTools::setMinimum(1);
     IsGISAXSTools::drawOutputDataDifference1D(*our_data, *isgi_data, "", "Difference spectra");
 
-
     delete isgi_data;
     delete our_data;
 
+    c1->Update();
 }
 
 
@@ -151,13 +147,7 @@ void TestIsGISAXS12::run_isgisaxs_fit()
 {
     // reading info about two 1D scans defined in isgisaxs example
     DataSet isgi_scans;
-    read_isgisaxs_datfile(m_data_path+"isgi_fitconstraints.dat", isgi_scans);
-
-
-
-    // making some plots together with test simulation
-//    plot_isgisaxs_data();
-//    return;
+    read_isgisaxs_outfile(m_data_path+"isgi_fitconstraints.out", isgi_scans);
 
     // creating fit suite
     m_fitSuite = new FitSuite();
@@ -170,37 +160,38 @@ void TestIsGISAXS12::run_isgisaxs_fit()
     minim->SetStrategy(1);
 //    minim->SetPrecision(1.);
 
-//    m_fitSuite->addFitParameter("*Normalizer/scale", 1e5, 100, AttLimits::limited(1e4, 2e5));
-//    m_fitSuite->addFitParameter("*Normalizer/shift", 10, 1, AttLimits::limited(1., 20.));
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability",  0.4, 0.1, AttLimits::limited(0.01, 1.0) );
-
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius1",  4*Units::nanometer, 1*Units::nanometer, AttLimits::limited(1., 10.) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius1",  0.2, 0.1, AttLimits::limited(0.01, 1.) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio1",  0.8, 0.1, AttLimits::limited(0.01, 10.) );
+    m_fitSuite->addFitParameter("*Normalizer/scale", 1e5, 1, AttLimits::limited(1e4, 2e5));
+    m_fitSuite->addFitParameter("*Normalizer/shift", 10, 0.01, AttLimits::limited(1., 20.));
 
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius2",  4*Units::nanometer, 1*Units::nanometer, AttLimits::limited(1., 10.) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius2",  0.2, 0.1, AttLimits::limited(0.01, 1.) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio2",  0.8, 0.1, AttLimits::limited(0.01, 10.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability1",  0.4, 0.01, AttLimits::limited(0.01, 1.0) );
+    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius1",  4*Units::nanometer, 0.01*Units::nanometer, AttLimits::limited(1., 10.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius1",  0.2, 0.01, AttLimits::limited(0.01, 1.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio1",  0.8, 0.01, AttLimits::limited(0.01, 10.) );
 
-//    m_fitSuite->addFitParameter("*SampleBuilder/interf_distance",  12*Units::nanometer, 1*Units::nanometer, AttLimits::limited(0.01, 50.0) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/interf_width",  6*Units::nanometer, 1*Units::nanometer, AttLimits::limited(0.01, 10.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability2",  0.6, 0.01, AttLimits::limited(0.01, 1.0) );
+    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius2",  4*Units::nanometer, 0.01*Units::nanometer, AttLimits::limited(1., 10.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius2",  0.2, 0.01, AttLimits::limited(0.01, 1.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio2",  0.8, 0.01, AttLimits::limited(0.01, 10.) );
 
+    m_fitSuite->addFitParameter("*SampleBuilder/interf_distance",  12*Units::nanometer, 0.01*Units::nanometer, AttLimits::limited(0.01, 50.0) );
+    m_fitSuite->addFitParameter("*SampleBuilder/interf_width",  6*Units::nanometer, 0.01*Units::nanometer, AttLimits::limited(0.01, 10.) );
 
-    m_fitSuite->addFitParameter("*Normalizer/scale", 1e5, 100, AttLimits::limited(1e4, 2e5));
-    m_fitSuite->addFitParameter("*Normalizer/shift", 10, 1, AttLimits::limited(1., 20.));
-    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability",  0.4, 0.1, AttLimits::limited(0.01, 1.0) );
 
-    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius1",  4*Units::nanometer, 1*Units::nanometer, AttLimits::limited(1., 10.) );
-    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius1",  0.2, 0.1, AttLimits::limited(0.01, 1.) );
-    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio1",  0.8, 0.1, AttLimits::limited(0.01, 10.) );
+//      m_fitSuite->addFitParameter("*Normalizer/scale", 1.31159E+05, 100, AttLimits::limited(1e4, 2e5));
+//      m_fitSuite->addFitParameter("*Normalizer/shift", -8.10009E-02, 1, AttLimits::limited(-10., 20.));
 
-    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius2",  4*Units::nanometer, 1*Units::nanometer, AttLimits::limited(1., 10.) );
-    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius2",  0.2, 0.1, AttLimits::limited(0.01, 1.) );
-    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio2",  0.8, 0.1, AttLimits::limited(0.01, 10.) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/particle_probability1",  5.34055E-01, 0.1, AttLimits::limited(0.01, 1.0) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/particle_radius1",  4.90801E+00, 1*Units::nanometer, AttLimits::limited(1., 10.) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius1",  1.90651E-01, 0.1, AttLimits::limited(0.01, 1.) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio1",  1.00193E+00, 0.1, AttLimits::limited(0.01, 10.) );
 
-    m_fitSuite->addFitParameter("*SampleBuilder/interf_distance",  12*Units::nanometer, 1*Units::nanometer, AttLimits::limited(0.01, 50.0) );
-    m_fitSuite->addFitParameter("*SampleBuilder/interf_width",  6*Units::nanometer, 1*Units::nanometer, AttLimits::limited(0.01, 10.) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/particle_probability2",  4.70783E-01, 0.1, AttLimits::limited(0.01, 1.0) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/particle_radius2",  5.16801E+00, 1*Units::nanometer, AttLimits::limited(1., 10.) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius2",  2.03908E-01, 0.1, AttLimits::limited(0.01, 1.) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio2",  9.77402E-01, 0.1, AttLimits::limited(0.01, 10.) );
 
+//      m_fitSuite->addFitParameter("*SampleBuilder/interf_distance",  1.49681E+01, 1*Units::nanometer, AttLimits::limited(0.01, 50.0) );
+//      m_fitSuite->addFitParameter("*SampleBuilder/interf_width",  3.03315E+00, 1*Units::nanometer, AttLimits::limited(0.01, 10.) );
 
     // setting up fitSuite
     ChiSquaredModule chiModule;
@@ -214,22 +205,51 @@ void TestIsGISAXS12::run_isgisaxs_fit()
     m_fitSuite->runFit();
 
     // drawing results
-    TCanvas *c2 = new TCanvas("c2","c2",800,600);
+    TCanvas *c2 = new TCanvas("c2","GISASFW fit results",800,600);
     c2->Divide(2,2);
-    for(size_t i=0; i<m_fitSuite->getFitObjects()->size(); ++i) {
-        c2->cd(i+1);
-        const FitObject *obj = m_fitSuite->getFitObjects()->getObject(i);
-        TH1D *hreal = IsGISAXSTools::getOutputDataScanHist(*obj->getChiSquaredModule()->getRealData(),"real");
-        TH1D *hsimul = IsGISAXSTools::getOutputDataScanHist(*obj->getChiSquaredModule()->getSimulationData(),"simul");
+    TLegend *leg1 = new TLegend(0.5,0.6,0.85,0.85);
+    leg1->SetBorderSize(1);
+    leg1->SetFillStyle(0);
+    for(size_t i_set=0; i_set<m_fitSuite->getFitObjects()->size(); ++i_set) {
+        c2->cd(i_set+1);
+        const FitObject *obj = m_fitSuite->getFitObjects()->getObject(i_set);
+        TH1D *hreal = IsGISAXSTools::getOutputDataScanHist(*obj->getChiSquaredModule()->getRealData(),"gisasfw_real");
+        TH1D *hsimul = IsGISAXSTools::getOutputDataScanHist(*obj->getChiSquaredModule()->getSimulationData(),"gisasfw_simul");
         hreal->SetLineColor(kBlue);
         gPad->SetLogy();
         hreal->DrawCopy();
         hsimul->DrawCopy("same");
-        delete hreal;
-        delete hsimul;
+        if(i_set==0) leg1->AddEntry(hreal,"GISASFW data","lp");
+        if(i_set==0) leg1->AddEntry(hsimul,"GISASFW simul","lp");
+    }
+    c2->cd(1); leg1->Draw();
+    c2->cd(2); leg1->Draw();
+
+    // drawing ratio
+    TLegend *leg2 = new TLegend(0.5,0.6,0.85,0.85);
+    leg2->SetBorderSize(1);
+    leg2->SetFillStyle(0);
+    for(size_t i_set=0; i_set<m_fitSuite->getFitObjects()->size(); ++i_set) {
+        c2->cd(3+1);
+        const FitObject *obj = m_fitSuite->getFitObjects()->getObject(i_set);
+        OutputData<double > *real = obj->getChiSquaredModule()->getRealData()->clone();
+        OutputData<double > *simul = obj->getChiSquaredModule()->getSimulationData()->clone();
+
+        c2->cd(i_set+3);
+        *simul /= *real;
+        TH1D *hratio = IsGISAXSTools::getOutputDataScanHist(*simul,"gisasfw_real_simul_ratio");
+        hratio->DrawCopy();
+        if(i_set==0) {
+            leg2->AddEntry(hratio,"GISASFW simul/real","lp");
+        }
+        delete real;
+        delete simul;
     }
+    c2->cd(3); leg2->Draw();
+    c2->cd(4); leg2->Draw();
 
 
+    c2->Update();
 }
 
 
@@ -252,161 +272,62 @@ void TestIsGISAXS12::plot_isgisaxs_data()
     print_axes(isgi_scans_smoothed);
     print_axes(isgi_results);
 
-    TCanvas *c1 = DrawHelper::instance().createAndRegisterCanvas("c1_isgisaxs_data", "c1_isgisaxs_data", 768, 1024);
+    TCanvas *c1 = DrawHelper::instance().createAndRegisterCanvas("c1_isgisaxs_data", "Looking on IsGISAXS data and fit results", 768, 1024);
     c1->Divide(2,3);
 
     // drawing real data with fine and coars granularity on top of each other
+    TLegend *leg1 = new TLegend(0.5,0.6,0.85,0.85);
+    leg1->SetBorderSize(1);
+    leg1->SetFillStyle(0);
+
     for(size_t i_set=0; i_set<isgi_scans.size(); ++i_set) {
         c1->cd(1+i_set); gPad->SetLogy();
         TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*isgi_scans[i_set], "data");
         hdata->DrawCopy();
+        if(i_set==0) leg1->AddEntry(hdata,"isgisaxs data fine","lp");
         TH1D *hdata_smoothed = IsGISAXSTools::getOutputDataScanHist(*isgi_scans_smoothed[i_set], "data_smoothed");
         hdata_smoothed->SetLineColor(kBlue);
         hdata_smoothed->DrawCopy("same");
+        if(i_set==0) leg1->AddEntry(hdata_smoothed,"isgisaxs data","lp");
     }
+    c1->cd(1); leg1->Draw();
+    c1->cd(2); leg1->Draw();
 
     // drawing isgsaxs fit results on top of isgisaxs real data
+    TLegend *leg2 = new TLegend(0.5,0.6,0.85,0.85);
+    leg2->SetBorderSize(1);
+    leg2->SetFillStyle(0);
     for(size_t i_set=0; i_set<isgi_scans.size(); ++i_set) {
         c1->cd(3+i_set); gPad->SetLogy();
         TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*isgi_results[i_set], "data");
         hdata->SetLineColor(kRed);
         hdata->DrawCopy();
+        if(i_set==0) leg2->AddEntry(hdata,"isgisaxs results","lp");
         TH1D *hdata_smoothed = IsGISAXSTools::getOutputDataScanHist(*isgi_scans_smoothed[i_set], "data_smoothed");
         hdata_smoothed->SetLineColor(kBlue);
         hdata_smoothed->DrawCopy("same");
+        if(i_set==0) leg2->AddEntry(hdata_smoothed,"isgisaxs data","lp");
     }
+    c1->cd(3); leg2->Draw();
+    c1->cd(4); leg2->Draw();
 
-
-    /*
-     *
-     *
-  1  1  # Global scale factor :               1.31728E+05
-  2  2  # Global shift factor :               5.90612E-01
-  3  3  # ( 1) Particle probability :         6.60819E-01
-  4  4  # ( 1) Particle radius (nm) :         4.92536E+00
-  5  5  # ( 1) Dispersion of radius:          1.86101E-01
-  6  6  # ( 1) Height aspect ratio :          9.84164E-01
-  7  7  # ( 2) Particle probability :         3.44720E-01
-  8  8  # ( 2) Particle radius (nm) :         5.26120E+00
-  9  9  # ( 2) Dispersion of radius:          2.16915E-01
- 10 10  # ( 2) Height aspect ratio :          1.00898E+00
- 11 11  # D (nm) :                            1.49763E+01
- 12 12  # w (nm) :                            3.02653E+00
-    */
-
-    // Putting parameters found by isgisaxs into our sample and run FitSuite once with the help of TestMinimizer to see if
-    // our simulation produces numerically same results
-
-//    m_fitSuite = new FitSuite();
-//    m_fitSuite->setMinimizer( new TestMinimizer() );
-
-//    m_fitSuite->addFitParameter("*Normalizer/scale", 1.31728E+05, 100, AttLimits::limited(1e4, 2e5));
-//    m_fitSuite->addFitParameter("*Normalizer/shift", 5.90612E-01, 1, AttLimits::limited(1., 20.));
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability",  6.60819E-01, 0.1, AttLimits::limited(0.01, 1.0) );
-
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius1",  4.92536E+00, 1*Units::nanometer, AttLimits::limited(1., 10.) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius1",  1.86101E-01, 0.1, AttLimits::limited(0.01, 1.) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio1",  9.84164E-01, 0.1, AttLimits::limited(0.01, 10.) );
-
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius2",  5.26120E+00, 1*Units::nanometer, AttLimits::limited(1., 10.) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius2",  2.16915E-01, 0.1, AttLimits::limited(0.01, 1.) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio2",  1.00898E+00, 0.1, AttLimits::limited(0.01, 10.) );
-
-//    m_fitSuite->addFitParameter("*SampleBuilder/interf_distance",  1.49763E+01, 1*Units::nanometer, AttLimits::limited(0.01, 50.0) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/interf_width",  3.02653E+00, 1*Units::nanometer, AttLimits::limited(0.01, 10.) );
-
-//    // setting up fitSuite
-//    ChiSquaredModule chiModule;
-//    chiModule.setOutputDataNormalizer( OutputDataNormalizerScaleAndShift() );
-
-//    for(DataSet::iterator it=isgi_scans_smoothed.begin(); it!= isgi_scans_smoothed.end(); ++it) {
-//        m_fitSuite->addExperimentAndRealData(*m_experiment, *(*it), chiModule);
-//    }
-
-//    m_fitSuite->runFit();
-
-    // drawing isgsaxs fit results on top of isgisaxs real data
+    // drawing ration of isgisaxs data/results
+    TLegend *leg3 = new TLegend(0.5,0.6,0.85,0.85);
+    leg3->SetBorderSize(1);
+    leg3->SetFillStyle(0);
     for(size_t i_set=0; i_set<isgi_scans.size(); ++i_set) {
-        c1->cd(5+i_set); gPad->SetLogy();
-        //TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*isgi_scans_smoothed[i_set], "data");
-        TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*isgi_results[i_set], "data");
+        c1->cd(5+i_set);
+        *isgi_results[i_set] /= *isgi_scans_smoothed[i_set];
+        TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*isgi_results[i_set], "isgisaxs_results_data");
         hdata->SetLineColor(kRed);
         hdata->DrawCopy();
-//        const OutputData<double > *data = m_fitSuite->getFitObjects()->getObject(i_set)->getChiSquaredModule()->getSimulationData();
-//        TH1D *hdata_smoothed = IsGISAXSTools::getOutputDataScanHist(*data, "data_from_module");
-//        hdata_smoothed->SetLineColor(kBlue);
-//        hdata_smoothed->DrawCopy("same");
+        if(i_set==0) leg3->AddEntry(hdata,"isgisaxs results/data","lp");
     }
+    c1->cd(5); leg3->Draw();
+    c1->cd(6); leg3->Draw();
 
+    c1->Update();
 
-
-    m_experiment->setDetectorParameters(*isgi_results[0]);
-    m_experiment->runSimulation();
-    //m_experiment->normalize();
-    c1->cd(5);
-    OutputDataNormalizerScaleAndShift mr(1.31728E+05, 5.90612E-01);
-    OutputData<double > *xxx = mr.createNormalizedData(*m_experiment->getOutputData());
-    TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*xxx, "data");
-    hdata->DrawCopy("same");
-
-
-//    if(m_isgi_scans.size() != 2) throw LogicErrorException("TestIsGISAXS12::plot_isgisaxs_data() -> Load isgisaxs scans first");
-
-//    enum isgisaxs_scans {kFixedAlphaf, kFixedPhif };
-
-//    // making 2d OutputData with axes like in two isgisaxs scans (phi_f axis from one scan (with alpha_f fixed), alpha_f axis from another scan (with phi_f fixed)
-//    OutputData<double > *data_as_isgisaxs = new OutputData<double>;
-//    const NamedVector<double > *axis_phif_scan = dynamic_cast<const NamedVector<double> *>(m_isgi_scans[kFixedAlphaf]->getAxis("phi_f"));
-//    const NamedVector<double > *axis_alphaf_scan = dynamic_cast<const NamedVector<double> *>(m_isgi_scans[kFixedPhif]->getAxis("alpha_f"));
-//    if( !axis_phif_scan || !axis_phif_scan ) throw NullPointerException("TestIsGISAXS12::plot_isgisaxs_data() -> Error. Can'get get axis");
-//    data_as_isgisaxs->addAxis(axis_phif_scan->clone());
-//    data_as_isgisaxs->addAxis(axis_alphaf_scan->clone());
-//    data_as_isgisaxs->setAllTo(0.0);
-//    std::cout << axis_phif_scan->getSize() << " " << axis_alphaf_scan->getSize() << " " << data_as_isgisaxs->getAllocatedSize() << std::endl;
-
-//    // running 2d simulation
-//    m_experiment->setDetectorParameters(*data_as_isgisaxs);
-//    delete data_as_isgisaxs;
-////    m_experiment->setBeamIntensity(1e10);
-//    m_experiment->runSimulation();
-////    m_experiment->normalize();
-
-//    // setting up 1d scans by making slices on just simulated data
-//    DataScan_t data_scans;
-//    data_scans.push_back( OutputDataFunctions::selectRangeOnOneAxis(*m_experiment->getOutputData(), "alpha_f", m_isgi_fixed_alphaf, m_isgi_fixed_alphaf  ));
-//    data_scans.push_back( OutputDataFunctions::selectRangeOnOneAxis(*m_experiment->getOutputData(), "phi_f", m_isgi_fixed_phif, m_isgi_fixed_phif ));
-
-//    // drawing data and scans
-//    TCanvas *c1 = new TCanvas("c1","c1",1024, 768);
-//    c1->Divide(2,3);
-//    c1->cd(1); gPad->SetLogz();
-//    TH2D *hist1 = dynamic_cast<TH2D *>(IsGISAXSTools::getOutputDataTH123D( *m_experiment->getOutputData(), "real_data"));
-//    hist1->Draw("COLZ");
-//    for(DataScan_t::const_iterator it=data_scans.begin(); it!= data_scans.end(); ++it) {
-//        TLine *line = IsGISAXSTools::getOutputDataScanLine(*(*it));
-//        line->DrawClone();
-//        delete line;
-//    }
-//    int npad(3);
-//    for(DataScan_t::iterator it=data_scans.begin(); it!= data_scans.end(); ++it, ++npad) {
-//        c1->cd(npad);
-//        TH1D *hist = IsGISAXSTools::getOutputDataScanHist(*(*it), "sim");
-//        hist->DrawCopy();
-//        delete hist;
-//    }
-
-//    // drawing isgi scans
-//    npad=5;
-//    for(DataScan_t::iterator it=m_isgi_scans.begin(); it!= m_isgi_scans.end(); ++it, ++npad) {
-//        c1->cd(npad);
-//        TH1D *hist = IsGISAXSTools::getOutputDataScanHist(*(*it),"isgi");
-//        hist->SetLineColor(kBlue);
-//        hist->DrawCopy();
-//        delete hist;
-//    }
-//    c1->Update();
-
-//    for(DataScan_t::iterator it=data_scans.begin(); it!= data_scans.end(); ++it) delete (*it);
 }
 
 
@@ -482,6 +403,9 @@ void TestIsGISAXS12::read_isgisaxs_datfile(const std::string &filename, DataSet
 
 /* ************************************************************************* */
 // read special isgisaxs *.out file with isgisaxs adjusted data and fit results
+//
+// if read_fit_results == false, then it loads isgisaxs data to fit
+// if read_fit_results == true, then it loads isgisaxs fit results
 /* ************************************************************************* */
 void TestIsGISAXS12::read_isgisaxs_outfile(const std::string &filename, DataSet &dataset, bool read_fit_results)
 {
@@ -517,7 +441,7 @@ void TestIsGISAXS12::read_isgisaxs_outfile(const std::string &filename, DataSet
             vdouble1d_t buff;
             std::copy(std::istream_iterator<double>(iss), std::istream_iterator<double>(), back_inserter(buff));
             if( buff.size() != kFitted+1) {
-                throw LogicErrorException("TestIsGISAXS12::read_isgisaxs_outfile -> Error! Line doesn't have enough double numbers");
+                throw LogicErrorException("TestIsGISAXS12::read_isgisaxs_outfile -> Error! Line doesn't have enough double numbers. Not an *.out file? Line '"+sline+"'");
             }
 
             isgiData.phif = std::asin(buff[kSin_twotheta]);
@@ -607,137 +531,110 @@ OutputData<double> *TestIsGISAXS12::convert_isgi_scan(std::vector<IsgiData > &is
         ++it;
     }
 
-//    OutputData<double > *data_half = OutputDataFunctions::doubleBinSize(*data);
-//    OutputData<double > *data_quarter = OutputDataFunctions::doubleBinSize(*data_half);
-
-//    std::cout << data->getAllocatedSize() << std::endl;
-//    std::cout << data_half->getAllocatedSize() << std::endl;
-//    std::cout << data_quarter->getAllocatedSize() << std::endl;
-//    delete data;
-//    delete data_half;
-//    TCanvas *c1 = dynamic_cast<TCanvas *>( gROOT->FindObject("c1_data_interpol") );
-//    if( !c1) {
-//        c1 = new TCanvas("c1_data_interpol","c1_data_interpol",800, 600);
-//        c1->Divide(2,2);
-//        c1->cd(1);
-//    } else {
-//        c1->cd(2);
-//    }
-//    TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*data,"data");
-//    TH1D *hdata_half = IsGISAXSTools::getOutputDataScanHist(*data_half,"data_half");
-//    TH1D *hdata_quarter = IsGISAXSTools::getOutputDataScanHist(*data_quarter,"data_quarter");
-//    hdata_half->SetLineColor(kBlue);
-//    hdata_quarter->SetLineColor(kRed);
-//    hdata->Draw();
-//    hdata_half->Draw("same");
-//    hdata_quarter->Draw("same");
-
     return data;
 }
 
 
 /* ************************************************************************* */
-// run test fitting (no isgisaxs comparison here)
+// run test minimizer to check the whole chain
 /* ************************************************************************* */
-void TestIsGISAXS12::run_test_fit()
+void TestIsGISAXS12::run_test_minimizer()
 {
-    // creating "real" data
-    //m_experiment->setDetectorResolutionFunction(new ResolutionFunction2DSimple(0.0002, 0.0002));
-    m_experiment->setBeamIntensity(1e10);
-    m_experiment->runSimulation();
-    m_experiment->normalize();
+    // reading isgisaxs real data
+    DataSet isgi_scans_smoothed;
+    read_isgisaxs_outfile(m_data_path+"isgi_fitconstraints.out", isgi_scans_smoothed);
+    // isgisaxs fit results
+    DataSet isgi_results;
+    read_isgisaxs_outfile(m_data_path+"isgi_fitconstraints.out", isgi_results, true);
 
-    OutputData<double > *real_data = IsGISAXSTools::createNoisyData( *m_experiment->getOutputData() );
+    // Putting parameters found by isgisaxs into our sample and run FitSuite once with the help of TestMinimizer to see if
+    // our simulation produces numerically same results
 
-    // setting up 1d scans by making slices on real data
-    DataSet data_scans;
-    data_scans.push_back( OutputDataFunctions::selectRangeOnOneAxis(*real_data, "alpha_f", 0.012, 0.012) );
-    data_scans.push_back( OutputDataFunctions::selectRangeOnOneAxis(*real_data, "phi_f", 0.011, 0.011) );
+    m_fitSuite = new FitSuite();
+    m_fitSuite->setMinimizer( new TestMinimizer() );
 
-    // drawing data and scans
-    TCanvas *c1 = new TCanvas("c1","c1",1024, 768);
-    c1->Divide(2,2);
-    c1->cd(1); gPad->SetLogz();
-    TH2D *hist1 = dynamic_cast<TH2D *>(IsGISAXSTools::getOutputDataTH123D( *real_data, "real_data"));
-    hist1->Draw("COLZ");
-    for(DataSet::const_iterator it=data_scans.begin(); it!= data_scans.end(); ++it) {
-        TLine *line = IsGISAXSTools::getOutputDataScanLine(*(*it));
-        line->DrawClone();
-        delete line;
-    }
+    m_fitSuite->addFitParameter("*Normalizer/scale", 1.31159E+05, 100, AttLimits::limited(1e4, 2e5));
+    m_fitSuite->addFitParameter("*Normalizer/shift", -8.10009E-02, 1, AttLimits::limited(-10., 20.));
 
-    int npad(2);
-    for(DataSet::iterator it=data_scans.begin(); it!= data_scans.end(); ++it, ++npad) {
-        c1->cd(npad);
-        TH1D *hist = IsGISAXSTools::getOutputDataScanHist(*(*it));
-        hist->DrawCopy();
-        delete hist;
-    }
-    c1->Update();
+    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability1",  5.34055E-01, 0.1, AttLimits::limited(0.01, 1.0) );
+    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius1",  4.90801E+00, 1*Units::nanometer, AttLimits::limited(1., 10.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius1",  1.90651E-01, 0.1, AttLimits::limited(0.01, 1.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio1",  1.00193E+00, 0.1, AttLimits::limited(0.01, 10.) );
 
-    // creating fit suite
-    m_fitSuite = new FitSuite();
-    m_fitSuite->setMinimizer( new ROOTMinimizer("Minuit2", "Migrad") );
-//    m_fitSuite->setMinimizer( new ROOTMinimizer("GSLMultiFit", "") );
-    m_fitSuite->attachObserver( new FitSuiteObserverPrint() );
-    m_fitSuite->attachObserver( new FitSuiteObserverDraw() );
-
-//    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius1",  0.2*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius2",  0.2*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio1",  0.8*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio2",  0.8*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/interf_distance",  12*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/interf_width",  6*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability",  0.4, 0.1, AttLimits::lowerLimited(0.01) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius1",  4*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-//    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius2",  4*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-
-    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius1",  0.3*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius2",  0.3*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio1",  0.7*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio2",  0.7*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-    m_fitSuite->addFitParameter("*SampleBuilder/interf_distance",  10*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-    m_fitSuite->addFitParameter("*SampleBuilder/interf_width",  5*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability",  0.4, 0.1, AttLimits::lowerLimited(0.01) );
-    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius1",  3*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius2",  3*Units::nanometer, 1*Units::nanometer, AttLimits::lowerLimited(0.01) );
-
-    for(DataSet::iterator it=data_scans.begin(); it!= data_scans.end(); ++it) {
-        m_fitSuite->addExperimentAndRealData(*m_experiment, *(*it));
-    }
+    m_fitSuite->addFitParameter("*SampleBuilder/particle_probability2",  4.70783E-01, 0.1, AttLimits::limited(0.01, 1.0) );
+    m_fitSuite->addFitParameter("*SampleBuilder/particle_radius2",  5.16801E+00, 1*Units::nanometer, AttLimits::limited(1., 10.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/dispersion_radius2",  2.03908E-01, 0.1, AttLimits::limited(0.01, 1.) );
+    m_fitSuite->addFitParameter("*SampleBuilder/height_aspect_ratio2",  9.77402E-01, 0.1, AttLimits::limited(0.01, 10.) );
 
+    m_fitSuite->addFitParameter("*SampleBuilder/interf_distance",  1.49681E+01, 1*Units::nanometer, AttLimits::limited(0.01, 50.0) );
+    m_fitSuite->addFitParameter("*SampleBuilder/interf_width",  3.03315E+00, 1*Units::nanometer, AttLimits::limited(0.01, 10.) );
+
+    // setting up fitSuite
+    ChiSquaredModule chiModule;
+    chiModule.setChiSquaredFunction( SquaredFunctionWithSystematicError(0.08) );
+    chiModule.setOutputDataNormalizer( OutputDataNormalizerScaleAndShift() );
+    for(DataSet::iterator it=isgi_scans_smoothed.begin(); it!= isgi_scans_smoothed.end(); ++it) {
+        m_fitSuite->addExperimentAndRealData(*m_experiment, *(*it), chiModule);
+    }
     m_fitSuite->runFit();
 
-    delete real_data;
-    for(DataSet::iterator it=data_scans.begin(); it!= data_scans.end(); ++it) delete (*it);
-}
+    TCanvas *c1 = new TCanvas("c1_test_minimizer","TestMinimizer", 800, 600);
+    c1->Divide(2,2);
+
+    // drawing GISASFW simul on top of isgisaxs simul
+    TLegend *leg1 = new TLegend(0.5,0.6,0.85,0.85);
+    leg1->SetBorderSize(1);
+    leg1->SetFillStyle(0);
+    for(size_t i_set=0; i_set<isgi_results.size(); ++i_set) {
+        c1->cd(1+i_set);
+        gPad->SetLogy();
+        TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*isgi_results[i_set], "data");
+        hdata->SetLineColor(kRed);
+        hdata->DrawCopy();
+        const OutputData<double > *data = m_fitSuite->getFitObjects()->getObject(i_set)->getChiSquaredModule()->getSimulationData();
+        TH1D *simul_data = IsGISAXSTools::getOutputDataScanHist(*data, "data_from_module");
+        simul_data->SetLineColor(kBlue);
+        simul_data->DrawCopy("same");
 
+        if(i_set==0) leg1->AddEntry(hdata,"isgisaxs results","lp");
+        if(i_set==0) leg1->AddEntry(simul_data,"gisasfw simul","lp");
+    }
+    c1->cd(1); leg1->Draw();
+    c1->cd(2); leg1->Draw();
+
+    TLegend *leg2 = new TLegend(0.5,0.6,0.85,0.85);
+    leg2->SetBorderSize(1);
+    leg2->SetFillStyle(0);
+    for(size_t i_set=0; i_set<isgi_results.size(); ++i_set) {
+        c1->cd(3+i_set);
+        OutputData<double > *data = m_fitSuite->getFitObjects()->getObject(i_set)->getChiSquaredModule()->getSimulationData()->clone();
+        *data /= *isgi_results[i_set];
+        TH1D *hdata = IsGISAXSTools::getOutputDataScanHist(*data, "gisasfw_isgisaxs_simul");
+        hdata->SetLineColor(kRed);
+        hdata->DrawCopy();
+        delete data;
+        if(i_set==0) leg2->AddEntry(hdata,"gisasfw/isgisaxs simul","lp");
+    }
+    c1->cd(3); leg1->Draw();
+    c1->cd(4); leg1->Draw();
+}
 
 
 /* ************************************************************************* */
 //
 /* ************************************************************************* */
 TestIsGISAXS12::TestSampleBuilder::TestSampleBuilder()
-// starting parameters
-//    : m_particle_probability(0.4)
-//    , m_particle_radius1(4*Units::nanometer)
-//    , m_dispersion_radius1(0.2)
-//    , m_height_aspect_ratio1(0.8)
-//    , m_particle_radius2(4*Units::nanometer)
-//    , m_dispersion_radius2(0.2)
-//    , m_height_aspect_ratio2(0.8)
-//    , m_interf_distance(12.0*Units::nanometer)
-//    , m_interf_width(6*Units::nanometer)
-// optimal parameters
-  : m_particle_probability(6.60819E-01)
-  , m_particle_radius1(4.92536E+00*Units::nanometer)
-  , m_dispersion_radius1(1.86101E-01)
-  , m_height_aspect_ratio1(9.84164E-01)
-  , m_particle_radius2(5.26120E+00*Units::nanometer)
-  , m_dispersion_radius2(2.16915E-01)
-  , m_height_aspect_ratio2(1.00898E+00)
-  , m_interf_distance(1.49763E+01*Units::nanometer)
-  , m_interf_width(3.02653E+00*Units::nanometer)
+// optimal parameters as found by isgisaxs
+  : m_particle_probability1(5.34055E-01)
+  , m_particle_radius1(4.90801E+00*Units::nanometer)
+  , m_dispersion_radius1(1.90651E-01)
+  , m_height_aspect_ratio1(1.00193E+00)
+  , m_particle_probability2(4.70783E-01)
+  , m_particle_radius2(5.16801E+00*Units::nanometer)
+  , m_dispersion_radius2(2.03908E-01)
+  , m_height_aspect_ratio2(9.77402E-01)
+  , m_interf_distance(1.49681E+01*Units::nanometer)
+  , m_interf_width(3.03315E+00*Units::nanometer)
 
 {
     init_parameters();
@@ -746,10 +643,11 @@ TestIsGISAXS12::TestSampleBuilder::TestSampleBuilder()
 void TestIsGISAXS12::TestSampleBuilder::init_parameters()
 {
     getParameterPool()->clear();
-    getParameterPool()->registerParameter("particle_probability", &m_particle_probability);
+    getParameterPool()->registerParameter("particle_probability1", &m_particle_probability1);
     getParameterPool()->registerParameter("particle_radius1", &m_particle_radius1);
     getParameterPool()->registerParameter("dispersion_radius1", &m_dispersion_radius1);
     getParameterPool()->registerParameter("height_aspect_ratio1", &m_height_aspect_ratio1);
+    getParameterPool()->registerParameter("particle_probability2", &m_particle_probability2);
     getParameterPool()->registerParameter("particle_radius2", &m_particle_radius2);
     getParameterPool()->registerParameter("dispersion_radius2", &m_dispersion_radius2);
     getParameterPool()->registerParameter("height_aspect_ratio2", &m_height_aspect_ratio2);
@@ -772,6 +670,10 @@ ISample *TestIsGISAXS12::TestSampleBuilder::buildSample() const
     Layer air_layer(air_material);
 
     // preparing nano particles prototypes for seeding layer's particle_decoration
+    double particle_probability1 = m_particle_probability1;
+//    double particle_probability2 = 1. - m_particle_probability1;
+    double particle_probability2 = m_particle_probability2;
+
     double radius1 = m_particle_radius1;
     double radius2 = m_particle_radius2;
     double height1 = m_height_aspect_ratio1*radius1;
@@ -796,9 +698,9 @@ ISample *TestIsGISAXS12::TestSampleBuilder::buildSample() const
 
     // building nano particles
     ParticleBuilder builder;
-    builder.setPrototype(cylinder1,"/Particle/FormFactorCylinder/radius", par1, m_particle_probability);
+    builder.setPrototype(cylinder1,"/Particle/FormFactorCylinder/radius", par1, particle_probability1);
     builder.plantParticles(particle_decoration);
-    builder.setPrototype(cylinder2,"/Particle/FormFactorCylinder/radius", par2, 1-m_particle_probability);
+    builder.setPrototype(cylinder2,"/Particle/FormFactorCylinder/radius", par2, particle_probability2);
     builder.plantParticles(particle_decoration);
 
     // making layer holding all whose nano particles
diff --git a/Core/Algorithms/inc/IChiSquaredModule.h b/Core/Algorithms/inc/IChiSquaredModule.h
index 169647ce196b62ce1a25262dfe7af39b42170b9e..5b6299f835d72ff6396f4b626313259d080822a0 100644
--- a/Core/Algorithms/inc/IChiSquaredModule.h
+++ b/Core/Algorithms/inc/IChiSquaredModule.h
@@ -58,6 +58,7 @@ public:
 
     //! get data normalizer
     virtual const IOutputDataNormalizer *getOutputDataNormalizer() const {return mp_data_normalizer; }
+    virtual IOutputDataNormalizer *getOutputDataNormalizer() {return mp_data_normalizer; }
     //! set data normalizer
     virtual void setOutputDataNormalizer(const IOutputDataNormalizer &data_normalizer);
 
@@ -69,6 +70,9 @@ public:
     //! return last calculated chi squared value
     virtual double getValue() const { return m_chi2_value; }
 
+    //! set number of free parameters
+    virtual void setNfreeParameters(int nfree_parameters) { m_nfree_parameters = nfree_parameters; }
+
 protected:
     // disabling assignment operator
     IChiSquaredModule &operator=(const IChiSquaredModule &);
@@ -81,6 +85,7 @@ protected:
     IFittingDataSelector *mp_data_selector;
     IOutputDataNormalizer *mp_data_normalizer;
     IIntensityFunction  *mp_intensity_function;
+    int m_nfree_parameters;
 
     double m_chi2_value;
 };
diff --git a/Core/Algorithms/inc/IOutputDataNormalizer.h b/Core/Algorithms/inc/IOutputDataNormalizer.h
index 0221b67879ebda3ed3b3c361e5f526918c7dd2d3..a456b63db081a16624bbe44e1ab60ee86a73cb5f 100644
--- a/Core/Algorithms/inc/IOutputDataNormalizer.h
+++ b/Core/Algorithms/inc/IOutputDataNormalizer.h
@@ -44,6 +44,8 @@ public:
 
     virtual OutputDataNormalizerScaleAndShift *clone() const;
 
+    void setMaximumIntensity(double max_intensity) { m_max_intensity = max_intensity; }
+
 protected:
     //! initialize pool parameters, i.e. register some of class members for later access via parameter pool
     virtual void init_parameters();
@@ -54,6 +56,7 @@ private:
 
     double m_scale;
     double m_shift;
+    double m_max_intensity;
 };
 
 
diff --git a/Core/Algorithms/src/ChiSquaredModule.cpp b/Core/Algorithms/src/ChiSquaredModule.cpp
index 71005602b55b61829603a7add9730298b33aca95..82789b15c9a5bd9420f7916bbefc6f4fbeb411dc 100644
--- a/Core/Algorithms/src/ChiSquaredModule.cpp
+++ b/Core/Algorithms/src/ChiSquaredModule.cpp
@@ -24,20 +24,20 @@ double ChiSquaredModule::calculateChiSquared()
     if( !mp_simulation_data ) throw NullPointerException("ChiSquaredModule::calculateChiSquared() -> Error! No simulated data has been set");
 
     double result = 0.0;
-    size_t data_size = mp_real_data->getAllocatedSize();
+    size_t data_size = mp_real_data->getAllocatedSize() - m_nfree_parameters;
     initWeights();
 
-    if( mp_intensity_function ) {
-        OutputDataFunctions::applyFunction(*mp_simulation_data, mp_intensity_function);
-        OutputDataFunctions::applyFunction(*mp_real_data, mp_intensity_function);
-    }
-
     if(mp_data_normalizer) {
         OutputData<double > *normalized_simulation = mp_data_normalizer->createNormalizedData(*mp_simulation_data);
         delete mp_simulation_data;
         mp_simulation_data = normalized_simulation;
     }
 
+    if( mp_intensity_function ) {
+        OutputDataFunctions::applyFunction(*mp_simulation_data, mp_intensity_function);
+        OutputDataFunctions::applyFunction(*mp_real_data, mp_intensity_function);
+    }
+
     OutputData<double> *p_difference = createChi2DifferenceMap();
     OutputData<double>::const_iterator it_weights = mp_weights->begin();
     OutputData<double>::const_iterator it_diff = p_difference->begin();
@@ -45,7 +45,7 @@ double ChiSquaredModule::calculateChiSquared()
         result += (*it_diff++)*(*it_weights++);
     }
     delete p_difference;
-    m_chi2_value = result/data_size;
+    m_chi2_value = result/(double)data_size;
     return m_chi2_value;
 }
 
diff --git a/Core/Algorithms/src/GISASExperiment.cpp b/Core/Algorithms/src/GISASExperiment.cpp
index a21fdabe29a7a3eb9c070db3805499d77b1ae96f..04ae42bec538421eb5c8b5106dcf94c5ad2e6271 100644
--- a/Core/Algorithms/src/GISASExperiment.cpp
+++ b/Core/Algorithms/src/GISASExperiment.cpp
@@ -237,9 +237,12 @@ double GISASExperiment::getSolidAngle(size_t index) const
     } else {
         //std::cout << "GISASExperiment::getSolidAngle() -> Warning! Only one bin on phi_f axis, size of the bin will be taken from alpha_f axis" << std::endl;
     }
-    if(!dalpha) dalpha=dphi;
-    if(!dphi) dphi=dalpha;
-    return cos_alpha_f*dalpha*dphi;
+    if(!dalpha || !dphi) {
+        std::cout << "GISASExperiment::getSolidAngle() -> Warning! Not defined normalization" << std::endl;
+        return 1;
+    } else {
+        return cos_alpha_f*dalpha*dphi;
+    }
 }
 
 
diff --git a/Core/Algorithms/src/IChiSquaredModule.cpp b/Core/Algorithms/src/IChiSquaredModule.cpp
index 592f83d7c4a0fa0e7e81a65c01efdf21baa1d8b1..b9d19768123f47279baff909c4a104623ba0879c 100644
--- a/Core/Algorithms/src/IChiSquaredModule.cpp
+++ b/Core/Algorithms/src/IChiSquaredModule.cpp
@@ -9,6 +9,7 @@ IChiSquaredModule::IChiSquaredModule()
     , mp_data_selector(0)
     , mp_data_normalizer(0)
     , mp_intensity_function(0)
+    , m_nfree_parameters(0)
     , m_chi2_value(0)
 {
     mp_squared_function = new SquaredFunctionDefault();
@@ -24,6 +25,7 @@ IChiSquaredModule::IChiSquaredModule(const IChiSquaredModule &other)
     , mp_data_selector(0)
     , mp_data_normalizer(0)
     , mp_intensity_function(0)
+    , m_nfree_parameters(0)
     , m_chi2_value(0)
 {
     if(other.mp_real_data) mp_real_data = other.mp_real_data;
@@ -33,6 +35,7 @@ IChiSquaredModule::IChiSquaredModule(const IChiSquaredModule &other)
     if(other.mp_data_selector) mp_data_selector = other.mp_data_selector->clone();
     if(other.mp_data_normalizer) mp_data_normalizer = other.mp_data_normalizer->clone();
     if(other.mp_intensity_function) mp_intensity_function = other.mp_intensity_function->clone();
+    m_nfree_parameters = other.m_nfree_parameters;
 }
 
 
diff --git a/Core/Algorithms/src/IOutputDataNormalizer.cpp b/Core/Algorithms/src/IOutputDataNormalizer.cpp
index e5bbd0ed7e29f4022098520b0f0e946ee553601f..6ad14b8f60148f0d0f455d94d7616cae70758951 100644
--- a/Core/Algorithms/src/IOutputDataNormalizer.cpp
+++ b/Core/Algorithms/src/IOutputDataNormalizer.cpp
@@ -6,6 +6,7 @@
 OutputDataNormalizerScaleAndShift::OutputDataNormalizerScaleAndShift()
     : m_scale(1.0)
     , m_shift(0)
+    , m_max_intensity(0)
 {
     setName("Normalizer");
     init_parameters();
@@ -14,6 +15,7 @@ OutputDataNormalizerScaleAndShift::OutputDataNormalizerScaleAndShift()
 OutputDataNormalizerScaleAndShift::OutputDataNormalizerScaleAndShift(double scale, double shift)
     : m_scale(scale)
     , m_shift(shift)
+    , m_max_intensity(0)
 {
     setName("Normalizer");
     init_parameters();
@@ -23,6 +25,7 @@ OutputDataNormalizerScaleAndShift::OutputDataNormalizerScaleAndShift(const Outpu
 {
     m_scale = other.m_scale;
     m_shift = other.m_shift;
+    m_max_intensity = other.m_max_intensity;
     init_parameters();
 }
 
@@ -45,17 +48,17 @@ OutputData<double> *OutputDataNormalizerScaleAndShift::createNormalizedData(cons
 {
     OutputData<double > *normalized_data = data.clone();
 
-    OutputData<double >::const_iterator cit = std::max_element(data.begin(), data.end());
-    double max_intensity = (*cit);
-    if(max_intensity) {
-        OutputData<double >::iterator it = normalized_data->begin();
-        while(it!=normalized_data->end()) {
-            double value = (*it);
-            (*it) = m_scale*(value/max_intensity) + m_shift;
-            ++it;
-        }
-    } else {
-        std::cout << "OutputDataNormalizerScaleAndShift::createNormalizedData() -> Warning! Zero maximum intensity" << std::endl;
+    double max_intensity = m_max_intensity;
+    if( max_intensity == 0 ) {
+        OutputData<double >::const_iterator cit = std::max_element(data.begin(), data.end());
+        max_intensity = (*cit);
+    }
+    if(max_intensity == 0) throw LogicErrorException("OutputDataNormalizerScaleAndShift::createNormalizedData() -> Error! Zero maximum intensity");
+    OutputData<double >::iterator it = normalized_data->begin();
+    while(it!=normalized_data->end()) {
+        double value = (*it);
+        (*it) = m_scale*(value/max_intensity) + m_shift;
+        ++it;
     }
 
     return normalized_data;
diff --git a/Core/Tools/inc/FitSuiteParameters.h b/Core/Tools/inc/FitSuiteParameters.h
index 860fbc5fb935e48087060906caa7578974c2c0b2..e95b891f303f3d5560d239e9aa9eb54239c3458c 100644
--- a/Core/Tools/inc/FitSuiteParameters.h
+++ b/Core/Tools/inc/FitSuiteParameters.h
@@ -72,6 +72,9 @@ public:
     //! linking fit parameters with pool parameters
     void link_to_pool(const ParameterPool *pool);
 
+    //! return number of free parameters
+    size_t getNfreeParameters() const;
+
 private:
     //! disabled copy constructor and assignment operator
     FitSuiteParameters &operator=(const FitSuiteParameters &other);
diff --git a/Core/Tools/src/FitSuite.cpp b/Core/Tools/src/FitSuite.cpp
index 8dbd0206fe5544d28da850cd85955ff6c4afd6a0..b11f9a6c0943c313abe5e2050f823dd687a7ec00 100644
--- a/Core/Tools/src/FitSuite.cpp
+++ b/Core/Tools/src/FitSuite.cpp
@@ -121,6 +121,12 @@ void FitSuite::runFit()
     // linking fit parameters with parameters defined in the experiment
     link_fit_parameters();
 
+    // FIXME (find better place) propagating number of free parameters
+    for(size_t i=0; i<m_fit_objects.size();  ++i) {
+        m_fit_objects.getChiSquaredModule(i)->setNfreeParameters(m_fit_parameters.getNfreeParameters());
+    }
+
+
     // running minimizer
     if( m_fit_strategies.empty() ) {
         // running single minimization round
diff --git a/Core/Tools/src/FitSuiteObjects.cpp b/Core/Tools/src/FitSuiteObjects.cpp
index 99916ff302de11cfa69ebb9c562bf19ffb43e90a..c96c2443454be75d0c89d6bf18309203fa28907d 100644
--- a/Core/Tools/src/FitSuiteObjects.cpp
+++ b/Core/Tools/src/FitSuiteObjects.cpp
@@ -35,7 +35,7 @@ void FitSuiteObjects::runSimulation()
 {
     for(FitObjects_t::iterator it = m_fit_objects.begin(); it!= m_fit_objects.end(); ++it) {
         (*it)->getExperiment()->runSimulation();
-        (*it)->getExperiment()->normalize();
+        //(*it)->getExperiment()->normalize();
     }
 }
 
@@ -45,11 +45,27 @@ void FitSuiteObjects::runSimulation()
 /* ************************************************************************* */
 double FitSuiteObjects::getChiSquaredValue()
 {
-    double chi_squared(0);
+    // determining maximum intensity in all datasets
+    double max_intensity(0);
     for(FitObjects_t::iterator it = m_fit_objects.begin(); it!= m_fit_objects.end(); ++it) {
-        chi_squared += (*it)->calculateChiSquared();
+        const OutputData<double > *data = (*it)->getExperiment()->getOutputData();
+        OutputData<double >::const_iterator cit = std::max_element(data->begin(), data->end());
+        max_intensity = std::max(max_intensity, *cit);
     }
-    return chi_squared;
+
+    double chi_sum(0);
+    for(FitObjects_t::iterator it = m_fit_objects.begin(); it!= m_fit_objects.end(); ++it) {
+
+        // normalizing datasets to the maximum intensity and scale, if Chi squared module have normalizer module defined
+        OutputDataNormalizerScaleAndShift *data_normalizer =  dynamic_cast<OutputDataNormalizerScaleAndShift *>((*it)->getChiSquaredModule()->getOutputDataNormalizer());
+        if( data_normalizer) {
+           data_normalizer->setMaximumIntensity(max_intensity);
+        }
+        double chi_squared = (*it)->calculateChiSquared();
+        chi_sum += chi_squared;
+        std::cout << " chi " << chi_squared << " chi_sum:" << chi_sum << std::endl;
+    }
+    return chi_sum;
 }
 
 
diff --git a/Core/Tools/src/FitSuiteParameters.cpp b/Core/Tools/src/FitSuiteParameters.cpp
index 404e3afd031b6da0404f2964fc959bd9d708464b..ebec4c4fcc9143e095cde25b7105e62c77c67fc1 100644
--- a/Core/Tools/src/FitSuiteParameters.cpp
+++ b/Core/Tools/src/FitSuiteParameters.cpp
@@ -79,6 +79,18 @@ std::vector<double > FitSuiteParameters::getValues() const
 }
 
 
+size_t FitSuiteParameters::getNfreeParameters() const
+{
+    size_t n_free(0);
+    for(parameters_t::const_iterator it=m_parameters.begin(); it!=m_parameters.end(); ++it)
+    {
+        if( !(*it)->isFixed() ) n_free++;
+    }
+    std::cout << "XXX FitSuiteParameters::getNfreeParameters() " << n_free;
+    return n_free;
+}
+
+
 
 /* ************************************************************************* */
 // linking fit parameters with pool parameters
diff --git a/Core/Tools/src/OutputDataReader.cpp b/Core/Tools/src/OutputDataReader.cpp
index 98cbaa8ff15c3e6e40f01518d7e244f6b3df1d5f..64de72be79953095e9d95db9c9a1fa7b5854d147 100644
--- a/Core/Tools/src/OutputDataReader.cpp
+++ b/Core/Tools/src/OutputDataReader.cpp
@@ -14,7 +14,12 @@
 #include <boost/iostreams/filtering_streambuf.hpp>
 #include <boost/iostreams/filtering_stream.hpp>
 #include <boost/iostreams/copy.hpp>
+
+#include "Macros.h"
+GCC_DIAG_OFF(unused-parameter);
 #include <boost/iostreams/filter/gzip.hpp>
+GCC_DIAG_ON(unused-parameter);
+
 
 
 OutputData<double > *OutputDataReader::getOutputData(const std::string &file_name)