diff --git a/src/THcTrigDet.cxx b/src/THcTrigDet.cxx
index f00f6a295dae44dd05f300e2441840b2d2f93ae4..2695938e345cdfbbd47f4cd8c3accbfafe3f7313 100644
--- a/src/THcTrigDet.cxx
+++ b/src/THcTrigDet.cxx
@@ -136,7 +136,13 @@ THcTrigDet::THcTrigDet(
 }
 
 
-THcTrigDet::~THcTrigDet() {}
+THcTrigDet::~THcTrigDet() {
+  delete [] fAdcTimeWindowMin; fAdcTimeWindowMin = NULL;
+  delete [] fAdcTimeWindowMax; fAdcTimeWindowMax = NULL;
+  delete [] fTdcTimeWindowMin; fTdcTimeWindowMin = NULL;
+  delete [] fTdcTimeWindowMax; fTdcTimeWindowMax = NULL;
+
+}
 
 
 THaAnalysisObject::EStatus THcTrigDet::Init(const TDatime& date) {
@@ -180,7 +186,7 @@ THaAnalysisObject::EStatus THcTrigDet::Init(const TDatime& date) {
   }
   // Initialize hitlist part of the class.
   // printf(" Init trig det hitlist\n");
-  InitHitList(fDetMap, "THcTrigRawHit", 100);
+  InitHitList(fDetMap, "THcTrigRawHit", 200,fTDC_RefTimeCut,fADC_RefTimeCut);
   CreateMissReportParms(fKwPrefix.c_str());
 
   fPresentP = 0;
@@ -237,24 +243,41 @@ Int_t THcTrigDet::Decode(const THaEvData& evData) {
     Int_t cnt = hit->fCounter-1;
     if (hit->fPlane == 1) {
       THcRawAdcHit rawAdcHit = hit->GetRawAdcHit();
-
-      fAdcPedRaw[cnt] = rawAdcHit.GetPedRaw();
-      fAdcPulseIntRaw[cnt] = rawAdcHit.GetPulseIntRaw();
-      fAdcPulseAmpRaw[cnt] = rawAdcHit.GetPulseAmpRaw();
-      fAdcPulseTimeRaw[cnt] = rawAdcHit.GetPulseTimeRaw();
-      fAdcPulseTime[cnt] = rawAdcHit.GetPulseTime()+fAdcTdcOffset;
-
-      fAdcPed[cnt] = rawAdcHit.GetPed();
-      fAdcPulseInt[cnt] = rawAdcHit.GetPulseInt();
-      fAdcPulseAmp[cnt] = rawAdcHit.GetPulseAmp();
-
       fAdcMultiplicity[cnt] = rawAdcHit.GetNPulses();
+      UInt_t good_hit=999;
+         if (rawAdcHit.GetNPulses()>1) {
+          for (UInt_t thit=0; thit<rawAdcHit.GetNPulses(); ++thit) {
+	    Int_t TestTime=rawAdcHit.GetPulseTime(thit)+fAdcTdcOffset;
+	    if (TestTime>fAdcTimeWindowMin[cnt]&&TestTime<fAdcTimeWindowMax[cnt]&&good_hit==999) {
+	      good_hit=thit;
+	    }
+	  }
+	 }
+       if (good_hit==999) good_hit=0;
+       fAdcPedRaw[cnt] = rawAdcHit.GetPedRaw();
+       fAdcPulseIntRaw[cnt] = rawAdcHit.GetPulseIntRaw(good_hit);
+       fAdcPulseAmpRaw[cnt] = rawAdcHit.GetPulseAmpRaw(good_hit);
+       fAdcPulseTimeRaw[cnt] = rawAdcHit.GetPulseTimeRaw(good_hit);
+       fAdcPulseTime[cnt] = rawAdcHit.GetPulseTime(good_hit)+fAdcTdcOffset;
+       fAdcPed[cnt] = rawAdcHit.GetPed();
+       fAdcPulseInt[cnt] = rawAdcHit.GetPulseInt(good_hit);
+       fAdcPulseAmp[cnt] = rawAdcHit.GetPulseAmp(good_hit);
     }
     else if (hit->fPlane == 2) {
       THcRawTdcHit rawTdcHit = hit->GetRawTdcHit();
 
-      fTdcTimeRaw[cnt] = rawTdcHit.GetTimeRaw();
-      fTdcTime[cnt] = rawTdcHit.GetTime()*fTdcChanperNS+fTdcOffset;
+      UInt_t good_hit=999;
+         if (rawTdcHit.GetNHits()>1) {
+          for (UInt_t thit=0; thit<rawTdcHit.GetNHits(); ++thit) {
+	    Int_t TestTime=rawTdcHit.GetTime(thit)*fTdcChanperNS+fTdcOffset;
+	    if (TestTime>fTdcTimeWindowMin[cnt]&&TestTime<fTdcTimeWindowMax[cnt]&&good_hit==999) {
+	      good_hit=thit;
+	    }
+	  }
+	 }
+       if (good_hit==999) good_hit=0;
+      fTdcTimeRaw[cnt] = rawTdcHit.GetTimeRaw(good_hit);
+      fTdcTime[cnt] = rawTdcHit.GetTime(good_hit)*fTdcChanperNS+fTdcOffset;
 
       fTdcMultiplicity[cnt] = rawTdcHit.GetNHits();
     }
@@ -281,7 +304,6 @@ void THcTrigDet::Setup(const char* name, const char* description) {
 
 Int_t THcTrigDet::ReadDatabase(const TDatime& date) {
   std::string adcNames, tdcNames;
-
   DBRequest list[] = {
     {"_numAdc", &fNumAdc, kInt},  // Number of ADC channels.
     {"_numTdc", &fNumTdc, kInt},  // Number of TDC channels.
@@ -290,12 +312,38 @@ Int_t THcTrigDet::ReadDatabase(const TDatime& date) {
     {"_tdcoffset", &fTdcOffset, kDouble,0,1},  // Offset of tdc channels
     {"_adc_tdc_offset", &fTdcOffset, kDouble,0,1},  // Offset of Adc Pulse time (ns)
     {"_tdcchanperns", &fTdcChanperNS, kDouble,0,1},  // Convert channesl to ns
+    {"_trig_tdcrefcut", &fTDC_RefTimeCut, kInt, 0, 1},
+    {"_trig_adcrefcut", &fADC_RefTimeCut, kInt, 0, 1},
     {0}
   };
   fTdcChanperNS=0.1;
   fTdcOffset=300.;
   fAdcTdcOffset=200.;
+  fTDC_RefTimeCut=-1000.;
+  fADC_RefTimeCut=-1000.;
   gHcParms->LoadParmValues(list, fKwPrefix.c_str());
+  //
+  fAdcTimeWindowMin = new Double_t [fNumAdc];
+  fAdcTimeWindowMax = new Double_t [fNumAdc];
+  fTdcTimeWindowMin = new Double_t [fNumTdc];
+  fTdcTimeWindowMax = new Double_t [fNumTdc];
+  for(Int_t ip=0;ip<fNumAdc;ip++) { // Set a large default window
+    fAdcTimeWindowMin[ip]=-1000;
+    fAdcTimeWindowMax[ip]=1000;
+  }
+  for(Int_t ip=0;ip<fNumTdc;ip++) { // Set a large default window
+    fTdcTimeWindowMin[ip]=-1000;
+    fTdcTimeWindowMax[ip]=1000;
+  }
+  DBRequest list2[]={
+    {"_AdcTimeWindowMin", fAdcTimeWindowMin, kDouble,     (UInt_t) fNumAdc, 1},
+    {"_AdcTimeWindowMax", fAdcTimeWindowMax, kDouble,     (UInt_t) fNumAdc, 1},
+    {"_TdcTimeWindowMin", fTdcTimeWindowMin, kDouble,     (UInt_t) fNumAdc, 1},
+    {"_TdcTimeWindowMax", fTdcTimeWindowMax, kDouble,     (UInt_t) fNumAdc, 1},
+    {0}
+  };
+
+  gHcParms->LoadParmValues(list2, fKwPrefix.c_str());
 
   // Split the names to std::vector<std::string>.
   fAdcNames = vsplit(adcNames);
diff --git a/src/THcTrigDet.h b/src/THcTrigDet.h
index bce03b4bbc67bab5fe13e04e049638d5f2c68064..58be6074745764d98f0783f03abe724835820a2c 100644
--- a/src/THcTrigDet.h
+++ b/src/THcTrigDet.h
@@ -55,7 +55,15 @@ class THcTrigDet : public THaDetector, public THcHitList {
 
     Int_t fTdcTimeRaw[fMaxTdcChannels];
     Double_t fTdcTime[fMaxTdcChannels];
+    Int_t fTDC_RefTimeCut;
+    Int_t fADC_RefTimeCut;
 
+    Double_t *fAdcTimeWindowMin;    
+    Double_t *fAdcTimeWindowMax;    
+    Double_t *fTdcTimeWindowMin;    
+    Double_t *fTdcTimeWindowMax;    
+
+    
     Int_t fAdcPedRaw[fMaxAdcChannels];
     Int_t fAdcPulseIntRaw[fMaxAdcChannels];
     Int_t fAdcPulseAmpRaw[fMaxAdcChannels];