diff --git a/.gitignore b/.gitignore
index e2c1aa5be9e1261caedb7eda626be03aa08131f6..42661621bae74ef9ed49c5d579dcf090310c8e6b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,7 +10,7 @@ hcana
 *.[oad]
 *~
 *.so
-\#.*\#
+\#*\#
 
 # Examples directory
 examples/*.root
diff --git a/.gitmodules b/.gitmodules
index ddb12369a39ec2ec17d8682ebc026af723ec95a7..e6a3a04529afd649dcca34240a4560b7cd42b921 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,3 @@
 [submodule "podd"]
 	path = podd
-	url = git@github.com:sawjlab/podd.git
+	url = git://github.com/sawjlab/podd.git
diff --git a/Makefile b/Makefile
index 8965ef476807633dea2e5d9160fb5635dd01aef5..541d5812243a4a31d5b29f242621c40095cfc298 100644
--- a/Makefile
+++ b/Makefile
@@ -9,12 +9,16 @@
 
 
 SRC  =  src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \
-	src/THcHodoscopeHit.cxx src/THcRawHit.cxx \
+	src/THcHallCSpectrometer.cxx \
+	src/THcDetectorMap.cxx \
+	src/THcRawHit.cxx src/THcHitList.cxx \
+	src/THcSignalHit.cxx \
+	src/THcHodoscope.cxx src/THcScintillatorPlane.cxx \
+	src/THcHodoscopeHit.cxx \
+	src/THcDriftChamber.cxx src/THcDriftChamberPlane.cxx \
 	src/THcDCHit.cxx \
-	src/THcHitList.cxx src/THcDetectorMap.cxx src/THcHodoscope.cxx \
-	src/THcHallCSpectrometer.cxx src/THcDriftChamber.cxx \
-	src/THcScintillatorPlane.cxx src/THcSignalHit.cxx \
-	src/THcShower.cxx src/THcShowerHit.cxx src/THcShowerPlane.cxx  
+	src/THcShower.cxx src/THcShowerPlane.cxx \
+	src/THcShowerHit.cxx 
 
 # Name of your package. 
 # The shared library that will be built will get the name lib$(PACKAGE).so
diff --git a/examples/hodtest.C b/examples/hodtest.C
index d091f53ebc9299edb62de508f30f5972ca2530c8..2ee29bb95d0e3ea16d69e39d057b9dd251da52fc 100644
--- a/examples/hodtest.C
+++ b/examples/hodtest.C
@@ -20,12 +20,12 @@ gHcDetectorMap->Load("jan03.map");
   // Add hodoscope
   HMS->AddDetector( new THcHodoscope("hod", "Hodoscope" ));
   HMS->AddDetector( new THcShower("Cal", "Shower" ));
-  //  HMS->AddDetector( new THcDriftChamber("dc", "Drift Chambers" ));
+  HMS->AddDetector( new THcDriftChamber("dc", "Drift Chambers" ));
 
   // Set up the analyzer - we use the standard one,
   // but this could be an experiment-specific one as well.
   // The Analyzer controls the reading of the data, executes
-  // tests/cuts, loops over Apparatus's and PhysicsModules,
+  // tests/cuts, loops over Acpparatus's and PhysicsModules,
   // and executes the output routines.
   THcAnalyzer* analyzer = new THcAnalyzer;
   
diff --git a/examples/output.def b/examples/output.def
index 86d1e07957e4dc71f2fec8b47ac4d460036735a3..cf1c55cef0be09ea2ce8b2fa1d2b77bd58cdb9aa 100644
--- a/examples/output.def
+++ b/examples/output.def
@@ -1,6 +1,8 @@
 # See $ANALYZER/examples/output_example.def for examples
 #
+block H.dc.*
 block H.hod.*
+block H.Cal.*
 
 
 # TDC hits per paddle
@@ -23,7 +25,6 @@ TH1F hnegadc3 'HMS s2x- ADC hits' H.hod.2x.negadchits 16 0.5 16.5
 TH1F hposadc4 'HMS s2y+ ADC hits' H.hod.2y.posadchits 10 0.5 10.5
 TH1F hnegadc4 'HMS s2y- ADC hits' H.hod.2y.negadchits 10 0.5 10.5
 
-block H.Cal.*
 # ADC hits per Calorimeter layer
 TH1F chposadc1 'HMS Cal 1z+ ADC hits' H.Cal.1z.posadchits 13 0.5 13.5
 TH1F chnegadc1 'HMS Cal 1z- ADC hits' H.Cal.1z.negadchits 13 0.5 13.5
@@ -31,3 +32,4 @@ TH1F chposadc2 'HMS Cal 2z+ ADC hits' H.Cal.2z.posadchits 13 0.5 13.5
 TH1F chnegadc2 'HMS Cal 2z- ADC hits' H.Cal.2z.negadchits 13 0.5 13.5
 TH1F chposadc3 'HMS Cal 3z+ ADC hits' H.Cal.3z.posadchits 13 0.5 13.5
 TH1F chposadc4 'HMS Cal 4z+ ADC hits' H.Cal.4z.posadchits 13 0.5 13.5
+
diff --git a/src/HallC_LinkDef.h b/src/HallC_LinkDef.h
index d5bbfdd9d41fc8ec7238a2d0d31be55951d5e7f5..01a64a358eb03c3a468a2299591d5b9e3ef78b1e 100644
--- a/src/HallC_LinkDef.h
+++ b/src/HallC_LinkDef.h
@@ -10,18 +10,19 @@
 #pragma link C++ class THcInterface+;
 #pragma link C++ class THcParmList+;
 #pragma link C++ class THcAnalyzer+;
+#pragma link C++ class THcHallCSpectrometer+;
+#pragma link C++ class THcDetectorMap+;
 #pragma link C++ class THcRawHit+;
-#pragma link C++ class THcHodoscopeHit+;
-#pragma link C++ class THcDCHit+;
 #pragma link C++ class THcHitList+;
+#pragma link C++ class THcSignalHit+;
 #pragma link C++ class THcHodoscope+;
-#pragma link C++ class THcDriftChamber+;
-#pragma link C++ class THcDetectorMap+;
-#pragma link C++ class THcHallCSpectrometer+;
 #pragma link C++ class THcScintillatorPlane+;
+#pragma link C++ class THcHodoscopeHit+;
+#pragma link C++ class THcDriftChamber+;
+#pragma link C++ class THcDriftChamberPlane+;
+#pragma link C++ class THcDCHit+;
+#pragma link C++ class THcShower+;
 #pragma link C++ class THcShowerPlane+;
-#pragma link C++ class THcSignalHit+;
 #pragma link C++ class THcShowerHit+;
-#pragma link C++ class THcShower+;
 
 #endif
diff --git a/src/THcDriftChamber.cxx b/src/THcDriftChamber.cxx
index 2e8881df5333d56685e8084833ba368f400d9c54..b69d21243bef7781e2662dd7261958dca01b7d1c 100644
--- a/src/THcDriftChamber.cxx
+++ b/src/THcDriftChamber.cxx
@@ -31,18 +31,69 @@
 using namespace std;
 
 //_____________________________________________________________________________
-THcDriftChamber::THcDriftChamber( const char* name, const char* description,
+THcDriftChamber::THcDriftChamber(
+ const char* name, const char* description,
 				  THaApparatus* apparatus ) :
-  THaNonTrackingDetector(name,description,apparatus)
+  THaTrackingDetector(name,description,apparatus)
 {
   // Constructor
 
-  fTrackProj = new TClonesArray( "THaTrackProj", 5 );
+  //  fTrackProj = new TClonesArray( "THaTrackProj", 5 );
+
+}
+
+//_____________________________________________________________________________
+void THcDriftChamber::Setup(const char* name, const char* description)
+{
+
+  char prefix[2];
+  char parname[100];
+
+  THaApparatus *app = GetApparatus();
+  if(app) {
+    cout << app->GetName() << endl;
+  } else {
+    cout << "No apparatus found" << endl;
+  }
+
+  prefix[0]=tolower(app->GetName()[0]);
+  prefix[1]='\0';
+
+  strcpy(parname,prefix);
+  strcat(parname,name); 	// Append "dc"
+  Int_t plen=strlen(parname);
+  cout << "parname=" << parname << endl;
+
+  // Get number of planes and number wires for each plane
+  strcat(parname,"_num_planes");
+  fNPlanes = *(Int_t *)gHcParms->Find(parname)->GetValuePointer();
+
+  parname[plen] = '\0';
+  strcat(parname,"_num_chambers");
+  fNChambers = *(Int_t *)gHcParms->Find(parname)->GetValuePointer();
+
+  fPlaneNames = new char* [fNPlanes];
+
+  char *desc = new char[strlen(description)+100];
+  fPlanes = new THcDriftChamberPlane* [fNPlanes];
+
+  for(Int_t i=0;i<fNPlanes;i++) {
+    fPlaneNames[i] = new char[5];
+    sprintf(fPlaneNames[i],"%d",i+1);
+    strcpy(desc, description);
+    strcat(desc, " Plane ");
+    strcat(desc, fPlaneNames[i]);
+
+    fPlanes[i] = new THcDriftChamberPlane(fPlaneNames[i], desc, i+1, this);
+    cout << "Created Drift Chamber Plane " << fPlaneNames[i] << ", " << desc << endl;
+
+  }
+    
 }
 
 //_____________________________________________________________________________
 THcDriftChamber::THcDriftChamber( ) :
-  THaNonTrackingDetector()
+  THaTrackingDetector()
 {
   // Constructor
 }
@@ -52,8 +103,22 @@ THaAnalysisObject::EStatus THcDriftChamber::Init( const TDatime& date )
 {
   static const char* const here = "Init()";
 
-  if( THaNonTrackingDetector::Init( date ) )
-    return fStatus;
+  Setup(GetName(), GetTitle());	// Create the subdetectors here
+  
+  // 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);
+
+  EStatus status;
+  // This triggers call of ReadDatabase and DefineVariables
+  if( (status = THaTrackingDetector::Init( date )) )
+    return fStatus=status;
+
+  for(Int_t ip=0;ip<fNPlanes;ip++) {
+    if((status = fPlanes[ip]->Init( date ))) {
+      return fStatus=status;
+    }
+  }
 
   // Replace with what we need for Hall C
   //  const DataDest tmp[NDEST] = {
@@ -62,16 +127,18 @@ THaAnalysisObject::EStatus THcDriftChamber::Init( const TDatime& date )
   //  };
   //  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 ) {
+  char EngineDID[4];
+
+  EngineDID[0] = toupper(GetApparatus()->GetName()[0]);
+  EngineDID[1] = 'D';
+  EngineDID[2] = 'C';
+  EngineDID[3] = '\0';
+  
+  if( gHcDetectorMap->FillMap(fDetMap, EngineDID) < 0 ) {
     Error( Here(here), "Error filling detectormap for %s.", 
-	     "HSCIN");
+	     EngineDID);
       return kInitError;
   }
 
@@ -87,39 +154,36 @@ Int_t THcDriftChamber::ReadDatabase( const TDatime& date )
   // 'date' contains the date/time of the run being analyzed.
 
   //  static const char* const here = "ReadDatabase()";
+  char prefix[2];
+  char parname[100];
 
   // 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();
+  prefix[0]=tolower(GetApparatus()->GetName()[0]);
+
+  prefix[1]='\0';
 
+  strcpy(parname,prefix);
+  strcat(parname,"dc");
+  Int_t plen=strlen(parname);
+
+  // Get number of planes and number wires for each plane
+  strcat(parname,"_num_planes");
+  fNPlanes = *(Int_t *)gHcParms->Find(parname)->GetValuePointer();
+
+  parname[plen]='\0';
+  strcat(parname,"_nrwire");
+  
   fNWires = new Int_t [fNPlanes];
-  Int_t* p= (Int_t *)gHcParms->Find("hdc_nrwire")->GetValuePointer();
+  Int_t* p= (Int_t *)gHcParms->Find(parname)->GetValuePointer();
   for(Int_t i=0;i<fNPlanes;i++) {
     fNWires[i] = p[i];
   }
@@ -241,17 +305,25 @@ Int_t THcDriftChamber::Decode( const THaEvData& evdata )
   // Get the Hall C style hitlist (fRawHitList) for this event
   Int_t nhits = THcHitList::DecodeToHitList(evdata);
 
+  // Let each plane get its hits
+  Int_t nexthit = 0;
+  for(Int_t ip=0;ip<fNPlanes;ip++) {
+    nexthit = fPlanes[ip]->ProcessHits(fRawHitList, nexthit);
+  }
+
+#if 0
   // 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;
+    //    cout << ihit << " : " << hit->fPlane << ":" << hit->fCounter << " : "
+    //	 << endl;
     for(Int_t imhit = 0; imhit < hit->fNHits; imhit++) {
-      cout << "                     " << imhit << " " << hit->fTDC[imhit]
-	   << endl;
+      //      cout << "                     " << imhit << " " << hit->fTDC[imhit]
+      //	   << endl;
     }
   }
-  cout << endl;
+  //  cout << endl;
+#endif
 
   return nhits;
 }
@@ -263,7 +335,7 @@ Int_t THcDriftChamber::ApplyCorrections( void )
 }
 
 //_____________________________________________________________________________
-Int_t THcDriftChamber::CoarseProcess( TClonesArray& /* tracks */ )
+Int_t THcDriftChamber::CoarseTrack( TClonesArray& /* tracks */ )
 {
   // Calculation of coordinates of particle track cross point with scint
   // plane in the detector coordinate system. For this, parameters of track 
@@ -279,7 +351,7 @@ Int_t THcDriftChamber::CoarseProcess( TClonesArray& /* tracks */ )
 }
 
 //_____________________________________________________________________________
-Int_t THcDriftChamber::FineProcess( TClonesArray& tracks )
+Int_t THcDriftChamber::FineTrack( TClonesArray& tracks )
 {
   // Reconstruct coordinates of particle track cross point with scintillator
   // plane, and copy the data into the following local data structure:
diff --git a/src/THcDriftChamber.h b/src/THcDriftChamber.h
index b9f7be4e68c9e8ddd9899a9af31cc7ac90237e73..f96363d60e1d3452c4b9ee0f34b6589b24c87fae 100644
--- a/src/THcDriftChamber.h
+++ b/src/THcDriftChamber.h
@@ -7,14 +7,15 @@
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
-#include "TClonesArray.h"
-#include "THaNonTrackingDetector.h"
+#include "THaTrackingDetector.h"
 #include "THcHitList.h"
 #include "THcDCHit.h"
+#include "THcDriftChamberPlane.h"
 
-class THaScCalib;
+//class THaScCalib;
+class TClonesArray;
 
-class THcDriftChamber : public THaNonTrackingDetector, public THcHitList {
+class THcDriftChamber : public THaTrackingDetector, public THcHitList {
 
 public:
   THcDriftChamber( const char* name, const char* description = "",
@@ -23,8 +24,8 @@ public:
 
   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      CoarseTrack( TClonesArray& tracks );
+  virtual Int_t      FineTrack( TClonesArray& tracks );
   
   virtual Int_t      ApplyCorrections( void );
 
@@ -33,7 +34,7 @@ public:
   Int_t GetNTracks() const { return fTrackProj->GetLast()+1; }
   const TClonesArray* GetTrackHits() const { return fTrackProj; }
   
-  friend class THaScCalib;
+  //  friend class THaScCalib;
 
   THcDriftChamber();  // for ROOT I/O
 protected:
@@ -45,8 +46,12 @@ protected:
 
   // Potential Hall C parameters.  Mostly here for demonstration
   Int_t fNPlanes;
+  char** fPlaneNames;
+  Int_t fNChambers;
   Int_t* fNWires;		// Number of wires per plane
 
+  THcDriftChamberPlane** fPlanes; // List of plane objects
+
   TClonesArray*  fTrackProj;  // projection of track onto scintillator plane
                               // and estimated match to TOF paddle
   // Useful derived quantities
@@ -71,7 +76,9 @@ protected:
   virtual Int_t  ReadDatabase( const TDatime& date );
   virtual Int_t  DefineVariables( EMode mode = kDefine );
 
-  ClassDef(THcDriftChamber,0)   // Generic hodoscope class
+  void Setup(const char* name, const char* description);
+
+  ClassDef(THcDriftChamber,0)   // Drift Chamber class
 };
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/src/THcDriftChamberPlane.cxx b/src/THcDriftChamberPlane.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..1040342149b78125e1d86512623579ff25ca21c8
--- /dev/null
+++ b/src/THcDriftChamberPlane.cxx
@@ -0,0 +1,171 @@
+//*-- Author :
+
+//////////////////////////////////////////////////////////////////////////
+//
+// THcDriftChamberPlane
+//
+//////////////////////////////////////////////////////////////////////////
+
+#include "THcDriftChamberPlane.h"
+#include "TClonesArray.h"
+#include "THcSignalHit.h"
+#include "THcGlobals.h"
+#include "THcParmList.h"
+#include "THcHitList.h"
+#include "THcDriftChamber.h"
+
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+
+using namespace std;
+
+ClassImp(THcDriftChamberPlane)
+
+//______________________________________________________________________________
+THcDriftChamberPlane::THcDriftChamberPlane( const char* name, 
+					    const char* description,
+					    const Int_t planenum,
+					    THaDetectorBase* parent )
+  : THaSubDetector(name,description,parent)
+{
+  // Normal constructor with name and description
+  fTDCHits = new TClonesArray("THcSignalHit",100);
+  fPlaneNum = planenum;
+}
+
+//______________________________________________________________________________
+THcDriftChamberPlane::~THcDriftChamberPlane()
+{
+  // Destructor
+  delete fTDCHits;
+
+}
+THaAnalysisObject::EStatus THcDriftChamberPlane::Init( const TDatime& date )
+{
+  // Extra initialization for scintillator plane: set up DataDest map
+
+  cout << "THcDriftChamberPlane::Init called " << GetName() << endl;
+
+  if( IsZombie())
+    return fStatus = kInitError;
+
+  // How to get information for parent
+  //  if( GetParent() )
+  //    fOrigin = GetParent()->GetOrigin();
+
+  EStatus status;
+  if( (status=THaSubDetector::Init( date )) )
+    return fStatus = status;
+
+  return fStatus = kOK;
+
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamberPlane::ReadDatabase( const TDatime& date )
+{
+
+  // See what file it looks for
+  
+  static const char* const here = "ReadDatabase()";
+  char prefix[2];
+  char parname[100];
+  
+  prefix[0]=tolower(GetParent()->GetPrefix()[0]);
+  prefix[1]='\0';
+
+  // Retrieve parameters we need
+
+  return kOK;
+}
+//_____________________________________________________________________________
+Int_t THcDriftChamberPlane::DefineVariables( EMode mode )
+{
+  // Initialize global variables and lookup table for decoder
+
+  //  cout << "THcDriftChamberPlane::DefineVariables called " << GetName() << endl;
+
+  if( mode == kDefine && fIsSetup ) return kOK;
+  fIsSetup = ( mode == kDefine );
+
+  // Register variables in global list
+  RVarDef vars[] = {
+    {"tdchits", "List of TDC hits", 
+     "fTDCHits.THcSignalHit.GetPaddleNumber()"},
+    { 0 }
+  };
+
+  return DefineVarsFromList( vars, mode );
+}
+
+//_____________________________________________________________________________
+void THcDriftChamberPlane::Clear( Option_t* )
+{
+  //cout << " Calling THcDriftChamberPlane::Clear " << GetName() << endl;
+  // Clears the hit lists
+  fTDCHits->Clear();
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamberPlane::Decode( const THaEvData& evdata )
+{
+  // Doesn't actually get called.  Use Fill method instead
+  cout << " Calling THcDriftChamberPlane::Decode " << GetName() << endl;
+
+  return 0;
+}
+//_____________________________________________________________________________
+Int_t THcDriftChamberPlane::CoarseProcess( TClonesArray& tracks )
+{
+ 
+  //  HitCount();
+
+ return 0;
+}
+
+//_____________________________________________________________________________
+Int_t THcDriftChamberPlane::FineProcess( TClonesArray& tracks )
+{
+  return 0;
+}
+Int_t THcDriftChamberPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
+{
+  // Extract the data for this plane from hit list
+  // Assumes that the hit list is sorted by plane, so we stop when the
+  // plane doesn't agree and return the index for the next hit.
+
+  Int_t nTDCHits=0;
+  fTDCHits->Clear();
+
+  Int_t nrawhits = rawhits->GetLast()+1;
+  // cout << "THcDriftChamberPlane::ProcessHits " << fPlaneNum << " " << nexthit << "/" << nrawhits << endl;
+
+  Int_t ihit = nexthit;
+  while(ihit < nrawhits) {
+    THcDCHit* hit = (THcDCHit *) rawhits->At(ihit);
+    if(hit->fPlane > fPlaneNum) {
+      break;
+    }
+    // Just put in the first hit for now
+    if(hit->fNHits > 0) {	// Should always be the case
+#if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0)      
+      THcSignalHit *sighit = (THcSignalHit*) fTDCHits->ConstructedAt(nTDCHits++);
+#else
+      TObject* obj = (*fTDCHits)[nTDCHits++];
+      R__ASSERT( obj );
+      if(!obj->TestBit (TObject::kNotDeleted))
+	fTDCHitsClass->New(obj);
+      THcSignalHit *sighit = (THcSignalHit*)obj;
+#endif  
+      sighit->Set(hit->fCounter, hit->fTDC[0]);
+    }
+    ihit++;
+  }
+  return(ihit);
+}
+
+    
+  
+  
diff --git a/src/THcDriftChamberPlane.h b/src/THcDriftChamberPlane.h
new file mode 100644
index 0000000000000000000000000000000000000000..29f4bb799abbc484d2f4f88d2caf9bef43dd5d00
--- /dev/null
+++ b/src/THcDriftChamberPlane.h
@@ -0,0 +1,56 @@
+#ifndef ROOT_THcDriftChamberPlane
+#define ROOT_THcDriftChamberPlane
+
+//////////////////////////////////////////////////////////////////////////////
+//                         
+// THcDriftChamberPlane
+//
+// A Hall C scintillator plane
+//
+// May want to later inherit from a THcPlane class if there are similarities
+// in what a plane is shared with other detector types (shower, etc.)
+// 
+//////////////////////////////////////////////////////////////////////////////
+
+#include "THaSubDetector.h"
+#include "TClonesArray.h"
+
+class THaEvData;
+class THaSignalHit;
+
+class THcDriftChamberPlane : public THaSubDetector {
+  
+ public:
+  THcDriftChamberPlane( const char* name, const char* description,
+			Int_t planenum, THaDetectorBase* parent = NULL);
+  virtual ~THcDriftChamberPlane();
+
+  virtual void    Clear( Option_t* opt="" );
+  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 );
+          Bool_t   IsTracking() { return kFALSE; }
+  virtual Bool_t   IsPid()      { return kFALSE; }
+
+  virtual Int_t ProcessHits(TClonesArray* rawhits, Int_t nexthit);
+
+  Double_t fSpacing;
+
+  TClonesArray* fParentHitList;
+
+ protected:
+
+  TClonesArray* fTDCHits;
+
+  Int_t fPlaneNum;
+
+  virtual Int_t  ReadDatabase( const TDatime& date );
+  virtual Int_t  DefineVariables( EMode mode = kDefine );
+
+  ClassDef(THcDriftChamberPlane,0)
+};
+#endif
+
+
diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx
index 251f3381ad1cac5d2b41749df5b00a3dfc0ead02..4ff2611303ab82bdb805ab4128070aa9c5140797 100644
--- a/src/THcHodoscope.cxx
+++ b/src/THcHodoscope.cxx
@@ -40,8 +40,6 @@ THcHodoscope::THcHodoscope( const char* name, const char* description,
   //fTrackProj = new TClonesArray( "THaTrackProj", 5 );
   // Construct the planes
 
-  Setup(name, description);
-
 }
 
 //_____________________________________________________________________________
@@ -59,25 +57,23 @@ void THcHodoscope::Setup(const char* name, const char* description)
   static const char* const message = 
     "Must construct %s detector with valid name! Object construction failed.";
 
+  cout << "In THcHodoscope::Init()" << endl;
   // Base class constructor failed?
   if( IsZombie()) return;
 
-  fNPlanes = 4;	// Eventually get # planes and plane names from a DB
+  fNPlanes = 4;  // Should get this from parameters
+
   fPlaneNames = new char* [fNPlanes];
   for(Int_t i=0;i<fNPlanes;i++) {fPlaneNames[i] = new char[3];}
-  strcpy(fPlaneNames[0],"1x");
+  // Should get the plane names from parameters.  
+  strcpy(fPlaneNames[0],"1x");  
   strcpy(fPlaneNames[1],"1y");
   strcpy(fPlaneNames[2],"2x");
   strcpy(fPlaneNames[3],"2y");
 
-  size_t nlen = strlen(name);
-  size_t slen = 0;
-  for(Int_t i=0;i < fNPlanes;i++)
-    {slen = TMath::Max(slen,strlen(fPlaneNames[i]));}
-  size_t len = nlen+slen+1;
-
+  cout << "fNPlanes = " << fNPlanes << endl;
   // Probably shouldn't assume that description is defined
-  char* desc = new char[strlen(description)+50+slen];
+  char* desc = new char[strlen(description)+50];
   fPlanes = new THcScintillatorPlane* [fNPlanes];
   for(Int_t i=0;i < fNPlanes;i++) {
     strcpy(desc, description);
@@ -108,8 +104,8 @@ void THcHodoscope::SetApparatus( THaApparatus* app )
 THaAnalysisObject::EStatus THcHodoscope::Init( const TDatime& date )
 {
   static const char* const here = "Init()";
-
-  cout << "THcHodoscope::Init " << GetName() << endl;
+  cout << "In THcHodoscope::Init()" << endl;
+  Setup(GetName(), GetTitle());
 
   // Should probably put this in ReadDatabase as we will know the
   // maximum number of hits after setting up the detector map
@@ -156,96 +152,56 @@ Int_t THcHodoscope::ReadDatabase( const TDatime& date )
   // 'date' contains the date/time of the run being analyzed.
 
   //  static const char* const here = "ReadDatabase()";
+  char prefix[2];
+  char parname[100];
 
   // 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)
 
-  cout << "THcHodoscope::ReadDatabase called " << GetName() << endl;
-
-  fNPlanes = 4;			// Hardwire for now
-
-  fNPaddle = new Int_t [fNPlanes];
+  prefix[0]=tolower(GetApparatus()->GetName()[0]);
 
-  fNPaddle[0] = *(Int_t *)gHcParms->Find("hscin_1x_nr")->GetValuePointer();
-  fNPaddle[1] = *(Int_t *)gHcParms->Find("hscin_1y_nr")->GetValuePointer();
-  fNPaddle[2] = *(Int_t *)gHcParms->Find("hscin_2x_nr")->GetValuePointer();
-  fNPaddle[3] = *(Int_t *)gHcParms->Find("hscin_2y_nr")->GetValuePointer();
+  prefix[1]='\0';
 
-  fSpacing = new Double_t [fNPlanes];
-  fSpacing[0] = gHcParms->Find("hscin_1x_spacing")->GetValue(0);
-  fSpacing[1] = gHcParms->Find("hscin_1y_spacing")->GetValue(0);
-  fSpacing[2] = gHcParms->Find("hscin_2x_spacing")->GetValue(0);
-  fSpacing[3] = gHcParms->Find("hscin_2y_spacing")->GetValue(0);
+  strcpy(parname,prefix);
+  strcat(parname,"scin_");
+  Int_t plen=strlen(parname);
 
-  fCenter = new Double_t* [fNPlanes];
-  Double_t* p;
-  Int_t iplane;
-
-  iplane = 0;
-  p = (Double_t *)gHcParms->Find("hscin_1x_center")->GetValuePointer();
-  fCenter[iplane] = new Double_t [fNPaddle[iplane]];
-  // Print out some parameters just to demonstrate that it works
-  cout << iplane;
-  for(Int_t i=0;i<fNPaddle[iplane];i++) {
-    fCenter[iplane][i] = p[i];
-    cout << " " << fCenter[iplane][i];
-  }
-  cout << endl;
+  fNPaddle = new Int_t [fNPlanes];
 
-  iplane = 1;
-  p = (Double_t *)gHcParms->Find("hscin_1y_center")->GetValuePointer();
-  fCenter[iplane] = new Double_t [fNPaddle[iplane]];
-  cout << iplane;
-  for(Int_t i=0;i<fNPaddle[iplane];i++) {
-    fCenter[iplane][i] = p[i];
-    cout << " " << fCenter[iplane][i];
+  for(Int_t i=0;i<fNPlanes;i++) {
+    parname[plen] = '\0';
+    strcat(parname,fPlaneNames[i]);
+    strcat(parname,"_nr");
+    fNPaddle[i] = *(Int_t *)gHcParms->Find(parname)->GetValuePointer();
+    cout << parname << " " << fNPaddle[i] << endl;
   }
-  cout << endl;
 
-  iplane = 2;
-  p = (Double_t *)gHcParms->Find("hscin_2x_center")->GetValuePointer();
-  fCenter[iplane] = new Double_t [fNPaddle[iplane]];
-  cout << iplane;
-  for(Int_t i=0;i<fNPaddle[iplane];i++) {
-    fCenter[iplane][i] = p[i];
-    cout << " " << fCenter[iplane][i];
+  fSpacing = new Double_t [fNPlanes];
+  for(Int_t i=0;i<fNPlanes;i++) {
+    parname[plen] = '\0';
+    strcat(parname,fPlaneNames[i]);
+    strcat(parname,"_spacing");
+    fSpacing[i] = *(Int_t *)gHcParms->Find(parname)->GetValuePointer();
   }
-  cout << endl;
 
-  iplane = 3;
-  p = (Double_t *)gHcParms->Find("hscin_2y_center")->GetValuePointer();
-  fCenter[iplane] = new Double_t [fNPaddle[iplane]];
-  cout << iplane;
-  for(Int_t i=0;i<fNPaddle[iplane];i++) {
-    fCenter[iplane][i] = p[i];
-    cout << " " << fCenter[iplane][i];
+  fCenter = new Double_t* [fNPlanes];
+  for(Int_t i=0;i<fNPlanes;i++) {
+    parname[plen] = '\0';
+    strcat(parname,fPlaneNames[i]);
+    strcat(parname,"_center");
+    Double_t* p = (Double_t *)gHcParms->Find(parname)->GetValuePointer();
+    fCenter[i] = new Double_t [fNPaddle[i]];
+    cout << parname;
+    for(Int_t ipad=0;ipad<fNPaddle[i];ipad++) {
+      fCenter[i][ipad] = p[ipad];
+      cout << " " << fCenter[i][ipad];
+    }
+    cout << endl;
   }
-  cout << endl;
 
   fIsInit = true;
 
diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx
index 78d81e06f32b78b7586acb8bb8b7e1ffa18b61f6..4fe536edd4d04b2d72fad6d02fc1441fb9bd8074 100644
--- a/src/THcScintillatorPlane.cxx
+++ b/src/THcScintillatorPlane.cxx
@@ -36,10 +36,12 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name,
   fNegTDCHits = new TClonesArray("THcSignalHit",16);
   fPosADCHits = new TClonesArray("THcSignalHit",16);
   fNegADCHits = new TClonesArray("THcSignalHit",16);
+#if ROOT_VERSION_CODE < ROOT_VERSION(5,32,0)
   fPosTDCHitsClass = fPosTDCHits->GetClass();
   fNegTDCHitsClass = fNegTDCHits->GetClass();
   fPosADCHitsClass = fPosADCHits->GetClass();
   fNegADCHitsClass = fNegADCHits->GetClass();
+#endif
   fPlaneNum = planenum;
 }
 
@@ -211,62 +213,58 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
     }
 
 
-if(hit->fTDC_pos >  0) {
+    if(hit->fTDC_pos >  0) {
 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0)
-	THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++);
-	sighit->Set(hit->fCounter, hit->fTDC_pos);
+      THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++);
 #else
-TObject* obj = (*fPosTDCHits)[nPosTDCHits++];
-R__ASSERT( obj );
-if(!obj->TestBit (TObject::kNotDeleted))
-fPosTDCHitsClass->New(obj);
-THcSignalHit *sighit = (THcSignalHit*)obj;
+      TObject* obj = (*fPosTDCHits)[nPosTDCHits++];
+      R__ASSERT( obj );
+      if(!obj->TestBit (TObject::kNotDeleted))
+	fPosTDCHitsClass->New(obj);
+      THcSignalHit *sighit = (THcSignalHit*)obj;
 #endif
-   sighit->Set(hit->fCounter, hit->fTDC_pos);
-}
-
+      sighit->Set(hit->fCounter, hit->fTDC_pos);
+    }
 
-if(hit->fTDC_neg >  0) {
+    if(hit->fTDC_neg >  0) {
 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0)
-	THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++);
-	sighit->Set(hit->fCounter, hit->fTDC_neg);
+      THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++);
 #else
-	TObject* obj = (*fNegTDCHits)[nNegTDCHits++];
-	R__ASSERT( obj );
-if(!obj->TestBit (TObject::kNotDeleted))
+
+      TObject* obj = (*fPosTDCHits)[nNegTDCHits++];
+      R__ASSERT( obj );
+      if(!obj->TestBit (TObject::kNotDeleted))
 	fNegTDCHitsClass->New(obj);
-	THcSignalHit *sighit = (THcSignalHit*)obj;
+      THcSignalHit *sighit = (THcSignalHit*)obj;
 #endif
-   sighit->Set(hit->fCounter, hit->fTDC_neg);
-}
+      sighit->Set(hit->fCounter, hit->fTDC_neg);
+    }
 
-if(hit->fADC_pos >  0) {
+    if(hit->fADC_pos >  0) {
 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0)
-	THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++);
-	sighit->Set(hit->fCounter, hit->fADC_pos);
+      THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++);
 #else
-	TObject* obj = (*fPosADCHits)[nPosADCHits++];
-	R__ASSERT( obj );
-if(!obj->TestBit (TObject::kNotDeleted))
+      TObject* obj = (*fPosTDCHits)[nPosADCHits++];
+      R__ASSERT( obj );
+      if(!obj->TestBit (TObject::kNotDeleted))
 	fPosADCHitsClass->New(obj);
-	THcSignalHit *sighit = (THcSignalHit*)obj;
+      THcSignalHit *sighit = (THcSignalHit*)obj;
 #endif
-   sighit->Set(hit->fCounter, hit->fADC_pos);
-}
+      sighit->Set(hit->fCounter, hit->fADC_pos);
+    }
 
-if(hit->fADC_neg >  0) {
+    if(hit->fADC_neg >  0) {
 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,32,0)
-	THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++);
-	sighit->Set(hit->fCounter, hit->fADC_neg);
+      THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++);
 #else
-	TObject* obj = (*fNegADCHits)[nNegADCHits++];
-	R__ASSERT( obj );
-if(!obj->TestBit (TObject::kNotDeleted))
+      TObject* obj = (*fPosTDCHits)[nNegADCHits++];
+      R__ASSERT( obj );
+      if(!obj->TestBit (TObject::kNotDeleted))
 	fNegADCHitsClass->New(obj);
-	THcSignalHit *sighit = (THcSignalHit*)obj;
+      THcSignalHit *sighit = (THcSignalHit*)obj;
 #endif
-   sighit->Set(hit->fCounter, hit->fADC_neg);
-}
+      sighit->Set(hit->fCounter, hit->fADC_neg);
+    }
 
     ihit++;
   }