From 7786cd39a97788ed8c298e3904684573602dc670 Mon Sep 17 00:00:00 2001
From: Klaus Rabbertz <klaus.rabbertz@cern.ch>
Date: Tue, 18 May 2021 11:01:45 +0200
Subject: [PATCH] Working version of writing & reading InfoBlocks with
 stat./numerical uncertainty

---
 doc/tableformat/fastNLOTableFormatv25.ods     | Bin 0 -> 25543 bytes
 v2.3/toolkit/AUTHORS                          |  11 +-
 v2.3/toolkit/configure.ac                     |   8 +-
 v2.3/toolkit/data/modify/SteerModify.str      |  49 ++-
 .../fastnlotoolkit/fastNLOCoeffAddBase.cc     |  82 +++--
 .../fastnlotoolkit/fastNLOCoeffAddFix.cc      |   8 +-
 .../fastnlotoolkit/fastNLOCoeffAddFlex.cc     |   8 +-
 .../fastnlotoolkit/fastNLOCoeffBase.cc        | 115 +++++--
 v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc  |  33 +-
 v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc   |  12 +-
 v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc   |  44 ++-
 .../include/fastnlotk/fastNLOCoeffAddBase.h   |   4 +-
 .../include/fastnlotk/fastNLOCoeffAddFix.h    |   4 +-
 .../include/fastnlotk/fastNLOCoeffAddFlex.h   |   4 +-
 .../include/fastnlotk/fastNLOCoeffBase.h      |  14 +-
 .../include/fastnlotk/fastNLOTable.h          |   2 +-
 .../include/fastnlotk/fastNLOTools.h          |   2 +
 .../include/fastnlotk/speaker.h               |  22 +-
 v2.3/toolkit/src/fnlo-tk-append.cc            |   2 +-
 v2.3/toolkit/src/fnlo-tk-cat.cc               |   2 +-
 v2.3/toolkit/src/fnlo-tk-cppread.cc           |  33 +-
 v2.3/toolkit/src/fnlo-tk-example.cc           |   2 +-
 v2.3/toolkit/src/fnlo-tk-merge.cc             |   2 +-
 v2.3/toolkit/src/fnlo-tk-merge2.cc            |   2 +-
 v2.3/toolkit/src/fnlo-tk-modify.cc            | 324 +++++++++++++-----
 v2.3/toolkit/src/fnlo-tk-rootout.cc           |  53 ++-
 v2.3/toolkit/src/fnlo-tk-statunc.cc           |  18 +-
 v2.3/toolkit/src/fnlo-tk-yodaout.cc           |  21 +-
 28 files changed, 612 insertions(+), 269 deletions(-)
 create mode 100644 doc/tableformat/fastNLOTableFormatv25.ods

diff --git a/doc/tableformat/fastNLOTableFormatv25.ods b/doc/tableformat/fastNLOTableFormatv25.ods
new file mode 100644
index 0000000000000000000000000000000000000000..6cc3fa9ed593b2ccf1a8855c9e500902e665ab2c
GIT binary patch
literal 25543
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

literal 0
HcmV?d00001

diff --git a/v2.3/toolkit/AUTHORS b/v2.3/toolkit/AUTHORS
index 4798eb21..f6ab37e9 100644
--- a/v2.3/toolkit/AUTHORS
+++ b/v2.3/toolkit/AUTHORS
@@ -1,8 +1,9 @@
 fastNLO is written by
----------------------
+=====================
 Daniel Britzger [daniel.britzger@desy.de],
-Thomas Kluge,
 Klaus Rabbertz [klaus.rabbertz@cern.ch],
-Georg Sieber [g.sieber@cern.ch],
-Fred Stober [stober@cern.ch], and
-Markus Wobisch [wobisch@fnal.gov]
+Markus Wobisch [wobisch@latech.edu]
+
+Former contributors are:
+------------------------
+Thomas Kluge, Georg Sieber, Jakob Stark, Fred Stober
diff --git a/v2.3/toolkit/configure.ac b/v2.3/toolkit/configure.ac
index 7057fcce..c263bdf4 100644
--- a/v2.3/toolkit/configure.ac
+++ b/v2.3/toolkit/configure.ac
@@ -10,7 +10,7 @@
 # Require minimal autoconf version, 2.69 is from 2012
 AC_PREREQ([2.69])
 # Define subproject fastNLO_toolkit
-AC_INIT([fastNLO_toolkit], [2.3.1], [daniel.britzger@desy.de,klaus.rabbertz@cern.ch,g.sieber@cern.ch,stober@cern.ch,wobisch@fnal.gov])
+AC_INIT([fastNLO_toolkit], [2.5.0], [daniel.britzger@desy.de,klaus.rabbertz@cern.ch,wobisch@latech.edu])
 #Suppress verbose output when compiling (use make V=99 for verbose output)
 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 # Properly include subprojects
@@ -733,9 +733,9 @@ AM_CONDITIONAL(DX_COND_pdf,   [test "x$DOXYGEN" != "x"])
 # Define project substitution variables (to be replaced e.g. in config files below)
 AC_SUBST([AUTHORS],["D. Britzger, T. Kluge, K. Rabbertz, F. Stober, G. Sieber, M. Wobisch"])
 AC_SUBST([AUTHORSv14],["T. Kluge, K. Rabbertz, M. Wobisch"])
-AC_SUBST([AUTHORSv2],["D. Britzger, T. Kluge, K. Rabbertz, F. Stober, M. Wobisch"])
-AC_SUBST([QUOTEv14],["hep-ph/0609285"])
-AC_SUBST([QUOTEv2],["arXiv:1109.1310"])
+AC_SUBST([AUTHORSv2],["D. Britzger, K. Rabbertz, F. Stober, M. Wobisch"])
+AC_SUBST([QUOTEv14],["Proc. DIS 2006, 483 (2006), hep-ph/0609285."])
+AC_SUBST([QUOTEv2],["Proc. DIS 2012, 217 (2012), arXiv:1208.3641."])
 AC_SUBST([SUBPROJECT],["toolkit"])
 AC_SUBST([WEBPAGE],["http://projects.hepforge.org/fastnlo"])
 AC_SUBST([YEARS],["2005-`date +%Y`"])
diff --git a/v2.3/toolkit/data/modify/SteerModify.str b/v2.3/toolkit/data/modify/SteerModify.str
index b321e0c5..a059e7ff 100644
--- a/v2.3/toolkit/data/modify/SteerModify.str
+++ b/v2.3/toolkit/data/modify/SteerModify.str
@@ -24,7 +24,7 @@
 #     ScDescript {
 #       "First line to add"
 #       "Second line of add"
-#       "etc"
+#       "etc."
 #     }
 #
 ##################################################################################
@@ -38,6 +38,7 @@ OutTable   ModifiedTable.tab
 #--------------------
 #   Info print out
 #--------------------
+Verbosity           INFO   # Set print out verbosity
 PrintSteeringCard   true   # Print steering provided on command line or within this file
 PrintInputA1        true   # Print table header of input table
 PrintInputA2        true   # Print table scenario of input table
@@ -48,8 +49,8 @@ PrintOutputA2       true   # Print table scenario of output table
 #   Modify parameters of the table header
 #   Leave value empty for no modification
 #-------------------------------------------
-#Itabversion                # Change table version (Expert option!)
-#ScenName                   # Change scenario name
+#Itabversion 25000          # Change table version (Expert option!)
+#ScenName fnlabcd           # Change scenario name
 
 # --------------------------------------------
 #   Modify parameters of the table scenario
@@ -68,21 +69,25 @@ ScDescript {               # Example of final scenario description for CMS inclu
   "RIVET_ID=CMS_2011_S9086218/D01-x01-y01,SPIRES_ID=9086218,INSPIRE_RECORD=902309"
   "THEORY_LABEL=NLOJet++"
   "provided by:"
-  "fastNLO_2.1.0"
+  "fastNLO_2.5.0"
   "If you use this table, please cite:"
-  "  D. Britzger, T. Kluge, K. Rabbertz, F. Stober, M. Wobisch, arXiv:1109.1310"
+  "  D. Britzger, K. Rabbertz, F. Stober, M. Wobisch, Proc. DIS 2012, 217 (2012), arXiv:1208.3641."
 }
 
 #------------------------------------------------------
-#   Modify bin sizes
+#   Modify bin sizes set in table scenario
 #   (Does not change differential cross sections,
 #    which are stored already in differential form!)
 #------------------------------------------------------
-BinSizeFactor   1.         # Overall factor for bin sizes
+#BinSizeFactor   1.         # Overall factor for bin sizes
 #BinSize {                  # Individual bin size factors for each observable bin; one no. per bin!
 #
 #}
 
+# --------------------------------------------
+#   Modify the table contributions
+# --------------------------------------------
+
 #--------------------------------------------------------------------
 #   Modify tabulated coefficients
 #   (Changes the differential cross sections, which can be adapted
@@ -92,11 +97,41 @@ BinSizeFactor   1.         # Overall factor for bin sizes
 #
 #}
 
+#--------------------------------------------------------------------
+#   Modify code description
+#   (Same description for all perturbative contributions!)
+#--------------------------------------------------------------------
+#CodeDescript {
+#  "NNLOJET_rev5918, please cite: T. Gehrmann et al., PoS RADCOR2017, 074 (2018), arXiv:1801.06415."
+#  "APPLfast interface, please cite: D. Britzger et al., Eur. Phys. J. C79, 845 (2019), arXiv:1906.05303."
+#}
+
+#--------------------------------------------------------------------
+#   Add InfoBlocks with statistical/numerical uncertainty
+#   (For now only works with NNLOJET dat files!)
+#--------------------------------------------------------------------
+#InfoBlockFiles { # NNLOJET dat files for each order separately
+#  2jet.LO.fnl3832_yb0_ys0_ptavgj12.dat
+#  2jet.NLO_only.fnl3832_yb0_ys0_ptavgj12.dat
+#  2jet.NNLO_only.fnl3832_yb0_ys0_ptavgj12.dat
+#}
+
+#InfoBlockDescr { # Same description for each contribution
+#  "Default statistical uncertainties from NNLOJET."
+#}
+
+#InfoBlockOrders { # Attribution of dat files to respective orders
+#  "LO"
+#  "NLO"
+#  "NNLO"
+#}
+
 #-------------------------------------------------------------------------
 #   Cut out unused observable bins or split table into multiples pieces
 #     Specify bin numbers to be removed within curly brackets.
 #     First bin is bin 1, last bin is NObsBin.
 #     An ordered numbering with INCREASING bin numbers must be used!
+#   Do NOT erase bins while adding InfoBlocks or vice versa!
 #--------------------------------------------------------------------------
 #RemoveBins {               #  Gaps are fine, BUT an increasing bin numbering must be used!
 #   1   2   3
diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc
index 7132e52e..19aac254 100644
--- a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc
+++ b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddBase.cc
@@ -36,10 +36,9 @@ bool fastNLOCoeffAddBase::CheckCoeffConstants(const fastNLOCoeffBase* c, bool qu
       return false;
    } else {
       // Unknown contribution
-      say::error["fastNLOCoeffAddBase::CheckCoeffConstants"]
-         << "Unknown contribution type, aborting! "
-         << "IAddMultFlag = " << c->GetIAddMultFlag()
-         << ", IDataFlag ="   << c->GetIDataFlag() <<endl;
+      say::error["fastNLOCoeffAddBase::CheckCoeffConstants"] << "Unknown contribution type, aborting! "
+                                                             << "IAddMultFlag = " << c->GetIAddMultFlag()
+                                                             << ", IDataFlag ="   << c->GetIDataFlag() <<endl;
       exit(1);
    }
 }
@@ -53,13 +52,13 @@ fastNLOCoeffAddBase* fastNLOCoeffAddBase::Clone() const {
 
 ///________________________________________________________________________________________________________________ //
 void fastNLOCoeffAddBase::Read(istream& table, int ITabVersionRead){
-   debug["ReadCoeffAddBase::Read"]<<"Start reading table ..."<<endl;
+   debug["Read"]<<"Start reading table ..."<<endl;
    fastNLOCoeffBase::ReadBase(table, ITabVersionRead);
    CheckCoeffConstants(this);
    ReadCoeffAddBase(table, ITabVersionRead);
    fastNLOCoeffBase::ReadCoeffInfoBlocks(table, ITabVersionRead);
    EndReadCoeff(table, ITabVersionRead);
-   debug["ReadCoeffAddBase::Read"]<<"Finished reading table ..."<<endl;
+   debug["Read"]<<"Finished reading table ..."<<endl;
 }
 
 
@@ -292,7 +291,7 @@ void fastNLOCoeffAddBase::Write(ostream& table, int itabversion) {
    table << IPDFdef3 << sep;
 
    if(IPDFdef2==0){ // PDF linear combinations are stored herewith
-      cout<<"Writing PDF coefficients into table."<<endl;
+      info["Write"]<<"Writing PDF coefficients into table."<<endl;
       if ( IPDFdef3 != NSubproc ){
          error["Write"]<<"IPDFdef3 must be equal to NSubproc. (IPDFdef3="<<IPDFdef3<<", NSubproc="<<NSubproc<<"). Exiting."<<endl;
          exit(1);
@@ -788,44 +787,67 @@ void fastNLOCoeffAddBase::Print(int iprint) const {
 //________________________________________________________________________________________________________________ //
 
 // Erase observable bin
-void fastNLOCoeffAddBase::EraseBin(unsigned int iObsIdx) {
-   debug["EraseBin"]<<"Erasing table entries in CoeffAddBase for bin index " << iObsIdx << endl;
+void fastNLOCoeffAddBase::EraseBin(unsigned int iObsIdx, int ITabVersionRead) {
+   debug["EraseBin"]<<"Erasing observable bin in CoeffAddBase with bin index " << iObsIdx << endl;
    if ( XNode1.size() == 0 ) {
       error["EraseBin"]<<"All additive contribution bins deleted already. Aborted!" << endl;
       exit(1);
    }
    if ( XNode1.size() != 0 ) XNode1.erase(XNode1.begin()+iObsIdx);
    if ( NPDFDim==2 && XNode2.size() != 0 ) XNode2.erase(XNode2.begin()+iObsIdx);
-   for ( unsigned int ip = 0 ; ip<fWgt.WgtObsSumW2.size() ; ip++ ) {
-      fWgt.WgtObsSumW2[ip].erase(fWgt.WgtObsSumW2[ip].begin()+iObsIdx);
-      fWgt.SigObsSumW2[ip].erase(fWgt.SigObsSumW2[ip].begin()+iObsIdx);
-      fWgt.SigObsSum[ip].  erase(fWgt.SigObsSum  [ip].begin()+iObsIdx);
-      fWgt.WgtObsNumEv[ip].erase(fWgt.WgtObsNumEv[ip].begin()+iObsIdx);
+   for ( unsigned int i = 0 ; i<fWgt.WgtObsSumW2.size() ; i++ ) {
+      fWgt.WgtObsSumW2[i].erase(fWgt.WgtObsSumW2[i].begin()+iObsIdx);
+      fWgt.SigObsSumW2[i].erase(fWgt.SigObsSumW2[i].begin()+iObsIdx);
+      fWgt.SigObsSum[i].  erase(fWgt.SigObsSum  [i].begin()+iObsIdx);
+      fWgt.WgtObsNumEv[i].erase(fWgt.WgtObsNumEv[i].begin()+iObsIdx);
+   }
+   if ( ! ( ITabVersionRead < 25000 ) ) {
+      if ( NCoeffInfoBlocks > 0 ) {
+         debug["EraseBin"]<<"Found " << NCoeffInfoBlocks << " InfoBlocks with bins to be erased, too." << endl;
+         for ( int i=0; i < NCoeffInfoBlocks; i++ ) {
+            if ( ICoeffInfoBlockFlag1[i] == 0 && ICoeffInfoBlockFlag2[i] == 0 ) {
+               CoeffInfoBlockContent[i].erase(CoeffInfoBlockContent[i].begin()+iObsIdx);
+               NCoeffInfoBlockCont[i] = NCoeffInfoBlockCont[i] - 1;
+            } else {
+               error["EraseBin"]<<"Erase bin not yet implemented for InfoBlocks other than with flags 1,2 = 0, 0:" <<
+                  ICoeffInfoBlockFlag1[i] << ", " << ICoeffInfoBlockFlag2[i] << ", aborted!" << endl;
+               exit(567);
+            }
+         }
+      }
    }
    fastNLOCoeffBase::EraseBin(iObsIdx);
 }
 
 // Catenate observable bin
-void fastNLOCoeffAddBase::CatBin(const fastNLOCoeffAddBase& other, unsigned int iObsIdx) {
-   debug["CatBin"]<<"Catenating observable bin in CoeffAddBase corresponding to bin index " << iObsIdx << endl;
+void fastNLOCoeffAddBase::CatBin(const fastNLOCoeffAddBase& other, unsigned int iObsIdx, int ITabVersionRead) {
+   debug["CatBin"]<<"Catenating observable bin to CoeffAddBase with bin index " << iObsIdx << endl;
    if ( XNode1.size() == 0 ) {
       error["CatBin"]<<"Initial additive table is empty. Aborted!" << endl;
       exit(1);
    }
-   //unsigned int nold = XNode1.size();
-   if ( XNode1.size() != 0 ) {
-      XNode1.push_back(other.XNode1[iObsIdx]);
-      // XNode1.resize(nold+1);
-      // XNode1[nold] = other.XNode1[iObsIdx];
-   }
-   if ( NPDFDim==2 &&  XNode2.size() != 0 ) {
-      XNode2.push_back(other.XNode2[iObsIdx]);
-   }
-   for ( unsigned int ip = 0 ; ip<fWgt.WgtObsSumW2.size() ; ip++ ) {
-      fWgt.WgtObsSumW2[ip].push_back(other.fWgt.WgtObsSumW2[ip][iObsIdx]);
-      fWgt.SigObsSumW2[ip].push_back(other.fWgt.SigObsSumW2[ip][iObsIdx]);
-      fWgt.SigObsSum[ip].  push_back(other.fWgt.SigObsSum  [ip][iObsIdx]);
-      fWgt.WgtObsNumEv[ip].push_back(other.fWgt.WgtObsNumEv[ip][iObsIdx]);
+   if ( XNode1.size() != 0 ) XNode1.push_back(other.XNode1[iObsIdx]);
+   if ( NPDFDim==2 &&  XNode2.size() != 0 ) XNode2.push_back(other.XNode2[iObsIdx]);
+   for ( unsigned int i = 0 ; i<fWgt.WgtObsSumW2.size() ; i++ ) {
+      fWgt.WgtObsSumW2[i].push_back(other.fWgt.WgtObsSumW2[i][iObsIdx]);
+      fWgt.SigObsSumW2[i].push_back(other.fWgt.SigObsSumW2[i][iObsIdx]);
+      fWgt.SigObsSum[i].  push_back(other.fWgt.SigObsSum  [i][iObsIdx]);
+      fWgt.WgtObsNumEv[i].push_back(other.fWgt.WgtObsNumEv[i][iObsIdx]);
+   }
+   if ( ! ( ITabVersionRead < 25000 ) ) {
+      if ( NCoeffInfoBlocks > 0 ) {
+         debug["CatBin"]<<"Found " << NCoeffInfoBlocks << " InfoBlocks with bins to be catenated, too." << endl;
+         for ( int i=0; i < NCoeffInfoBlocks; i++ ) {
+            if ( ICoeffInfoBlockFlag1[i] == 0 && ICoeffInfoBlockFlag2[i] == 0 ) {
+               CoeffInfoBlockContent[i].push_back(other.CoeffInfoBlockContent[i][iObsIdx]);
+               NCoeffInfoBlockCont[i] = NCoeffInfoBlockCont[i] + 1;
+            } else {
+               error["CatBin"]<<"Catenate bins not yet implemented for InfoBlocks other than with flags 1,2 = 0, 0:" <<
+                  ICoeffInfoBlockFlag1[i] << ", " << ICoeffInfoBlockFlag2[i] << ", aborted!" << endl;
+               exit(678);
+            }
+         }
+      }
    }
    fastNLOCoeffBase::CatBin(other, iObsIdx);
 }
diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFix.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFix.cc
index 5f2b1399..bb92b490 100644
--- a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFix.cc
+++ b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFix.cc
@@ -428,7 +428,7 @@ void fastNLOCoeffAddFix::Print(int iprint) const {
 
 
 //________________________________________________________________________________________________________________ //
-void fastNLOCoeffAddFix::EraseBin(unsigned int iObsIdx) {
+void fastNLOCoeffAddFix::EraseBin(unsigned int iObsIdx, int ITabVersionRead) {
    //! Erase observable bin
    debug["fastNLOCoeffAddFix::EraseBin"]<<"Erasing table entries in CoeffAddFix for bin index " << iObsIdx << endl;
    if ( ScaleNode.size() == 0 ) {
@@ -437,11 +437,11 @@ void fastNLOCoeffAddFix::EraseBin(unsigned int iObsIdx) {
    }
    if ( ScaleNode.size() != 0 ) ScaleNode.erase(ScaleNode.begin()+iObsIdx);
    if ( SigmaTilde.size() != 0 ) SigmaTilde.erase(SigmaTilde.begin()+iObsIdx);
-   fastNLOCoeffAddBase::EraseBin(iObsIdx);
+   fastNLOCoeffAddBase::EraseBin(iObsIdx,ITabVersionRead);
 }
 
 // Catenate observable bin
-void fastNLOCoeffAddFix::CatBin(const fastNLOCoeffAddFix& other, unsigned int iObsIdx) {
+void fastNLOCoeffAddFix::CatBin(const fastNLOCoeffAddFix& other, unsigned int iObsIdx, int ITabVersionRead) {
    debug["fastNLOCoeffAddFix::CatBin"]<<"Catenating observable bin in CoeffAddFix corresponding to bin index " << iObsIdx << endl;
    if ( ScaleNode.size() == 0 ) {
       say::error["CatBin"]<<"Initial fix-scale table is empty. Aborted!" << endl;
@@ -456,5 +456,5 @@ void fastNLOCoeffAddFix::CatBin(const fastNLOCoeffAddFix& other, unsigned int iO
       SigmaTilde.resize(nold+1);
       SigmaTilde[nold] = other.SigmaTilde[iObsIdx];
    }
-   fastNLOCoeffAddBase::CatBin(other, iObsIdx);
+   fastNLOCoeffAddBase::CatBin(other, iObsIdx, ITabVersionRead);
 }
diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFlex.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFlex.cc
index 69125707..758b8cb1 100644
--- a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFlex.cc
+++ b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffAddFlex.cc
@@ -518,7 +518,7 @@ void fastNLOCoeffAddFlex::Print(int iprint) const {
 //________________________________________________________________________________________________________________ //
 
 // Erase observable bin
-void fastNLOCoeffAddFlex::EraseBin(unsigned int iObsIdx) {
+void fastNLOCoeffAddFlex::EraseBin(unsigned int iObsIdx, int ITabVersionRead) {
    debug["fastNLOCoeffAddFlex::EraseBin"]<<"Erasing table entries in CoeffAddFlex for bin index " << iObsIdx << endl;
    if ( ScaleNode1.size() == 0 ) {
       say::error["EraseBin"]<<"All bins deleted already. Aborted!" << endl;
@@ -532,11 +532,11 @@ void fastNLOCoeffAddFlex::EraseBin(unsigned int iObsIdx) {
    if ( SigmaTildeMuRRDep.size() != 0 ) SigmaTildeMuRRDep.erase(SigmaTildeMuRRDep.begin()+iObsIdx);
    if ( SigmaTildeMuFFDep.size() != 0 ) SigmaTildeMuFFDep.erase(SigmaTildeMuFFDep.begin()+iObsIdx);
    if ( SigmaTildeMuRFDep.size() != 0 ) SigmaTildeMuRFDep.erase(SigmaTildeMuRFDep.begin()+iObsIdx);
-   fastNLOCoeffAddBase::EraseBin(iObsIdx);
+   fastNLOCoeffAddBase::EraseBin(iObsIdx,ITabVersionRead);
 }
 
 // Catenate observable bin
-void fastNLOCoeffAddFlex::CatBin(const fastNLOCoeffAddFlex& other, unsigned int iObsIdx) {
+void fastNLOCoeffAddFlex::CatBin(const fastNLOCoeffAddFlex& other, unsigned int iObsIdx, int ITabVersionRead) {
    debug["fastNLOCoeffAddFlex::CatBin"]<<"Catenating observable bin in CoeffAddFlex corresponding to bin index " << iObsIdx << endl;
    if ( ScaleNode1.size() == 0 ) {
       say::error["CatBin"]<<"Initial flex-scale table is empty. Aborted!" << endl;
@@ -575,5 +575,5 @@ void fastNLOCoeffAddFlex::CatBin(const fastNLOCoeffAddFlex& other, unsigned int
       SigmaTildeMuRFDep.resize(nold+1);
       SigmaTildeMuRFDep[nold] = other.SigmaTildeMuRFDep[iObsIdx];
    }
-   fastNLOCoeffAddBase::CatBin(other, iObsIdx);
+   fastNLOCoeffAddBase::CatBin(other, iObsIdx, ITabVersionRead);
 }
diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffBase.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffBase.cc
index 54b108a1..d7b54af5 100644
--- a/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffBase.cc
+++ b/v2.3/toolkit/fastnlotoolkit/fastNLOCoeffBase.cc
@@ -26,17 +26,17 @@ fastNLOCoeffBase* fastNLOCoeffBase::Clone() const {
 void fastNLOCoeffBase::Read(istream& table, int ITabVersionRead){
    // basic read function.
    // reads in only 'base'-variables.
-   debug["ReadCoeffBase::Read"]<<"Start reading table ..."<<endl;
+   debug["Read"]<<"Start reading table ..."<<endl;
    ReadBase(table, ITabVersionRead);
    ReadCoeffInfoBlocks(table, ITabVersionRead);
    EndReadCoeff(table, ITabVersionRead);
-   debug["ReadCoeffBase::Read"]<<"Finished reading table."<<endl;
+   debug["Read"]<<"Finished reading table."<<endl;
 }
 
 
 //________________________________________________________________________________________________________________ //
 void fastNLOCoeffBase::ReadBase(istream& table, int ITabVersionRead){
-   debug["ReadCoeffBase::ReadBase"]<<"Start reading base coefficient table ..."<<endl;
+   debug["ReadBase"]<<"Start reading base coefficient table ..."<<endl;
    fastNLOTools::ReadMagicNo(table);
    table >> IXsectUnits;
    table >> IDataFlag;
@@ -46,16 +46,16 @@ void fastNLOCoeffBase::ReadBase(istream& table, int ITabVersionRead){
    table >> NScaleDep;
    fastNLOTools::ReadFlexibleVector(CtrbDescript,table);
    fastNLOTools::ReadFlexibleVector(CodeDescript,table);
-   debug["ReadCoeffBase::ReadBase"]<<"Finished reading base coefficient table."<<endl;
+   debug["ReadBase"]<<"Finished reading base coefficient table."<<endl;
 }
 
 
 //________________________________________________________________________________________________________________ //
 void fastNLOCoeffBase::EndReadCoeff(istream& table, int ITabVersionRead){
-   debug["fastNLOCoeffBase::EndReadCoeff"]<<"Should have reached end of coefficient table for table version "<<ITabVersionRead<<endl;
+   debug["EndReadCoeff"]<<"Should have reached end of coefficient table for table version "<<ITabVersionRead<<endl;
    fastNLOTools::ReadMagicNo(table);
    fastNLOTools::PutBackMagicNo(table);
-   debug["fastNLOCoeffBase::EndReadCoeff"]<<"Finished reading coefficient table for table version "<<ITabVersionRead<<endl;
+   debug["EndReadCoeff"]<<"Finished reading coefficient table for table version "<<ITabVersionRead<<endl;
 }
 
 
@@ -126,30 +126,36 @@ bool fastNLOCoeffBase::IsCompatible(const fastNLOCoeffBase& other) const {
 
 //________________________________________________________________________________________________________________ //
 bool fastNLOCoeffBase::IsCatenable(const fastNLOCoeffBase& other) const {
-   if( IXsectUnits != other.GetIXsectUnits() ){
+   if ( IXsectUnits != other.GetIXsectUnits() ){
       debug["IsCatenable"]<<"IXsectUnits != other.GetIXsectUnits(). Skipped."<<endl;
       return false;
    }
-   if( IDataFlag != other.GetIDataFlag() ){
+   if ( IDataFlag != other.GetIDataFlag() ){
       debug["IsCatenable"]<<"IDataFlag != other.GetIDataFlag(). Skipped."<<endl;
       return false;
    }
-   if( IAddMultFlag != other.GetIAddMultFlag() ){
+   if ( IAddMultFlag != other.GetIAddMultFlag() ){
       debug["IsCatenable"]<<"IAddMultFlag != other.GetIAddMultFlag(). Skipped."<<endl;
       return false;
    }
-   if( IContrFlag1 != other.GetIContrFlag1() ){
+   if ( IContrFlag1 != other.GetIContrFlag1() ){
       debug["IsCatenable"]<<"IContrFlag1 != other.GetIContrFlag1(). Skipped."<<endl;
       return false;
    }
-   if( IContrFlag2 != other.GetIContrFlag2() ){
+   if ( IContrFlag2 != other.GetIContrFlag2() ){
       debug["IsCatenable"]<<"IContrFlag2 != other.GetIContrFlag2(). Skipped."<<endl;
       return false;
    }
-   if( NScaleDep != other.GetNScaleDep() ){
-      debug["IsCatenable"]<<"NScaleDep != other.GetNScaleDep(). Skipped."<<endl;
+   if ( NScaleDep != other.GetNScaleDep() ){
       return false;
    }
+   if ( ! (fVersionRead < 25000) ) {
+      if ( (HasCoeffInfoBlock(0,0) && ! other.HasCoeffInfoBlock(0,0)) ||
+           (! HasCoeffInfoBlock(0,0) && other.HasCoeffInfoBlock(0,0)) ) {
+         debug["IsCatenable"]<<"Missing InfoBlock in either of the two tables. Skipped."<<endl;
+         return false;
+      }
+   }
    info["IsCatenable"]<<"Base parameters of contribution allow catenation"<<endl;
    // check descripts here ?!
    //bool potentialcompatible = true;
@@ -200,25 +206,25 @@ void fastNLOCoeffBase::Print(int iprint) const {
 
 // Erase observable bin
 void fastNLOCoeffBase::EraseBin(unsigned int iObsIdx) {
-   debug["fastNLOCoeffBase::EraseBin"]<<"Erasing table entries in CoeffBase for bin index " << iObsIdx << endl;
+   debug["EraseBin"]<<"Erasing table entries in CoeffBase for bin index " << iObsIdx << endl;
    SetNObsBin(GetNObsBin()-1);
 }
 
 // Catenate observable bin
 void fastNLOCoeffBase::CatBin(const fastNLOCoeffBase& other, unsigned int iObsIdx) {
-   debug["fastNLOCoeffBase::CatBin"]<<"Catenating observable bin in CoeffBase corresponding to bin index " << iObsIdx << endl;
+   debug["CatBin"]<<"Catenating observable bin in CoeffBase corresponding to bin index " << iObsIdx << endl;
    SetNObsBin(GetNObsBin()+1);
 }
 
 // Multiply observable bin
 void fastNLOCoeffBase::MultiplyBin(unsigned int iObsIdx, double nfact) {
-   debug["fastNLOCoeffBase::MultiplyBin"]<<"Multiplying table entries. Nothing to be done in CoeffBase." << endl;
+   debug["MultiplyBin"]<<"Multiplying table entries. Nothing to be done in CoeffBase." << endl;
 }
 
 //
 //________________________________________________________________________________________________________________
 // Added to include CoeffInfoBlocks
-bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1) {
+bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1) const {
    bool result = false;
    for (int i=0; i<NCoeffInfoBlocks; i++) {
       if ( ICoeffInfoBlockFlag1[i] == fICoeffInfoBlockFlag1 ) result = true;
@@ -226,7 +232,7 @@ bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1) {
    return result;
 }
 
-bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1, int fICoeffInfoBlockFlag2) {
+bool fastNLOCoeffBase::HasCoeffInfoBlock(int fICoeffInfoBlockFlag1, int fICoeffInfoBlockFlag2) const {
    bool result = false;
    for (int i=0; i<NCoeffInfoBlocks; i++) {
       if ( ICoeffInfoBlockFlag1[i] == fICoeffInfoBlockFlag1 && ICoeffInfoBlockFlag2[i] == fICoeffInfoBlockFlag2 ) result = true;
@@ -248,41 +254,56 @@ int fastNLOCoeffBase::GetCoeffInfoBlockIndex(int fICoeffInfoBlockFlag1, int fICo
    return -1;
 }
 
+void fastNLOCoeffBase::AddCoeffInfoBlock(int fICoeffInfoBlockFlag1, int fICoeffInfoBlockFlag2,
+                                         std::vector<std::string> Description, std::string datfile) {
+   info["AddCoeffInfoBlocks"]<<"Adding additional InfoBlock with flags "<<fICoeffInfoBlockFlag1<<" and "<<fICoeffInfoBlockFlag2<<" to table contribution."<<endl;
+   NCoeffInfoBlocks += 1;
+   ICoeffInfoBlockFlag1.push_back(fICoeffInfoBlockFlag1);
+   ICoeffInfoBlockFlag2.push_back(fICoeffInfoBlockFlag2);
+   NCoeffInfoBlockDescr.push_back(Description.size());
+   CoeffInfoBlockDescript.push_back(Description);
+   std::vector<double> Uncertainty = fastNLOTools::ReadInfoBlockContent(datfile);
+   CoeffInfoBlockContent.push_back(Uncertainty);
+}
+
 void fastNLOCoeffBase::ReadCoeffInfoBlocks(istream& table, int ITabVersionRead) {
    if (ITabVersionRead < 25000) {
-      debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"No additional info blocks allowed for table versions < 25000"<<endl;
+      debug["ReadCoeffInfoBlocks"]<<"No additional info blocks allowed for table versions < 25000"<<endl;
    } else {
       table >> NCoeffInfoBlocks;
-      debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found "<<NCoeffInfoBlocks<<" additional info blocks for coefficient table."<<endl;
+      debug["ReadCoeffInfoBlocks"]<<"Found "<<NCoeffInfoBlocks<<" additional info blocks for coefficient table."<<endl;
       for (int i=0; i<NCoeffInfoBlocks; i++) {
          int iflag;
          table >> iflag;
          ICoeffInfoBlockFlag1.push_back(iflag);
          if (ICoeffInfoBlockFlag1[i] == 0) {
-            debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<endl;
+            debug["ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<endl;
          } else {
-            error["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of unknown type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<endl;
+            error["ReadCoeffInfoBlocks"]<<"Found info block of unknown type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<endl;
             exit(111);
          }
          table >> iflag;
          ICoeffInfoBlockFlag2.push_back(iflag);
          if (ICoeffInfoBlockFlag2[i] == 0) {
-            debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag2 = "<<ICoeffInfoBlockFlag2[i]<<endl;
+            debug["ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag2 = "<<ICoeffInfoBlockFlag2[i]<<endl;
          } else {
-            error["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of unknown type ICoeffInfoBlockFlag2 = "<<ICoeffInfoBlockFlag2[i]<<endl;
+            error["ReadCoeffInfoBlocks"]<<"Found info block of unknown type ICoeffInfoBlockFlag2 = "<<ICoeffInfoBlockFlag2[i]<<endl;
             exit(222);
          }
          std::vector < std::string > Description;
-         fastNLOTools::ReadFlexibleVector(Description,table);
+         NCoeffInfoBlockDescr.push_back(fastNLOTools::ReadFlexibleVector(Description,table)-1);
          CoeffInfoBlockDescript.push_back(Description);
+         for (unsigned int j=0; j<Description.size(); j++) {
+            debug["ReadCoeffInfoBlocks"]<<"Read info block description line "<<j<<" : "<< Description[j] <<endl;
+         }
          if ( ICoeffInfoBlockFlag1[i] == 0 ) { // Entry per ObsBin
             std::vector < double > Content;
-            int nlines = fastNLOTools::ReadFlexibleVector(Content,table);
-            if ( nlines-1 != fNObsBins ) {
-               error["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<" , but # of content lines = "<<nlines-1<<" differs from fNObsBins = "<<fNObsBins<<"! Aborted."<<endl;
+            NCoeffInfoBlockCont.push_back(fastNLOTools::ReadFlexibleVector(Content,table));
+            if ( NCoeffInfoBlockCont[i]-1 != fNObsBins ) {
+               error["ReadCoeffInfoBlocks"]<<"Found info block of type ICoeffInfoBlockFlag1 = "<<ICoeffInfoBlockFlag1[i]<<" , but # of content lines = "<<NCoeffInfoBlockCont[i]-1<<" differs from fNObsBins = "<<fNObsBins<<"! Aborted."<<endl;
                exit(223);
             } else {
-               debug["fastNLOCoeffBase::ReadCoeffInfoBlocks"]<<"Read "<<nlines-1<<" lines into InfoBlock content vector."<<endl;
+               debug["ReadCoeffInfoBlocks"]<<"Read "<<NCoeffInfoBlockCont[i]-1<<" lines into InfoBlock content vector."<<endl;
             }
             CoeffInfoBlockContent.push_back(Content);
          }
@@ -292,19 +313,39 @@ void fastNLOCoeffBase::ReadCoeffInfoBlocks(istream& table, int ITabVersionRead)
 
 void fastNLOCoeffBase::WriteCoeffInfoBlocks(ostream& table, int ITabVersionWrite) {
    if (ITabVersionWrite < 25000) {
-      debug["fastNLOCoeffBase::WriteCoeffInfoBlocks"]<<"No additional info blocks allowed for table versions < 25000"<<endl;
+      debug["WriteCoeffInfoBlocks"]<<"No additional InfoBlocks allowed for table versions < 25000"<<endl;
    } else {
-      // Test with zero InfoBlocks
-      debug["fastNLOCoeffBase::WriteCoeffInfoBlocks"]<<"Writing additional line "<<NCoeffInfoBlocks<<endl;
+      debug["WriteCoeffInfoBlocks"]<<"Writing additional InfoBlocks; NCoeffInfoBlocks = "<<NCoeffInfoBlocks<<endl;
       table << NCoeffInfoBlocks << sep;
       for (int i=0; i<NCoeffInfoBlocks; i++) {
-         table << ICoeffInfoBlockFlag1[i];
-         table << ICoeffInfoBlockFlag2[i];
-         table << NCoeffInfoBlockDescr[i];
-         for (int j=0; j<NCoeffInfoBlockDescr[i];j++) {
-            table << CoeffInfoBlockDescript[i][j];
+         debug["WriteCoeffInfoBlocks"]<<"ICoeffInfoBlockFlags1,2 = "<<ICoeffInfoBlockFlag1[i]<<", "<<ICoeffInfoBlockFlag1[i]<<endl;
+         table << ICoeffInfoBlockFlag1[i] << sep;
+         table << ICoeffInfoBlockFlag2[i] << sep;
+         table << NCoeffInfoBlockDescr[i] << sep;
+         for (int j=0; j<NCoeffInfoBlockDescr[i]; j++) {
+            debug["WriteCoeffInfoBlocks"]<<"CoeffInfoBlockDecsript[.][.] = "<<CoeffInfoBlockDescript[i][j]<<endl;
+            table << CoeffInfoBlockDescript[i][j] << sep;
          }
          int nlines = fastNLOTools::WriteFlexibleVector(CoeffInfoBlockContent[i],table);
+         debug["WriteCoeffInfoBlocks"]<<"Wrote "<<nlines-1<<" content lines to additional InfoBlock no. "<<i<<endl;
       }
    }
 }
+
+void fastNLOCoeffBase::SetContributionDescription(std::vector <std::string> CtrbDescr) {
+   debug["SetContributionDescription"]<<"Setting contribution description."<<endl;
+   size_t NCtrbDescript = CtrbDescr.size();
+   fastNLOCoeffBase::CtrbDescript.resize(NCtrbDescript);
+   for (size_t i=0; i < NCtrbDescript; ++i) {
+      fastNLOCoeffBase::CtrbDescript[i] = CtrbDescr[i];
+   }
+}
+
+void fastNLOCoeffBase::SetCodeDescription(std::vector <std::string> CodeDescr) {
+   debug["SetCodeDescription"]<<"Setting code description."<<endl;
+   size_t NCodeDescript = CodeDescr.size();
+   fastNLOCoeffBase::CodeDescript.resize(NCodeDescript);
+   for (size_t i=0; i < NCodeDescript; ++i) {
+      fastNLOCoeffBase::CodeDescript[i] = CodeDescr[i];
+   }
+}
diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc
index 20b2cc33..ba1e7aa6 100644
--- a/v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc
+++ b/v2.3/toolkit/fastnlotoolkit/fastNLOReader.cc
@@ -1399,6 +1399,13 @@ void fastNLOReader::CalcCrossSection() {
    for (unsigned int i=0; i<NObsBin; i++) {
       QScale[i] = QScale[i]/XSection[i];
    }
+
+   // ---- Square root for statistical uncertainty combinaton ---- //
+   logger.debug["CalcCrossSection"]<<"Calculate stat. uncertainty from quadratic addition: sqrt(dXS)"<<endl;
+   for (unsigned int i=0; i<NObsBin; i++) {
+      dXSection[i] = sqrt(dXSection[i]);
+   }
+
    logger.debug["CalcCrossSection"]<<"... leaving CalcCrossSection."<<endl;
 }
 
@@ -1506,13 +1513,15 @@ void fastNLOReader::CalcCrossSectionv21(fastNLOCoeffAddFlex* c) {
    int xUnits = c->GetIXsectUnits();
    logger.debug["CalcCrossSectionv21"]<<"Ipublunits = " << Ipublunits << ", xUnits = " << xUnits << endl;
 
-   // Check whether CoeffInfoBlock for relative stat. uncertainties (0,0) exists
-   logger.debug["CalcCrossSectionv21"]<<"Checking on presence of statistical uncertainties  ..."<<endl;
+   // Check whether CoeffInfoBlock for relative statistical/numerical uncertainties (0,0) exists
+   logger.debug["CalcCrossSectionv21"]<<"Checking on presence of statistical/numerical uncertainties  ..."<<endl;
    int iCIBIndex = c->GetCoeffInfoBlockIndex(0,0);
    std::vector < double > dCIBCont;
    if ( iCIBIndex > -1 ) {
-      logger.debug["CalcCrossSectionv21"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with statistical uncertainties."<<endl;
+      logger.debug["CalcCrossSectionv21"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with statistical/numerical uncertainties."<<endl;
       dCIBCont = c->GetCoeffInfoContent(iCIBIndex);
+   } else {
+      logger.info["CalcCrossSectionv21"]<<"No CoeffInfoBlock found; uncertainties are initialised to zero."<<endl;
    }
 
    for (unsigned int i=0; i<NObsBin; i++) {
@@ -1566,7 +1575,10 @@ void fastNLOReader::CalcCrossSectionv21(fastNLOCoeffAddFlex* c) {
       if ( dCIBCont.empty() ) {
          dXS->at(i) += 0.;
       } else {
-         dXS->at(i) += fabs(XStmp)*dCIBCont[i]; // XStmp may be negative, but dCIBCont as statistical uncertainty should not!
+         // Quadratical addition of independent statistical uncertainties
+         dXS->at(i) += XStmp*XStmp*dCIBCont[i]*dCIBCont[i];
+         // Linear absolut addition of uncertainties (useful?)
+         //         dXS->at(i) += fabs(XStmp)*dCIBCont[i];
       }
    }
    logger.debug["CalcCrossSectionv21"]<<"... leaving CalcCrossSectionv21."<<endl;
@@ -1608,13 +1620,15 @@ void fastNLOReader::CalcCrossSectionv20(fastNLOCoeffAddFix* c) {
    int xUnits = c->GetIXsectUnits();
    logger.debug["CalcCrossSectionv20"]<<"Ipublunits = " << Ipublunits << ", xUnits = " << xUnits << endl;
 
-   // Check whether CoeffInfoBlock for relative stat. uncertainties (0,0) exists
-   logger.debug["CalcCrossSectionv20"]<<"Checking on presence of statistical uncertainties  ..."<<endl;
+   // Check whether CoeffInfoBlock for relative statistical/numerical uncertainties (0,0) exists
+   logger.debug["CalcCrossSectionv20"]<<"Checking on presence of statistical/numerical uncertainties  ..."<<endl;
    int iCIBIndex = c->GetCoeffInfoBlockIndex(0,0);
    std::vector < double > dCIBCont;
    if ( iCIBIndex > -1 ) {
-      logger.debug["CalcCrossSectionv20"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with statistical uncertainties."<<endl;
+      logger.debug["CalcCrossSectionv20"]<<"Found CoeffInfoBlock "<<iCIBIndex<<" with statistical/numerical uncertainties."<<endl;
       dCIBCont = c->GetCoeffInfoContent(iCIBIndex);
+   } else {
+      logger.info["CalcCrossSectionv20"]<<"No CoeffInfoBlock found; uncertainties are initialised to zero."<<endl;
    }
 
    int scaleVar = c->GetNpow() == ILOord ? 0 : fScalevar;
@@ -1642,7 +1656,10 @@ void fastNLOReader::CalcCrossSectionv20(fastNLOCoeffAddFix* c) {
       if ( dCIBCont.empty() ) {
          dXS->at(i) += 0.;
       } else {
-         dXS->at(i) += fabs(XStmp)*dCIBCont[i]; // XStmp may be negative, but dCIBCont as statistical uncertainty should not!
+         // Quadratical addition of independent statistical uncertainties
+         dXS->at(i) += XStmp*XStmp*dCIBCont[i]*dCIBCont[i];
+         // Linear absolut addition of uncertainties (useful?)
+         //         dXS->at(i) += fabs(XStmp)*dCIBCont[i];
       }
    }
    logger.debug["CalcCrossSectionv20"]<<"... leaving CalcCrossSectionv20."<<endl;
diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc
index 49385591..0dc9e7ed 100644
--- a/v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc
+++ b/v2.3/toolkit/fastnlotoolkit/fastNLOTable.cc
@@ -1758,10 +1758,6 @@ string fastNLOTable::GetXSDescr() const {
    return "Undefined";
 }
 
-vector <string> fastNLOTable::GetScDescr() const {
-   return ScDescript;
-}
-
 void fastNLOTable::SetScDescr(std::vector <std::string> ScDescr) {
    size_t NScDescript = ScDescr.size();
    fastNLOTable::ScDescript.resize(NScDescript);
@@ -2210,11 +2206,11 @@ void fastNLOTable::EraseBinFromTable(unsigned int iObsIdx) {
       } else if ( fastNLOCoeffAddFix::CheckCoeffConstants(ctmp,quiet) ) {
          logger.info["EraseBinFromTable"]<<"Found additive fix-table contribution. Now erasing index no. " << iObsIdx << endl;
          fastNLOCoeffAddFix* cfix = (fastNLOCoeffAddFix*)fCoeff[ic];
-         cfix->EraseBin(iObsIdx);
+         cfix->EraseBin(iObsIdx,ITabVersionRead);
       } else if ( fastNLOCoeffAddFlex::CheckCoeffConstants(ctmp,quiet) ) {
          logger.info["EraseBinFromTable"]<<"Found additive flex-table contribution. Now erasing index no. " << iObsIdx << endl;
          fastNLOCoeffAddFlex* cflex = (fastNLOCoeffAddFlex*)fCoeff[ic];
-         cflex->EraseBin(iObsIdx);
+         cflex->EraseBin(iObsIdx,ITabVersionRead);
       } else {
          logger.error["EraseBinFromTable"]<<"Could not identify contribution. Print and abort!" << endl;
          ctmp->Print(-1);
@@ -2301,7 +2297,7 @@ void fastNLOTable::CatBinToTable(const fastNLOTable& other, unsigned int iObsIdx
                fastNLOCoeffAddFix* crhs = (fastNLOCoeffAddFix*)other.GetCoeffTable(ic);
                if ( clhs->IsCatenable(*crhs) ) {
                   logger.info["CatBinToTable"]<<"Found fix-scale additive contribution. Now catenating index no. " << iObsIdx << endl;
-                  clhs->CatBin(*crhs,iObsIdx);
+                  clhs->CatBin(*crhs,iObsIdx,ITabVersionRead);
                   continue;
                }
             }
@@ -2310,7 +2306,7 @@ void fastNLOTable::CatBinToTable(const fastNLOTable& other, unsigned int iObsIdx
                fastNLOCoeffAddFlex* crhs = (fastNLOCoeffAddFlex*)other.GetCoeffTable(ic);
                if ( clhs->IsCatenable(*crhs) ) {
                   logger.info["CatBinToTable"]<<"Found flex-scale additive contribution. Now catenating index no. " << iObsIdx << endl;
-                  clhs->CatBin(*crhs,iObsIdx);
+                  clhs->CatBin(*crhs,iObsIdx,ITabVersionRead);
                   continue;
                }
             }
diff --git a/v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc b/v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc
index 01721846..667b74f7 100644
--- a/v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc
+++ b/v2.3/toolkit/fastnlotoolkit/fastNLOTools.cc
@@ -1,7 +1,10 @@
+#include <cfloat>
 #include <cstdlib>
-#include <string>
+#include <fstream>
 #include <iostream>
 #include <cmath>
+#include <sstream>
+#include <string>
 #include "fastnlotk/fastNLOTools.h"
 
 using namespace std;
@@ -388,5 +391,44 @@ namespace fastNLOTools {
       return true;
    }
 
+   //______________________________________________________________________________
+   std::vector <double> ReadInfoBlockContent(std::string filename) {
+      std::ifstream infile;
+      std::string line;
+      std::vector <double> Uncertainty;
+      info["ReadInfoBlockContent"]<<"Reading additional InfoBlock content from file: " << filename <<endl;
+      infile.open(filename);
+      if (infile.is_open()) {
+         int iline = 0;
+         // Read line-by-line
+         while(std::getline(infile, line)) {
+            // Put line into stringstream and read word-by-word
+            std::istringstream iss(line);
+            std::string word;
+            iss >> word;
+            // For now assume NNLOJET dat file format:
+            // - Skip all lines starting with comment symbol '#'
+            // - Read cross section and absolute statistical uncertainty from 4th and 5th columns
+            if ( word.at(0) != '#' ) {
+               // Skip first three words of each line
+               iss >> word;
+               iss >> word;
+               double xs, dxs;
+               iss >> xs;
+               iss >> dxs;
+               if ( fabs(xs) > DBL_MIN ) {
+                  Uncertainty.push_back(dxs/xs);
+               } else {
+                  Uncertainty.push_back(0.);
+               }
+               iline += 1;
+            }
+         }
+      } else {
+         error["ReadInfoBlockContent"]<<"Cannot read InfoBlock content, aborted! Filename is: " << filename <<endl;
+         exit(33);
+      }
+      return Uncertainty;
+   }
 
 } // end namespace fastNLO
diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddBase.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddBase.h
index cb9033ca..63543b94 100644
--- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddBase.h
+++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddBase.h
@@ -119,8 +119,8 @@ public:
    virtual void MultiplyCoefficientsByConstant(double fact) {};//!< Multiply all coefficients of all bins by a constant factor
    virtual void MultiplyBin(unsigned int iObsIdx, double fact) {};  //!< Multiply coefficients of one observable bin a factor
    virtual void MultiplyBinProc(unsigned int iObsIdx, unsigned int iProc, double fact) {}; //!< Multiply coefficients of one observable bin a factor (idx starting from 0)
-   virtual void EraseBin(unsigned int iObsIdx);//!< Erase observable bin from table
-   virtual void CatBin(const fastNLOCoeffAddBase& other, unsigned int iObsIdx); //!< Catenate observable to table
+   virtual void EraseBin(unsigned int iObsIdx, int ITabVersionRead);//!< Erase observable bin from table
+   virtual void CatBin(const fastNLOCoeffAddBase& other, unsigned int iObsIdx, int ITabVersionRead); //!< Catenate observable to table
 
    int GetIRef() const {return IRef;}
    void SetIRef(int iref=1) {IRef=iref;}
diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFix.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFix.h
index 282bf068..19b8e884 100644
--- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFix.h
+++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFix.h
@@ -32,9 +32,9 @@ public:
    virtual void MultiplyBin(unsigned int iObsIdx, double fact); //!< Multiply coefficients of one bin a factor
    virtual void MultiplyBinProc(unsigned int iObsIdx, unsigned int iProc, double fact); //!< Multiply coefficients of one bin and subprocess by a factor
    // Erase observable bin from table
-   virtual void EraseBin(unsigned int iObsIdx);
+   virtual void EraseBin(unsigned int iObsIdx, int ITabVersionRead);
    // Catenate observable to table
-   virtual void CatBin(const fastNLOCoeffAddFix& other, unsigned int iObsIdx);
+   virtual void CatBin(const fastNLOCoeffAddFix& other, unsigned int iObsIdx, int ITabVersionRead);
 
    int GetTotalScalevars() const ;
    int GetTotalScalenodes() const ;
diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFlex.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFlex.h
index e55b4b56..51f8cd6c 100644
--- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFlex.h
+++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffAddFlex.h
@@ -31,8 +31,8 @@ public:
    virtual void MultiplyCoefficientsByConstant(double fact); //!< Multiply all coefficients of all bins by a constant factor
    virtual void MultiplyBin(unsigned int iObsIdx, double fact); //!< Multiply coefficients of one bin a factor (iObsIdx starting with index 0)
    virtual void MultiplyBinProc(unsigned int iObsIdx, unsigned int iProc, double fact); //!< Multiply coefficients of one bin and subprocess a factor
-   virtual void EraseBin(unsigned int iObsIdx); //!< Erase observable bin from table
-   virtual void CatBin(const fastNLOCoeffAddFlex& other, unsigned int iObsIdx); //!< Catenate observable to table
+   virtual void EraseBin(unsigned int iObsIdx, int ITabVersionRead); //!< Erase observable bin from table
+   virtual void CatBin(const fastNLOCoeffAddFlex& other, unsigned int iObsIdx, int ITabVersionRead); //!< Catenate observable to table
 
    unsigned int GetNScaleNode1(int iObsBin) const { return ScaleNode1[iObsBin].size(); };
    unsigned int GetNScaleNode2(int iObsBin) const { return ScaleNode2[iObsBin].size(); };
diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffBase.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffBase.h
index 91f9e718..9ac3f249 100644
--- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffBase.h
+++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOCoeffBase.h
@@ -38,6 +38,10 @@ public:
 
    void SetCoeffAddDefaults();
 
+   /// ___________________________________________________________________________________________________
+   /// Some info getters & setters for contribution modifications
+   /// ___________________________________________________________________________________________________
+
    int GetIDataFlag() const {return IDataFlag;}
    void SetIDataFlag(int n){IDataFlag = n;}
 
@@ -61,9 +65,11 @@ public:
 
    bool GetIsFlexibleScale() const { return (NScaleDep>=3) && (IAddMultFlag==0); }
 
+   /// get/set contribution and code description
    std::vector<std::string > GetContributionDescription() const { return CtrbDescript; }
-   void SetContributionDescription(std::vector<std::string > descr ) { CtrbDescript = descr; };           //! Set contribution description
+   void SetContributionDescription(std::vector<std::string > descr );
    std::vector<std::string > GetCodeDescription() const { return CodeDescript; }
+   void SetCodeDescription(std::vector<std::string > descr );
 
    bool IsLO() const {return IContrFlag1==1 && IContrFlag2==1;}
    bool IsNLO() const {return IContrFlag1==1 && IContrFlag2==2;}
@@ -75,12 +81,13 @@ public:
 
    // Added to include CoeffInfoBlocks
    bool HasCoeffInfoBlock() const {return NCoeffInfoBlocks>0;}
-   bool HasCoeffInfoBlock(int ICoeffInfoBlockFlag1);
-   bool HasCoeffInfoBlock(int ICoeffInfoBlockFlag1, int ICoeffInfoBlockFlag2);
+   bool HasCoeffInfoBlock(int ICoeffInfoBlockFlag1) const;
+   bool HasCoeffInfoBlock(int ICoeffInfoBlockFlag1, int ICoeffInfoBlockFlag2) const;
    int GetCoeffInfoBlockIndex(int ICoeffInfoBlockFlag1);
    int GetCoeffInfoBlockIndex(int ICoeffInfoBlockFlag1, int ICoeffInfoBlockFlag2);
    std::vector < double > GetCoeffInfoContent(int Index) const { return CoeffInfoBlockContent[Index]; };
    int GetNCoeffInfoBlocks() const {return NCoeffInfoBlocks;}
+   void AddCoeffInfoBlock(int ICoeffInfoBlockFlag1, int ICoeffInfoBlockFlag2, std::vector<std::string> Description, std::string datfile);
 
 protected:
    void ReadBase(std::istream& table, int ITabVersionRead);
@@ -108,6 +115,7 @@ protected:
    std::vector < int > ICoeffInfoBlockFlag2;
    std::vector < int > NCoeffInfoBlockDescr;
    std::vector < std::vector < std::string > > CoeffInfoBlockDescript;
+   std::vector < int > NCoeffInfoBlockCont;
    fastNLO::v2d CoeffInfoBlockContent;
 };
 
diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTable.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTable.h
index 799320f3..bde76acd 100644
--- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTable.h
+++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTable.h
@@ -158,7 +158,7 @@ class fastNLOTable {
    /// ___________________________________________________________________________________________________
 
    /// get/set scenario description
-   std::vector <std::string> GetScDescr() const;
+   std::vector <std::string> GetScDescr() const { return ScDescript; }
    void SetScDescr(std::vector <std::string> ScDescr);
 
    /// get/set cross section units of published results (pb = 12, fb = 15, ...)
diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h
index 99461c2c..39e528fd 100644
--- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h
+++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/fastNLOTools.h
@@ -80,6 +80,8 @@ namespace fastNLOTools {
    bool ReadMagicNo(std::istream& table);                                       //!< Read and check magic number from table.
    void PutBackMagicNo(std::istream& table);                                    //!< Reset magic number, such that it can be recognized by other reading routines
 
+   std::vector <double> ReadInfoBlockContent(std::string filename);
+
 };
 
 
diff --git a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/speaker.h b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/speaker.h
index 8671927d..7fdea3a7 100644
--- a/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/speaker.h
+++ b/v2.3/toolkit/fastnlotoolkit/include/fastnlotk/speaker.h
@@ -10,6 +10,22 @@
 
 namespace say {
    enum Verbosity {DEBUG=-1000, MANUAL=2, INFO=0, WARNING=1, ERROR=2, SILENT=1000};
+
+   // String to enum
+   struct toVerbosity : public std::map<std::string, Verbosity>
+      {
+         toVerbosity()
+            {
+               this->operator[]("DEBUG")   = DEBUG;
+               this->operator[]("MANUAL")  = MANUAL;
+               this->operator[]("INFO")    = INFO;
+               this->operator[]("WARNING") = WARNING;
+               this->operator[]("ERROR")   = ERROR;
+               this->operator[]("SILENT")  = SILENT;
+            };
+         ~toVerbosity(){}
+      };
+
 }
 
 class speaker {
@@ -17,7 +33,6 @@ public:
    speaker(std::string prefix="",say::Verbosity volume=say::INFO,bool err=false,bool quiet=false);
    speaker(const speaker& spk);
    ~speaker();
-   //speaker(const speaker& spk) : weg(0) {;};
    const speaker& operator= (const speaker& other);
    std::ostream& operator[](const std::string& fct) const ;
    const speaker& operator+ (const std::string& fct) const {
@@ -67,7 +82,6 @@ public:
    };
 
 protected:
-   //std::ostream weg;
    static std::ostream* weg;
    bool fquiet;
    std::string pref;
@@ -83,7 +97,7 @@ protected:
 
 namespace say {
    extern speaker debug;
-   extern speaker man;   //
+   extern speaker man;
    extern speaker info;
    extern speaker warn;
    extern speaker error;
@@ -95,7 +109,7 @@ namespace say {
 
 class PrimalScream {
 public:
-   PrimalScream(std::string classname);//,std::string prefix="");
+   PrimalScream(std::string classname);
    void SetClassName(const std::string classname );
    void SetVerbosity(say::Verbosity volume);
    speaker debug;
diff --git a/v2.3/toolkit/src/fnlo-tk-append.cc b/v2.3/toolkit/src/fnlo-tk-append.cc
index fa86db5d..9b000430 100644
--- a/v2.3/toolkit/src/fnlo-tk-append.cc
+++ b/v2.3/toolkit/src/fnlo-tk-append.cc
@@ -28,7 +28,7 @@ int main(int argc, char** argv) {
    using namespace say;          //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;      //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
    //! --- Print program purpose
diff --git a/v2.3/toolkit/src/fnlo-tk-cat.cc b/v2.3/toolkit/src/fnlo-tk-cat.cc
index 514069c3..4216af82 100644
--- a/v2.3/toolkit/src/fnlo-tk-cat.cc
+++ b/v2.3/toolkit/src/fnlo-tk-cat.cc
@@ -26,7 +26,7 @@ int main(int argc, char** argv) {
    using namespace say;          //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;      //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
    //! --- Print program purpose
diff --git a/v2.3/toolkit/src/fnlo-tk-cppread.cc b/v2.3/toolkit/src/fnlo-tk-cppread.cc
index b0ad40e2..a7fd626b 100644
--- a/v2.3/toolkit/src/fnlo-tk-cppread.cc
+++ b/v2.3/toolkit/src/fnlo-tk-cppread.cc
@@ -55,10 +55,10 @@ int main(int argc, char** argv) {
    using namespace say;          //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;      //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
-   //! ---  Parse command line
+   //! --- Parse command line
    char buffer[1024]; // TODO: Use PATH_MAX instead?
    string tablename;
    if (argc <= 1) {
@@ -228,8 +228,7 @@ int main(int argc, char** argv) {
    }
    if (argc <= 4 || AsEvolCode == "_") {
       AsEvolCode = "GRV";
-      shout["fnlo-tk-cppread"] << "No request given for alpha_s evolution code," << endl;
-      shout << "            using GRV default." << endl;
+      shout["fnlo-tk-cppread"] << "No request given for alpha_s evolution code, using GRV default." << endl;
    } else {
       shout["fnlo-tk-cppread"] << "Using alpha_s evolution code: " << AsEvolCode << endl;
    }
@@ -251,7 +250,7 @@ int main(int argc, char** argv) {
       chflex = (const char*) argv[6];
    }
    if (argc <= 6 || chflex == "_") {
-      chflex = "scale1";
+      chflex = "kScale1";
       shout["fnlo-tk-cppread"] << "Using default mur=muf=scale 1." << endl;
    } else {
       shout["fnlo-tk-cppread"] << "Using scale definition "+chflex << endl;
@@ -264,7 +263,7 @@ int main(int argc, char** argv) {
    }
    if (argc <= 7 || chtmp == "_") {
       shout["fnlo-tk-cppread"] << "No request given for no. of flavours," << endl;
-      shout << "            using default value for LHAPDF or Nf = " << Nf << "." << endl;
+      shout << "                  using default value for LHAPDF or Nf = " << Nf << "." << endl;
    } else {
       Nf = atoi(argv[7]);
       if ( AsEvolCode == "LHAPDF" ) {
@@ -287,7 +286,7 @@ int main(int argc, char** argv) {
    }
    if (argc <= 8 || chtmp == "_") {
       shout["fnlo-tk-cppread"] << "No request given for no. of loops," << endl;
-      shout << "            using default value for LHAPDF or NLoop = " << NLoop << "." << endl;
+      shout << "                  using default value for LHAPDF or NLoop = " << NLoop << "." << endl;
    } else {
       NLoop = atoi(argv[8]);
       if ( AsEvolCode == "LHAPDF" ) {
@@ -310,7 +309,7 @@ int main(int argc, char** argv) {
    }
    if (argc <= 9 || chtmp == "_") {
       shout["fnlo-tk-cppread"] << "No request given for value of alpha_s(M_Z)," << endl;
-      shout << "            using default value for LHAPDF or asMz = " << asMz << "." << endl;
+      shout << "                  using default value for LHAPDF or asMz = " << asMz << "." << endl;
    } else {
       asMz = atof(argv[9]);
       if ( AsEvolCode == "LHAPDF" ) {
@@ -333,7 +332,7 @@ int main(int argc, char** argv) {
    }
    if (argc <= 10 || chtmp == "_") {
       shout["fnlo-tk-cppread"] << "No request given for value of M_Z," << endl;
-      shout << "            using default value for LHAPDF or Mz = " << Mz << "." << endl;
+      shout << "                  using default value for LHAPDF or Mz = " << Mz << "." << endl;
    } else {
       Mz = atof(argv[10]);
       if ( AsEvolCode == "LHAPDF" ) {
@@ -356,8 +355,7 @@ int main(int argc, char** argv) {
    }
    if (argc <= 11 || VerbosityLevel == "_") {
       VerbosityLevel = "WARNING";
-      shout["fnlo-tk-cppread"] << "No request given for verbosity level," << endl;
-      shout << "            using WARNING default." << endl;
+      shout["fnlo-tk-cppread"] << "No request given for verbosity level, using WARNING default." << endl;
    } else {
       shout["fnlo-tk-cppread"] << "Using verbosity level: " << VerbosityLevel << endl;
    }
@@ -370,17 +368,8 @@ int main(int argc, char** argv) {
    yell << _CSEPSC << endl;
    //---  End of parsing arguments
 
-   //! --- Reset verbosity level to warning only from here on
-   // TODO: KR: A string to enum map or similar could come in handy here
-   if ( VerbosityLevel == "DEBUG" ) {
-      SetGlobalVerbosity(DEBUG);
-   } else if ( VerbosityLevel == "INFO" ) {
-      SetGlobalVerbosity(INFO);
-   } else if ( VerbosityLevel == "ERROR" ) {
-      SetGlobalVerbosity(ERROR);
-   } else {
-      SetGlobalVerbosity(WARNING);
-   }
+   //! --- Reset verbosity level from here on
+   SetGlobalVerbosity(toVerbosity()[VerbosityLevel]);
 
    // ************************** fastNLO and example documentation starts here ****************************
    // --- fastNLO user: Hello!
diff --git a/v2.3/toolkit/src/fnlo-tk-example.cc b/v2.3/toolkit/src/fnlo-tk-example.cc
index 8ccb78f5..dd37b9eb 100644
--- a/v2.3/toolkit/src/fnlo-tk-example.cc
+++ b/v2.3/toolkit/src/fnlo-tk-example.cc
@@ -42,7 +42,7 @@ int main(int argc, char** argv) {
    using namespace say;       //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;   //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
    //! --- Print program purpose
diff --git a/v2.3/toolkit/src/fnlo-tk-merge.cc b/v2.3/toolkit/src/fnlo-tk-merge.cc
index 45466cca..13104ab4 100644
--- a/v2.3/toolkit/src/fnlo-tk-merge.cc
+++ b/v2.3/toolkit/src/fnlo-tk-merge.cc
@@ -29,7 +29,7 @@ int main(int argc, char** argv) {
    using namespace say;          //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;      //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
    //! --- Print program purpose
diff --git a/v2.3/toolkit/src/fnlo-tk-merge2.cc b/v2.3/toolkit/src/fnlo-tk-merge2.cc
index fcf87011..b0e54786 100644
--- a/v2.3/toolkit/src/fnlo-tk-merge2.cc
+++ b/v2.3/toolkit/src/fnlo-tk-merge2.cc
@@ -108,7 +108,7 @@ int main(int argc, char** argv) {
    using namespace say;          //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;      //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
    //! --- Print program purpose
diff --git a/v2.3/toolkit/src/fnlo-tk-modify.cc b/v2.3/toolkit/src/fnlo-tk-modify.cc
index ae19d1ab..19699965 100644
--- a/v2.3/toolkit/src/fnlo-tk-modify.cc
+++ b/v2.3/toolkit/src/fnlo-tk-modify.cc
@@ -15,6 +15,7 @@
 #include <iostream>
 #include <vector>
 #include "fastnlotk/fastNLOTable.h"
+#include "fastnlotk/fastNLOTools.h"
 #include "fastnlotk/read_steer.h"
 #include "fastnlotk/speaker.h"
 
@@ -26,46 +27,57 @@ int main(int argc, char** argv) {
    using namespace say;          //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;      //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
-   //! --- Print program purpose
-   yell << _CSEPSC << endl;
-   info["fnlo-tk-modify"] << "Tool to manipulate a fastNLO table" << endl;
-   yell << _SSEPSC << endl;
-   info["fnlo-tk-modify"] << "For more explanations type:" << endl;
-   info["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl;
-   info["fnlo-tk-modify"] << "and consult the provided default steering file 'SteerModify.str'." << endl;
-   yell << _CSEPSC << endl;
-
-   //! ---  Parse commmand line
-   yell << "" << endl;
-   yell << _CSEPSC << endl;
-   shout["fnlo-tk-modify"] << "fastNLO Table Manipulator"<<endl;
-   yell << _SSEPSC << endl;
-   //! Test for default steering file "SteerModify.str"
-   string steername = "SteerModify.str";
+   //! --- Parse command line
+   string steername = "SteerModify.str"; //! Default steering file "SteerModify.str"
+   string intable;
+   string outtable;
+   string testname;
    if (argc <= 1) {
-      ifstream ffile;
-      ffile.open(steername.c_str());
-      if (!ffile) {
-         error["fnlo-tk-modify"] << "Neither mandatory parameters specified in command line " << endl;
-         error["fnlo-tk-modify"] << "nor default steering file 'SteerModify.str' found. Aborted!" << endl;
-         shout["fnlo-tk-modify"] << "For more explanations type:" << endl;
-         shout["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl;
-         yell << _CSEPSC << endl;
-         exit(1);
-      }
+      yell << "" << endl;
+      yell << _CSEPSC << endl;
+      shout["fnlo-tk-modify"] << "fastNLO Table Manipulator" << endl;
+      yell << _SSEPSC << endl;
+      shout["fnlo-tk-modify"] << "Since no argument is given, all settings must be provided via" << endl;
+      shout["fnlo-tk-modify"] << "  the default steering file 'SteerModify.str'," << endl;
+      shout["fnlo-tk-modify"] << "  which can be consulted for further information as well." << endl;
+      shout["fnlo-tk-modify"] << "For more explanations type:" << endl;
+      shout["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl;
+      shout["fnlo-tk-modify"] << "For version number printout type:" << endl;
+      shout["fnlo-tk-modify"] << "./fnlo-tk-modify -v" << endl;
+      yell << _CSEPSC << endl;
    } else {
-      steername = (const char*) argv[1];
+      testname = (const char*) argv[1];
+      if (testname == "-v") {
+         fastNLOTools::PrintFastnloVersion();
+         return 0;
+      }
+      //! --- Print program purpose
+      yell << _CSEPSC << endl;
+      shout["fnlo-tk-modify"] << "Tool to manipulate a fastNLO table" << endl;
+      yell << _SSEPSC << endl;
+      shout["fnlo-tk-modify"] << "For more explanations type:" << endl;
+      shout["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl;
+      shout["fnlo-tk-modify"] << "and consult the default steering file 'SteerModify.str'." << endl;
+      shout["fnlo-tk-modify"] << "For version number printout type:" << endl;
+      shout["fnlo-tk-modify"] << "./fnlo-tk-modify -v" << endl;
+      yell << _CSEPSC << endl;
+      yell << "" << endl;
       //! --- Usage info
-      if (steername == "-h") {
+      if (testname == "-h") {
+         yell << _CSEPSC << endl;
+         shout["fnlo-tk-modify"] << "fastNLO Table Manipulator" << endl;
+         yell << _SSEPSC << endl;
          yell << " #" << endl;
          info["fnlo-tk-modify"] << "The purpose of this tool is to allow the user to perform a number of" << endl;
          info["fnlo-tk-modify"] << "modifications on a fastNLO table, e.g. the adaptation of the scenario description." << endl;
          info["fnlo-tk-modify"] << "Most importantly, superfluous observable bins can be removed or additional factors" << endl;
-         info["fnlo-tk-modify"] << "can be applied to each bin." << endl;
-         info["fnlo-tk-modify"] << "It is assumed that the desired changes are set up in a steering file." << endl;
+         info["fnlo-tk-modify"] << "can be applied to each bin. Moreover, additional uncertainties like from numerical" << endl;
+         info["fnlo-tk-modify"] << "integrations can be added to each perturbative contribution." << endl;
+         info["fnlo-tk-modify"] << "Because simple command line arguments or options would not be flexible enough," << endl;
+         info["fnlo-tk-modify"] << "it is assumed that the desired changes are set up in a steering file." << endl;
          info["fnlo-tk-modify"] << "By default the steering file is named 'SteerModify.str'." << endl;
          info["fnlo-tk-modify"] << "A template for such a file is contained in the release and" << endl;
          info["fnlo-tk-modify"] << "usually should have been installed under share/fastnlo_toolkit/Modify/." << endl;
@@ -74,69 +86,101 @@ int main(int argc, char** argv) {
          info["fnlo-tk-modify"] << "e.g. fnlo-tk-modify steerfile=AnotherFileName.str" << endl;
          info["fnlo-tk-modify"] << endl;
          man << "" << endl;
-         man << "Usage: ./fnlo-tk-modify [steerfile=SteerFile.str] <InTable=fastNLOtableIn.tab> <OutTable=fastNLOtableOut.tab> [OptArg=option]" << endl;
+         man << "Usage: ./fnlo-tk-modify [steerfile=SteerFile.str] [InTable=fastNLOtableIn.tab.gz] [OutTable=fastNLOtableOut.tab.gz] [OptArg=option]" << endl;
          man << "       Specification: <> mandatory; [] optional." << endl;
-         man << "       All desired table modifications like" << endl;
-         man << "       - changing the scenario name" << endl;
-         man << "       - changing or complementing the scenario description" << endl;
-         man << "       - adapting the cross section output units" << endl;
-         man << "       - correcting the power of the LO process" << endl;
-         man << "       - correcting the cms energy" << endl;
-         man << "       - cutting out unused bins or" << endl;
-         man << "       - multiplying bins by a set of factors" << endl;
-         man << "       are assumed to be controlled via steering parameters " << endl;
-         man << "       similar to the ones that may be used in table creation." << endl;
-         man << "       By default it is expected that at least the mandatory ones are" << endl;
-         man << "       specified in the steering file 'SteerModify.str' or" << endl;
-         man << "       are given via command line arguments:" << endl;
-         man << "[steerfile=SteerFile.str]:      Alternative steering filename" << endl;
-         man << "<InTable=fastNLOtableIn.tab>:   Table input filename, if not specified in steering file" << endl;
-         man << "<OutTable=fastNLOtableOut.tab>: Table output filename, if not specified in steering file" << endl;
-         man << "       For more steering options please check the default steering file delivered" << endl;
-         man << "       by the fastNLO Tolkit (usually in $prefix/share/fastnlo_toolkit/steerfiles)." << endl;
+         man << "[steerfile=SteerFile.str]:         Alternative steering filename." << endl;
+         man << "[InTable=fastNLOtableIn.tab.gz]:   Table input filename, if not specified in steering file." << endl;
+         man << "[OutTable=fastNLOtableOut.tab.gz]: Table output filename, if not specified in steering file." << endl;
+         man << "   All desired table modifications like" << endl;
+         man << "   - changing the scenario name," << endl;
+         man << "   - changing or complementing the scenario description," << endl;
+         man << "   - cutting out unused bins," << endl;
+         man << "   - multiplying bins by a set of factors," << endl;
+         man << "   - adding uncertainty information," << endl;
+         man << "   - adapting the cross section output units," << endl;
+         man << "   - correcting the power of the LO process, or" << endl;
+         man << "   - correcting the cms energy" << endl;
+         man << "   are assumed to be controlled via steering parameters" << endl;
+         man << "   similar to the ones that may be used in table creation." << endl;
+         man << "   By default it is expected that at least the mandatory ones are" << endl;
+         man << "   either given via command line arguments or are specified" << endl;
+         man << "   in a steering file by default named 'SteerModify.str'." << endl;
+         man << "   For more steering options please check the default steering file delivered" << endl;
+         man << "   by the fastNLO Tolkit (usually in $prefix/share/fastnlo_toolkit/steerfiles)." << endl;
          yell << " #" << endl;
          yell  << _CSEPSC << endl;
          return 0;
-      } else {
-         shout["fnlo-tk-modify"] << "Parsing requested modifications ..." << endl;
       }
-   }
-
-   if ( !PARSE(argc,argv) ) {
-      if ( ! (EXIST(InTable) && EXIST(OutTable)) ) {
-         shout["fnlo-tk-modify"] << "Mandatory parameters not specified in command line," << endl;
-         shout["fnlo-tk-modify"] << "trying to read from default steering file 'SteerModify.str'" << endl;
-         int retcode = READ("SteerModify.str");
-         if ( retcode != 0 ) {
-            error["fnlo-tk-modify"] << "Reading of mandatory parameters from default steering file 'SteerModify.str' unsuccessful. Aborted!" << endl;
-            exit(retcode);
+      yell  << _CSEPSC << endl;
+      info["fnlo-tk-modify"] << "Parsing command line ..." << endl;
+      for ( int i = 1; i < argc; i++ ) {
+         std::string test = argv[i];
+         size_t ipos = test.find("steerfile=");
+         if ( ipos == 0 ) {
+            ipos = test.find("=");
+            steername = test.substr(ipos+1,std::string::npos);
+            info["fnlo-tk-modify"] << "Found argument for steerfile: " << steername << endl;
+         }
+         ipos = test.find("InTable=");
+         if ( ipos == 0 ) {
+            ipos = test.find("=");
+            intable = test.substr(ipos+1,std::string::npos);
+            info["fnlo-tk-modify"] << "Found argument for InTable: " << intable << endl;
          }
-         if ( ! (EXIST(InTable) && EXIST(OutTable)) ) {
-            error["fnlo-tk-modify"] << "Mandatory parameters also not specified in default steering file 'SteerModify.str'. Aborted!" << endl;
-            shout["fnlo-tk-modify"] << "For more explanations type:" << endl;
-            shout["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl;
-            PRINTALL();
-            exit(1);
+         ipos = test.find("OutTable=");
+         if ( ipos == 0 ) {
+            ipos = test.find("=");
+            outtable = test.substr(ipos+1,std::string::npos);
+            info["fnlo-tk-modify"] << "Found argument for OutTable: " << outtable << endl;
          }
       }
-   } else {
-      shout["fnlo-tk-modify"] << "Parsing alternative steering file ..." << endl;
    }
 
-   if ( ! (EXIST(InTable) && EXIST(OutTable)) ) {
-      error["fnlo-tk-modify"] << "Input and/or output table not specified. Aborted!" << endl;
-      PRINTALL();
-      exit(1);
+   // Reading all settings from command line; success means provided steering file could be read!
+   if ( PARSE(argc,argv) ) {
+      info["fnlo-tk-modify"] << "Read all settings from command line and provided steering file." << endl;
+      if ( ! (EXIST(InTable) && EXIST(OutTable)) ) {
+         error["fnlo-tk-modify"] << "Mandatory parameters InTable and OutTable are not defined," << endl;
+         error["fnlo-tk-modify"] << "neither on command line nor in steering file. Aborted!" << endl;
+         error["fnlo-tk-modify"] << "For more explanations type:" << endl;
+         error["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl;
+         PRINTALL();
+         exit(1);
+      }
+   } else { // Steering file could not be read, try default one!
+      info["fnlo-tk-modify"] << "Provided steering file, if any, could not be read." << endl;
+      info["fnlo-tk-modify"] << "Trying default steering file 'SteerModify.str' instead ..." << endl;
+      int retcode = READ("SteerModify.str");
+      if ( retcode != 0 ) {
+         warn["fnlo-tk-modify"] << "No steering file found!" << endl;
+         warn["fnlo-tk-modify"] << "All manipulations must have been defined by" << endl;
+         warn["fnlo-tk-modify"] << "command line options!" << endl;
+      }
+      if ( ! (EXIST(InTable) && EXIST(OutTable)) ) {
+         error["fnlo-tk-modify"] << "Mandatory parameters InTable and OutTable not defined," << endl;
+         error["fnlo-tk-modify"] << "neither on command line nor in any steering file. Aborted!" << endl;
+         error["fnlo-tk-modify"] << "For more explanations type:" << endl;
+         error["fnlo-tk-modify"] << "./fnlo-tk-modify -h" << endl;
+         PRINTALL();
+         exit(1);
+      }
    }
 
+   //! --- If desired print all steering information
    if ( EXIST(PrintSteeringCard) ) {
+      info["fnlo-tk-modify"] << "Print all steering information ..." << endl;
       if ( BOOL(PrintSteeringCard) ) PRINTALL();
    }
 
-   shout["fnlo-tk-modify"] << "Trying to read input table " << STRING(InTable) << endl;
+   //! --- Reset verbosity level
+   if ( EXIST(Verbosity) ) {
+      info["fnlo-tk-modify"] << "Resetting verbosity to: " << STRING(Verbosity) << endl;
+      SetGlobalVerbosity(toVerbosity()[STRING(Verbosity)]);
+   }
 
+   //! --- Print input table information
+   info["fnlo-tk-modify"] << "Trying to read input table " << STRING(InTable) << endl;
    fastNLOTable table(CHAR(InTable));
-   table.ReadTable();
    if ( EXIST(PrintInputA1) ) {
       if ( BOOL(PrintInputA1) ) table.PrintHeader(1);
    }
@@ -144,7 +188,7 @@ int main(int argc, char** argv) {
       if ( BOOL(PrintInputA2) ) table.PrintScenario(1);
    }
 
-   // Block A1
+   // Block A1: Table header
    if ( EXIST(Itabversion) ) {
       info["fnlo-tk-modify"]<<"Modifying table version: from "<< table.GetITabVersionRead() << " to " << INT(Itabversion) << endl;
       table.SetITabVersionWrite(INT(Itabversion));
@@ -153,7 +197,8 @@ int main(int argc, char** argv) {
       info["fnlo-tk-modify"]<<"Modifying scenario name: from "<< table.GetScenName() << " to " << STRING(ScenName) << endl;
       table.SetScenName(STRING(ScenName));
    }
-   // Block A2
+
+   // Block A2: Table scenario
    if ( EXIST(Ipublunits) ) {
       info["fnlo-tk-modify"]<<"Modifying publication units: from "<< table.GetIpublunits() << " to " << INT(Ipublunits) << endl;
       table.SetIpublunits(INT(Ipublunits));
@@ -167,7 +212,7 @@ int main(int argc, char** argv) {
          shout << "Line no. " << i << ": " << ScDescr[i] << endl;
       }
       if ( BOOL(AttachScDescription) ){
-         info["fnlo-tk-modify"]<<"Attaching lines:" << endl;
+         info["fnlo-tk-modify"]<<"Attaching to scenario description:" << endl;
          size_t NewNScSize = NScSize + STRING_ARR(ScDescript).size();
          ScDescr.resize(NewNScSize);
          for ( size_t i = NScSize; i < NewNScSize; i++ ) {
@@ -175,7 +220,7 @@ int main(int argc, char** argv) {
             shout << "Line no. " << i << ": " << ScDescr[i] << endl;
          }
       } else {
-         info["fnlo-tk-modify"]<<"Replacing lines with:" << endl;
+         info["fnlo-tk-modify"]<<"Replacing scenario description by:" << endl;
          size_t NewNScSize = STRING_ARR(ScDescript).size();
          ScDescr.resize(NewNScSize);
          for ( size_t i = 0; i < NewNScSize; i++ ) {
@@ -219,6 +264,7 @@ int main(int argc, char** argv) {
       }
    }
 
+   // Block B's: Scenario contributions
    if ( !DOUBLE_ARR(MultCoeff).empty() ) {
       vector<double> fac = DOUBLE_ARR(MultCoeff);
       info["fnlo-tk-modify"]<<"Multiplying by provided factors all coefficients of additive contributions to observable bins!"<<endl;
@@ -233,6 +279,7 @@ int main(int argc, char** argv) {
       }
    }
 
+   //! Erase observable bins from table (Do NOT simultaneously to adding InfoBlocks!)
    if ( !INT_ARR(RemoveBins).empty() ) {
       info["fnlo-tk-modify"]<<"Removing observable bins from interpolation table!"<<endl;
       unsigned int nobs = table.GetNObsBin();
@@ -250,6 +297,121 @@ int main(int argc, char** argv) {
       }
    }
 
+   //! Replace CodeDescription in each perturbative contribution
+   if ( !STRING_ARR(CodeDescript).empty() ){
+      int Ncontrib = table.GetNcontrib();
+      size_t NCodeDescript = STRING_ARR(CodeDescript).size();
+      std::vector<std::string> Description;
+      info["fnlo-tk-modify"]<<"Replacing code description by:" << endl;
+      for ( size_t i = 0; i < NCodeDescript; i++ ) {
+         info["fnlo-tk-modify"]<<"Line no. " << i << ": " << STRING_ARR(CodeDescript)[i] << endl;
+         Description.push_back(STRING_ARR(CodeDescript)[i]);
+      }
+      for ( int i = 0; i < Ncontrib; i++ ) {
+         fastNLOCoeffBase* c = table.GetCoeffTable(i);
+         if ( fastNLOCoeffAddBase::CheckCoeffConstants(c,true) ) {
+            c->SetCodeDescription(Description);
+         }
+      }
+   }
+
+   //! Add InfoBlocks with statistical uncertainty from NNLOJET
+   if ( !STRING_ARR(InfoBlockFiles).empty() &&
+        !STRING_ARR(InfoBlockDescr).empty() &&
+        !STRING_ARR(InfoBlockOrders).empty()) {
+      if ( !INT_ARR(RemoveBins).empty() ) {
+         info["fnlo-tk-modify"]<<"Do NOT erase bins while adding InfoBlocks or vice versa! Aborted."<<endl;
+         exit(25);
+      } else {
+         info["fnlo-tk-modify"]<<"Adding InfoBlocks to contributions."<<endl;
+      }
+      unsigned int NFiles  = STRING_ARR(InfoBlockFiles).size();
+      unsigned int NDescr  = STRING_ARR(InfoBlockDescr).size();
+      unsigned int NOrders = STRING_ARR(InfoBlockOrders).size();
+      for ( unsigned int i = 0; i < NFiles; i++ ){
+         info["fnlo-tk-modify"]<<"InfoBlock file no. " << i << " is: " << STRING_ARR(InfoBlockFiles)[i] << endl;
+      }
+      for ( unsigned int i = 0; i < NDescr; i++ ){
+         info["fnlo-tk-modify"]<<"InfoBlock description no. " << i << " is: " << STRING_ARR(InfoBlockDescr)[i] << endl;
+      }
+      for ( unsigned int i = 0; i < NOrders; i++ ){
+         info["fnlo-tk-modify"]<<"InfoBlock order no. " << i << " is: " << STRING_ARR(InfoBlockOrders)[i] << endl;
+      }
+      int Ncontrib = table.GetNcontrib();
+      int ic = 0;
+      std::string Default = "Please provide description!";
+      for ( int i = 0; i < Ncontrib; i++ ) {
+         fastNLOCoeffBase* c = table.GetCoeffTable(i);
+         if ( fastNLOCoeffAddBase::CheckCoeffConstants(c,true) ) {
+            if ( c->IsLO() ) {
+               info["fnlo-tk-modify"]<<"Found LO contribution " << i << endl;
+               int ilo = 0;
+               if ( NOrders > 1 ) {
+                  for ( unsigned int j = 0; j < NFiles; j++ ) {
+                     if (STRING_ARR(InfoBlockOrders)[j] == "LO") {
+                        ilo = j;
+                     }
+                  }
+               }
+               std::vector<std::string> Description;
+               if ( NDescr > 1 ) {
+                  Description.push_back(STRING_ARR(InfoBlockDescr)[ilo]);
+               } else if ( NDescr > 0 ) {
+                  Description.push_back(STRING_ARR(InfoBlockDescr)[0]);
+               } else {
+                  Description.push_back(Default);
+               }
+               c->AddCoeffInfoBlock(0,0,Description,STRING_ARR(InfoBlockFiles)[ilo]);
+               ic += 1;
+            } else if ( c->IsNLO() ) {
+               info["fnlo-tk-modify"]<<"Found NLO contribution " << i << endl;
+               int inlo = 0;
+               if ( NOrders > 1 ) {
+                  for ( unsigned int j = 0; j < NFiles; j++ ) {
+                     if (STRING_ARR(InfoBlockOrders)[j] == "NLO") {
+                        inlo = j;
+                     }
+                  }
+               }
+               std::vector <std:: string> Description;
+               if ( NDescr > 1 ) {
+                  Description.push_back(STRING_ARR(InfoBlockDescr)[inlo]);
+               } else if ( NDescr > 0 ) {
+                  Description.push_back(STRING_ARR(InfoBlockDescr)[0]);
+               } else {
+                  Description.push_back(Default);
+               }
+               c->AddCoeffInfoBlock(0,0,Description,STRING_ARR(InfoBlockFiles)[inlo]);
+               ic += 1;
+            } else if ( c->IsNNLO() ) {
+               info["fnlo-tk-modify"]<<"Found NNLO contribution " << i << endl;
+               int innlo = 0;
+               if ( NOrders > 1 ) {
+                  for ( unsigned int j = 0; j < NFiles; j++ ) {
+                     if (STRING_ARR(InfoBlockOrders)[j] == "NNLO") {
+                        innlo = j;
+                     }
+                  }
+               }
+               std::vector <std:: string> Description;
+               if ( NDescr > 1 ) {
+                  Description.push_back(STRING_ARR(InfoBlockDescr)[innlo]);
+               } else if ( NDescr > 0 ) {
+                  Description.push_back(STRING_ARR(InfoBlockDescr)[0]);
+               } else {
+                  Description.push_back(Default);
+               }
+               c->AddCoeffInfoBlock(0,0,Description,STRING_ARR(InfoBlockFiles)[innlo]);
+               ic += 1;
+            } else {
+               info["fnlo-tk-modify"]<<"Unknown contribution " << i << endl;
+               info["fnlo-tk-modify"]<<"Nothing changed." << endl;
+            }
+         }
+      }
+   }
+
+   //! --- Print output table information
    if ( EXIST(PrintOutputA1) ) {
       if ( BOOL(PrintOutputA1) ) table.PrintHeader(0);
    }
@@ -258,7 +420,7 @@ int main(int argc, char** argv) {
       if ( BOOL(PrintOutputA2) ) table.PrintScenario(0);
    }
 
-   // writing modified table
+   //! Writing modified table
    table.SetFilename(CHAR(OutTable));
    table.WriteTable();
 
diff --git a/v2.3/toolkit/src/fnlo-tk-rootout.cc b/v2.3/toolkit/src/fnlo-tk-rootout.cc
index f74747f8..b29aad49 100644
--- a/v2.3/toolkit/src/fnlo-tk-rootout.cc
+++ b/v2.3/toolkit/src/fnlo-tk-rootout.cc
@@ -40,7 +40,7 @@ int main(int argc, char** argv) {
    using namespace say;       //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;   //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
    //! --- Parse commmand line
@@ -83,8 +83,8 @@ int main(int argc, char** argv) {
          yell << _SSEPSC << endl;
          yell << " #" << endl;
          info["fnlo-tk-rootout"] << "This program evaluates a fastNLO table and" << endl;
-         info["fnlo-tk-rootout"] << "writes histograms with cross sections and scale or" << endl;
-         info["fnlo-tk-rootout"] << "PDF uncertainties into ROOT." << endl;
+         info["fnlo-tk-rootout"] << "writes histograms with cross sections and PDF, statistical or" << endl;
+         info["fnlo-tk-rootout"] << "scale uncertainties into ROOT." << endl;
          info["fnlo-tk-rootout"] << "" << endl;
          info["fnlo-tk-rootout"] << "TODO: Provide more info on histogram numbering/labelling ..." << endl;
          man << "" << endl;
@@ -119,6 +119,7 @@ int main(int argc, char** argv) {
          man << "                 \"scale21\", i.e. mur=scale2, muf=scale1," << endl;
          man << "                 \"kProd\", i.e. mur=muf=scale1*scale2," << endl;
          man << "                 \"kQuadraticSum\", i.e. mur=muf=sqrt(scale1^2+scale2^2)." << endl;
+         man << "[Verbosity]: Set verbosity level of table evaluation [DEBUG,INFO,WARNING,ERROR], def. = WARNING" << endl;
          yell << " #" << endl;
          man << "Use \"_\" to skip changing a default argument." << endl;
          yell << " #" << endl;
@@ -142,8 +143,9 @@ int main(int argc, char** argv) {
    }
 
    //! --- Uncertainty choice
-   EScaleUncertaintyStyle eScaleUnc = kScaleNone;
    EPDFUncertaintyStyle   ePDFUnc   = kPDFNone;
+   EAddUncertaintyStyle   eAddUnc   = kAddNone;
+   EScaleUncertaintyStyle eScaleUnc = kScaleNone;
    string chunc = "none";
    if (argc > 3) {
       chunc = (const char*) argv[3];
@@ -228,12 +230,28 @@ int main(int argc, char** argv) {
       shout["fnlo-tk-rootout"] << "Using scale definition "+chflex+"." << endl;
    }
 
-   //! ---  Too many arguments
+   //--- Set verbosity level of table evaluation
+   string VerbosityLevel = "WARNING";
    if (argc > 7) {
+      VerbosityLevel  = (const char*) argv[7];
+   }
+   if (argc <= 7 || VerbosityLevel == "_") {
+      VerbosityLevel = "WARNING";
+      shout["fnlo-tk-rootout"] << "No request given for verbosity level, using WARNING default." << endl;
+   } else {
+      shout["fnlo-tk-rootout"] << "Using verbosity level: " << VerbosityLevel << endl;
+   }
+
+   //! ---  Too many arguments
+   if (argc > 8) {
       error["fnlo-tk-rootout"] << "Too many arguments, aborting!" << endl;
       exit(1);
    }
    yell << _CSEPSC << endl;
+   //---  End of parsing arguments
+
+   //! --- Reset verbosity level from here on
+   SetGlobalVerbosity(toVerbosity()[VerbosityLevel]);
 
    //! --- Prepare loop over PDF sets
    const int nsets = 4;
@@ -258,13 +276,17 @@ int main(int argc, char** argv) {
 
    //! --- fastNLO initialisation, attach table
    fastNLOTable table = fastNLOTable(tablename);
+
    //! Print essential table information
    table.PrintContributionSummary(0);
+   table.Print(0);
 
    //! Initialise a fastNLO reader instance with interface to LHAPDF
    //! Note: This also initializes the cross section to the LO/NLO one!
    fastNLOLHAPDF* fnlo = NULL;
    fnlo = new fastNLOLHAPDF(table,PDFFiles[0],0);
+   //! Store table version number
+   int ITabVersion = fnlo->GetITabVersionRead();
 
    //! Check on existence of LO (Id = -1 if not existing)
    int ilo   = fnlo->ContrId(kFixedOrder, kLeading);
@@ -441,9 +463,9 @@ int main(int argc, char** argv) {
          //! Re-calculate cross sections for new settings
          fnlo->CalcCrossSection();
 
-         //! Do PDF and scale uncertainties
-         unsigned int iOffs[3] = {1,6,8};
-         for (unsigned int iUnc = 0; iUnc<3; iUnc++) {
+         //! Do PDF, statistical/numerical, and scale uncertainties
+         unsigned int iOffs[4] = {1,3,6,8};
+         for (unsigned int iUnc = 0; iUnc<4; iUnc++) {
 
             //! Get cross section & uncertainties (only for additive perturbative contributions)
             XsUncertainty XsUnc;
@@ -458,8 +480,19 @@ int main(int argc, char** argv) {
                snprintf(titlel, sizeof(titlel), "-dsigma_%s/sigma",PDFFiles[iPDF].c_str());
                snprintf(titleu, sizeof(titleu), "+dsigma_%s/sigma",PDFFiles[iPDF].c_str());
             }
-            //! 2P scale uncertainties
+            //! Statistical/numerical uncertainties
             else if ( iUnc==1 ) {
+               if (ITabVersion < 25000) {
+                  info["fnlo-tk-rootout"] << "Table version " << ITabVersion << "too small; statistical uncertainties not available." << endl;
+               }
+               eAddUnc = kAddStat;
+               XsUnc = fnlo->GetAddUncertainty(eAddUnc, lNorm);
+               snprintf(buffer, sizeof(buffer), " # Relative Statistical Uncertainties (%s %s)",sOrder.c_str(),PDFFiles[iPDF].c_str());
+               snprintf(titlel, sizeof(titlel), "-dsigma_stat/sigma");
+               snprintf(titleu, sizeof(titleu), "+dsigma_stat/sigma");
+            }
+            //! 2P scale uncertainties
+            else if ( iUnc==2 ) {
                eScaleUnc = kSymmetricTwoPoint;
                XsUnc = fnlo->GetScaleUncertainty(eScaleUnc, lNorm);
                snprintf(buffer, sizeof(buffer), " # 2P Relative Scale Uncertainties (%s %s)",sOrder.c_str(),PDFFiles[iPDF].c_str());
@@ -467,7 +500,7 @@ int main(int argc, char** argv) {
                snprintf(titleu, sizeof(titleu), "+dsigma_2P/sigma");
             }
             //! 6P scale uncertainties
-            else if ( iUnc==2 ) {
+            else if ( iUnc==3 ) {
                eScaleUnc = kAsymmetricSixPoint;
                XsUnc = fnlo->GetScaleUncertainty(eScaleUnc, lNorm);
                snprintf(buffer, sizeof(buffer), " # 6P Relative Scale Uncertainties (%s %s)",sOrder.c_str(),PDFFiles[iPDF].c_str());
diff --git a/v2.3/toolkit/src/fnlo-tk-statunc.cc b/v2.3/toolkit/src/fnlo-tk-statunc.cc
index 7d74f178..77ea0523 100644
--- a/v2.3/toolkit/src/fnlo-tk-statunc.cc
+++ b/v2.3/toolkit/src/fnlo-tk-statunc.cc
@@ -42,7 +42,7 @@ int main(int argc, char** argv) {
    using namespace say;       //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;   //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
    //! --- Parse command line
@@ -212,8 +212,7 @@ int main(int argc, char** argv) {
    }
    if (argc <= 6 || VerbosityLevel == "_") {
       VerbosityLevel = "WARNING";
-      shout["fnlo-tk-statunc"] << "No request given for verbosity level," << endl;
-      shout << "            using WARNING default." << endl;
+      shout["fnlo-tk-statunc"] << "No request given for verbosity level, using WARNING default." << endl;
    } else {
       shout["fnlo-tk-statunc"] << "Using verbosity level: " << VerbosityLevel << endl;
    }
@@ -226,17 +225,8 @@ int main(int argc, char** argv) {
    yell << _CSEPSC << endl;
    //---  End of parsing arguments
 
-   //! --- Reset verbosity level to warning only from here on
-   // TODO: KR: A string to enum map or similar could come in handy here
-   if ( VerbosityLevel == "DEBUG" ) {
-      SetGlobalVerbosity(DEBUG);
-   } else if ( VerbosityLevel == "INFO" ) {
-      SetGlobalVerbosity(INFO);
-   } else if ( VerbosityLevel == "ERROR" ) {
-      SetGlobalVerbosity(ERROR);
-   } else {
-      SetGlobalVerbosity(WARNING);
-   }
+   //! --- Reset verbosity level from here on
+   SetGlobalVerbosity(toVerbosity()[VerbosityLevel]);
 
    //! --- Loop over selected table sample
    //! Initialise fastNLO instances with interface to LHAPDF
diff --git a/v2.3/toolkit/src/fnlo-tk-yodaout.cc b/v2.3/toolkit/src/fnlo-tk-yodaout.cc
index 497af918..9aa8ac36 100644
--- a/v2.3/toolkit/src/fnlo-tk-yodaout.cc
+++ b/v2.3/toolkit/src/fnlo-tk-yodaout.cc
@@ -37,7 +37,7 @@ int main(int argc, char** argv) {
    using namespace say;       //! namespace for 'speaker.h'-verbosity levels
    using namespace fastNLO;   //! namespace for fastNLO constants
 
-   //! --- Set verbosity level
+   //! --- Set initial verbosity level
    SetGlobalVerbosity(INFO);
 
    //! --- Parse commmand line
@@ -256,7 +256,6 @@ int main(int argc, char** argv) {
       chflex = (const char*) argv[6];
    }
    if (argc <= 6 || chflex == "_") {
-      chflex = "scale1";
       shout["fnlo-tk-yodaout"] << "Using default mur=muf=scale 1." << endl;
    } else {
       shout["fnlo-tk-yodaout"] << "Using scale definition "+chflex+"." << endl;
@@ -281,8 +280,7 @@ int main(int argc, char** argv) {
    }
    if (argc <= 8 || VerbosityLevel == "_") {
       VerbosityLevel = "WARNING";
-      shout["fnlo-tk-yodaout"] << "No request given for verbosity level," << endl;
-      shout << "            using WARNING default." << endl;
+      shout["fnlo-tk-yodaout"] << "No request given for verbosity level, using WARNING default." << endl;
    } else {
       shout["fnlo-tk-yodaout"] << "Using verbosity level: " << VerbosityLevel << endl;
    }
@@ -295,22 +293,15 @@ int main(int argc, char** argv) {
    yell << _CSEPSC << endl;
    //---  End of parsing arguments
 
-   //! --- Reset verbosity level to warning only from here on
-   // TODO: KR: A string to enum map or similar could come in handy here
-   if ( VerbosityLevel == "DEBUG" ) {
-      SetGlobalVerbosity(DEBUG);
-   } else if ( VerbosityLevel == "INFO" ) {
-      SetGlobalVerbosity(INFO);
-   } else if ( VerbosityLevel == "ERROR" ) {
-      SetGlobalVerbosity(ERROR);
-   } else {
-      SetGlobalVerbosity(WARNING);
-   }
+   //! --- Reset verbosity level from here on
+   SetGlobalVerbosity(toVerbosity()[VerbosityLevel]);
 
    //! --- fastNLO initialisation, attach table
    fastNLOTable table = fastNLOTable(tablename);
+
    //! Print essential table information
    table.PrintContributionSummary(0);
+   table.Print(0);
 
    //! Initialise a fastNLO reader instance
    //! Note: This also initializes the cross section to the LO/NLO one!
-- 
GitLab