diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/CMakeLists.txt b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/CMakeLists.txt
index 73d2d45b9b18019677e1155a6f1bf1f7d995c377..e5d0234fd5031953fa7a614a38fdc7d0adb5d31a 100644
--- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/CMakeLists.txt
+++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/CMakeLists.txt
@@ -11,8 +11,6 @@ atlas_depends_on_subdirs( PUBLIC
                           Event/xAOD/xAODTracking
                           GaudiKernel
                           InnerDetector/InDetRecTools/InDetRecToolInterfaces
-                          Reconstruction/Particle
-                          Tracking/TrkVertexFitter/TrkVKalVrtFitter
                           PRIVATE
                           Tools/PathResolver
                           DetectorDescription/GeoPrimitives
@@ -23,7 +21,10 @@ atlas_depends_on_subdirs( PUBLIC
                           Tracking/TrkEvent/VxSecVertex
                           Tracking/TrkEvent/VxVertex
                           Tracking/TrkTools/TrkToolInterfaces
-                          Tracking/TrkVertexFitter/TrkVertexFitterInterfaces )
+                          Tracking/TrkVertexFitter/TrkVertexFitterInterfaces
+                          Tracking/TrkVertexFitter/TrkVKalVrtFitter
+                          Reconstruction/Particle
+			  Reconstruction/MVAUtils )
 #InnerDetector/InDetRecTools/InDetMaterialRejTool
 
 # External dependencies:
@@ -37,7 +38,7 @@ find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread TMVA )
 #		   PUBLIC_HEADERS InDetVKalVxInJetTool InDetTrkInJetType
 #                   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
 #                   LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${EIGEN_LIBRARIES} AthenaBaseComps xAODTracking GaudiKernel 
-#		        InDetRecToolInterfaces Particle TrkVKalVrtFitterLib GeoPrimitives AnalysisUtilsLib TrkNeutralParameters 
+#		        InDetRecToolInterfaces Particle TrkVKalVrtFitterLib GeoPrimitives AnalysisUtilsLib TrkNeutralParameters MVAUtils
 #		        TrkParticleBase TrkTrackSummary VxSecVertex VxVertex TrkToolInterfaces TrkVertexFitterInterfaces PathResolver )
 
 # Component(s) in the package:
@@ -45,7 +46,7 @@ atlas_add_component( InDetVKalVxInJetTool
                      src/*.cxx  src/components/*.cxx
                      INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${EIGEN_INCLUDE_DIRS}
                      LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} ${EIGEN_LIBRARIES} AthenaBaseComps xAODTracking PathResolver GaudiKernel 
-		        InDetRecToolInterfaces Particle TrkVKalVrtFitterLib GeoPrimitives AnalysisUtilsLib TrkNeutralParameters 
+		        InDetRecToolInterfaces Particle TrkVKalVrtFitterLib GeoPrimitives AnalysisUtilsLib TrkNeutralParameters MVAUtils
 		        TrkParticleBase TrkTrackSummary VxSecVertex VxVertex TrkToolInterfaces TrkVertexFitterInterfaces PathResolver )
  
 # Install files from the package:
diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetTrkInJetType.h b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetTrkInJetType.h
index 3f947855d42c3b2c49b761dcbb504b8026c9aca7..51ad19ff5063d6e05df5c026751e5375ca282a86 100644
--- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetTrkInJetType.h
+++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetTrkInJetType.h
@@ -28,13 +28,10 @@
 //
 
 class TLorentzVector;
-namespace Rec{
-  class TrackParticle;
-}
-
-namespace Trk{
-  class TrkVKalVrtFitter;
-}
+class IChronoStatSvc;
+namespace Rec{ class TrackParticle; }
+namespace MVAUtils { class BDT; }
+namespace Trk {  class TrkVKalVrtFitter; }
 namespace TMVA { class Reader; }
 
 namespace InDet {
@@ -78,11 +75,16 @@ namespace InDet {
 
    private:
 
-    TMVA::Reader* m_tmvaReader;
+    TMVA::Reader* m_tmvaReader{};
+    MVAUtils::BDT* m_localBDT{};
+    IChronoStatSvc * m_timingProfile{}; 
+   
     int m_trkSctHitsCut{};
     int m_trkPixelHitsCut{};
     float m_trkChi2Cut{};
     float m_trkMinPtCut{};
+    float m_jetMaxPtCut{};
+    float m_jetMinPtCut{};
     float m_d0_limLow{};
     float m_d0_limUpp{};
     float m_Z0_limLow{};
@@ -103,8 +105,9 @@ namespace InDet {
     float m_SigR{};
     float m_ptjet{};
     float m_etajet{};
-    float   m_ibl{};
-    float   m_bl{};
+    float m_etatrk{};
+    float m_ibl{};
+    float m_bl{};
  };
 
 
diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetVKalVxInJetTool.h b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetVKalVxInJetTool.h
index e6da7b7d5b417d5653faf99813c4d0a46da699f4..896aa2b9a8c0453ef50d0ca7ff3c761b4fd4cd8a 100755
--- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetVKalVxInJetTool.h
+++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/InDetVKalVxInJetTool/InDetVKalVxInJetTool.h
@@ -60,6 +60,7 @@ class TH2D;
 class TH1F;
 class TProfile;
 class TTree;
+class IChronoStatSvc;
 
 namespace Trk{
   class TrkVKalVrtFitter;
@@ -238,6 +239,7 @@ namespace InDet {
 
       ToolHandle < Trk::IVertexFitter >       m_fitterSvc;
       Trk::TrkVKalVrtFitter*   m_fitSvc{};
+      IChronoStatSvc * m_timingProfile{}; 
  
       ToolHandle < IInDetTrkInJetType >       m_trackClassificator;
 
@@ -270,6 +272,7 @@ namespace InDet {
        float ptjet;
        float etajet;
        float phijet;
+       float etatrk[maxNTrk];
        float p_prob[maxNTrk];
        float s_prob[maxNTrk];
        int   idMC[maxNTrk];
diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSec.cxx b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSec.cxx
index 104fb338a7223343bd1d62803a82f80142df04a5..9221419f12e526a666a554df9dcd77e1cc301a7a 100755
--- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSec.cxx
+++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/BTagVrtSec.cxx
@@ -706,7 +706,6 @@ namespace InDet{
       std::vector<double> Chi2PerTrk,VKPerigee,CovPerigee,closeVrtSig(0),closeVrtCh2(0);
       //TLorentzVector   Momentum;
       std::vector<double> Impact,ImpactError;
-      double ImpactSignif=0;
       double             Chi2, Signif3D, Dist2D, JetVrtDir;
       long int           Charge;
       int i,j;
@@ -745,10 +744,11 @@ namespace InDet{
 	    m_hb_impactR->Fill( SignifR, m_w_1); 
             m_hb_impactZ->Fill( SignifZ, m_w_1); 
             m_hb_impactRZ->Fill(SignifR, SignifZ, m_w_1); 
-	    m_hb_impact->Fill( ImpactSignif, m_w_1);
+	    m_hb_impact->Fill( TrkSig3D[i], m_w_1);
 	    if(i<DevTuple::maxNTrk && m_curTup){
+                 m_curTup->etatrk[i]=SelectedTracks[i]->eta();
                  m_curTup->p_prob[i]=RankBTrk(SelectedTracks[i]->pt(),JetDir.Pt(),0.);
-                 m_curTup->s_prob[i]=RankBTrk(0.,0.,ImpactSignif); 
+                 m_curTup->s_prob[i]=RankBTrk(0.,0.,TrkSig3D[i]); 
                  m_curTup->SigR[i]=SignifR; m_curTup->SigZ[i]=SignifZ; 
                  m_curTup->d0[i]=Impact[0]; m_curTup->Z0[i]=Impact[1];
 	         m_curTup->idMC[i]=getG4Inter(SelectedTracks[i]); 
@@ -768,7 +768,7 @@ namespace InDet{
             }
 	 }
       }
-      if(m_fillHist){  m_curTup->ptjet=JetDir.Perp();  m_curTup->etajet=fabs(JetDir.Eta()); m_curTup->phijet=JetDir.Phi();
+      if(m_fillHist){  m_curTup->ptjet=JetDir.Perp();  m_curTup->etajet=JetDir.Eta(); m_curTup->phijet=JetDir.Phi();
                        m_curTup->nTrkInJet=std::min(NTracks,DevTuple::maxNTrk); };
 
       ListSecondTracks.reserve(2*NTracks);                 // Reserve memory for single vertex
@@ -782,6 +782,8 @@ namespace InDet{
          for (j=i+1; j<NTracks; j++) {
              if(trkScore[i][0]==0.)continue;
              if(trkScore[j][0]==0.)continue;
+             if(trkScore[i][2] > m_antiGarbageCut)continue;  //---- Use classificator to remove Pileup+Interactions
+             if(trkScore[j][2] > m_antiGarbageCut)continue;  //---- Use classificator to remove Pileup+Interactions
  	     if(!m_multiWithPrimary) {  // Not used for multi-vertex with primary one search
                 if( std::max(trkScore[i][1],trkScore[j][1]) > m_antiFragmentCut ) continue; // Remove definite fragmentation tracks
 		bool goodPair=false;
diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx
index 935a4abc3710720144ff3abd6252f09ab771d79c..7ee1f993d40eca9074622ec13153c8421a49b162 100755
--- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx
+++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/CutTrk.cxx
@@ -183,12 +183,15 @@ namespace InDet{
           //if( !((*i_ntrk)->summaryValue(InmOutlier,xAOD::numberOfInnermostOutliers))   )  InmOutlier=-1;
 //std::cout<<"NwInnerM="<<(long int)InmHits<<", "<<(long int)InmSharedH<<", "<<(long int)InmSplitH<<", "<<(long int)InmOutlier<<'\n';
 
-
-          m_fitSvc->VKalGetImpact((*i_ntrk), PrimVrt.position(), 1, Impact, ImpactError);
-          //double ImpactA0=VectPerig[0];                         // Temporary
-          //double ImpactZ=VectPerig[1]-PrimVrt.position().z();   // Temporary
-	  double ImpactA0=Impact[0];  
-	  double ImpactZ=Impact[1];   
+          Amg::Vector3D perigeePos=mPer.position();
+          double ImpactA0=sqrt( (perigeePos.x()-PrimVrt.x())*(perigeePos.x()-PrimVrt.x())
+                               +(perigeePos.y()-PrimVrt.y())*(perigeePos.y()-PrimVrt.y()) );
+          double ImpactZ=perigeePos.z()-PrimVrt.z();
+          double ImpactSignif=sqrt(ImpactA0*ImpactA0/CovTrkMtx11+ImpactZ*ImpactZ/CovTrkMtx22);
+
+          //double ImpactSignif = m_fitSvc->VKalGetImpact((*i_ntrk), PrimVrt.position(), 1, Impact, ImpactError);
+          //double ImpactA0=Impact[0];  
+          //double ImpactZ=Impact[1];   
           if(m_fillHist){  m_hb_trkD0->Fill( ImpactA0, m_w_1); }
 //---- Improved cleaning
 /////          if(PixelHits<=2 && ( outPixHits || splPixHits )) continue;  //VK Bad idea at high Pt!
@@ -198,24 +201,21 @@ namespace InDet{
             else          {if(PixelHits)PixelHits -=1;}                                      // 3-layer pixel detector
           }
           if(fabs((*i_ntrk)->eta())>1.65)   if(SctHits)SctHits   -=1;
-//----Anti-pileup cut
+//----Anti-pileup cut (in Sel2TrVrt now)
 //          double SignifR = Impact[0]/ sqrt(ImpactError[0]);
 //          if(fabs(SignifR) < m_AntiPileupSigRCut) {   // cut against tracks from pileup vertices
 //            double SignifZ = Impact[1]/ sqrt(ImpactError[2]);
 //            if(SignifZ > 1.+m_AntiPileupSigZCut ) continue;
 //            if(SignifZ < 1.-m_AntiPileupSigZCut ) continue;
 //          }
-//---- Use classificator to remove Pileup+Interactions
-          std::vector<float> trkRank=m_trackClassificator->trkTypeWgts(*i_ntrk, PrimVrt, JetDir);
-          if(trkRank[2] > m_antiGarbageCut)continue;
 //----
           StatusCode sc = CutTrk( VectPerig[4] , VectPerig[3],
                           ImpactA0 , ImpactZ, trkChi2,
                           PixelHits, SctHits, SharedHits, BLayHits);
           if( sc.isFailure() )                 continue;
-	  //double rankBTrk=RankBTrk((*i_ntrk)->pt(),JetDir.Perp(),ImpactSignif);
-	  if(trkRank[1]>0.5)NPrimTrk += 1;
-	  orderedTrk.emplace(trkRank[0],*i_ntrk);
+	  double rankBTrk=RankBTrk(0.,0.,ImpactSignif);
+	  if(rankBTrk<0.7)NPrimTrk += 1;
+	  orderedTrk.emplace(rankBTrk,*i_ntrk);
       }
 //---- Order tracks according to ranks
       std::map<double,const xAOD::TrackParticle*>::reverse_iterator rt=orderedTrk.rbegin();
diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetTrkInJetType.cxx b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetTrkInJetType.cxx
index 3da8d5e80ab0c21570b7ea84ed1c6b15c0aa0c29..963807762c8c6dfe74977b7b07e7e192bcd48455 100644
--- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetTrkInJetType.cxx
+++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetTrkInJetType.cxx
@@ -3,13 +3,15 @@
 */
 
 #include "InDetVKalVxInJetTool/InDetTrkInJetType.h"
-#include "TMVA/MethodBase.h"
+#include "TMVA/MethodBDT.h"
 #include "TMVA/Reader.h"
 #include "PathResolver/PathResolver.h"
 #include "TLorentzVector.h"
 #include "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
 
-#include  "Particle/TrackParticle.h"
+#include "Particle/TrackParticle.h"
+#include "MVAUtils/BDT.h" 
+#include "GaudiKernel/IChronoStatSvc.h"
 //
 //-------------------------------------------------
 namespace InDet {
@@ -19,16 +21,19 @@ InDetTrkInJetType::InDetTrkInJetType(const std::string& type,
                                            const std::string& name,
                                            const IInterface* parent):
   AthAlgTool(type,name,parent),
-  m_tmvaReader(0),
+  m_tmvaReader(nullptr),
+  m_localBDT(nullptr),
   m_trkSctHitsCut(4),
   m_trkPixelHitsCut(1),
   m_trkChi2Cut(5.),
   m_trkMinPtCut(700.),
+  m_jetMaxPtCut(7000000.),
+  m_jetMinPtCut(  35000.),
   m_d0_limLow(-3.),
   m_d0_limUpp( 5.),
   m_Z0_limLow(-8.),
   m_Z0_limUpp(12.),
-  m_calibFileName("TrackClassif_3cl.v01.xml"),
+  m_calibFileName("TrackClassif_3cl.v02.xml"),
   m_fitterSvc("Trk::TrkVKalVrtFitter/VertexFitterTool",this)
   {
      declareInterface<IInDetTrkInJetType>(this);
@@ -36,16 +41,20 @@ InDetTrkInJetType::InDetTrkInJetType(const std::string& type,
      declareProperty("trkPixelHits", m_trkPixelHitsCut ,  "Cut on track Pixel hits number" );
      declareProperty("trkChi2",   m_trkChi2Cut   ,  "Cut on track Chi2/Ndf" );
      declareProperty("trkMinPt",  m_trkMinPtCut  ,  "Minimal track Pt cut" );
+     declareProperty("jetMaxPt",  m_jetMaxPtCut  ,  "Maximal jet Pt cut" );
+     declareProperty("jetMinPt",  m_jetMinPtCut  ,  "Minimal jet Pt cut from training" );
      declareProperty("d0_limLow", m_d0_limLow    ,  "Low d0 impact cut" );
      declareProperty("d0_limUpp", m_d0_limUpp    ,  "Upper d0 impact cut" );
      declareProperty("Z0_limLow", m_Z0_limLow    ,  "Low Z0 impact cut" );
      declareProperty("Z0_limUpp", m_Z0_limUpp    ,  "Upper Z0 impact cut" );
+     m_timingProfile=nullptr;
   }
 
 //Destructor---------------------------------------------------------------
   InDetTrkInJetType::~InDetTrkInJetType(){
-    delete m_tmvaReader;
-    if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "InDetTrkInJetType destructor called" << endmsg;
+    if(m_tmvaReader)delete m_tmvaReader;
+    if(m_localBDT)delete m_localBDT;
+    ATH_MSG_DEBUG("InDetTrkInJetType destructor called");
   }
 
 //Initialize---------------------------------------------------------------
@@ -53,48 +62,61 @@ InDetTrkInJetType::InDetTrkInJetType(const std::string& type,
      m_initialised = 0;
      m_tmvaReader = new TMVA::Reader();
      //m_tmvaReader->AddVariable( "prbS",  &m_prbS );
-     m_tmvaReader->AddVariable( "Sig3D", &m_Sig3D );
-     m_tmvaReader->AddVariable( "prbP",  &m_prbP );
-     m_tmvaReader->AddVariable( "pTvsJet", &m_pTvsJet );
+     m_tmvaReader->AddVariable( "Sig3D",  &m_Sig3D );
+     m_tmvaReader->AddVariable( "prbP",   &m_prbP );
+     m_tmvaReader->AddVariable( "pTvsJet",&m_pTvsJet );
      //m_tmvaReader->AddVariable( "prodTJ", &m_prodTJ );
-     m_tmvaReader->AddVariable( "d0",    &m_d0 );
-     m_tmvaReader->AddVariable( "SigR",  &m_SigR );
-     m_tmvaReader->AddVariable( "SigZ",  &m_SigZ );
-     m_tmvaReader->AddVariable( "ptjet", &m_ptjet );
+     m_tmvaReader->AddVariable( "d0",     &m_d0 );
+     m_tmvaReader->AddVariable( "SigR",   &m_SigR );
+     m_tmvaReader->AddVariable( "SigZ",   &m_SigZ );
+     m_tmvaReader->AddVariable( "ptjet",  &m_ptjet );
      m_tmvaReader->AddVariable( "ibl"   , &m_ibl );
      m_tmvaReader->AddVariable( "bl"   ,  &m_bl );
-     m_tmvaReader->AddVariable( "etajet", &m_etajet );
+     m_tmvaReader->AddVariable( "etatrk", &m_etatrk );
 //
 //-- Calibration file
 //
-//     std::string fullPathToFile = PathResolverFindCalibFile("InDetVKalVxInJetTool/TrackClassif_3cl.v01.xml");
      std::string fullPathToFile = PathResolverFindCalibFile("InDetVKalVxInJetTool/"+m_calibFileName);
      if(fullPathToFile != ""){
         if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) <<"TrackClassification calibration file" << fullPathToFile << endmsg;
         m_tmvaReader->BookMVA("BDTG", fullPathToFile);
+        TMVA::MethodBDT* method_bdt = dynamic_cast<TMVA::MethodBDT*> (m_tmvaReader->FindMVA("BDTG"));
+	if(!method_bdt){    ATH_MSG_DEBUG("Error! No method_BDT for TrackClassification!");
+                            return StatusCode::SUCCESS;  }
+        bool useYesNoLeaf = false;
+        bool isGrad       = false;
+        if(method_bdt->GetOptions().Contains("UseYesNoLeaf=True")) useYesNoLeaf = true;
+        if(method_bdt->GetOptions().Contains("BoostType=Grad")) isGrad = true;
+        m_localBDT = new MVAUtils::BDT( method_bdt, isGrad, useYesNoLeaf);
+	if(!m_localBDT){   ATH_MSG_DEBUG("Error! No_BDT from MVAUtils created");
+                           return StatusCode::SUCCESS; }
      }else{
-        if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) <<"Error! No calibration for TrackClassification found." << endmsg;
+        ATH_MSG_DEBUG("Error! No calibration for TrackClassification found.");
         return StatusCode::SUCCESS;
      }    
      //-------
      if (m_fitterSvc.retrieve().isFailure()) {
-        if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) << "Could not find Trk::TrkVKalVrtFitter" << endmsg;
+        ATH_MSG_DEBUG("Could not find Trk::TrkVKalVrtFitter");
         return StatusCode::SUCCESS;
      } else {
-        if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) << "InDetTrkInJetTool TrkVKalVrtFitter found" << endmsg;
+        ATH_MSG_DEBUG("InDetTrkInJetTool TrkVKalVrtFitter found");
      }
      m_fitSvc = dynamic_cast<Trk::TrkVKalVrtFitter*>(&(*m_fitterSvc));
      if(!m_fitSvc){
-        if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<<" No implemented Trk::ITrkVKalVrtFitter interface" << endmsg;
+        ATH_MSG_DEBUG(" No implemented Trk::ITrkVKalVrtFitter interface");
         return StatusCode::SUCCESS;
      }
      m_initialised = 1;          // Tool is initialised successfully.
+//-----
+     if(msgLvl(MSG::DEBUG)) ATH_CHECK(service("ChronoStatSvc", m_timingProfile));
+//-----
      return StatusCode::SUCCESS;
    }
 
    StatusCode InDetTrkInJetType::finalize()
    {
-    if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) <<"InDetTrkInJetType finalize()" << endmsg;
+    if(m_timingProfile)m_timingProfile->chronoPrint("InDet_TrkInJetType");
+    ATH_MSG_DEBUG("InDetTrkInJetType finalize()");
     return StatusCode::SUCCESS; 
    }
 
@@ -106,7 +128,7 @@ InDetTrkInJetType::InDetTrkInJetType(const std::string& type,
 //-- Track quality checks
       std::vector<float> safeReturn(3,0.);
       if( !m_initialised )          return safeReturn;
-      if(Jet.Perp() > 2500000.)     return safeReturn;
+      if(Jet.Perp() > m_jetMaxPtCut)return safeReturn;
       if(Trk->pt() < m_trkMinPtCut) return safeReturn;
       if(Trk->pt() > Jet.Pt())      return safeReturn;
       if(Trk->numberDoF() == 0)                             return safeReturn; //Safety
@@ -117,7 +139,6 @@ InDetTrkInJetType::InDetTrkInJetType(const std::string& type,
       if( PixelHits < m_trkPixelHitsCut ) return safeReturn;
       if( SctHits   < m_trkSctHitsCut )   return safeReturn;
  
-
       std::vector<double> Impact,ImpactError;
       m_Sig3D=m_fitSvc->VKalGetImpact(Trk, PV.position(), 1, Impact, ImpactError);
       AmgVector(5) tmpPerigee = Trk->perigeeParameters().parameters(); 
@@ -162,6 +183,7 @@ InDetTrkInJetType::InDetTrkInJetType(const std::string& type,
      double coeffPt=10.;
      double pfrac=(Trk->pt()-m_trkMinPtCut)/sqrt(Jet.Perp());
      m_prbP= pfrac/(coeffPt+pfrac);
+     m_etatrk=Trk->eta();
 //---
      double coeffSig=1.0;
      if(trkSignif<coeffSig) return safeReturn;
@@ -173,6 +195,7 @@ InDetTrkInJetType::InDetTrkInJetType(const std::string& type,
      m_SigR=SignifR;
 //---
      m_ptjet=Jet.Perp();
+     if(m_ptjet<m_jetMinPtCut)m_ptjet=m_jetMinPtCut; //Very low jet pt is replaced by Pt=35GeV
      m_etajet=fabs(Jet.Eta());
 //---
      m_ibl = (float)hitIBL;
@@ -184,8 +207,15 @@ InDetTrkInJetType::InDetTrkInJetType(const std::string& type,
 //---
      TLorentzVector normJ;  normJ.SetPtEtaPhiM(1.,Jet.Eta(),Jet.Phi(),0.);
      m_prodTJ=sqrt(TLV.Dot(normJ));
-     return m_tmvaReader->EvaluateMulticlass("BDTG");
-
+//---
+     if(m_timingProfile)m_timingProfile->chronoStart("InDet_TrkInJetType");
+     //std::vector<float> weights=m_tmvaReader->EvaluateMulticlass("BDTG");
+     //-----Use MVAUtils to save CPU
+     std::vector<float> bdt_vars={m_Sig3D, m_prbP, m_pTvsJet, m_d0, m_SigR, m_SigZ, m_ptjet, m_ibl, m_bl, m_etatrk};
+     std::vector<float> weights=m_localBDT->GetMultiResponse(bdt_vars,3);
+     //-----
+     if(m_timingProfile)m_timingProfile->chronoStop("InDet_TrkInJetType");
+     return weights;
    }
    
 }// close namespace
diff --git a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetVKalVxInJetTool.cxx b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetVKalVxInJetTool.cxx
index 4fd96f2179c2338dc6b008409aed5fc4ff822431..fa6a1452f1bc62e6c9b76ff4b0a80921e74987b7 100755
--- a/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetVKalVxInJetTool.cxx
+++ b/InnerDetector/InDetRecTools/InDetVKalVxInJetTool/src/InDetVKalVxInJetTool.cxx
@@ -9,6 +9,7 @@
 #include  "TrkVKalVrtFitter/TrkVKalVrtFitter.h"
 
 #include "GaudiKernel/ITHistSvc.h"
+#include "GaudiKernel/IChronoStatSvc.h"
 #include "TH1D.h"
 #include "TH2D.h"
 #include "TTree.h"
@@ -50,9 +51,9 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
     m_trkSigCut(2.0),
     m_a0TrkErrorCut(1.0),
     m_zTrkErrorCut(5.0),
-    m_cutHFClass(0.1),
-    m_antiGarbageCut(0.80),
-    m_antiFragmentCut(0.80),
+    m_cutHFClass(0.15),
+    m_antiGarbageCut(0.75),
+    m_antiFragmentCut(0.70),
     m_Vrt2TrMassLimit(4000.),
     m_fillHist(false),
     m_existIBL(true),
@@ -145,6 +146,7 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
     declareProperty("TrackDetachCut",	  m_trackDetachCut, "To allow track from vertex detachment for MultiVertex Finder" );
 
     declareProperty("VertexFitterTool",  m_fitterSvc);
+    declareProperty("TrackClassTool",  m_trackClassificator);
 //    declareProperty("MaterialMap", m_materialMap);
 //    declareProperty("TrkVKalVrtFitter", m_fitSvc);
 //
@@ -164,18 +166,14 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
 
 //Destructor---------------------------------------------------------------
     InDetVKalVxInJetTool::~InDetVKalVxInJetTool(){
-     //MsgStream log( msgSvc(), name() ) ;
-     //log << MSG::DEBUG << "InDetVKalVxInJetTool destructor called" << endmsg;
      if(m_WorkArray) delete m_WorkArray;
      if(m_compatibilityGraph)delete m_compatibilityGraph;
-     if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "InDetVKalVxInJetTool destructor called" << endmsg;
+     ATH_MSG_DEBUG("InDetVKalVxInJetTool destructor called");
    }
 
 //Initialize---------------------------------------------------------------
    StatusCode InDetVKalVxInJetTool::initialize(){
-     //MsgStream log( msgSvc(), name() ) ;
-     //log << MSG::DEBUG << "InDetVKalVxInJetTool initialize() called" << endmsg;
-     if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG)<< "InDetVKalVxInJetTool initialize() called" << endmsg;
+     ATH_MSG_DEBUG("InDetVKalVxInJetTool initialize() called");
      m_WorkArray = new VKalVxInJetTemp;
      m_compatibilityGraph = new boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS>();
 
@@ -214,6 +212,8 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
 //        if(!m_fitSvc)log<<MSG::DEBUG<<" No Trk::TrkVKalVrtFitter" << endmsg;
 //     }
 
+//------------------------------------------
+     if(msgLvl(MSG::DEBUG)) ATH_CHECK(service("ChronoStatSvc", m_timingProfile));
 //------------------------------------------
 // Chose whether IBL is installed
      if(m_existIBL){ // 4-layer pixel detector
@@ -352,6 +352,7 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
           m_tuple->Branch("etajet",      &m_curTup->etajet,    "etajet/F");
           m_tuple->Branch("phijet",      &m_curTup->phijet,    "phijet/F");
           m_tuple->Branch("ntrk",        &m_curTup->nTrkInJet, "ntrk/I");
+          m_tuple->Branch("etatrk",      &m_curTup->etatrk,    "etatrk[ntrk]/F");
           m_tuple->Branch("prbS",        &m_curTup->s_prob,    "prbS[ntrk]/F");
           m_tuple->Branch("prbP",        &m_curTup->p_prob,    "prbP[ntrk]/F");
           m_tuple->Branch("wgtB",        &m_curTup->wgtB,      "wgtB[ntrk]/F");
@@ -424,7 +425,8 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
   StatusCode InDetVKalVxInJetTool::finalize()
   {
     //MsgStream log( msgSvc(), name() );
-    if(msgLvl(MSG::DEBUG))msg(MSG::DEBUG) <<"InDetVKalVxInJetTool finalize()" << endmsg;
+    if(m_timingProfile)m_timingProfile->chronoPrint("InDetVKalVxInJetTool");
+    ATH_MSG_DEBUG("InDetVKalVxInJetTool finalize()");
     return StatusCode::SUCCESS; 
   }
   
@@ -435,6 +437,7 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
 							           const TLorentzVector & JetDir,
 						 	           const std::vector<const xAOD::IParticle*> & IInpTrk)
     const  {
+    if(m_timingProfile)m_timingProfile->chronoStart("InDetVKalVxInJetTool");
     std::vector<double>     Results;
     std::vector<const xAOD::TrackParticle*>            InpTrk;
     std::vector<const xAOD::TrackParticle*>            SelSecTrk;
@@ -500,6 +503,7 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
     m_compatibilityGraph->clear();
     std::vector<int> zytmp(1000); m_WorkArray->m_Incomp.swap(zytmp);    // Deallocate memory
     std::vector<int> zwtmp(0);    m_WorkArray->m_Prmtrack.swap(zwtmp);  // 
+    if(m_timingProfile)m_timingProfile->chronoStop("InDetVKalVxInJetTool");
     return res;
    }
 
@@ -509,6 +513,7 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
 							           const TLorentzVector & JetDir,
 						 	           const std::vector<const Trk::TrackParticleBase*> & InpTrkBase)
     const  {
+    if(m_timingProfile)m_timingProfile->chronoStart("InDetVKalVxInJetTool");
     std::vector<double>     Results;
     std::vector<const Rec::TrackParticle*>            SelSecTrk;
     std::vector< std::vector<const Rec::TrackParticle*> >  SelSecTrkPerVrt;
@@ -557,6 +562,7 @@ InDetVKalVxInJetTool::InDetVKalVxInJetTool(const std::string& type,
     m_compatibilityGraph->clear();
     std::vector<int> zytmp(1000); m_WorkArray->m_Incomp.swap(zytmp);    // Deallocate memory
     std::vector<int> zwtmp(0);    m_WorkArray->m_Prmtrack.swap(zwtmp);  // 
+    if(m_timingProfile)m_timingProfile->chronoStop("InDetVKalVxInJetTool");
     return res;
        
 //    return new Trk::VxSecVertexInfo(listVrtSec);