diff --git a/Tracking/TrkFitter/TrkiPatFitter/CMakeLists.txt b/Tracking/TrkFitter/TrkiPatFitter/CMakeLists.txt
index 3d40cedcd4ee031eca14bd7d4e703cbd454bb751..1da3edb21cd4f20daa1fc2122cc8a201cdf87b36 100644
--- a/Tracking/TrkFitter/TrkiPatFitter/CMakeLists.txt
+++ b/Tracking/TrkFitter/TrkiPatFitter/CMakeLists.txt
@@ -12,13 +12,13 @@ atlas_depends_on_subdirs( PUBLIC
                           GaudiKernel
                           Tracking/TrkEvent/TrkParameters
                           Tracking/TrkEvent/TrkTrack
+                          Tracking/TrkDetDescr/TrkGeometry
                           Tracking/TrkFitter/TrkFitterInterfaces
                           Tracking/TrkFitter/TrkiPatFitterUtils
                           PRIVATE
                           Event/EventPrimitives
                           Tracking/TrkDetDescr/TrkDetDescrInterfaces
                           Tracking/TrkDetDescr/TrkDetElementBase
-                          Tracking/TrkDetDescr/TrkGeometry
                           Tracking/TrkDetDescr/TrkSurfaces
                           DetectorDescription/Identifier
                           Tracking/TrkEvent/TrkMaterialOnTrack
diff --git a/Tracking/TrkFitter/TrkiPatFitter/cmt/requirements b/Tracking/TrkFitter/TrkiPatFitter/cmt/requirements
index 81d1b94fe7399e47b21a29f1e81d2e7110bd44c4..a98e11d3265e85edc1a2092f00a9ff4f33f980f5 100755
--- a/Tracking/TrkFitter/TrkiPatFitter/cmt/requirements
+++ b/Tracking/TrkFitter/TrkiPatFitter/cmt/requirements
@@ -26,6 +26,7 @@ use AtlasPolicy		       AtlasPolicy-*
 use AthenaBaseComps	       AthenaBaseComps-*	     Control
 use GaudiInterface	       GaudiInterface-*		     External
 use GeoPrimitives	       GeoPrimitives-*		     DetectorDescription
+use TrkGeometry		       TrkGeometry-*		     Tracking/TrkDetDescr
 use TrkFitterInterfaces	       TrkFitterInterfaces-*	     Tracking/TrkFitter
 use TrkParameters	       TrkParameters-*		     Tracking/TrkEvent
 use TrkTrack		       TrkTrack-*		     Tracking/TrkEvent
diff --git a/Tracking/TrkFitter/TrkiPatFitter/src/MaterialAllocator.cxx b/Tracking/TrkFitter/TrkiPatFitter/src/MaterialAllocator.cxx
index 00176daa918f16d51f3ca0ef7b81fb4faa9eb6c8..235b3e363c7720e6a2abf84618394d76164fae99 100755
--- a/Tracking/TrkFitter/TrkiPatFitter/src/MaterialAllocator.cxx
+++ b/Tracking/TrkFitter/TrkiPatFitter/src/MaterialAllocator.cxx
@@ -205,14 +205,15 @@ MaterialAllocator::addLeadingMaterial (std::list<FitMeasurement*>&	measurements,
     // nothing to do if starting with vertex measurement
     if (measurements.front()->isVertex())
     {
-	if (msgLvl(MSG::DEBUG))
-	{
-	    ATH_MSG_VERBOSE(" addLeadingMaterial: " );
-	    printMeasurements(measurements);
-	}
 	return;
     }
 
+    if (msgLvl(MSG::DEBUG))
+    {
+      ATH_MSG_DEBUG(" start of addLeadingMaterial: " );
+      printMeasurements(measurements);
+    }
+
     // fitted momentum at perigee - ignoring leading material effects
     double charge	= 1.;
     double qOverP	= fitParameters.qOverP();
@@ -508,12 +509,12 @@ MaterialAllocator::addLeadingMaterial (std::list<FitMeasurement*>&	measurements,
 							intersection,
 							qOverP);
                       if(newIntersectionSTEP&&intersection) {
-                       double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag();
-                       std::cout << " iMat 1 distance STEP and Intersector " << dist << std::endl;
-                       if(dist>10.) std::cout << " iMat 1 ALARM distance STEP and Intersector " << dist << std::endl;
+//                       double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag();
+//                       std::cout << " iMat 1 distance STEP and Intersector " << dist << std::endl;
+//                       if(dist>10.) std::cout << " iMat 1 ALARM distance STEP and Intersector " << dist << std::endl;
                        delete newIntersectionSTEP;
                       } else {
-                        if(intersection) std::cout << " iMat 1 ALARM STEP did not intersect! " << std::endl;
+//                        if(intersection) std::cout << " iMat 1 ALARM STEP did not intersect! " << std::endl;
                       }
                     } else {
 		      intersection	= m_useStepPropagator>=1?
@@ -581,6 +582,9 @@ MaterialAllocator::addLeadingMaterial (std::list<FitMeasurement*>&	measurements,
 			}
 		    }
 		}
+
+	        ATH_MSG_DEBUG(" push_front(leadingMeas) ");
+
 		measurements.push_front(leadingMeas);
 		
 		// update momentum for energy loss
@@ -612,12 +616,12 @@ MaterialAllocator::addLeadingMaterial (std::list<FitMeasurement*>&	measurements,
 								  intersection,
 								  qOverP);
               if(newIntersectionSTEP&&intersection) {
-                double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag();
-                std::cout << " iMat 2 distance STEP and Intersector " << dist << std::endl;
-                if(dist>10.) std::cout << " iMat 2 ALARM distance STEP and Intersector " << dist << std::endl;
+//                double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag();
+//                std::cout << " iMat 2 distance STEP and Intersector " << dist << std::endl;
+//                if(dist>10.) std::cout << " iMat 2 ALARM distance STEP and Intersector " << dist << std::endl;
                 delete newIntersectionSTEP;
               } else {
-                if(intersection) std::cout << " iMat 2 ALARM STEP did not intersect! " << std::endl;
+//                if(intersection) std::cout << " iMat 2 ALARM STEP did not intersect! " << std::endl;
               }
             } else {
 		 intersection	= m_useStepPropagator>=1?
@@ -1354,12 +1358,12 @@ MaterialAllocator::indetMaterial (std::list<FitMeasurement*>&	measurements,
 									  intersection,
 									  qOverP);
                   if(newIntersectionSTEP&&intersection) {
-                    double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag();
-                    std::cout << " iMat 3 distance STEP and Intersector " << dist << std::endl;
-                    if(dist>10.) std::cout << " iMat 3 ALARM distance STEP and Intersector " << dist << std::endl;
+//                    double dist = 1000.*(newIntersectionSTEP->position()-intersection->position()).mag();
+//                    std::cout << " iMat 3 distance STEP and Intersector " << dist << std::endl;
+//                    if(dist>10.) std::cout << " iMat 3 ALARM distance STEP and Intersector " << dist << std::endl;
                     delete newIntersectionSTEP;
                   } else  {
-                    if(intersection) std::cout << " iMat 3 ALARM STEP did not intersect! " << std::endl;
+//                    if(intersection) std::cout << " iMat 3 ALARM STEP did not intersect! " << std::endl;
                   }
                 } else {
 		  intersection	= m_useStepPropagator>=1?
@@ -2458,36 +2462,75 @@ MaterialAllocator::spectrometerMaterial (std::list<FitMeasurement*>&	measurement
     bool reorderMS			= false;
     bool reorderID			= false;
     bool firstMSHit			= false;
-    double previousDistance		= -m_orderingTolerance;
+    double previousDistance		= 0.;
+    double previousDistanceR		= 0.;
+    double previousDistanceZ		= 0.;
+    double minDistanceID		= 0.;
+    double minDistanceMS		= 0.;
+    double minRDistanceMS		= 0.;
+    double minZDistanceMS		= 0.;
     std::list<Trk::FitMeasurement*>::iterator m = measurements.begin();
     for ( ; m != measurements.end(); ++m)
     {
 	Amg::Vector3D position			= (**m).intersection(FittedTrajectory).position();
 	Amg::Vector3D positionSurf		= (**m).surface()->center();
+	Amg::Vector3D positionMst		= startPosition;
+        if((**m).measurementBase()) positionMst = (**m).measurementBase()->globalPosition();
 	double distance				= startDirection.dot(position - startPosition);
+	double distanceR			= sqrt((positionMst.x() - startPosition.x())*(positionMst.x() - startPosition.x()) + (positionMst.y() - startPosition.y())*(positionMst.y() - startPosition.y()));
+	double distanceZ			= (positionMst.z() - startPosition.z());
+        if(startDirection.z()<0) distanceZ = -distanceZ; 
 	if (!m_calorimeterVolume->inside(position) || !m_calorimeterVolume->inside(positionSurf)) {	
-	  if (distance < previousDistance)		reorderMS = true;
+	  if (distance - previousDistance < -m_orderingTolerance) {
+      	    reorderMS = true;
+            if(distance - previousDistance<minDistanceMS) {
+              minDistanceMS = distance-previousDistance ;
+              minRDistanceMS = distanceR-previousDistanceR;
+              minZDistanceMS = distanceZ-previousDistanceZ;
+            }
+          }
 	  if ((**m).isScatterer())			haveMaterial = true;
           if ((**m).measurementBase()&&!firstMSHit) {
              firstMSHit = true;
           }
  	  if ((**m).isScatterer()&&!firstMSHit)		haveLeadingMaterial = true;
         } else {
-	  if (distance < previousDistance)	reorderID = true;
+	  if (distance - previousDistance < -m_orderingTolerance) {
+      	    reorderID = true;
+            if(distance - previousDistance<minDistanceID) minDistanceID = distance-previousDistance ;
+          }
         }
-	previousDistance			= distance - m_orderingTolerance;
+        previousDistance                        = distance;
+        previousDistanceZ                       = distanceZ;
+        previousDistanceR                       = distanceR;
+    }
+
+    if(reorderMS&&(minRDistanceMS>-m_orderingTolerance||minZDistanceMS>-m_orderingTolerance)) {
+
+//    3D distance of the intersection is problematic but the R or Z distance of the measurementBase is fine 
+//    we should not reorder 
+
+      reorderMS = false;
+    }
+
+//    if(!m_allowReordering) {
+      if (reorderMS&&fabs(minDistanceMS)>-2.) ATH_MSG_WARNING( " reorder MS part of track with minimum distance " << minDistanceMS << " minRDistanceMS " << minRDistanceMS << " minZDistanceMS " << minZDistanceMS);
+      if (reorderID&&fabs(minDistanceID)>-2.) ATH_MSG_WARNING( " reorder ID part of track with minimum distance " << minDistanceID);
+//    }
+
+    if(reorderMS||reorderID) {
+     if (msgLvl(MSG::DEBUG)) printMeasurements(measurements); 
     }
 
-    if (reorderMS) ATH_MSG_WARNING( " reorder MS part of track ");
-    if (reorderID) ATH_MSG_WARNING( " reorder ID part of track ");
     if (!haveLeadingMaterial&&haveMaterial) {
       ATH_MSG_WARNING( " MS part of track has no leading material in front of first MS hit ");
     }  
 
     if (reorderMS)    	orderMeasurements(measurements,startDirection,startPosition);
+
     // nothing to do if spectrometer material already exists
     if (haveMaterial)	return;
-    ATH_MSG_WARNING( " spectrometerMaterial: ALARM no material found on track ");
+    ATH_MSG_DEBUG( " spectrometerMaterial: ALARM no material found on track can happen for MuGirl");
 
     // material has to be added: need inner and outer TrackParameters
     FitMeasurement* innerMeasurement	= 0;
diff --git a/Tracking/TrkFitter/TrkiPatFitter/src/iPatFitter.cxx b/Tracking/TrkFitter/TrkiPatFitter/src/iPatFitter.cxx
index 4e638028668551eca0da1738f8c72d3eff4d99ef..c91af94c5bba77d87d5238a51578968d5aa8b215 100755
--- a/Tracking/TrkFitter/TrkiPatFitter/src/iPatFitter.cxx
+++ b/Tracking/TrkFitter/TrkiPatFitter/src/iPatFitter.cxx
@@ -644,6 +644,8 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>&	measurements,
     // extrapolation to set FittedTrajectory
     double qOverP					= parameters.qOverP();
     double previousDistance				= -m_orderingTolerance;
+    double previousDistanceR				= -m_orderingTolerance;
+    double previousDistanceZ				= -m_orderingTolerance;
     bool reorder					= false;
     Amg::Vector3D startDirection			= parameters.direction();
     Amg::Vector3D startPosition				= parameters.position();
@@ -673,12 +675,12 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>&	measurements,
                                                       m_stepField,
                                                       Trk::muon);
             if(newIntersectionSTEP) {
-              double dist = 1000.*(newIntersectionSTEP->position()-newIntersection->position()).mag();
-              std::cout << " iPat 1 distance STEP and Intersector " << dist << std::endl; 
-              if(dist>10.) std::cout << " iPat 1 ALARM distance STEP and Intersector " << dist << std::endl; 
+//              double dist = 1000.*(newIntersectionSTEP->position()-newIntersection->position()).mag();
+//              std::cout << " iPat 1 distance STEP and Intersector " << dist << std::endl; 
+//              if(dist>10.) std::cout << " iPat 1 ALARM distance STEP and Intersector " << dist << std::endl; 
               delete newIntersectionSTEP;
-            } else {
-              std::cout << " iPat 1 ALARM STEP did not intersect! " << std::endl;
+//            } else {
+//              std::cout << " iPat 1 ALARM STEP did not intersect! " << std::endl;
             }
         }
 	if (newIntersection)
@@ -689,8 +691,17 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>&	measurements,
 	    if (! reorder)
 	    {
 		double distance  = startDirection.dot(intersection->position() - startPosition);
-		if (distance < previousDistance) reorder = true;
+                Amg::Vector3D positionMst = (**m).globalPosition();
+                double distanceR          = sqrt((positionMst.x() - startPosition.x())*(positionMst.x() - startPosition.x()) + (positionMst.y() - startPosition.y())*(positionMst.y() - startPosition.y()));
+                double distanceZ          = (positionMst.z() - startPosition.z());
+                if(startDirection.z()<0) distanceZ = -distanceZ;
+		if (distance < previousDistance&&distanceR < previousDistanceR&&distanceZ < previousDistanceZ) {
+                  reorder = true;
+                  ATH_MSG_DEBUG( " reorder 3D distance " << distance - previousDistance << " R distance " << distanceR - previousDistanceR << " Z distance " <<  distanceZ - previousDistanceZ ); 
+                }
 		previousDistance = distance - m_orderingTolerance;
+		previousDistanceR = distanceR - m_orderingTolerance;
+		previousDistanceZ = distanceZ - m_orderingTolerance;
 	    }
 	}
 	else
@@ -754,6 +765,8 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>&		  measurements,
     bool haveMeasurement				= false;
     int hit						= measurements.size();
     double previousDistance				= -m_orderingTolerance;
+    double previousDistanceR				= -m_orderingTolerance;
+    double previousDistanceZ				= -m_orderingTolerance;
     bool reorder					= false;
     bool skipVertexMeasurement				= measurements.size();
     Amg::Vector3D startDirection			= parameters.direction();
@@ -960,12 +973,12 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>&		  measurements,
                                                  m_stepField,
                                                  Trk::muon);
               if(newIntersectionSTEP) {
-                double dist = 1000.*(newIntersectionSTEP->position()-newIntersection->position()).mag();
-                std::cout << " iPat 2 distance STEP and Intersector " << dist << std::endl; 
-                if(dist>10.) std::cout << " iPat 2 ALARM distance STEP and Intersector " << dist << std::endl; 
+//                double dist = 1000.*(newIntersectionSTEP->position()-newIntersection->position()).mag();
+//                std::cout << " iPat 2 distance STEP and Intersector " << dist << std::endl; 
+//                if(dist>10.) std::cout << " iPat 2 ALARM distance STEP and Intersector " << dist << std::endl; 
                 delete newIntersectionSTEP;
-              } else {
-                std::cout << " iPat 2 ALARM STEP did not intersect! " << std::endl;
+//              } else {
+//                std::cout << " iPat 2 ALARM STEP did not intersect! " << std::endl;
               }
             }
 
@@ -1014,8 +1027,19 @@ iPatFitter::addMeasurements (std::list<FitMeasurement*>&		  measurements,
 	if (! reorder)
 	{
 	    double distance  = startDirection.dot(intersection->position() - startPosition);
-	    if (distance < previousDistance) reorder = true;
-	    previousDistance = distance - m_orderingTolerance;
+            Amg::Vector3D positionMst = startPosition;
+            if((**s).measurementOnTrack())  positionMst = (**s).measurementOnTrack()->globalPosition();
+            if((**s).materialEffectsOnTrack())  positionMst = (**s).materialEffectsOnTrack()->associatedSurface().center();
+            double distanceR          = sqrt((positionMst.x() - startPosition.x())*(positionMst.x() - startPosition.x()) + (positionMst.y() - startPosition.y())*(positionMst.y() - startPosition.y()));
+            double distanceZ          = (positionMst.z() - startPosition.z());
+            if(startDirection.z()<0) distanceZ = -distanceZ;
+	    if(distance < previousDistance&&distanceR < previousDistanceR&&distanceZ < previousDistanceZ) {
+              reorder = true;
+              ATH_MSG_DEBUG( " reorder 3D distance " << distance - previousDistance << " R distance " << distanceR - previousDistanceR << " Z distance " <<  distanceZ - previousDistanceZ ); 
+            }
+	    previousDistance  = distance - m_orderingTolerance;
+	    previousDistanceR = distanceR - m_orderingTolerance;
+            previousDistanceZ = distanceZ - m_orderingTolerance;
 	}
 	
 	// insert measurement(s) in list
@@ -1115,25 +1139,8 @@ iPatFitter::performFit(std::list<FitMeasurement*>*			measurements,
 // 						  perigeeQuality);
 // 	}
 
-       bool haveLeadingMaterial            = false;
-       bool firstMSHit                     = false;
-       std::list<Trk::FitMeasurement*>::iterator m = measurements->begin();
-       for ( ; m != measurements->end(); ++m) {
-         Amg::Vector3D position = (*m)->hasIntersection(FittedTrajectory) ? (*m)->intersection(FittedTrajectory).position(): (*m)->surface()->center() ;
-         Amg::Vector3D positionSurf = (*m)->surface()->center();
-         if (!m_calorimeterVolume->inside(position) || !m_calorimeterVolume->inside(positionSurf)) {
-           if ((*m)->measurementBase()&&!firstMSHit) {
-             firstMSHit = true;
-           }
-           if ((*m)->isScatterer()&&!firstMSHit)         haveLeadingMaterial = true;
-         }
-       }
-       if(! haveLeadingMaterial && firstMSHit) {
 	// include leading material
-         unsigned int nmeas = measurements->size();
-  	 m_materialAllocator->addLeadingMaterial(*measurements,particleHypothesis,*parameters);
-         msg(MSG::DEBUG) << " addLeadingMaterial in Muon Spectrometer  nr meas before " << nmeas << " after " << measurements->size() << endmsg;
-       } 
+	m_materialAllocator->addLeadingMaterial(*measurements,particleHypothesis,*parameters);
 
 
 	// construct the fitted track