diff --git a/src/THcDriftChamberPlane.cxx b/src/THcDriftChamberPlane.cxx
index 61d11227e57833af6b0d2371f664eea1a438d41a..5f14d7300a1459eb21f719500a27295e11c3ce44 100644
--- a/src/THcDriftChamberPlane.cxx
+++ b/src/THcDriftChamberPlane.cxx
@@ -316,7 +316,7 @@ Int_t THcDriftChamberPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
     for(UInt_t mhit=0; mhit<hit->fNHits; mhit++) {
       fNRawhits++;
       /* Sort into early, late and ontime */
-      Int_t rawtdc = hit->fTDC[mhit];
+      Int_t rawtdc = hit->GetRawData(0,mhit);
       if((rawtdc-reftime) < fTdcWinMin) {
 	// Increment early counter  (Actually late because TDC is backward)
       } else if ((rawtdc-reftime) > fTdcWinMax) {
diff --git a/src/THcHitList.cxx b/src/THcHitList.cxx
index 94b6d7b727e3ea501216aab319541bdb152e7197..9363cbe90b37f3664a84c882d7085e28bcd53267 100644
--- a/src/THcHitList.cxx
+++ b/src/THcHitList.cxx
@@ -36,8 +36,58 @@ void THcHitList::InitHitList(THaDetMap* detmap,
   for(Int_t i=0;i<maxhits;i++) {
     fRawHitList->ConstructedAt(i);
   }
-  
+
   fdMap = detmap;
+
+  /* Pull out all the reference channels */
+  fNRefIndex = 0;
+  fRefIndexMaps.clear();
+  /* Find the biggest refindex */
+  for (Int_t i=0; i < fdMap->GetSize(); i++) {
+    THaDetMap::Module* d = fdMap->GetModule(i);
+    if(d->plane >= 1000) {
+      Int_t refindex = d->signal;
+      if(refindex>=fNRefIndex) {
+	fNRefIndex = refindex+1;
+      }
+    }
+  }
+  // Create the vector.  Could roll this into last loop
+  for(Int_t i=0;i<fNRefIndex;i++) {
+    RefIndexMap map;
+    map.defined = kFALSE;
+    map.hashit = kFALSE;
+    fRefIndexMaps.push_back(map);
+  }
+  // Put the refindex mapping information in the vector
+  for (Int_t i=0; i < fdMap->GetSize(); i++) {
+    THaDetMap::Module* d = fdMap->GetModule(i);
+    if(d->plane >= 1000) {	// This is a reference time definition
+      Int_t refindex = d->signal;
+      if(refindex >= 0) {
+	fRefIndexMaps[refindex].crate = d->crate;
+	fRefIndexMaps[refindex].slot = d->slot;
+	fRefIndexMaps[refindex].channel = d->lo;
+	fRefIndexMaps[refindex].defined = kTRUE;
+      } else {
+	cout << "Hitlist: Invalid refindex mapping" << endl;
+      }
+    }
+  }
+  // Should add another loop over fdMap and check that all detector
+  // channels that have a refindex, use a defined index
+  for (Int_t i=0; i < fdMap->GetSize(); i++) {
+    THaDetMap::Module* d = fdMap->GetModule(i);
+    if(d->plane < 1000) {
+      Int_t refindex = d->refindex;
+      if(!fRefIndexMaps[refindex].defined) {
+	cout << "Refindex " << refindex << " not defined for " <<
+		" (" << d->crate << ", " << d->slot <<
+		", " << d->lo << ")" << endl;
+      }
+    }
+  }
+	  
 }
 
 Int_t THcHitList::DecodeToHitList( const THaEvData& evdata ) {
@@ -53,26 +103,43 @@ Int_t THcHitList::DecodeToHitList( const THaEvData& evdata ) {
   fRawHitList->Clear( );
   fNRawHits = 0;
 
+  // Get the indexed reference times for this event
+  for(Int_t i=0;i<fNRefIndex;i++) {
+    if(fRefIndexMaps[i].defined) {
+      if(evdata.GetNumHits(fRefIndexMaps[i].crate,
+			   fRefIndexMaps[i].slot,
+			   fRefIndexMaps[i].channel) > 0) {
+	// Only take first hit in this reference channel
+	fRefIndexMaps[i].reftime =
+	  evdata.GetData(fRefIndexMaps[i].crate,fRefIndexMaps[i].slot,
+			 fRefIndexMaps[i].channel,0);
+	fRefIndexMaps[i].hashit = kTRUE;
+      } else {
+	fRefIndexMaps[i].hashit = kFALSE;
+      }
+    }
+  }
   for ( Int_t i=0; i < fdMap->GetSize(); i++ ) {
     THaDetMap::Module* d = fdMap->GetModule(i);
 
     // Loop over all channels that have a hit.
     //    cout << "Crate/Slot: " << d->crate << "/" << d->slot << endl;
+    Int_t plane = d->plane;
+    if (plane >= 1000) continue; // Skip reference times
+    Int_t signal = d->signal;
     for ( Int_t j=0; j < evdata.GetNumChan( d->crate, d->slot); j++) {
       THcRawHit* rawhit=0;
-      
+
       Int_t chan = evdata.GetNextChan( d->crate, d->slot, j );
       if( chan < d->lo || chan > d->hi ) continue;     // Not one of my channels
-      
+
       // Need to convert crate, slot, chan into plane, counter, signal
       // Search hitlist for this plane,counter,signal
-      Int_t plane = d->plane;
-      Int_t signal = d->signal;
       Int_t counter = d->reverse ? d->first + d->hi - chan : d->first + chan - d->lo;
       //cout << d->crate << " " << d->slot << " " << chan << " " << plane << " "
       // << counter << " " << signal << endl;
       // Search hit list for plane and counter
-      // We could do sorting 
+      // We could do sorting
       UInt_t thishit = 0;
       while(thishit < fNRawHits) {
 	rawhit = (THcRawHit*) (*fRawHitList)[thishit];
@@ -90,7 +157,7 @@ Int_t THcHitList::DecodeToHitList( const THaEvData& evdata ) {
 	rawhit->fPlane = plane;
 	rawhit->fCounter = counter;
       }
-	
+
       // Get the data from this channel
       // Allow for multiple hits
       Int_t nMHits = evdata.GetNumHits(d->crate, d->slot, chan);
@@ -100,11 +167,23 @@ Int_t THcHitList::DecodeToHitList( const THaEvData& evdata ) {
 	rawhit->SetData(signal,data);
       }
       // Get the reference time.  Only take the first hit
+      // If a reference channel
+      // was specified, it takes precidence of reference index
       if(d->refchan >= 0) {
 	if( evdata.GetNumHits(d->crate,d->slot,d->refchan) > 0) {
 	  Int_t reftime = evdata.GetData(d->crate, d->slot, d->refchan, 0);
 	  rawhit->SetReference(signal, reftime);
 	}
+      } else {
+	if(d->refindex >=0 && d->refindex < fNRefIndex) {
+	  if(fRefIndexMaps[d->refindex].hashit) {
+	    rawhit->SetReference(signal, fRefIndexMaps[d->refindex].reftime);
+	  } else {
+	    cout << "HitList: refindex " << d->refindex <<
+	      " missing for (" << d->crate << ", " << d->slot <<
+	      ", " << chan << ")" << endl;
+	  }
+	}
       }
     }
   }
diff --git a/src/THcHitList.h b/src/THcHitList.h
index 27c299745591c5ade46900c7ccf638f6057eb5fd..0b84cc14a5e4dcad5c49fbd8bb25f3a14a77e3bb 100644
--- a/src/THcHitList.h
+++ b/src/THcHitList.h
@@ -41,6 +41,20 @@ public:
 
 protected:
 
+  struct RefIndexMap { // Mapping for one reference channel
+    Bool_t defined;
+    Bool_t hashit;
+    Int_t crate;
+    Int_t slot;
+    Int_t channel;
+    Int_t reftime;
+  };
+  std::vector<RefIndexMap> fRefIndexMaps;
+  // Should this be a sparse list instead in case user
+  // picks ridiculously large refindexes?
+
+  Int_t fNRefIndex;
+
   ClassDef(THcHitList,0);  // List of raw hits sorted by plane, counter
 };
 #endif
diff --git a/src/THcRawDCHit.cxx b/src/THcRawDCHit.cxx
index 174e7916333dd6d99ddcd59b7ba652b5490986e6..078a6de015a107846ac18ff511c8be55f26c3e24 100644
--- a/src/THcRawDCHit.cxx
+++ b/src/THcRawDCHit.cxx
@@ -17,6 +17,19 @@ void THcRawDCHit::SetData(Int_t signal, Int_t data) {
 
 // Return just the first hit
 Int_t THcRawDCHit::GetData(Int_t signal) {
+  if(fNHits>0) {
+    if(fHasRef) {
+      return(fTDC[0]-fReferenceTime);
+    } else {
+      return(fTDC[0]);
+    }
+  } else {
+    return(-1);
+  }
+}
+
+// Return just the first hit
+Int_t THcRawDCHit::GetRawData(Int_t signal) {
   if(fNHits>0) {
     return(fTDC[0]);
   } else {
@@ -24,8 +37,21 @@ Int_t THcRawDCHit::GetData(Int_t signal) {
   }
 }
 
-// Return a requested hit
+// Return a requested hit with reference time subtracted
 Int_t THcRawDCHit::GetData(Int_t signal, UInt_t ihit) {
+  if(ihit >=0 && ihit< fNHits) {
+    if(fHasRef) {
+      return(fTDC[ihit]-fReferenceTime);
+    } else {
+      return(fTDC[ihit]);
+    }
+  } else {
+    return(-1);
+  }
+}
+
+// Return a requested raw hit
+Int_t THcRawDCHit::GetRawData(Int_t signal, UInt_t ihit) {
   if(ihit >=0 && ihit< fNHits) {
     return(fTDC[ihit]);
   } else {
diff --git a/src/THcRawDCHit.h b/src/THcRawDCHit.h
index 305a89b9d3d0c4ef5d8faabe0c0434fba6660b42..577dedc7819f43e344c55bce130de1f43d80f0c9 100644
--- a/src/THcRawDCHit.h
+++ b/src/THcRawDCHit.h
@@ -23,6 +23,8 @@ public:
   void SetReference(Int_t signal, Int_t reference);
   Int_t GetData(Int_t signal);
   Int_t GetData(Int_t signal, UInt_t ihit);
+  Int_t GetRawData(Int_t signal);
+  Int_t GetRawData(Int_t signal, UInt_t ihit);
   Int_t GetReference(Int_t signal);
   
 
diff --git a/src/THcRawHit.h b/src/THcRawHit.h
index dc0cbd3196578f807cc29337f65896beb2bc55d6..dd4a100dd988f91c955de024ffb509cc01f6a828 100644
--- a/src/THcRawHit.h
+++ b/src/THcRawHit.h
@@ -26,7 +26,8 @@ public:
   //  virtual Bool_t  operator!=( const THcRawHit& ) = 0;
 
   virtual void SetData(Int_t signal, Int_t data) {};
-  virtual Int_t GetData(Int_t signal) {return 0;};
+  virtual Int_t GetData(Int_t signal) {return 0;}; /* Ref time subtracted */
+  virtual Int_t GetRawData(Int_t signal) {return 0;} /* Ref time not subtracted */
   virtual void SetReference(Int_t signal, Int_t reference) {};
   virtual Bool_t HasReference(Int_t signal) {return fHasRef;};
   virtual Int_t GetReference(Int_t signal) {return 0;};