diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/ISF_FatrasTools/McMaterialEffectsEngine.icc b/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/ISF_FatrasTools/McMaterialEffectsEngine.icc
index 2eea3be465e631fb54bede7f43334aabbd33723e..499610ea77e4290bfdd9518fe4139c181239225a 100644
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/ISF_FatrasTools/McMaterialEffectsEngine.icc
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/ISF_FatrasTools/McMaterialEffectsEngine.icc
@@ -33,7 +33,7 @@ template <class T> Trk::ExtrapolationCode iFatras::McMaterialEffectsEngine::hand
      //EX_MSG_DEBUG(eCell.navigationStep, "Update", "char", "Update on layer with index " << m_layer->layerIndex().value() << " - corr factor = " << pathCorrection*mFactor); 
 
      const Trk::MaterialProperties* materialProperties = m_layer->layerMaterialProperties()->fullMaterial(eCell.leadParameters->position());
-     if ( materialProperties ) {
+     if ( materialProperties && materialProperties->thicknessInX0()>0 ) {
        m_matProp = materialProperties;
        m_thicknessInX0 = mFactor*m_matProp->thicknessInX0();
        m_thicknessInL0 = mFactor*m_matProp->thicknessInL0();
diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/EnergyLossSamplerBetheHeitler.cxx b/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/EnergyLossSamplerBetheHeitler.cxx
index ecf6a3d1dd8790b552f960a0cbd1579a2ba51ee1..48c96e36442cd53ed32ee8bdf5985a0e65153623 100644
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/EnergyLossSamplerBetheHeitler.cxx
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/EnergyLossSamplerBetheHeitler.cxx
@@ -71,6 +71,8 @@ Trk::EnergyLoss* iFatras::EnergyLossSamplerBetheHeitler::energyLoss( const Trk::
   
   double pathLength = pathCorrection*materialProperties.thicknessInX0();
 
+  if (pathLength==0.) return new Trk::EnergyLoss(0.,0.);
+
   double p    = pInitial;
   double me   = s_particleMasses.mass[Trk::electron];
   double E    = sqrt(p*p+me*me);
@@ -116,11 +118,12 @@ Trk::EnergyLoss* iFatras::EnergyLossSamplerBetheHeitler::energyLoss( const Trk::
   double u = CLHEP::RandGamma::shoot(m_randomEngine, pathLength / log(2.), 1.);
   double z = exp( -1. * u );
   double deltaE(0.);
+
   if ( direction == Trk::alongMomentum )
     deltaE = m_scaleFactor*E * ( z - 1. );
   else
     deltaE = m_scaleFactor*E * ( 1. / z - 1. );
-  
+
   simulatedDeltaE+=fabs(deltaE);
   
   // transform into negative energyloss
diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/McMaterialEffectsEngine.cxx b/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/McMaterialEffectsEngine.cxx
index eb26e0e8b6022eb77bb093fb41b15731f32eedeb..c6f7530282cf66f07cbc8d630e668bab4dda43ef 100644
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/McMaterialEffectsEngine.cxx
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/McMaterialEffectsEngine.cxx
@@ -258,7 +258,7 @@ void iFatras::McMaterialEffectsEngine::multipleScatteringUpdate(const Trk::Track
     // the initial values
     double theta =  parameters[Trk::theta];
     double phi   =  parameters[Trk::phi];
-    double sinTheta   = (theta*theta > 10e-10) ? sin(theta) : 1.; 
+    double sinTheta   = (sin(theta)*sin(theta) > 10e-10) ? sin(theta) : 1.; 
     
     // sample them in an independent way
     double deltaTheta = m_projectionFactor*simTheta;
@@ -464,7 +464,10 @@ Trk::ExtrapolationCode iFatras::McMaterialEffectsEngine::processMaterialOnLayer(
   const Trk::TrackParameters* parm = eCell.leadParameters;
     
   // path correction
-  double pathCorrection = fabs(m_layer->surfaceRepresentation().pathCorrection(parm->position(),dir*(parm->momentum())));
+  double pathCorrection = m_layer->surfaceRepresentation().normal().dot(parm->momentum()) !=0 ?
+    fabs(m_layer->surfaceRepresentation().pathCorrection(parm->position(),dir*(parm->momentum()))) : 1.;
+
+  if (!pathCorrection) return Trk::ExtrapolationCode::InProgress;
   
   // figure out if particle stopped in the layer and recalculate path limit
   int iStatus = 0;
@@ -502,9 +505,9 @@ Trk::ExtrapolationCode iFatras::McMaterialEffectsEngine::processMaterialOnLayer(
   double p    = parm->momentum().mag();
   double m    = m_particleMasses.mass[eCell.pHypothesis];
   double E    = sqrt(p*p+m*m);
-  
+
   // radiation and ionization preceed the presampled interaction (if any) 
-  
+
   if (m_eLoss || m_ms) {
     // the updatedParameters - first a deep copy
     AmgVector(5)      uParameters = parm->parameters();
@@ -537,6 +540,8 @@ Trk::ExtrapolationCode iFatras::McMaterialEffectsEngine::processMaterialOnLayer(
 	uParameters[Trk::qOverP] = parm->charge()/newP;
 	
       }
+
+      EX_MSG_VERBOSE(eCell.navigationStep, "eloss", "char ", "E,deltaE:" <<E<<","<< eloss->deltaE() );
       
       // TODO straggling 
       
@@ -562,8 +567,8 @@ Trk::ExtrapolationCode iFatras::McMaterialEffectsEngine::processMaterialOnLayer(
     }
     
     
-    if ( m_ms ) {
-      
+    if ( m_ms && m_thicknessInX0>0 ) {
+
       double simTheta = m_msSampler->simTheta(*m_matProp, p, dX0/m_thicknessInX0, eCell.pHypothesis);
       //do the update -> You need 2 evaluation of simTheta. The second one is used to calculate deltaphi in multipleScatteringUpdate
       multipleScatteringUpdate(*(eCell.leadParameters), uParameters, simTheta, 
@@ -739,7 +744,10 @@ Trk::ExtrapolationCode iFatras::McMaterialEffectsEngine::processMaterialOnLayer(
   const Trk::NeutralParameters* parm = eCell.leadParameters;
     
   // path correction
-  double pathCorrection = fabs(m_layer->surfaceRepresentation().pathCorrection(parm->position(),dir*(parm->momentum())));
+  double pathCorrection = m_layer->surfaceRepresentation().normal().dot(parm->momentum()) !=0 ?
+    fabs(m_layer->surfaceRepresentation().pathCorrection(parm->position(),dir*(parm->momentum()))) : 1.;
+
+  if (!pathCorrection) return Trk::ExtrapolationCode::InProgress;
   
   // figure out if particle stopped in the layer and recalculate path limit
   int iStatus = 0;
@@ -966,6 +974,7 @@ void iFatras::McMaterialEffectsEngine::radiate(const ISF::ISFParticle* parent, A
       recordBremPhotonLay(parent,eCell.time,p,deltaP,ePos,eDir,eCell.pHypothesis,dir,mFr);
       p *=z ;
 
+      EX_MSG_VERBOSE("", "radiate", "", "brem photon emitted " << deltaP<<":updated e momentum:"<< p   );
       // std::cout <<"brem photon emitted, momentum update:"<< p<<","<<path<<","<<pathLim<<",mat.fraction:"<<mFr<<std::endl; 
     }    
   }
diff --git a/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/McMaterialEffectsUpdator.cxx b/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/McMaterialEffectsUpdator.cxx
index 5314eeb7f4a4491201e34c0e4f50e8bd028c17f5..4d1e558b8884499282e262f9447e3eaaa3dc309b 100755
--- a/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/McMaterialEffectsUpdator.cxx
+++ b/Simulation/ISF/ISF_Fatras/ISF_FatrasTools/src/McMaterialEffectsUpdator.cxx
@@ -431,7 +431,8 @@ const Trk::TrackParameters* iFatras::McMaterialEffectsUpdator::updateInLay(const
 
   // recalculate if missing
   m_matProp = m_matProp ? m_matProp : m_layer->fullUpdateMaterialProperties(*parm);
-  double pathCorrection = fabs(m_layer->surfaceRepresentation().pathCorrection(parm->position(),parm->momentum())); 
+  double pathCorrection = m_layer->surfaceRepresentation().normal().dot(parm->momentum()) !=0 ?
+    fabs(m_layer->surfaceRepresentation().pathCorrection(parm->position(),dir*(parm->momentum()))) : 1.;
     
   // check if a bending correction has to be applied
   if (m_bendingCorrection) {
@@ -477,7 +478,7 @@ const Trk::TrackParameters* iFatras::McMaterialEffectsUpdator::updateInLay(const
   int iStatus = 0;
   double dX0 = (1.-matFraction)*pathCorrection*m_matProp->thicknessInX0();
 
-  if (!m_matProp || particle==Trk::geantino || particle==Trk::nonInteracting ) {   
+  if (!m_matProp || particle==Trk::geantino || particle==Trk::nonInteracting || dX0==0.) {   
     // non-interacting - pass them back
     pathLim.updateMat(dX0,m_matProp->averageZ(),dInL0);
 
@@ -537,7 +538,7 @@ const Trk::TrackParameters* iFatras::McMaterialEffectsUpdator::updateInLay(const
   AmgVector(5) updatedParameters(parm->parameters());  
   const Trk::TrackParameters* updated = 0;
 
-  if ( m_eLoss && particle==Trk::electron ) {
+  if ( m_eLoss && particle==Trk::electron && dX0>0.) {
 
     double matTot =  (1-matFraction)*pathCorrection*m_matProp->thicknessInX0();
     Amg::Vector3D edir = parm->momentum().unit(); 
@@ -551,10 +552,10 @@ const Trk::TrackParameters* iFatras::McMaterialEffectsUpdator::updateInLay(const
     matFraction += dX0/pathCorrection/m_matProp->thicknessInX0();  
   }
 
-  if ( isp->charge()!=0 ) {
+  if ( isp->charge()!=0 && dX0>0.) {
     if ( m_eLoss ) ionize(*parm, updatedParameters, dX0, dir, particle );
 
-    if ( m_ms ) {
+    if ( m_ms  && m_matProp->thicknessInX0()>0.) {
 
       double sigmaMSproj = (m_use_msUpdator && m_msUpdator ) ?
 	sqrt(m_msUpdator->sigmaSquare(*m_matProp, p, dX0/m_matProp->thicknessInX0(), particle)) : msSigma(dX0,p,particle);
@@ -963,7 +964,7 @@ const Trk::TrackParameters* iFatras::McMaterialEffectsUpdator::update(double tim
     m_deltaP = deltaP;
   }
   
-  if (m_ms){
+  if (m_ms && matprop.x0()>0 ){
     // get the projected scattering angle
     double sigmaMSproj   = (m_use_msUpdator && m_msUpdator) ? sqrt(m_msUpdator->sigmaSquare(matprop, p, pathCorrection, particle)) : 
                                                               msSigma(pathCorrection*matprop.thicknessInX0(),p,particle); 
@@ -1558,7 +1559,9 @@ void iFatras::McMaterialEffectsUpdator::recordBremPhotonLay(const ISF::ISFPartic
 
     // decide if photon leaves the layer
     // amount of material to traverse      
-    double  pathCorrection = m_layer->surfaceRepresentation().pathCorrection(bremPhoton->position(),bremPhoton->momentum());
+    double pathCorrection = m_layer->surfaceRepresentation().normal().dot(bremPhoton->momentum()) !=0 ?
+      fabs(m_layer->surfaceRepresentation().pathCorrection(bremPhoton->position(),bremPhoton->momentum())) : 1.;
+
     double mTot = m_matProp->thicknessInX0()*pathCorrection*(1.-remMat); 
 
     if (mTot < pLim.x0Max) {  // release