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 c36c08acca8299b33743a9f307945c717ef55e1b..a6c2d01adbf042bec37de0df452cef0bc7dd7428 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;
@@ -52,10 +54,10 @@ protected:
   void PropagateMSGLevel(MSG::Level level) const;
   
   Chain_t m_chain;
-  int m_ninit=0;
   
 private:
   TFCSLateralShapeParametrizationHitBase* m_number_of_hits_simul;
+  int m_ninit=0;
 
   ClassDefOverride(TFCSLateralShapeParametrizationHitChain,2)  //TFCSLateralShapeParametrizationHitChain
 };
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationFluctChain.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationFluctChain.cxx
index 07ca7e48cae0233598a99e306f1c4f89a570eadd..24ed9295629d4375283dd3213e04035eb1e568fc 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationFluctChain.cxx
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationFluctChain.cxx
@@ -40,25 +40,9 @@ FCSReturnCode TFCSLateralShapeParametrizationFluctChain::simulate(TFCSSimulation
 
   //Execute the first get_nr_of_init() simulate calls only once. Used for example to initialize the center position
   TFCSLateralShapeParametrizationHitBase::Hit hit;
-  hit.reset_center();
-  auto hitloopstart=m_chain.begin();
-  if(get_nr_of_init()>0) {
-    if (debug) {
-      PropagateMSGLevel(old_level);
-      ATH_MSG_DEBUG("E("<<calosample()<<")="<<simulstate.E(calosample())<<" before init");
-    }
-
-    hitloopstart+=get_nr_of_init();
-    for(auto hititr=m_chain.begin(); hititr!=hitloopstart; ++hititr) {
-      TFCSLateralShapeParametrizationHitBase* hitsim=*hititr;
-
-      FCSReturnCode status = hitsim->simulate_hit(hit, simulstate, truth, extrapol);
-
-      if (status != FCSSuccess) {
-        ATH_MSG_ERROR("TFCSLateralShapeParametrizationFluctChain::simulate(): simulate_hit init call failed");
-        return FCSFatal;
-      }
-    }
+  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
@@ -90,9 +74,12 @@ FCSReturnCode TFCSLateralShapeParametrizationFluctChain::simulate(TFCSSimulation
     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;
+  int retry_warning=1;
+  int retry=0;
   do {
     hit.reset();
     //hit.E()=Eavghit;
@@ -117,6 +104,9 @@ FCSReturnCode TFCSLateralShapeParametrizationFluctChain::simulate(TFCSSimulation
       failed=true;
       ++ifail;
       ++itotalfail;
+      retry=status-FCSRetry;
+      retry_warning=retry>>1;
+      if(retry_warning<1) retry_warning=1;
       break;
     }
     if(!failed) {
@@ -128,13 +118,14 @@ 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);
 
diff --git a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationHitChain.cxx b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationHitChain.cxx
index d6bd27a1bbfed59df6afc3eeef8c11558784174a..ed28652bd6b0aa02f4bdff7b52e1e84ec5111f16 100644
--- a/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationHitChain.cxx
+++ b/Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimEvent/src/TFCSLateralShapeParametrizationHitChain.cxx
@@ -128,28 +128,17 @@ float TFCSLateralShapeParametrizationHitChain::get_sigma2_fluctuation(TFCSSimula
 
 void TFCSLateralShapeParametrizationHitChain::PropagateMSGLevel(MSG::Level level) const
 {
-  for(TFCSLateralShapeParametrizationHitBase* reset : m_chain) {
-    reset->setLevel(level);
-  }
+  for(TFCSLateralShapeParametrizationHitBase* reset : m_chain) reset->setLevel(level);
 }  
 
-FCSReturnCode TFCSLateralShapeParametrizationHitChain::simulate(TFCSSimulationState& simulstate,const TFCSTruthState* truth, const TFCSExtrapolationState* extrapol) const
+FCSReturnCode TFCSLateralShapeParametrizationHitChain::init_hit(TFCSLateralShapeParametrizationHitBase::Hit& hit,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;
   hit.reset_center();
-  auto hitloopstart=m_chain.begin();
   if(get_nr_of_init()>0) {
-    if (debug) {
-      PropagateMSGLevel(old_level);
-      ATH_MSG_DEBUG("E("<<calosample()<<")="<<simulstate.E(calosample())<<" before init");
-    }
+    ATH_MSG_DEBUG("E("<<calosample()<<")="<<simulstate.E(calosample())<<" before init");
 
-    hitloopstart+=get_nr_of_init();
-    for(auto hititr=m_chain.begin(); hititr!=hitloopstart; ++hititr) {
+    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);
@@ -160,6 +149,20 @@ FCSReturnCode TFCSLateralShapeParametrizationHitChain::simulate(TFCSSimulationSt
       }
     }
   }
+  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);
+
+  //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());
@@ -185,10 +188,16 @@ FCSReturnCode TFCSLateralShapeParametrizationHitChain::simulate(TFCSSimulationSt
     ATH_MSG_DEBUG("E("<<calosample()<<")="<<simulstate.E(calosample())<<" #hits~"<<nhit);
   }
 
+  auto hitloopstart=m_chain.begin()+get_nr_of_init();
   int ihit=0;
+  int ifail=0;
+  int itotalfail=0;
+  int retry_warning=1;
+  int retry=0;
   do {
     hit.reset();
     hit.E()=Ehit;
+    bool failed=false;
     if(debug) if(ihit==2) {
       //Switch debug output back to INFO to avoid huge logs
       PropagateMSGLevel(MSG::INFO);
@@ -196,36 +205,43 @@ FCSReturnCode TFCSLateralShapeParametrizationHitChain::simulate(TFCSSimulationSt
     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) {
-          break;
-        } else {
-          if (status == FCSFatal) {
-            if (debug) PropagateMSGLevel(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) PropagateMSGLevel(old_level);