diff --git a/Trigger/TrigHypothesis/TrigTauHypo/TrigTauHypo/EFTauDiKaonHypo.h b/Trigger/TrigHypothesis/TrigTauHypo/TrigTauHypo/EFTauDiKaonHypo.h
index 542116a18a4f7a4691967dc1e6879ae963434d45..11b6c47bf6c49922c2c1bc0be4ae958f9cc821df 100644
--- a/Trigger/TrigHypothesis/TrigTauHypo/TrigTauHypo/EFTauDiKaonHypo.h
+++ b/Trigger/TrigHypothesis/TrigTauHypo/TrigTauHypo/EFTauDiKaonHypo.h
@@ -48,6 +48,9 @@ class EFTauDiKaonHypo : public HLT::HypoAlgo {
   float m_massTrkSysMax;
   float m_massTrkSysKaonMin;
   float m_massTrkSysKaonMax;
+  float m_massTrkSysKaonPiMin;
+  float m_massTrkSysKaonPiMax;
+  float m_targetMassTrkSysKaonPi;
   float m_EtCalibMin;
   float m_leadTrkPtMin;
   int m_nTrackMax;
@@ -61,6 +64,7 @@ class EFTauDiKaonHypo : public HLT::HypoAlgo {
   /** variables used for cuts in hypo algorithm */   
   float m_massTrkSys;
   float m_massTrkSysKaon;
+  float m_massTrkSysKaonPi;
   float m_leadTrkPt;
   float m_EtCalib;
   int m_nTrack;
@@ -73,6 +77,7 @@ class EFTauDiKaonHypo : public HLT::HypoAlgo {
   int  m_cutCounter;
   float m_massTrkSysAccepted;
   float m_massTrkSysKaonAccepted;
+  float m_massTrkSysKaonPiAccepted;
   float m_leadTrkPtAccepted;
   float m_ptAccepted;
   float m_nTrackAccepted;
diff --git a/Trigger/TrigHypothesis/TrigTauHypo/python/TrigTauHypoMonitoring.py b/Trigger/TrigHypothesis/TrigTauHypo/python/TrigTauHypoMonitoring.py
index dac821e1dce339a77c8c4e14f151d1a94cd717a4..7d50c51d03d09dac2ea8696c16aa678b279c1500 100755
--- a/Trigger/TrigHypothesis/TrigTauHypo/python/TrigTauHypoMonitoring.py
+++ b/Trigger/TrigHypothesis/TrigTauHypo/python/TrigTauHypoMonitoring.py
@@ -44,8 +44,8 @@ class TrigTauHypoOnlineMonitoring(TrigGenericMonitoringToolConfig):
         elif (myName.find("tracktwo") > -1 or myName.find("loose1") > -1 or myName.find("medium1") > -1 or myName.find("tight1") > -1 or myName.find("FTK") > -1):
             cuts=['Input','has tau details','E_{T} calib','tk. number','score cut', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
 
-        elif (myName.find("dikaon") > -1 or myName.find("singlepion") > -1):
-            cuts=['Input','E_{T} calib','tk. number','lead tr pt','massTrkSys','massTrkSysKaon','EMPOverTrkSysP', 'etOverPtLeadTrk', 'dRmax', ' ', ' ', ' ', ' ']
+        elif (myName.find("kaon") > -1 or myName.find("pion") > -1):
+            cuts=['Input', 'tau cand' ,'E_{T} calib','tk. number','lead tr pt','massTrkSys','massTrkSysKaon','massTrkSysKaonPi','EMPOverTrkSysP', 'etOverPtLeadTrk', 'dRmax', ' ', ' ', ' ', ' ']
 
         elif myName.find("ditau") > -1:
             cuts=['Input','good vtx/trk', 'match', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
@@ -327,6 +327,7 @@ class EFTauDiKaonHypoOnlineMonitoring(TrigTauHypoOnlineMonitoring):
         self.Histograms += [defineHistogram('NWideTrack',type='TH1F',title='Tau nWideTrack Passed', xbins=10, xmin=-0.5,xmax=9.5)]
         self.Histograms += [defineHistogram('MassTrkSys',type='TH1F',title='Tau massTrkSys Passed', xbins=50, xmin=0.,xmax=2000.)]
         self.Histograms += [defineHistogram('MassTrkSysKaon',type='TH1F',title='Tau massTrkSysKaon Passed', xbins=50, xmin=0.,xmax=2000.)]
+        self.Histograms += [defineHistogram('MassTrkSysKaonPi',type='TH1F',title='Tau massTrkSysKaonPi Passed', xbins=50, xmin=0.,xmax=2000.)]
         self.Histograms += [defineHistogram('LeadTrkPt',type='TH1F',title='Tau leadTrkPt Passed', xbins=50, xmin=0.,xmax=50000.)]
         self.Histograms += [defineHistogram('DR',type='TH1F',title='Tau dRmax Passed', xbins=40, xmin=0.,xmax=0.4)]
         self.Histograms += [defineHistogram('EtOverPtLeadTrk',type='TH1F',title='Tau etOverPtLeadTrk Passed', xbins=50, xmin=0.,xmax=5.)]
diff --git a/Trigger/TrigHypothesis/TrigTauHypo/src/EFTauDiKaonHypo.cxx b/Trigger/TrigHypothesis/TrigTauHypo/src/EFTauDiKaonHypo.cxx
index 408decdf94060c8f51ad629d49b63bf7d23bb8d4..157ba2f919972374f1bbba4e18ea2b70019247a5 100644
--- a/Trigger/TrigHypothesis/TrigTauHypo/src/EFTauDiKaonHypo.cxx
+++ b/Trigger/TrigHypothesis/TrigTauHypo/src/EFTauDiKaonHypo.cxx
@@ -44,11 +44,14 @@ EFTauDiKaonHypo::EFTauDiKaonHypo(const std::string& name,
   declareProperty("massTrkSysMax", m_massTrkSysMax = 1000000000.);
   declareProperty("massTrkSysKaonMin", m_massTrkSysKaonMin = 0.);
   declareProperty("massTrkSysKaonMax", m_massTrkSysKaonMax = 1000000000.);
+  declareProperty("massTrkSysKaonPiMin", m_massTrkSysKaonPiMin = 0.);
+  declareProperty("massTrkSysKaonPiMax", m_massTrkSysKaonPiMax = 1000000000.);
+  declareProperty("targetMassTrkSysKaonPi", m_targetMassTrkSysKaonPi = 0.);
   declareProperty("leadTrkPtMin",  m_leadTrkPtMin  = 0.);
   declareProperty("EtCalibMin",    m_EtCalibMin  = 0.);
   declareProperty("nTrackMin",     m_nTrackMin  = 1);
   declareProperty("nTrackMax",     m_nTrackMax  = 2);
-  declareProperty("nWideTrackMax", m_nWideTrackMax  = 10);
+  declareProperty("nWideTrackMax", m_nWideTrackMax  = 1);
   declareProperty("dRmaxMax",      m_dRmaxMax  = 10.);
   declareProperty("etOverPtLeadTrkMin",    m_etOverPtLeadTrkMin  = 0.);
   declareProperty("etOverPtLeadTrkMax",    m_etOverPtLeadTrkMax  = 10.);
@@ -57,6 +60,7 @@ EFTauDiKaonHypo::EFTauDiKaonHypo(const std::string& name,
   declareMonitoredVariable("CutCounter",	m_cutCounter=0);
   declareMonitoredVariable("MassTrkSys",	m_massTrkSysAccepted =-10.);
   declareMonitoredVariable("MassTrkSysKaon",        m_massTrkSysKaonAccepted =-10.);
+  declareMonitoredVariable("MassTrkSysKaonPi",        m_massTrkSysKaonPiAccepted =-10.);
   declareMonitoredVariable("LeadTrkPt",		m_leadTrkPtAccepted =-10.);
   declareMonitoredVariable("EtCalib",		m_ptAccepted =-10.);
   declareMonitoredVariable("NTrack",		m_nTrackAccepted =-1);
@@ -67,6 +71,7 @@ EFTauDiKaonHypo::EFTauDiKaonHypo(const std::string& name,
 
   m_massTrkSys = 0.;
   m_massTrkSysKaon = 0.;
+  m_massTrkSysKaonPi = 0.;
   m_leadTrkPt = 0.;
   m_nTrack = 0;
   m_nWideTrack = 0;
@@ -102,6 +107,9 @@ HLT::ErrorCode EFTauDiKaonHypo::hltInitialize()
   msg() << MSG::INFO << " REGTEST: param massTrkSysMax " << m_massTrkSysMax <<endreq;
   msg() << MSG::INFO << " REGTEST: param massTrkSysKaonMin " << m_massTrkSysKaonMin <<endreq;
   msg() << MSG::INFO << " REGTEST: param massTrkSysKaonMax " << m_massTrkSysKaonMax <<endreq;
+  msg() << MSG::INFO << " REGTEST: param massTrkSysKaonPiMin " << m_massTrkSysKaonPiMin <<endreq;
+  msg() << MSG::INFO << " REGTEST: param massTrkSysKaonPiMax " << m_massTrkSysKaonPiMax <<endreq;
+  msg() << MSG::INFO << " REGTEST: param targetMassTrkSysKaonPi " << m_targetMassTrkSysKaonPi <<endreq;
   msg() << MSG::INFO << " REGTEST: param leadTrkPtMin " << m_leadTrkPtMin <<endreq;
   msg() << MSG::INFO << " REGTEST: param EtCalibMin " << m_EtCalibMin <<endreq;
   msg() << MSG::INFO << " REGTEST: param nTrackMin (included) " << m_nTrackMin <<endreq;
@@ -114,7 +122,7 @@ HLT::ErrorCode EFTauDiKaonHypo::hltInitialize()
 
   msg() << MSG::INFO << " REGTEST: ------ "<<endreq;
   
-  if( ( m_massTrkSysKaonMin >  m_massTrkSysKaonMax ) || ( m_massTrkSysMin >  m_massTrkSysMax ) || ( m_nTrackMin > m_nTrackMax )  || (m_etOverPtLeadTrkMin > m_etOverPtLeadTrkMax) )
+  if( ( m_massTrkSysKaonPiMin >  m_massTrkSysKaonPiMax ) ||  ( m_massTrkSysKaonMin >  m_massTrkSysKaonMax ) || ( m_massTrkSysMin >  m_massTrkSysMax ) || ( m_nTrackMin > m_nTrackMax )  || (m_etOverPtLeadTrkMin > m_etOverPtLeadTrkMax) )
     {
       msg() << MSG::ERROR << "EFTauDiKaonHypo is uninitialized! " << endreq;
       return HLT::BAD_JOB_SETUP;
@@ -150,6 +158,7 @@ HLT::ErrorCode EFTauDiKaonHypo::hltExecute(const HLT::TriggerElement* outputTE,
   m_cutCounter = 0;
   m_massTrkSysAccepted = -10.;
   m_massTrkSysKaonAccepted = -10.;
+  m_massTrkSysKaonPiAccepted = -10.;
   m_leadTrkPtAccepted = -10.;
   m_ptAccepted = -10.;
   m_nTrackAccepted = -1;
@@ -160,6 +169,7 @@ HLT::ErrorCode EFTauDiKaonHypo::hltExecute(const HLT::TriggerElement* outputTE,
 
   m_massTrkSys = 0.;
   m_massTrkSysKaon = 0.;
+  m_massTrkSysKaonPi = 0.;
   m_leadTrkPt = 0.;
   m_nTrack = 0;
   m_nWideTrack = 0;
@@ -238,7 +248,7 @@ HLT::ErrorCode EFTauDiKaonHypo::hltExecute(const HLT::TriggerElement* outputTE,
     
     // cut on core and wide tracks:
     m_nTrack = (*tauIt)->nTracks();
-    m_nWideTrack = (*tauIt)->nWideTracks();
+    m_nWideTrack = (*tauIt)->nTracksIsolation();
     if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << " REGTEST: Track size "<< m_nTrack <<endreq;	
     if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << " REGTEST: Wide Track size "<< m_nWideTrack <<endreq;
  
@@ -262,6 +272,7 @@ HLT::ErrorCode EFTauDiKaonHypo::hltExecute(const HLT::TriggerElement* outputTE,
 
     // for dikaon mass hypothesis, compute invariant mass with kaon mass
     TLorentzVector my_kaons(0.,0.,0.,0.);
+    std::vector<TLorentzVector> my_trks;
     // need to add checks for valid link
     for (unsigned int i=0;i<(*tauIt)->nTracks();++i) {
       const xAOD::TrackParticle* trk = 0;
@@ -269,19 +280,47 @@ HLT::ErrorCode EFTauDiKaonHypo::hltExecute(const HLT::TriggerElement* outputTE,
 
       try 
       {
-        trk = (*tauIt)->track(i);
+        trk = (*tauIt)->track(i)->track();
       }
       catch(std::exception e)
       {
         msg() << MSG::WARNING << " REGTEST: EFTauDiKaonHypo, failed to get tau track link! " <<endreq;
       } 
 
-      if(trk) tmpKaon.SetPtEtaPhiM(trk->pt(), trk->eta(), trk->phi(), 493.677);
+      if(trk) {
+         tmpKaon.SetPtEtaPhiM(trk->pt(), trk->eta(), trk->phi(), 493.677);
+         my_trks.push_back(trk->p4());
+      }
       my_kaons = my_kaons + tmpKaon;
     }
     m_massTrkSysKaon = my_kaons.M();
     if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << " REGTEST: massTrkSys with kaon mass hypo "<< m_massTrkSysKaon <<endreq;
 
+    // kaon+pi mass hypo
+    double finalKPiMass = 0;
+    if(my_trks.size()==2){
+
+          TLorentzVector tmpKaon;
+          tmpKaon.SetPtEtaPhiM(my_trks.at(0).Pt(), my_trks.at(0).Eta(), my_trks.at(0).Phi(), 493.677);
+          TLorentzVector tmpPion = my_trks.at(1);
+
+          double kPiMass1 = (tmpKaon+tmpPion).M();
+
+          tmpKaon.SetPtEtaPhiM(my_trks.at(1).Pt(), my_trks.at(1).Eta(), my_trks.at(1).Phi(), 493.677);
+          tmpPion = my_trks.at(0);
+
+          double kPiMass2 = (tmpKaon+tmpPion).M();
+
+          if(fabs(kPiMass1 - m_targetMassTrkSysKaonPi) < fabs(kPiMass2 - m_targetMassTrkSysKaonPi))
+          {
+            finalKPiMass = kPiMass1;
+          }else{
+            finalKPiMass = kPiMass2;
+          }
+    }
+    m_massTrkSysKaonPi = finalKPiMass;
+    if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << " REGTEST: massTrkSys with kaon+pi mass hypo "<< m_massTrkSysKaonPi <<endreq;
+
     if (!( (m_massTrkSys > m_massTrkSysMin) && (m_massTrkSys < m_massTrkSysMax) ) )  continue;
     m_cutCounter++;
     m_massTrkSysAccepted = m_massTrkSys;
@@ -290,6 +329,10 @@ HLT::ErrorCode EFTauDiKaonHypo::hltExecute(const HLT::TriggerElement* outputTE,
     m_cutCounter++;   
     m_massTrkSysKaonAccepted = m_massTrkSysKaon;
 
+    if (!( (m_massTrkSysKaonPi >= m_massTrkSysKaonPiMin) && (m_massTrkSysKaonPi < m_massTrkSysKaonPiMax) ) )  continue; //use >= otherwise singlepion chain would fail here!
+    m_cutCounter++;
+    m_massTrkSysKaonPiAccepted = m_massTrkSysKaonPi;
+
     // cut on EMPOverTrkSysP:     
     (*tauIt)->detail(xAOD::TauJetParameters::EMPOverTrkSysP, m_EMPOverTrkSysP);
     if( msgLvl() <= MSG::DEBUG ) msg() << MSG::DEBUG << " REGTEST: EMPOverTrkSysP "<< m_EMPOverTrkSysP <<endreq;
diff --git a/Trigger/TrigHypothesis/TrigTauHypo/src/EFTauMVHypo.cxx b/Trigger/TrigHypothesis/TrigTauHypo/src/EFTauMVHypo.cxx
index 258308388cf9e4f7456e49ef2342dcc22c4e481d..48b2fc614fbd55f7f2579da53a943bbbee3a6636 100644
--- a/Trigger/TrigHypothesis/TrigTauHypo/src/EFTauMVHypo.cxx
+++ b/Trigger/TrigHypothesis/TrigTauHypo/src/EFTauMVHypo.cxx
@@ -252,7 +252,7 @@ HLT::ErrorCode EFTauMVHypo::hltExecute(const HLT::TriggerElement* outputTE, bool
     m_mon_ptAccepted = EFet;
 
     m_numTrack = (*tauIt)->nTracks();
-    m_numWideTrack = (*tauIt)->nWideTracks();
+    m_numWideTrack = (*tauIt)->nTracksIsolation();
     
     if( msgLvl() <= MSG::DEBUG ){
       msg() << MSG::DEBUG << " REGTEST: Track size "<<m_numTrack <<endreq;	
diff --git a/Trigger/TrigHypothesis/TrigTauHypo/src/HLTVertexPreSelHypo.cxx b/Trigger/TrigHypothesis/TrigTauHypo/src/HLTVertexPreSelHypo.cxx
index 1698dc528fd3f6fb736309d03f0381d548270574..fbbd2318117981cf43f9eb45898663010f60ab6c 100644
--- a/Trigger/TrigHypothesis/TrigTauHypo/src/HLTVertexPreSelHypo.cxx
+++ b/Trigger/TrigHypothesis/TrigTauHypo/src/HLTVertexPreSelHypo.cxx
@@ -206,7 +206,7 @@ float HLTVertexPreSelHypo::findLeadingTrackZ0(size_t numberOfTracks, const xAOD:
 	const xAOD::TrackParticle* leadingTrack(NULL);
 	for(size_t i = 0; i < numberOfTracks; i++)
 	{
-		const xAOD::TrackParticle* currentTrack = tauJet->track(i);
+		const xAOD::TrackParticle* currentTrack = tauJet->track(i)->track();
 		ATH_MSG_DEBUG("Track " << (i + 1) << "  | pT: " << currentTrack->pt());
 		if(fabs(currentTrack->pt()) > highestpT)
 		{