diff --git a/Tracking/TrkVertexFitter/TrkVKalVrtCore/TrkVKalVrtCore/CommonPars.h b/Tracking/TrkVertexFitter/TrkVKalVrtCore/TrkVKalVrtCore/CommonPars.h
index b32f54e8e58c51aa05d702f1b85629f2ea980015..dd484b54b2a0e53092a15a5cb029bbc36a5dd26c 100755
--- a/Tracking/TrkVertexFitter/TrkVKalVrtCore/TrkVKalVrtCore/CommonPars.h
+++ b/Tracking/TrkVertexFitter/TrkVKalVrtCore/TrkVKalVrtCore/CommonPars.h
@@ -21,7 +21,8 @@
 
 #define NTrkM 300
 #define vkalMagCnvCst 0.29979246
-#define vkalInternalStepLimit  200.
-#define vkalAllowedPtChange      7.
+#define vkalInternalStepLimit   20.
+#define vkalAllowedPtChange      3.
+#define vkalShiftToTrigExtrapolation      20.
 
 #endif
diff --git a/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/CFit.cxx b/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/CFit.cxx
index 4fab96fcc89fd947b8f0d24f7dd1b78acb1d8e6f..c42d966811d0ad999b555f1cb8f0d15eeabaf2fa 100755
--- a/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/CFit.cxx
+++ b/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/CFit.cxx
@@ -276,7 +276,7 @@ long int fitVertex(VKVertex * vk, long int iflag)
 /*   Also set up localBMAG in dXYZST if nonuniform field is used    */
 /* ---------------------------------------------------------------- */
         extrapolationDone=false;
-        if( vShift>20. || it==1 || forcedExtrapolation){
+        if( vShift>vkalShiftToTrigExtrapolation || it==1 || forcedExtrapolation){
           extrapolationDone=true;
           forcedExtrapolation=false;
           double oldX=0., oldY=0., oldZ=0.;
@@ -365,7 +365,7 @@ long int fitVertex(VKVertex * vk, long int iflag)
           double ddz=savedExtrapVertices[it-1].Z-savedExtrapVertices[it-2].Z;
           double ddstep=sqrt(ddx*ddx+ddy*ddy+ddz*ddz);
 //std::cout<<" Huge degradation due to extrapolation. Limit step! it="<<it<<" step="<<ddstep<<'\n';
-          if( ddstep > 20.) { 
+          if( ddstep > 10.*vkalShiftToTrigExtrapolation) { 
             dxyzst[0]=(savedExtrapVertices[it-1].X + 2.*savedExtrapVertices[it-2].X)/3.;
             dxyzst[1]=(savedExtrapVertices[it-1].Y + 2.*savedExtrapVertices[it-2].Y)/3.;
             dxyzst[2]=(savedExtrapVertices[it-1].Z + 2.*savedExtrapVertices[it-2].Z)/3.;
@@ -375,7 +375,7 @@ long int fitVertex(VKVertex * vk, long int iflag)
         }
         chi21s = vk->Chi2;
 	chi22s = chi21s * 1.01 + 10.; //for safety 
-	if ( vShift < 20.) {              // REASONABLE DISPLACEMENT (<14mm) - RECALCULATE
+	if ( vShift < 10.*vkalShiftToTrigExtrapolation) {              // REASONABLE DISPLACEMENT - RECALCULATE
 /* ROBUSTIFICATION */
 	  if (forcft_1.irob != 0) {robtest(vk, 1);}  // ROBUSTIFICATION new data structure
 //Reset mag.field
@@ -422,12 +422,12 @@ long int fitVertex(VKVertex * vk, long int iflag)
 	//std::cout<<"-----------------------------------------------"<<'\n';
 /*  Test of convergence */
 	chi2df = fabs(chi21s - chi22s);
-	//std::cout<<"Convergence="<< chi2df <<" cnst="<<cnstRemnants<<'\n';
   /*---------------------Normal convergence--------------------*/
         double PrecLimit = min(chi22s*1.e-4, forcft_1.IterationPrecision);
+	//std::cout<<"Convergence="<< chi2df <<"<"<<PrecLimit<<" cnst="<<cnstRemnants<<"<"<<ConstraintAccuracy<<'\n';
 	if ((chi2df < PrecLimit) && (vShift < 0.001) && it>1 && (cnstRemnants<ConstraintAccuracy)){
 	   double dstFromExtrapPnt=sqrt(vk->fitV[0]*vk->fitV[0] + vk->fitV[1]*vk->fitV[1]+ vk->fitV[2]*vk->fitV[2]);
-	   if( dstFromExtrapPnt>2. && it < forcft_1.IterationNumber){
+	   if( dstFromExtrapPnt>vkalShiftToTrigExtrapolation/2. && it < forcft_1.IterationNumber-15){
 	     forcedExtrapolation=true;
 	     continue;          // Make another extrapolation exactly to found vertex position
            }
diff --git a/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/VtCFit.cxx b/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/VtCFit.cxx
index a8b3f783305be30e0a9cd6c3b20e23a00d0b1aa2..1e2e350675de1c580f67e0a89270436a3d31700b 100755
--- a/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/VtCFit.cxx
+++ b/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/VtCFit.cxx
@@ -688,8 +688,14 @@ extern DerivT derivt_;
 
     for (it = 0; it < NTRK; ++it) {    //Check if curvature sign is changed or change in Pt is too big
       if(vk->TrackList[it]->Id >= 0){
-        double Ratio=vk->TrackList[it]->fitP[2]/vk->TrackList[it]->iniP[2]; if(fabs(Ratio)<1.)Ratio=1./Ratio;
-        if(Ratio<0. || Ratio > vkalAllowedPtChange ) return -21;
+        double Ratio=vk->TrackList[it]->fitP[2]/vk->TrackList[it]->Perig[4]; if(fabs(Ratio)<1.)Ratio=1./Ratio;
+        if(Ratio<0. || Ratio > vkalAllowedPtChange ){
+          if(fabs(vk->TrackList[it]->fitP[2])<fabs(vk->TrackList[it]->Perig[4]) || Ratio<0 ){	
+             vk->TrackList[it]->fitP[2]=vk->TrackList[it]->Perig[4]/vkalAllowedPtChange;
+          }else{
+             vk->TrackList[it]->fitP[2]=vk->TrackList[it]->Perig[4]*vkalAllowedPtChange;
+          }
+	}
       }
     }
 
@@ -779,6 +785,8 @@ extern DerivT derivt_;
 		          alf = alfLowLim;
 			  PostFitIteration=4;  //Something is wrong. Don't make second optimisation
 		       }
+                       if(NCNST && alf>vkalInternalStepLimit/totalShift)
+	                 { alf=vkalInternalStepLimit/totalShift; PostFitIteration=4; icadd=2; limitationMade=true; }
         }
 
 //Having 3 points (0,-0.02,0.02) find a pabolic minimum