diff --git a/src/THcHitList.cxx b/src/THcHitList.cxx
index 370522269cb1e9a0589dd8fdba929ef7f5aba114..a66e4ce5bb1dd6d2afc9cb5e8541d40d5416f597 100644
--- a/src/THcHitList.cxx
+++ b/src/THcHitList.cxx
@@ -21,12 +21,13 @@
 using namespace std;
 
 #define SUPPRESSMISSINGADCREFTIMEMESSAGES 1
-THcHitList::THcHitList()
+THcHitList::THcHitList() : fMap(0), fTISlot(0)
 {
   /// Normal constructor.
 
   fRawHitList = NULL;
   fPSE125 = NULL;
+  fFADCSlotMap.clear();
 
 }
 
@@ -45,6 +46,16 @@ initialize a hit array of hits of class hitclass
 
 */
 
+
+/* InitHitList should make a list of ROCs that have FADCs in them.  (Probably
+just one.)  It then needs to figure out where the TI is and make sure
+the decoder is setup for pulling out the event time.
+
+Do we need to somehow configure this in the Hall C style map file.  Is there
+a method to ask the OO decoder what kind of module is in a given slot?
+
+*/
+
 void THcHitList::InitHitList(THaDetMap* detmap,
 			     const char *hitclass, Int_t maxhits,
 			     Int_t tdcref_cut, Int_t adcref_cut) {
@@ -171,6 +182,48 @@ The hit list is sorted (by plane, counter) after filling.
 */
 Int_t THcHitList::DecodeToHitList( const THaEvData& evdata, Bool_t suppresswarnings ) {
 
+  if(!fMap) {			// Find the TI slot for ADCs
+    // Assumes that all FADCs are in the same crate
+    cout << "Got the Crate map" << endl;
+    fMap = evdata.GetCrateMap();
+    for (Int_t i=0; i < fdMap->GetSize(); i++) { // Look for a FADC250
+      THaDetMap::Module* d = fdMap->GetModule(i);
+      Decoder::Fadc250Module* isfadc = dynamic_cast<Decoder::Fadc250Module*>(evdata.GetModule(d->crate, d->slot));
+      if(isfadc) {
+	// Scan this crate to find the TI.
+	for(Int_t slot=0;slot<Decoder::MAXSLOT;slot++) {
+	  if(fMap->getModel(d->crate, slot) == 4) {
+	    fTISlot = slot;
+	    fTICrate = d->crate;
+	    cout << "TI Slot = " << fTISlot << endl;
+	    break;
+	  }
+	}
+	// Now make a map of all the FADCs in this crate
+	if(fTISlot>0) {
+	  for(Int_t slot=0;slot<Decoder::MAXSLOT;slot++) {
+	    Decoder::Fadc250Module* fadc = dynamic_cast<Decoder::Fadc250Module*>
+	      (evdata.GetModule(d->crate, slot));
+	    if(fadc) {
+	      fFADCSlotMap[slot] = fadc;
+	    }
+	  }	    
+	}
+	break;
+      }
+    }
+  }
+    
+  Int_t titime = 0;
+  if(fTISlot!=0) {
+#define FUDGE 7
+    titime = evdata.GetData(fTICrate, fTISlot, 2, 0)-FUDGE;
+    // Need to get the FADC time for all modules in this crate
+    // that have hits.  Make a map with these times.
+    fTrigTimeShiftMap.clear();
+    //cout << "TI Crate: " << fTICrate << " " << (UInt_t) titime << endl;
+  }
+
   // cout << " Clearing TClonesArray " << endl;
   fRawHitList->Clear( );
   fNRawHits = 0;
@@ -180,6 +233,7 @@ Int_t THcHitList::DecodeToHitList( const THaEvData& evdata, Bool_t suppresswarni
   // Get the indexed reference times for this event
   for(Int_t i=0;i<fNRefIndex;i++) {
     if(fRefIndexMaps[i].defined) {
+      
       if(evdata.IsMultifunction(fRefIndexMaps[i].crate,
 				fRefIndexMaps[i].slot)) { // Multifunction module (e.g. FADC)
 	// Make sure at least one pulse
@@ -187,12 +241,24 @@ Int_t THcHitList::DecodeToHitList( const THaEvData& evdata, Bool_t suppresswarni
 					     fRefIndexMaps[i].crate,
 					     fRefIndexMaps[i].slot,
 					     fRefIndexMaps[i].channel);
+	Int_t timeshift=0;
+	if(fTISlot>0) {		// Get the trigger time for this module
+	  if(fTrigTimeShiftMap.find(fRefIndexMaps[i].slot)
+	     == fTrigTimeShiftMap.end()) { // 
+	    if(fFADCSlotMap.find(fRefIndexMaps[i].slot) != fFADCSlotMap.end()) {
+	      fTrigTimeShiftMap[fRefIndexMaps[i].slot]
+		= fFADCSlotMap[fRefIndexMaps[i].slot]->GetTriggerTime() - titime;
+	    }
+	    timeshift = fTrigTimeShiftMap[fRefIndexMaps[i].slot];
+	  }
+	}
 	fRefIndexMaps[i].hashit = kFALSE;
 	Bool_t goodreftime=kFALSE;
 	Int_t reftime = 0;
 	for(Int_t ihit=0; ihit<nrefhits; ihit++) {
 	  reftime = evdata.GetData(Decoder::kPulseTime,fRefIndexMaps[i].crate,
 				   fRefIndexMaps[i].slot, fRefIndexMaps[i].channel,ihit);
+	  reftime += 64*timeshift;
 	  if(reftime >= fADC_RefTimeCut) {
 	    goodreftime = kTRUE;
 	    break;
@@ -343,10 +409,21 @@ Int_t THcHitList::DecodeToHitList( const THaEvData& evdata, Bool_t suppresswarni
 	// Pulse area will go into regular SetData, others will use special hit methods
 	Int_t npulses=evdata.GetNumEvents(Decoder::kPulseIntegral, d->crate, d->slot, chan);
 	// Assume that the # of pulses for kPulseTime, kPulsePeak and kPulsePedestal are same;
+	Int_t timeshift=0;
+	if(fTISlot>0) {		// Get the trigger time for this module
+	  if(fTrigTimeShiftMap.find(d->slot)
+	     == fTrigTimeShiftMap.end()) { // 
+	    if(fFADCSlotMap.find(d->slot) != fFADCSlotMap.end()) {
+	      fTrigTimeShiftMap[d->slot]
+		= fFADCSlotMap[d->slot]->GetTriggerTime() - titime;
+	    }
+	  }
+	  timeshift = fTrigTimeShiftMap[d->slot];
+	}
 	for (Int_t ipulse=0;ipulse<npulses;ipulse++) {
 	  rawhit->SetDataTimePedestalPeak(signal,
 					  evdata.GetData(Decoder::kPulseIntegral, d->crate, d->slot, chan, ipulse),
-					  evdata.GetData(Decoder::kPulseTime, d->crate, d->slot, chan, ipulse),
+					  evdata.GetData(Decoder::kPulseTime, d->crate, d->slot, chan, ipulse)+64*timeshift,
 					  evdata.GetData(Decoder::kPulsePedestal, d->crate, d->slot, chan, ipulse),
 					  evdata.GetData(Decoder::kPulsePeak, d->crate, d->slot, chan, ipulse));
 	}
@@ -356,8 +433,20 @@ Int_t THcHitList::DecodeToHitList( const THaEvData& evdata, Bool_t suppresswarni
 					       d->crate, d->slot, d->refchan);
 	  Bool_t goodreftime=kFALSE;
 	  Int_t reftime = 0;
+	  timeshift=0;
+	  if(fTISlot>0) {		// Get the trigger time for this module
+	    if(fTrigTimeShiftMap.find(d->slot)
+	       == fTrigTimeShiftMap.end()) { // 
+	      if(fFADCSlotMap.find(d->slot) != fFADCSlotMap.end()) {
+		fTrigTimeShiftMap[d->slot]
+		  = fFADCSlotMap[d->slot]->GetTriggerTime() - titime;
+	      }
+	    }
+	    timeshift = fTrigTimeShiftMap[d->slot];
+	  }
 	  for(Int_t ihit=0; ihit<nrefhits; ihit++) {
 	    reftime = evdata.GetData(Decoder::kPulseTime, d->crate, d->slot, d->refchan, ihit);
+	    reftime += 64*timeshift;
 	    if(reftime >= fADC_RefTimeCut) {
 	      goodreftime=kTRUE;
 	      break;
@@ -397,6 +486,18 @@ Int_t THcHitList::DecodeToHitList( const THaEvData& evdata, Bool_t suppresswarni
       }
     }
   }
+#if 1
+  if(fTISlot) {
+    //    cout << "TI ROC: " << fTICrate << "   TI Time: " << titime << endl;
+    map<Int_t, Int_t>::iterator it;
+    for(it=fTrigTimeShiftMap.begin(); it!=fTrigTimeShiftMap.end(); it++) {
+      if(it->second < -3 || it->second > 3) {
+	cout << "Big ADC Trigger Time Shift, ROC " << fTICrate << endl;
+	cout << it->first << " " << it->second << endl;
+      }
+    }
+  }
+#endif    
   fRawHitList->Sort(fNRawHits);
 
   fNTDCRef_miss += (tdcref_miss ? 1 : 0);
diff --git a/src/THcHitList.h b/src/THcHitList.h
index ba907c55afba1be21cbaa15d91b7485c5853e4d0..34cf4f93d60312a8627b674e9bf6038fc409a37a 100644
--- a/src/THcHitList.h
+++ b/src/THcHitList.h
@@ -7,8 +7,11 @@
 #include "TClonesArray.h"
 #include "TObject.h"
 #include "Decoder.h"
+#include "THaCrateMap.h"
+#include "Fadc250Module.h"
 
 #include <iomanip>
+#include <map>
 
 using namespace std;
 
@@ -29,7 +32,7 @@ public:
 
   THcHitList();
 
-  virtual Int_t DecodeToHitList( const THaEvData&, Bool_t suppress=kFALSE );
+  virtual Int_t DecodeToHitList( const THaEvData& evdata, Bool_t suppress=kFALSE );
   void          InitHitList(THaDetMap* detmap,
 			    const char *hitclass, Int_t maxhits,
 			    Int_t tdcref_cut=0, Int_t adcref_cut=0);
@@ -76,6 +79,12 @@ protected:
   Int_t fNTDCRef_miss;
   Int_t fNADCRef_miss;
 
+  Decoder::THaCrateMap* fMap;	/* The Crate map */
+  Int_t fTISlot;
+  Int_t fTICrate;
+  std::map<Int_t, Int_t> fTrigTimeShiftMap;
+  std::map<Int_t, Decoder::Fadc250Module*> fFADCSlotMap;
+
   ClassDef(THcHitList,0);  // List of raw hits sorted by plane, counter
 };
 #endif