diff --git a/Makefile b/Makefile
index 6fc33b4ce9637eb00322f162a4d98febd8204d88..ebcb3cd48a3e420cb45ab5b6c187b9592270083a 100644
--- a/Makefile
+++ b/Makefile
@@ -10,8 +10,9 @@
 
 SRC  =  src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \
 	src/THcHodoscopeHit.cxx src/THcRawHit.cxx \
+	src/THcDCHit.cxx \
 	src/THcHitList.cxx src/THcDetectorMap.cxx src/THcHodoscope.cxx \
-	src/THcHallCSpectrometer.cxx
+	src/THcHallCSpectrometer.cxx src/THcDriftChamber.cxx
 
 # Name of your package. 
 # The shared library that will be built will get the name lib$(PACKAGE).so
diff --git a/src/HallC_LinkDef.h b/src/HallC_LinkDef.h
index c743ba4415e2e4761787b7f6aa5e054b3b58963d..5ac786ee830989c3e66977412713011f7352976e 100644
--- a/src/HallC_LinkDef.h
+++ b/src/HallC_LinkDef.h
@@ -12,8 +12,10 @@
 #pragma link C++ class THcAnalyzer+;
 #pragma link C++ class THcRawHit+;
 #pragma link C++ class THcHodoscopeHit+;
+#pragma link C++ class THcDCHit+;
 #pragma link C++ class THcHitList+;
 #pragma link C++ class THcHodoscope+;
+#pragma link C++ class THcDriftChamber+;
 #pragma link C++ class THcDetectorMap+;
 #pragma link C++ class THcHallCSpectrometer+;
 
diff --git a/src/THcDCHit.cxx b/src/THcDCHit.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..261245a6399bd9b4eda92bf35fc3003694676cbd
--- /dev/null
+++ b/src/THcDCHit.cxx
@@ -0,0 +1,78 @@
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcDCHit                                                                  //
+//                                                                           //
+// Class representing for drift chamber wire (or other device with           //
+//   a single multihit TDC channel per detector element                      //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "THcDCHit.h"
+
+using namespace std;
+
+
+void THcDCHit::SetData(Int_t signal, Int_t data) {
+  fTDC[fNHits++] = data;
+}
+
+// Return just the first hit
+Int_t THcDCHit::GetData(Int_t signal) {
+  if(fNHits>0) {
+    return(fTDC[0]);
+  } else {
+    return(-1);
+  }
+}
+
+// Return a requested hit
+Int_t THcDCHit::GetData(Int_t signal, Int_t ihit) {
+  if(ihit >=0 && ihit< fNHits) {
+    return(fTDC[ihit]);
+  } else {
+    return(-1);
+  }
+}
+
+
+Int_t THcDCHit::Compare(const TObject* obj) const
+{
+  // Compare to sort by plane and counter
+  // Should we be able to move this into THcRawHit
+
+  const THcDCHit* hit = dynamic_cast<const THcDCHit*>(obj);
+
+  if(!hit) return -1;
+  Int_t p1 = fPlane;
+  Int_t p2 = hit->fPlane;
+  if(p1 < p2) return -1;
+  else if(p1 > p2) return 1;
+  else {
+    Int_t c1 = fCounter;
+    Int_t c2 = hit->fCounter;
+    if(c1 < c2) return -1;
+    else if (c1 == c2) return 0;
+    else return 1;
+  }
+}
+//_____________________________________________________________________________
+THcDCHit& THcDCHit::operator=( const THcDCHit& rhs )
+{
+  // Assignment operator.
+
+  THcRawHit::operator=(rhs);
+  if ( this != &rhs ) {
+    fPlane = rhs.fPlane;
+    fCounter = rhs.fCounter;
+    fNHits = rhs.fNHits;
+    for(Int_t ihit=0;ihit<fNHits;ihit++) {
+      fTDC[ihit] = rhs.fTDC[ihit];
+    }
+  }
+  return *this;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+ClassImp(THcDCHit)
+
diff --git a/src/THcDCHit.h b/src/THcDCHit.h
new file mode 100644
index 0000000000000000000000000000000000000000..5523c79770c9a39f9a83c336faff7a330f4ed50f
--- /dev/null
+++ b/src/THcDCHit.h
@@ -0,0 +1,37 @@
+#ifndef ROOT_THcDCHit
+#define ROOT_THcDCHit
+
+#include "THcRawHit.h"
+
+#define MAXHITS 16
+
+class THcDCHit : public THcRawHit {
+
+ public:
+
+ THcDCHit(Int_t plane=0, Int_t counter=0) : THcRawHit(plane, counter), 
+    fNHits(0) {
+  }
+  THcDCHit& operator=( const THcDCHit& );
+  virtual ~THcDCHit() {}
+
+  virtual void Clear( Option_t* opt="" ) { fNHits=0; }
+
+  void SetData(Int_t signal, Int_t data);
+  Int_t GetData(Int_t signal);
+  Int_t GetData(Int_t signal, Int_t ihit);
+
+  virtual Bool_t  IsSortable () const {return kTRUE; }
+  virtual Int_t   Compare(const TObject* obj) const;
+
+  Int_t fNHits;
+  Int_t fTDC[MAXHITS];
+
+ protected:
+
+ private:
+
+  ClassDef(THcDCHit, 0);	// DC hit class
+};  
+
+#endif
diff --git a/src/THcDetectorMap.cxx b/src/THcDetectorMap.cxx
index 5a9214ffe6b7f2244e9fc1cce463e5de95ef81b4..24ba354a105a37ccbc7ecffe62f500a5324a2137 100644
--- a/src/THcDetectorMap.cxx
+++ b/src/THcDetectorMap.cxx
@@ -33,7 +33,7 @@ inline static bool IsComment( const string& s, string::size_type pos )
 }
 
 //_____________________________________________________________________________
-THcDetectorMap::THcDetectorMap() : fNchans(0)
+THcDetectorMap::THcDetectorMap() : fNchans(0), fNIDs(0)
 {
 }
 
@@ -64,25 +64,18 @@ Int_t THcDetectorMap::FillMap(THaDetMap *detmap, const char *detectorname)
   // Translate detector name into and ID
   // For now just long if then else.  Could get it from the comments
   // at the beginning of the map file.
-  Int_t did;
-  if(strcasecmp(detectorname,"HDC")==0) {
-    did = 1;
-  } else if (strcasecmp(detectorname,"HSCIN")==0) {
-    did = 2;
-  } else if (strcasecmp(detectorname,"HCER")==0) {
-    did = 3;
-  } else if (strcasecmp(detectorname,"HCAL")==0) {
-    did = 4;
-  } else if (strcasecmp(detectorname,"HMISC")==0) {
-    did = 5;
-  } else if (strcasecmp(detectorname,"GMISC")==0) {
-    did = 6;
-  } else if (strcasecmp(detectorname,"HAERO")==0) {
-    did = 7;
-  } else {
+  Int_t did=-1;
+  for(Int_t i=0; i < fNIDs; i++) {
+    if(strcasecmp(detectorname,fIDMap[i].name) == 0) {
+      did = fIDMap[i].id;
+      break;
+    }
+  }
+  if(did < 0) {
+    cout << "FillMap Error: No detector ID registered for " << detectorname << endl;
+    cout << "     Using detector id of 0" << endl;
     did = 0;
   }
-  // Start SHMS with S?  What about SOS?
 
   mlist.clear();
   //  cout << "fNchans=" << fNchans << endl;
@@ -207,10 +200,24 @@ void THcDetectorMap::Load(const char *fname)
 
   while(getline(ifile,line)) {
     // BLank line or comment
-    if(line.empty()
-       || (start = line.find_first_not_of( whtspc )) == string::npos
-       || IsComment(line, start) )
+    if(line.empty()) continue;
+    if((start = line.find_first_not_of( whtspc )) == string::npos) continue;
+    if(IsComment(line, start)) { // Check for ID assignments
+      // Get rid of all white space
+      while((pos=line.find_first_of(whtspc)) != string::npos) {
+	line.erase(pos,1);
+      }
+      line.erase(0,1);	// Erase "!"
+      if(! ((pos=line.find("_ID=")) == string::npos)) {
+	fIDMap[fNIDs].name = new char [pos+1];
+	strncpy(fIDMap[fNIDs].name,line.c_str(),pos);
+	fIDMap[fNIDs].name[pos] = '\0';
+	start = (pos += 4); // Move to after "="
+	while(isdigit(line.at(pos++)));
+	fIDMap[fNIDs++].id = atoi(line.substr(start,pos).c_str());
+      }
       continue;
+    }
 
     //    cout << "MAPA: " << line << endl;
 
@@ -294,6 +301,12 @@ void THcDetectorMap::Load(const char *fname)
       fNchans++;
     }
   }
+  cout << endl << "   Detector ID Map" << endl << endl;
+  for(Int_t i=0; i < fNIDs; i++) {
+    cout << i << " ";
+    cout << fIDMap[i].name << " " << fIDMap[i].id << endl;
+  }
+  cout << endl;
 
 }
 
diff --git a/src/THcDetectorMap.h b/src/THcDetectorMap.h
index d78df9035b79b3e6752ce97fc66759e4b96a8dc9..1dd95b2471267ffd7dee8ef096caf6e381b2091b 100644
--- a/src/THcDetectorMap.h
+++ b/src/THcDetectorMap.h
@@ -49,6 +49,13 @@ class THcDetectorMap : public TObject {
   };
   std::list<ModChanList> mlist;
 
+  struct IDMap {
+    char* name;
+    Int_t id;
+  };
+  IDMap fIDMap[50];
+  Int_t fNIDs;			/* Number of detector IDs */
+
   bool compare(const ChaninMod *first, const ChaninMod *second);
 
  protected:
diff --git a/src/THcDriftChamber.cxx b/src/THcDriftChamber.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..2e8881df5333d56685e8084833ba368f400d9c54
--- /dev/null
+++ b/src/THcDriftChamber.cxx
@@ -0,0 +1,297 @@
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcDriftChamber                                                              //
+//                                                                           //
+// Class for a generic hodoscope consisting of multiple                      //
+// planes with multiple paddles with phototubes on both ends.                //
+// This differs from Hall A scintillator class in that it is the whole       //
+// hodoscope array, not just one plane.                                      //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "THcDriftChamber.h"
+#include "THaEvData.h"
+#include "THaDetMap.h"
+#include "THcDetectorMap.h"
+#include "THcGlobals.h"
+#include "THcParmList.h"
+#include "VarDef.h"
+#include "VarType.h"
+#include "THaTrack.h"
+#include "TClonesArray.h"
+#include "TMath.h"
+
+#include "THaTrackProj.h"
+
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+
+using namespace std;
+
+//_____________________________________________________________________________
+THcDriftChamber::THcDriftChamber( const char* name, const char* description,
+				  THaApparatus* apparatus ) :
+  THaNonTrackingDetector(name,description,apparatus)
+{
+  // Constructor
+
+  fTrackProj = new TClonesArray( "THaTrackProj", 5 );
+}
+
+//_____________________________________________________________________________
+THcDriftChamber::THcDriftChamber( ) :
+  THaNonTrackingDetector()
+{
+  // Constructor
+}
+
+//_____________________________________________________________________________
+THaAnalysisObject::EStatus THcDriftChamber::Init( const TDatime& date )
+{
+  static const char* const here = "Init()";
+
+  if( THaNonTrackingDetector::Init( date ) )
+    return fStatus;
+
+  // Replace with what we need for Hall C
+  //  const DataDest tmp[NDEST] = {
+  //    { &fRTNhit, &fRANhit, fRT, fRT_c, fRA, fRA_p, fRA_c, fROff, fRPed, fRGain },
+  //    { &fLTNhit, &fLANhit, fLT, fLT_c, fLA, fLA_p, fLA_c, fLOff, fLPed, fLGain }
+  //  };
+  //  memcpy( fDataDest, tmp, NDEST*sizeof(DataDest) );
+
+  // Should probably put this in ReadDatabase as we will know the
+  // maximum number of hits after setting up the detector map
+
+  THcHitList::InitHitList(fDetMap, "THcDCHit", 1000);
+
+  // Will need to determine which apparatus it belongs to and use the
+  // appropriate detector ID in the FillMap call
+  if( gHcDetectorMap->FillMap(fDetMap, "HDC") < 0 ) {
+    Error( Here(here), "Error filling detectormap for %s.", 
+	     "HSCIN");
+      return kInitError;
+  }
+
+  return fStatus = kOK;
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamber::ReadDatabase( const TDatime& date )
+{
+  // Read this detector's parameters from the database file 'fi'.
+  // This function is called by THaDetectorBase::Init() once at the
+  // beginning of the analysis.
+  // 'date' contains the date/time of the run being analyzed.
+
+  //  static const char* const here = "ReadDatabase()";
+
+  // Read data from database 
+  // Pull values from the THcParmList instead of reading a database
+  // file like Hall A does.
+
+  //  DBRequest list[] = {
+  //    { "TDC_offsetsL", fLOff, kDouble, fNelem },
+  //    { "TDC_offsetsR", fROff, kDouble, fNelem },
+  //    { "ADC_pedsL", fLPed, kDouble, fNelem },
+  //    { "ADC_pedsR", fRPed, kDouble, fNelem },
+  //    { "ADC_coefL", fLGain, kDouble, fNelem },
+  //    { "ADC_coefR", fRGain, kDouble, fNelem },
+  //    { "TDC_res",   &fTdc2T },
+  //    { "TransSpd",  &fCn },
+  //    { "AdcMIP",    &fAdcMIP },
+  //    { "NTWalk",    &fNTWalkPar, kInt },
+  //    { "Timewalk",  fTWalkPar, kDouble, 2*fNelem },
+  //    { "ReTimeOff", fTrigOff, kDouble, fNelem },
+  //    { "AvgRes",    &fResolution },
+  //    { "Atten",     &fAttenuation },
+  //    { 0 }
+  //  };
+
+  // We will probably want to add some kind of method to gHcParms to allow
+  // bulk retrieval of parameters of interest.
+
+  // Will need to determine which spectrometer in order to construct
+  // the parameter names (e.g. hscin_1x_nr vs. sscin_1x_nr)
+
+  fNPlanes = *(Int_t *)gHcParms->Find("hdc_num_planes")->GetValuePointer();
+
+  fNWires = new Int_t [fNPlanes];
+  Int_t* p= (Int_t *)gHcParms->Find("hdc_nrwire")->GetValuePointer();
+  for(Int_t i=0;i<fNPlanes;i++) {
+    fNWires[i] = p[i];
+  }
+
+  fIsInit = true;
+
+  return kOK;
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamber::DefineVariables( EMode mode )
+{
+  // Initialize global variables and lookup table for decoder
+
+  if( mode == kDefine && fIsSetup ) return kOK;
+  fIsSetup = ( mode == kDefine );
+
+  // Register variables in global list
+
+  //  RVarDef vars[] = {
+  //    { "nlthit", "Number of Left paddles TDC times",  "fLTNhit" },
+  //    { "nrthit", "Number of Right paddles TDC times", "fRTNhit" },
+  //    { "nlahit", "Number of Left paddles ADCs amps",  "fLANhit" },
+  //    { "nrahit", "Number of Right paddles ADCs amps", "fRANhit" },
+  //    { "lt",     "TDC values left side",              "fLT" },
+  //    { "lt_c",   "Corrected times left side",         "fLT_c" },
+  //    { "rt",     "TDC values right side",             "fRT" },
+  //    { "rt_c",   "Corrected times right side",        "fRT_c" },
+  //    { "la",     "ADC values left side",              "fLA" },
+  //    { "la_p",   "Corrected ADC values left side",    "fLA_p" },
+  //    { "la_c",   "Corrected ADC values left side",    "fLA_c" },
+  //    { "ra",     "ADC values right side",             "fRA" },
+  //    { "ra_p",   "Corrected ADC values right side",   "fRA_p" },
+  //    { "ra_c",   "Corrected ADC values right side",   "fRA_c" },
+  //    { "nthit",  "Number of paddles with l&r TDCs",   "fNhit" },
+  //    { "t_pads", "Paddles with l&r coincidence TDCs", "fHitPad" },
+  //    { "y_t",    "y-position from timing (m)",        "fYt" },
+  //    { "y_adc",  "y-position from amplitudes (m)",    "fYa" },
+  //    { "time",   "Time of hit at plane (s)",          "fTime" },
+  //    { "dtime",  "Est. uncertainty of time (s)",      "fdTime" },
+  //    { "dedx",   "dEdX-like deposited in paddle",     "fAmpl" },
+  //    { "troff",  "Trigger offset for paddles",        "fTrigOff"},
+  //    { "trn",    "Number of tracks for hits",         "GetNTracks()" },
+  //    { "trx",    "x-position of track in det plane",  "fTrackProj.THaTrackProj.fX" },
+  //    { "try",    "y-position of track in det plane",  "fTrackProj.THaTrackProj.fY" },
+  //    { "trpath", "TRCS pathlen of track to det plane","fTrackProj.THaTrackProj.fPathl" },
+  //    { "trdx",   "track deviation in x-position (m)", "fTrackProj.THaTrackProj.fdX" },
+  //    { "trpad",  "paddle-hit associated with track",  "fTrackProj.THaTrackProj.fChannel" },
+  //    { 0 }
+  //  };
+  //  return DefineVarsFromList( vars, mode );
+  return kOK;
+}
+
+//_____________________________________________________________________________
+THcDriftChamber::~THcDriftChamber()
+{
+  // Destructor. Remove variables from global list.
+
+  if( fIsSetup )
+    RemoveVariables();
+  if( fIsInit )
+    DeleteArrays();
+  if (fTrackProj) {
+    fTrackProj->Clear();
+    delete fTrackProj; fTrackProj = 0;
+  }
+}
+
+//_____________________________________________________________________________
+void THcDriftChamber::DeleteArrays()
+{
+  // Delete member arrays. Used by destructor.
+
+  delete [] fNWires;  fNWires = NULL;
+  //  delete [] fSpacing;  fSpacing = NULL;
+  //  delete [] fCenter;   fCenter = NULL; // This 2D. What is correct way to delete?
+
+  //  delete [] fRA_c;    fRA_c    = NULL;
+  //  delete [] fRA_p;    fRA_p    = NULL;
+  //  delete [] fRA;      fRA      = NULL;
+  //  delete [] fLA_c;    fLA_c    = NULL;
+  //  delete [] fLA_p;    fLA_p    = NULL;
+  //  delete [] fLA;      fLA      = NULL;
+  //  delete [] fRT_c;    fRT_c    = NULL;
+  //  delete [] fRT;      fRT      = NULL;
+  //  delete [] fLT_c;    fLT_c    = NULL;
+  //  delete [] fLT;      fLT      = NULL;
+  
+  //  delete [] fRGain;   fRGain   = NULL;
+  //  delete [] fLGain;   fLGain   = NULL;
+  //  delete [] fRPed;    fRPed    = NULL;
+  //  delete [] fLPed;    fLPed    = NULL;
+  //  delete [] fROff;    fROff    = NULL;
+  //  delete [] fLOff;    fLOff    = NULL;
+  //  delete [] fTWalkPar; fTWalkPar = NULL;
+  //  delete [] fTrigOff; fTrigOff = NULL;
+
+  //  delete [] fHitPad;  fHitPad  = NULL;
+  //  delete [] fTime;    fTime    = NULL;
+  //  delete [] fdTime;   fdTime   = NULL;
+  //  delete [] fYt;      fYt      = NULL;
+  //  delete [] fYa;      fYa      = NULL;
+}
+
+//_____________________________________________________________________________
+inline 
+void THcDriftChamber::ClearEvent()
+{
+  // Reset per-event data.
+
+  fTrackProj->Clear();
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamber::Decode( const THaEvData& evdata )
+{
+
+  // Get the Hall C style hitlist (fRawHitList) for this event
+  Int_t nhits = THcHitList::DecodeToHitList(evdata);
+
+  // fRawHitList is TClones array of THcDCHit objects
+  for(Int_t ihit = 0; ihit < fNRawHits ; ihit++) {
+    THcDCHit* hit = (THcDCHit *) fRawHitList->At(ihit);
+    cout << ihit << " : " << hit->fPlane << ":" << hit->fCounter << " : "
+	 << endl;
+    for(Int_t imhit = 0; imhit < hit->fNHits; imhit++) {
+      cout << "                     " << imhit << " " << hit->fTDC[imhit]
+	   << endl;
+    }
+  }
+  cout << endl;
+
+  return nhits;
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamber::ApplyCorrections( void )
+{
+  return(0);
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamber::CoarseProcess( TClonesArray& /* tracks */ )
+{
+  // Calculation of coordinates of particle track cross point with scint
+  // plane in the detector coordinate system. For this, parameters of track 
+  // reconstructed in THaVDC::CoarseTrack() are used.
+  //
+  // Apply corrections and reconstruct the complete hits.
+  //
+  //  static const Double_t sqrt2 = TMath::Sqrt(2.);
+  
+  ApplyCorrections();
+
+  return 0;
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamber::FineProcess( TClonesArray& tracks )
+{
+  // Reconstruct coordinates of particle track cross point with scintillator
+  // plane, and copy the data into the following local data structure:
+  //
+  // Units of measurements are meters.
+
+  // Calculation of coordinates of particle track cross point with scint
+  // plane in the detector coordinate system. For this, parameters of track 
+  // reconstructed in THaVDC::FineTrack() are used.
+
+  return 0;
+}
+
+ClassImp(THcDriftChamber)
+////////////////////////////////////////////////////////////////////////////////
diff --git a/src/THcDriftChamber.h b/src/THcDriftChamber.h
new file mode 100644
index 0000000000000000000000000000000000000000..b9f7be4e68c9e8ddd9899a9af31cc7ac90237e73
--- /dev/null
+++ b/src/THcDriftChamber.h
@@ -0,0 +1,79 @@
+#ifndef ROOT_THcDriftChamber
+#define ROOT_THcDriftChamber
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcDriftChamber                                                           //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "TClonesArray.h"
+#include "THaNonTrackingDetector.h"
+#include "THcHitList.h"
+#include "THcDCHit.h"
+
+class THaScCalib;
+
+class THcDriftChamber : public THaNonTrackingDetector, public THcHitList {
+
+public:
+  THcDriftChamber( const char* name, const char* description = "",
+		   THaApparatus* a = NULL );
+  virtual ~THcDriftChamber();
+
+  virtual Int_t      Decode( const THaEvData& );
+  virtual EStatus    Init( const TDatime& run_time );
+  virtual Int_t      CoarseProcess( TClonesArray& tracks );
+  virtual Int_t      FineProcess( TClonesArray& tracks );
+  
+  virtual Int_t      ApplyCorrections( void );
+
+  //  Int_t GetNHits() const { return fNhit; }
+  
+  Int_t GetNTracks() const { return fTrackProj->GetLast()+1; }
+  const TClonesArray* GetTrackHits() const { return fTrackProj; }
+  
+  friend class THaScCalib;
+
+  THcDriftChamber();  // for ROOT I/O
+protected:
+
+  // Calibration
+
+  // Per-event data
+
+
+  // Potential Hall C parameters.  Mostly here for demonstration
+  Int_t fNPlanes;
+  Int_t* fNWires;		// Number of wires per plane
+
+  TClonesArray*  fTrackProj;  // projection of track onto scintillator plane
+                              // and estimated match to TOF paddle
+  // Useful derived quantities
+  // double tan_angle, sin_angle, cos_angle;
+  
+  //  static const char NDEST = 2;
+  //  struct DataDest {
+  //    Int_t*    nthit;
+  //    Int_t*    nahit;
+  //    Double_t*  tdc;
+  //    Double_t*  tdc_c;
+  //    Double_t*  adc;
+  //    Double_t*  adc_p;
+  //    Double_t*  adc_c;
+  //    Double_t*  offset;
+  //    Double_t*  ped;
+  //    Double_t*  gain;
+  //  } fDataDest[NDEST];     // Lookup table for decoder
+
+  void           ClearEvent();
+  void           DeleteArrays();
+  virtual Int_t  ReadDatabase( const TDatime& date );
+  virtual Int_t  DefineVariables( EMode mode = kDefine );
+
+  ClassDef(THcDriftChamber,0)   // Generic hodoscope class
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+#endif
diff --git a/src/THcHitList.cxx b/src/THcHitList.cxx
index 9a1303b7c9e7a314f3612548d487d78502367db3..81464d6ec6aff6984bc571bb88a2ef3ef62674f4 100644
--- a/src/THcHitList.cxx
+++ b/src/THcHitList.cxx
@@ -11,6 +11,8 @@
 //////////////////////////////////////////////////////////////////////////
 
 #include "THcHitList.h"
+#include "TError.h"
+#include "TClass.h"
 
 using namespace std;
 
@@ -35,7 +37,15 @@ void THcHitList::InitHitList(THaDetMap* detmap,
   fNMaxRawHits = maxhits;
   fNRawHits = 0;
   for(Int_t i=0;i<maxhits;i++) {
+#if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0)
     fRawHitList->ConstructedAt(i);
+#else
+  // The essence of the ConstructedAt code explictly
+    TObject* obj = (*fRawHitList)[i];
+    R__ASSERT( obj );  // should never happen ...
+    if( !obj->TestBit(TObject::kNotDeleted) )
+      fRawHitClass->New(obj);
+#endif
   }
   
   fdMap = detmap;
diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx
index ede928973ca182ae81a02979ab4a6037f0b33bd5..b70ac6c2c6d2170bb7000da1b8baae2f632d3a6c 100644
--- a/src/THcHodoscope.cxx
+++ b/src/THcHodoscope.cxx
@@ -71,7 +71,7 @@ THaAnalysisObject::EStatus THcHodoscope::Init( const TDatime& date )
   // appropriate detector ID in the FillMap call
   if( gHcDetectorMap->FillMap(fDetMap, "HSCIN") < 0 ) {
     Error( Here(here), "Error filling detectormap for %s.", 
-	     "detectorname");
+	     "HSCIN");
       return kInitError;
   }
 
diff --git a/src/THcHodoscopeHit.cxx b/src/THcHodoscopeHit.cxx
index 1a34c8bc8081f7925fe3ae026400cd1069a4fbd1..9e3ea84e1dc023c6da80218f36b880d638c7ea1c 100644
--- a/src/THcHodoscopeHit.cxx
+++ b/src/THcHodoscopeHit.cxx
@@ -38,6 +38,7 @@ Int_t THcHodoscopeHit::GetData(Int_t signal) {
   return(-1); // Actually should throw exception
 }
 
+#if 0
 Int_t THcHodoscopeHit::Compare(const TObject* obj) const
 {
   // Compare to sort by plane and counter
@@ -57,6 +58,7 @@ Int_t THcHodoscopeHit::Compare(const TObject* obj) const
     else return 1;
   }
 }
+#endif
 //_____________________________________________________________________________
 THcHodoscopeHit& THcHodoscopeHit::operator=( const THcHodoscopeHit& rhs )
 {
diff --git a/src/THcHodoscopeHit.h b/src/THcHodoscopeHit.h
index f8ce97b90c29cf7dc7ebda5018dd8b1029261fc0..0bac2d1a1f9a231325dfb83a2a31e58f1ef95e67 100644
--- a/src/THcHodoscopeHit.h
+++ b/src/THcHodoscopeHit.h
@@ -20,8 +20,8 @@ class THcHodoscopeHit : public THcRawHit {
   void SetData(Int_t signal, Int_t data);
   Int_t GetData(Int_t signal);
 
-  virtual Bool_t  IsSortable () const {return kTRUE; }
-  virtual Int_t   Compare(const TObject* obj) const;
+  //  virtual Bool_t  IsSortable () const {return kTRUE; }
+  //  virtual Int_t   Compare(const TObject* obj) const;
 
   Int_t fADC_pos;
   Int_t fADC_neg;
diff --git a/src/THcRawHit.cxx b/src/THcRawHit.cxx
index daa513848a9fc78045f850b2423b62ed5a639bc5..3e37972a189932d7dd987a50bcbdf8ec59388f37 100644
--- a/src/THcRawHit.cxx
+++ b/src/THcRawHit.cxx
@@ -13,6 +13,27 @@
 //THcRawHit::~THcRawHit()
 //{}
 
+Int_t THcRawHit::Compare(const TObject* obj) const
+{
+  // Compare to sort by plane and counter
+
+  const THcRawHit* hit = dynamic_cast<const THcRawHit*>(obj);
+
+  if(!hit) return -1;
+  Int_t p1 = fPlane;
+  Int_t p2 = hit->fPlane;
+  if(p1 < p2) return -1;
+  else if(p1 > p2) return 1;
+  else {
+    Int_t c1 = fCounter;
+    Int_t c2 = hit->fCounter;
+    if(c1 < c2) return -1;
+    else if (c1 == c2) return 0;
+    else return 1;
+  }
+}
+
+
 ClassImp(THcRawHit)
 
 //_____________________________________________________________________________
diff --git a/src/THcRawHit.h b/src/THcRawHit.h
index 921939e5732d52cb5fea3fbef481133cb037d342..7372463c724a5e66229e48ad9bfb3b3bf270a6af 100644
--- a/src/THcRawHit.h
+++ b/src/THcRawHit.h
@@ -29,8 +29,10 @@ public:
   virtual Int_t GetData(Int_t signal) {return 0;};
 
   // Derived objects must be sortable and supply Compare method
-  virtual Bool_t  IsSortable () const {return kFALSE; }
-  virtual Int_t   Compare(const TObject* obj) const {return 0;}
+  //  virtual Bool_t  IsSortable () const {return kFALSE; }
+  //  virtual Int_t   Compare(const TObject* obj) const {return 0;}
+  virtual Bool_t  IsSortable () const {return kTRUE; }
+  virtual Int_t   Compare(const TObject* obj) const;
 
   Int_t fPlane;
   Int_t fCounter;