diff --git a/Control/AthenaConfiguration/python/iconfTool/gui/__init__.py b/Control/AthenaConfiguration/python/iconfTool/gui/__init__.py
old mode 100644
new mode 100755
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSLateralShapeParametrizationHitChain.h b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSLateralShapeParametrizationHitChain.h
index 4cd1818b2011c33ea0a3c911558e9881c94bbfa7..654204ff53e340becb51ee7d244bd0dfe5928a18 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSLateralShapeParametrizationHitChain.h
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/ISF_FastCaloSimEvent/TFCSLateralShapeParametrizationHitChain.h
@@ -14,6 +14,8 @@ public:
   TFCSLateralShapeParametrizationHitChain(const char* name=nullptr, const char* title=nullptr);
   TFCSLateralShapeParametrizationHitChain(TFCSLateralShapeParametrizationHitBase* hitsim);
 
+  virtual FCSReturnCode init_hit(TFCSLateralShapeParametrizationHitBase::Hit& hit,TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const;
+
   virtual FCSReturnCode simulate(TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const override;
 
   typedef std::vector< TFCSLateralShapeParametrizationHitBase* > Chain_t;
@@ -24,8 +26,10 @@ public:
   const Chain_t& chain() const {return m_chain;};
   Chain_t& chain() {return m_chain;};
   void push_back( const Chain_t::value_type& value ) {m_chain.push_back(value);};
-  //TODO: add generic functionality to determine the number of hits or center position only once
-  // and not for every iteration of the hit chain
+  void push_back_init( const Chain_t::value_type& value );
+
+  unsigned int get_nr_of_init() const {return m_ninit;};
+  void set_nr_of_init(unsigned int ninit) {m_ninit=ninit;};
 
   /// set which instance should determine the number of hits
   virtual void set_number_of_hits_simul(TFCSLateralShapeParametrizationHitBase* sim) {m_number_of_hits_simul=sim;};
@@ -48,11 +52,15 @@ public:
   void Print(Option_t *option = "") const override;
 
 protected:
+  void PropagateMSGLevel(MSG::Level level) const;
+  
   Chain_t m_chain;
   
 private:
   TFCSLateralShapeParametrizationHitBase* m_number_of_hits_simul;
-  ClassDefOverride(TFCSLateralShapeParametrizationHitChain,1)  //TFCSLateralShapeParametrizationHitChain
+  unsigned int m_ninit=0;
+
+  ClassDefOverride(TFCSLateralShapeParametrizationHitChain,2)  //TFCSLateralShapeParametrizationHitChain
 };
 
 #endif
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationFluctChain.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationFluctChain.cxx
index 0cf78123233caaa4d983efebf209f1addc294cfe..24ed9295629d4375283dd3213e04035eb1e568fc 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationFluctChain.cxx
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationFluctChain.cxx
@@ -35,16 +35,27 @@ float TFCSLateralShapeParametrizationFluctChain::get_E_hit(TFCSSimulationState&
 
 FCSReturnCode TFCSLateralShapeParametrizationFluctChain::simulate(TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const
 {
+  MSG::Level old_level=level();
+  const bool debug = msgLvl(MSG::DEBUG);
+
+  //Execute the first get_nr_of_init() simulate calls only once. Used for example to initialize the center position
+  TFCSLateralShapeParametrizationHitBase::Hit hit;
+  if(init_hit(hit,simulstate,truth,extrapol)!=FCSSuccess) {
+    ATH_MSG_ERROR("init_hit() failed");
+    return FCSFatal;
+  }
+
+  //Initialize hit energy only now, as init loop above might change the layer energy
   const float Elayer=simulstate.E(calosample());
   if (Elayer == 0) {
     ATH_MSG_VERBOSE("Elayer=0, nothing to do");
     return FCSSuccess;
   }
   
-  // Call get_number_of_hits() only once, as it could contain a random number
+  // Call get_sigma2_fluctuation only once, as it could contain a random number
   float sigma2  = get_sigma2_fluctuation(simulstate, truth, extrapol);
   if (sigma2 >= s_max_sigma2_fluctuation) {
-    ATH_MSG_ERROR("TFCSLateralShapeParametrizationHitChain::simulate(): fluctuation of hits could not be calculated");
+    ATH_MSG_ERROR("TFCSLateralShapeParametrizationFluctChain::simulate(): fluctuation of hits could not be calculated");
     return FCSFatal;
   }
 
@@ -58,16 +69,17 @@ FCSReturnCode TFCSLateralShapeParametrizationFluctChain::simulate(TFCSSimulation
   float error2_sumEhit=0;
   float error2=2*s_max_sigma2_fluctuation;
 
-  const bool debug = msgLvl(MSG::DEBUG);
   if (debug) {
+    PropagateMSGLevel(old_level);
     ATH_MSG_DEBUG("E("<<calosample()<<")="<<Elayer<<" sigma2="<<sigma2);
   }
 
+  auto hitloopstart=m_chain.begin()+get_nr_of_init();
   int ihit=0;
   int ifail=0;
   int itotalfail=0;
-  TFCSLateralShapeParametrizationHitBase::Hit hit;
-  hit.reset_center();
+  int retry_warning=1;
+  int retry=0;
   do {
     hit.reset();
     //hit.E()=Eavghit;
@@ -75,19 +87,26 @@ FCSReturnCode TFCSLateralShapeParametrizationFluctChain::simulate(TFCSSimulation
       hit.E()=CLHEP::RandGauss::shoot(simulstate.randomEngine(), Eavghit, m_RMS*Eavghit);
     } while (std::abs(hit.E())<absEavghit_tenth);
     bool failed=false;
-    for(TFCSLateralShapeParametrizationHitBase* hitsim : m_chain) {
-      if (debug) {
-        if (ihit < 2) hitsim->setLevel(MSG::DEBUG);
-        else hitsim->setLevel(MSG::INFO);
-      }
+    if(debug) if(ihit==2) {
+      //Switch debug output back to INFO to avoid huge logs
+      PropagateMSGLevel(MSG::INFO);
+    }
+    for(auto hititr=hitloopstart; hititr!=m_chain.end(); ++hititr) {
+      TFCSLateralShapeParametrizationHitBase* hitsim=*hititr;
 
       FCSReturnCode status = hitsim->simulate_hit(hit, simulstate, truth, extrapol);
 
       if (status == FCSSuccess) continue;
-      if (status == FCSFatal) return FCSFatal;
+      if (status == FCSFatal) {
+        if (debug) PropagateMSGLevel(old_level); 
+        return FCSFatal;
+      }  
       failed=true;
       ++ifail;
       ++itotalfail;
+      retry=status-FCSRetry;
+      retry_warning=retry>>1;
+      if(retry_warning<1) retry_warning=1;
       break;
     }
     if(!failed) {
@@ -99,16 +118,19 @@ FCSReturnCode TFCSLateralShapeParametrizationFluctChain::simulate(TFCSSimulation
       error2_sumEhit+=Ehit*Ehit;
       if(sumEhit2>0) error2=error2_sumEhit/sumEhit2;
     } else {
-      if (ifail >= FCS_RETRY_COUNT) {
-        ATH_MSG_ERROR("TFCSLateralShapeParametrizationFluctChain::simulate(): simulate_hit call failed after " << FCS_RETRY_COUNT << "retries");
-      }
-      if(ifail >= FCS_RETRY_COUNT*FCS_RETRY_COUNT) {
+      if(ifail >= retry) {
+        ATH_MSG_ERROR("TFCSLateralShapeParametrizationFluctChain::simulate(): simulate_hit call failed after " << ifail << "/"<< retry <<"retries, total fails="<<itotalfail);
+        if (debug) PropagateMSGLevel(old_level); 
         return FCSFatal;
       }
+      if (ifail >= retry_warning) {
+        ATH_MSG_WARNING("TFCSLateralShapeParametrizationFluctChain::simulate(): retry simulate_hit calls "<<ifail<<"/"<< retry<<", total fails="<<itotalfail);
+      }
     }
   } while (error2>sigma2);
 
   if (debug) {
+    PropagateMSGLevel(old_level); 
     ATH_MSG_DEBUG("E("<<calosample()<<")="<<Elayer<<" sumE="<<sumEhit<<"+-"<<TMath::Sqrt(error2_sumEhit)<<" ~ "<<TMath::Sqrt(error2_sumEhit)/sumEhit*100<<"% rel error^2="<<error2<<" sigma^2="<<sigma2<<" ~ "<<TMath::Sqrt(sigma2)*100<<"% hits="<<ihit<<" fail="<<itotalfail);
   }
 
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationHitChain.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationHitChain.cxx
index 0543c4b891e30d4ad33a932a7eec92d3a38fb2bd..45a30498fe529c56e3507a96931d087de2eafb4c 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationHitChain.cxx
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationHitChain.cxx
@@ -30,6 +30,17 @@ unsigned int TFCSLateralShapeParametrizationHitChain::size() const
    else return m_chain.size();
 }
 
+void TFCSLateralShapeParametrizationHitChain::push_back_init( const Chain_t::value_type& value ) 
+{
+  if(m_ninit==size()) {
+    chain().push_back(value);
+  } else {  
+    Chain_t::iterator it(&chain()[m_ninit]);
+    chain().insert(it,value);
+  }  
+  ++m_ninit;
+}
+
 const TFCSParametrizationBase* TFCSLateralShapeParametrizationHitChain::operator[](unsigned int ind) const 
 {
   if(m_number_of_hits_simul) {
@@ -126,8 +137,46 @@ float TFCSLateralShapeParametrizationHitChain::get_sigma2_fluctuation(TFCSSimula
   return s_max_sigma2_fluctuation;
 }
 
+void TFCSLateralShapeParametrizationHitChain::PropagateMSGLevel(MSG::Level level) const
+{
+  for(TFCSLateralShapeParametrizationHitBase* reset : m_chain) reset->setLevel(level);
+}  
+
+FCSReturnCode TFCSLateralShapeParametrizationHitChain::init_hit(TFCSLateralShapeParametrizationHitBase::Hit& hit,TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const
+{
+  hit.reset_center();
+  if(get_nr_of_init()>0) {
+    ATH_MSG_DEBUG("E("<<calosample()<<")="<<simulstate.E(calosample())<<" before init");
+
+    auto initloopend=m_chain.begin()+get_nr_of_init();
+    for(auto hititr=m_chain.begin(); hititr!=initloopend; ++hititr) {
+      TFCSLateralShapeParametrizationHitBase* hitsim=*hititr;
+
+      FCSReturnCode status = hitsim->simulate_hit(hit, simulstate, truth, extrapol);
+
+      if (status != FCSSuccess) {
+        ATH_MSG_ERROR("TFCSLateralShapeParametrizationHitChain::simulate(): simulate_hit init call failed");
+        return FCSFatal;
+      }
+    }
+  }
+  return FCSSuccess;
+}
+
 FCSReturnCode TFCSLateralShapeParametrizationHitChain::simulate(TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const
 {
+  MSG::Level old_level=level();
+  const bool debug = msgLvl(MSG::DEBUG);
+  const bool verbose = msgLvl(MSG::VERBOSE);
+
+  //Execute the first get_nr_of_init() simulate calls only once. Used for example to initialize the center position
+  TFCSLateralShapeParametrizationHitBase::Hit hit;
+  if(init_hit(hit,simulstate,truth,extrapol)!=FCSSuccess) {
+    ATH_MSG_ERROR("init_hit() failed");
+    return FCSFatal;
+  }
+
+  //Initialize hit energy only now, as init loop above might change the layer energy
   const float Elayer=simulstate.E(calosample());
   if (Elayer == 0) {
     ATH_MSG_VERBOSE("Elayer=0, nothing to do");
@@ -146,66 +195,68 @@ FCSReturnCode TFCSLateralShapeParametrizationHitChain::simulate(TFCSSimulationSt
 
   float sumEhit=0;
 
-  MSG::Level old_level=level();
-  const bool debug = msgLvl(MSG::DEBUG);
   if (debug) {
+    PropagateMSGLevel(old_level);
     ATH_MSG_DEBUG("E("<<calosample()<<")="<<simulstate.E(calosample())<<" #hits~"<<nhit);
   }
 
+  auto hitloopstart=m_chain.begin()+get_nr_of_init();
   int ihit=0;
-  TFCSLateralShapeParametrizationHitBase::Hit hit;
-  hit.reset_center();
+  int ifail=0;
+  int itotalfail=0;
+  int retry_warning=1;
+  int retry=0;
   do {
     hit.reset();
     hit.E()=Ehit;
-    for(TFCSLateralShapeParametrizationHitBase* hitsim : m_chain) {
-      if (debug) {
-        if (ihit < 2) hitsim->setLevel(old_level);
-        else hitsim->setLevel(MSG::INFO);
-      }
+    bool failed=false;
+    if(debug) if(ihit==2) if(!verbose) {
+      //Switch debug output back to INFO to avoid huge logs, but keep full log in verbose
+      PropagateMSGLevel(MSG::INFO);
+    }
+    for(auto hititr=hitloopstart; hititr!=m_chain.end(); ++hititr) {
+      TFCSLateralShapeParametrizationHitBase* hitsim=*hititr;
 
-      for (int i = 0; i <= FCS_RETRY_COUNT; i++) {
-        //TODO: potentially change logic in case of a retry to redo the whole hit chain from an empty hit instead of just redoing one step in the hit chain
-        if (i > 0) ATH_MSG_WARNING("TFCSLateralShapeParametrizationHitChain::simulate(): Retry simulate_hit call " << i << "/" << FCS_RETRY_COUNT);
-  
-        FCSReturnCode status = hitsim->simulate_hit(hit, simulstate, truth, extrapol);
-
-        if (status == FCSSuccess) {
-          //if(sumEhit+hit.E()>Elayer) hit.E()=Elayer-sumEhit;//sum of all hit energies needs to be Elayer: correct last hit accordingly
-          break;
-        } else {
-          if (status == FCSFatal) {
-            if (debug) {
-              for(TFCSLateralShapeParametrizationHitBase* reset : m_chain) {
-                reset->setLevel(old_level);
-              }
-            }  
-            return FCSFatal;
-          }  
-        }    
-
-        if (i == FCS_RETRY_COUNT) {
-          ATH_MSG_ERROR("TFCSLateralShapeParametrizationHitChain::simulate(): simulate_hit call failed after " << FCS_RETRY_COUNT << "retries");
-        }
+      FCSReturnCode status = hitsim->simulate_hit(hit, simulstate, truth, extrapol);
+
+      if (status == FCSSuccess) continue;
+      if (status == FCSFatal) {
+        if (debug) PropagateMSGLevel(old_level); 
+        return FCSFatal;
+      }  
+      failed=true;
+      ++ifail;
+      ++itotalfail;
+      retry=status-FCSRetry;
+      retry_warning=retry>>1;
+      if(retry_warning<1) retry_warning=1;
+      break;
+    }
+    if(!failed) {
+      ifail=0;
+      sumEhit+=hit.E();
+      ++ihit;
+      
+      if( (ihit==20*nhit) || (ihit==100*nhit) ) {
+        ATH_MSG_WARNING("TFCSLateralShapeParametrizationHitChain::simulate(): Iterated " << ihit << " times, expected " << nhit <<" times. Deposited E("<<calosample()<<")="<<sumEhit<<" expected E="<<Elayer);
+      }                                                                                                                         
+      if(ihit>1000*nhit && ihit>1000) {
+        ATH_MSG_WARNING("TFCSLateralShapeParametrizationHitChain::simulate(): Aborting hit chain, iterated " << 1000*nhit << " times, expected " << nhit <<" times. Deposited E("<<calosample()<<")="<<sumEhit<<" expected E="<<Elayer);
+        break;
+      }  
+    } else {
+      if(ifail >= retry) {
+        ATH_MSG_ERROR("TFCSLateralShapeParametrizationHitChain::simulate(): simulate_hit call failed after " << ifail << "/"<< retry <<"retries, total fails="<<itotalfail);
+        if (debug) PropagateMSGLevel(old_level); 
+        return FCSFatal;
+      }
+      if (ifail >= retry_warning) {
+        ATH_MSG_WARNING("TFCSLateralShapeParametrizationHitChain::simulate(): retry simulate_hit calls "<<ifail<<"/"<< retry<<", total fails="<<itotalfail);
       }
     }
-    sumEhit+=hit.E();
-    ++ihit;
-    
-    if( (ihit==20*nhit) || (ihit==100*nhit) ) {
-      ATH_MSG_WARNING("TFCSLateralShapeParametrizationHitChain::simulate(): Iterated " << ihit << " times, expected " << nhit <<" times. Deposited E("<<calosample()<<")="<<sumEhit<<" expected E="<<Elayer);
-    }                                                                                                                         
-    if(ihit>1000*nhit && ihit>1000) {
-      ATH_MSG_WARNING("TFCSLateralShapeParametrizationHitChain::simulate(): Aborting hit chain, iterated " << 1000*nhit << " times, expected " << nhit <<" times. Deposited E("<<calosample()<<")="<<sumEhit<<" expected E="<<Elayer);
-      break;
-    }  
   } while (std::abs(sumEhit)<std::abs(Elayer));
 
-  if (debug) {
-    for(TFCSLateralShapeParametrizationHitBase* reset : m_chain) {
-      reset->setLevel(old_level);
-    }
-  }  
+  if (debug) PropagateMSGLevel(old_level);
   return FCSSuccess;
 }
 
@@ -221,9 +272,16 @@ void TFCSLateralShapeParametrizationHitChain::Print(Option_t *option) const
     if(longprint) ATH_MSG_INFO(optprint <<"#:Number of hits simulation:");
     m_number_of_hits_simul->Print(opt+"#:");
   }
+  if(longprint && get_nr_of_init()>0) ATH_MSG_INFO(optprint <<"> Simulation init chain:");
+  auto hitloopstart=m_chain.begin()+get_nr_of_init();
+  for(auto hititr=m_chain.begin(); hititr!=hitloopstart; ++hititr) {
+    TFCSLateralShapeParametrizationHitBase* hitsim=*hititr;
+    hitsim->Print(opt+"> ");
+  } 
   if(longprint) ATH_MSG_INFO(optprint <<"- Simulation chain:");
   char count='A';
-  for(TFCSLateralShapeParametrizationHitBase* hitsim : m_chain) {
+  for(auto hititr=hitloopstart; hititr!=m_chain.end(); ++hititr) {
+    TFCSLateralShapeParametrizationHitBase* hitsim=*hititr;
     hitsim->Print(opt+count+" ");
     count++;
   }