diff --git a/Makefile b/Makefile
index 85c255e7528b5c4b7214bc1f26ad6c535c648835..b863154d236e2db26cce043cd237aa926a3554ac 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@ SRC  =  src/THcInterface.cxx src/THcParmList.cxx src/THcAnalyzer.cxx \
 	src/THcRawDCHit.cxx src/THcDCHit.cxx \
 	src/THcDCWire.cxx \
 	src/THcDCLookupTTDConv.cxx src/THcDCTimeToDistConv.cxx \
-	src/THcSpacePoint.cxx \
+	src/THcSpacePoint.cxx src/THcDCTrack.cxx \
 	src/THcShower.cxx src/THcShowerPlane.cxx \
 	src/THcShowerHit.cxx \
 	src/THcAerogel.cxx src/THcAerogelHit.cxx
diff --git a/src/HallC_LinkDef.h b/src/HallC_LinkDef.h
index c4ee7e6c33750de1068acfa7989aee0be89f27dc..408c60043915204efe8809826e84cee590311b0a 100644
--- a/src/HallC_LinkDef.h
+++ b/src/HallC_LinkDef.h
@@ -27,6 +27,7 @@
 #pragma link C++ class THcDCLookupTTDConv+;
 #pragma link C++ class THcDCTimeToDistConv+;
 #pragma link C++ class THcSpacePoint+;
+#pragma link C++ class THcDCTrack+;
 #pragma link C++ class THcShower+;
 #pragma link C++ class THcShowerPlane+;
 #pragma link C++ class THcShowerHit+;
diff --git a/src/THcDC.cxx b/src/THcDC.cxx
index 2adc5a02e22502a7a718db23a4558ca60d469dea..045fab79e226ff723733885fbe6502079bcbcd2f 100644
--- a/src/THcDC.cxx
+++ b/src/THcDC.cxx
@@ -15,6 +15,7 @@
 #include "THcDetectorMap.h"
 #include "THcGlobals.h"
 #include "THcParmList.h"
+#include "THcDCTrack.h"
 #include "VarDef.h"
 #include "VarType.h"
 #include "THaTrack.h"
@@ -65,6 +66,8 @@ THcDC::THcDC(
   fCentralWire = NULL;
   fPlaneTimeZero = NULL;
   fSigma = NULL;
+
+  fDCTracks = new TClonesArray( "THcDCTrack", 20 );
 }
 
 //_____________________________________________________________________________
@@ -352,6 +355,7 @@ THcDC::~THcDC()
     fTrackProj->Clear();
     delete fTrackProj; fTrackProj = 0;
   }
+  delete fDCTracks;
 }
 
 //_____________________________________________________________________________
@@ -460,7 +464,7 @@ Int_t THcDC::CoarseTrack( TClonesArray& /* tracks */ )
   }
   // Now link the stubs between chambers
   LinkStubs();
-  if(ntracks_fp > 0) TrackFit();
+  if(fNDCTracks > 0) TrackFit();
   // Check for internal TrackFit errors
   // Histogram the focal plane tracks
   // Histograms made in h_fill_dc_fp_hist
@@ -529,7 +533,8 @@ void THcDC::LinkStubs()
       fNSp++;
     }
   }
-  ntracks_fp=0;		// Number of Focal Plane tracks found
+  fNDCTracks=0;		// Number of Focal Plane tracks found
+  fDCTracks->Clear();
   Double_t stubminx = 999999;
   Double_t stubminy = 999999;
   Double_t stubminxp = 999999;
@@ -542,9 +547,10 @@ void THcDC::LinkStubs()
       // Now make sure this sp is not already used in a sp.
       // Could this be done by having a sp point to the track it is in?
       Int_t tryflag=1;
-      for(Int_t itrack=0;itrack<ntracks_fp;itrack++) {
-	for(Int_t isp=0;isp<fTrackSP[itrack].nSP;isp++) {
-	  if(fTrackSP[itrack].spID[isp] == isp1) {
+      for(Int_t itrack=0;itrack<fNDCTracks;itrack++) {
+	THcDCTrack *theDCTrack = static_cast<THcDCTrack*>( fDCTracks->At(itrack));
+	for(Int_t isp=0;isp<theDCTrack->GetNSpacePoints();isp++) {
+	  if(theDCTrack->GetSpacePointID(isp) == isp1) {
 	    tryflag=0;
 	  }
 	}
@@ -580,22 +586,21 @@ void THcDC::LinkStubs()
 		assert(sptracks==0);
 		//stubtest=1;  Used in h_track_tests.f
 		// Make a new track if there are not to many
-		if(ntracks_fp < MAXTRACKS) {
+		if(fNDCTracks < MAXTRACKS) {
 		  sptracks=0; // Number of tracks with this seed
-		  stub_tracks[sptracks++] = ntracks_fp;
-		  fTrackSP[ntracks_fp].nSP=2;
-		  fTrackSP[ntracks_fp].spID[0] = isp1;
-		  fTrackSP[ntracks_fp].spID[1] = isp2;
+		  stub_tracks[sptracks++] = fNDCTracks;
+		  THcDCTrack *theDCTrack = new( (*fDCTracks)[fNDCTracks++]) THcDCTrack(fNPlanes);
+		  theDCTrack->AddSpacePoint(isp1);
+		  theDCTrack->AddSpacePoint(isp2);
 		  // Now save the X, Y and XP for the two stubs
 		  // in arrays hx_sp1, hy_sp1, hy_sp1, ... hxp_sp2
 		  // Why not also YP?
 		  // Skip for here.  May be a diagnostic thing
 		  newtrack = 0; // Make no more tracks in this loop
 		  // (But could replace a SP?)
-		  ntracks_fp++;
 		} else {
 		  if (fDebugDC) cout << "EPIC FAIL 1:  Too many tracks found in THcDC::LinkStubs" << endl;
-		  ntracks_fp=0;
+		  fNDCTracks=0;
 		  // Do something here to fail this event
 		  return;
 		}
@@ -604,14 +609,16 @@ void THcDC::LinkStubs()
 		// Check if there is another space point in the same chamber
 		for(Int_t itrack=0;itrack<sptracks;itrack++) {
 		  Int_t track=stub_tracks[itrack];
+		  THcDCTrack *theDCTrack = static_cast<THcDCTrack*>( fDCTracks->At(track));
+
 		  Int_t spoint=0;
 		  Int_t duppoint=0;
-		  for(Int_t isp=0;isp<fTrackSP[track].nSP;isp++) {
+		  for(Int_t isp=0;isp<theDCTrack->GetNSpacePoints();isp++) {
 		    if(fSp[isp2]->fNChamber ==
-		       fSp[fTrackSP[track].spID[isp]]->fNChamber) {
+		       fSp[theDCTrack->GetSpacePointID(isp)]->fNChamber) {
 		      spoint=isp;
 		    }
-		    if(isp2==fTrackSP[track].spID[isp]) {
+		    if(isp2==theDCTrack->GetSpacePointID(isp)) {
 		      duppoint=1;
 		    }
 		  } // End loop over sp in tracks with isp1
@@ -619,24 +626,24 @@ void THcDC::LinkStubs()
 		    // add this space point to current track(2)
 		  if(!duppoint) {
 		    if(!spoint) {
-		      fTrackSP[track].spID[fTrackSP[track].nSP++] = isp2;
+		      theDCTrack->AddSpacePoint(isp2);
 		    } else {
 		      // If there is another point in the same chamber
 		      // in this track create a new track with all the
 		      // same space points except spoint
-		      if(ntracks_fp < MAXTRACKS) {
-			stub_tracks[sptracks++] = ntracks_fp;
-			fTrackSP[ntracks_fp].nSP=fTrackSP[track].nSP;
-			for(Int_t isp=0;isp<fTrackSP[track].nSP;isp++) {
+		      if(fNDCTracks < MAXTRACKS) {
+			stub_tracks[sptracks++] = fNDCTracks;
+			THcDCTrack *newDCTrack = new( (*fDCTracks)[fNDCTracks++]) THcDCTrack(fNPlanes);
+			for(Int_t isp=0;isp<theDCTrack->GetNSpacePoints();isp++) {
 			  if(isp!=spoint) {
-			    fTrackSP[ntracks_fp].spID[isp] = fTrackSP[track].spID[isp];
+			    newDCTrack->AddSpacePoint(theDCTrack->GetSpacePointID(isp));
 			  } else {
-			    fTrackSP[ntracks_fp].spID[isp] = isp2;
+			    newDCTrack->AddSpacePoint(theDCTrack->GetSpacePointID(isp2));
 			  } // End check for dup on copy
 			} // End copy of track
 		      } else {
 			if (fDebugDC) cout << "EPIC FAIL 2:  Too many tracks found in THcDC::LinkStubs" << endl;
-			ntracks_fp=0;
+			fNDCTracks=0;
 			// Do something here to fail this event
 			return; // Max # of allowed tracks
 		      }
@@ -649,34 +656,36 @@ void THcDC::LinkStubs()
 	} // end isp2 loop over new space points
       } // end test on tryflag
     } // end isp1 outer loop over space points
-  } else { // Make track out of each single space point
+   } else { // Make track out of each single space point
     for(Int_t isp=0;isp<fNSp;isp++) {
-      if(ntracks_fp<MAXTRACKS) {
-	fTrackSP[ntracks_fp].nSP=1;
-	fTrackSP[ntracks_fp].spID[0]=isp;
-	ntracks_fp++;
+      if(fNDCTracks<MAXTRACKS) {
+	// Need some constructed at thingy
+	THcDCTrack *newDCTrack = new( (*fDCTracks)[fNDCTracks++]) THcDCTrack(fNPlanes);
+	newDCTrack->AddSpacePoint(isp);
       } else {
 	if (fDebugDC) cout << "EPIC FAIL 3:  Too many tracks found in THcDC::LinkStubs" << endl;
-	ntracks_fp=0;
+	fNDCTracks=0;
 	// Do something here to fail this event
 	return; // Max # of allowed tracks
       }
     }
   }
   // Add the list of hits on the track to the track.
-  for(Int_t itrack=0;itrack<ntracks_fp;itrack++) {
-    fTrackSP[itrack].fNHits=0;
-    fTrackSP[itrack].fHits.clear();
-    for(Int_t isp=0;isp<fNSp;isp++) {
-      for(Int_t ihit=0;ihit<fSp[isp]->GetNHits();ihit++) {
-	fTrackSP[itrack].fHits.push_back(fSp[isp]->GetHit(ihit));
-	fTrackSP[itrack].fNHits++;
+  // Looks like it adds all hits for all space points to every track
+  for(Int_t itrack=0;itrack<fNDCTracks;itrack++) {
+    THcDCTrack *theDCTrack = static_cast<THcDCTrack*>( fDCTracks->At(itrack));
+    theDCTrack->Clear();
+    // Hit list in the track should have been cleared when created.
+    for(Int_t isp=0;isp<theDCTrack->GetNSpacePoints();isp++) {
+      Int_t spid=theDCTrack->GetSpacePointID(isp);
+      for(Int_t ihit=0;ihit<fSp[spid]->GetNHits();ihit++) {
+	theDCTrack->AddHit(fSp[spid]->GetHit(ihit));
       }
     }
   }
   ///
   ///
-  if (fDebugDC) cout << "Found " << ntracks_fp << " tracks"<<endl;
+  if (fDebugDC) cout << "Found " << fNDCTracks << " tracks"<<endl;
 }
 
 // Primary track fitting routine
@@ -689,31 +698,32 @@ void THcDC::TrackFit()
   // Initialize residuals
   // Need to make these member variables so they can be histogrammed
   // Probably an array of vectors.
-  Double_t double_resolution[fNPlanes][ntracks_fp];
-  Double_t single_resolution[fNPlanes][ntracks_fp];
+  Double_t double_resolution[fNPlanes][fNDCTracks];
+  Double_t single_resolution[fNPlanes][fNDCTracks];
   Double_t double_res[fNPlanes]; // For the good track
 
   for(Int_t ip=0;ip<fNPlanes;ip++) {
     double_res[ip] = 1000.0;
-    for(Int_t itrack=0;itrack<ntracks_fp;itrack++) {
+    for(Int_t itrack=0;itrack<fNDCTracks;itrack++) {
       double_resolution[ip][itrack] = 1000.0;
       single_resolution[ip][itrack] = 1000.0;
     }
   }
   
   Double_t dummychi2 = 1.0E4;
-  for(Int_t itrack=0;itrack<ntracks_fp;itrack++) {
+  for(Int_t itrack=0;itrack<fNDCTracks;itrack++) {
     //    Double_t chi2 = dummychi2;
     //    Int_t htrack_fit_num = itrack;
-    fTrackSP[itrack].fNfree = fTrackSP[itrack].fNHits - NUM_FPRAY;
+    THcDCTrack *theDCTrack = static_cast<THcDCTrack*>( fDCTracks->At(itrack));
+    theDCTrack->SetNFree(theDCTrack->GetNHits() - NUM_FPRAY);
     Double_t chi2 = dummychi2;
-    if(fTrackSP[itrack].fNfree > 0) {
+    if(theDCTrack->GetNFree() > 0) {
       TVectorD TT(NUM_FPRAY);
       TMatrixD AA(NUM_FPRAY,NUM_FPRAY);
       for(Int_t irayp=0;irayp<NUM_FPRAY;irayp++) {
 	TT[irayp] = 0.0;
-	for(Int_t ihit=0;ihit < fTrackSP[itrack].fNHits;ihit++) {
-	  THcDCHit* hit=fTrackSP[itrack].fHits[ihit];
+	for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) {
+	  THcDCHit* hit=theDCTrack->GetHit(ihit);
 	  Int_t plane=hit->GetPlaneNum()-1;
 	  TT[irayp] += (hit->GetCoord()*
 			fPlaneCoeffs[plane][raycoeffmap[irayp]])
@@ -726,8 +736,8 @@ void THcDC::TrackFit()
 	  if(jrayp<irayp) { // Symmetric
 	    AA[irayp][jrayp] = AA[jrayp][irayp];
 	  } else {
-	    for(Int_t ihit=0;ihit < fTrackSP[itrack].fNHits;ihit++) {
-	      THcDCHit* hit=fTrackSP[itrack].fHits[ihit];
+	    for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) {
+	      THcDCHit* hit=theDCTrack->GetHit(ihit);
 	      Int_t plane=hit->GetPlaneNum()-1;
 	      AA[irayp][jrayp] += fPlaneCoeffs[plane][raycoeffmap[irayp]]*
 		fPlaneCoeffs[plane][raycoeffmap[jrayp]]/
@@ -748,42 +758,35 @@ void THcDC::TrackFit()
       //      }
       // Calculate hit coordinate for each plane for chi2 and efficiency
       // calculations
-      fTrackSP[itrack].fCoords.clear();
-      fTrackSP[itrack].fResiduals.clear();
-      fTrackSP[itrack].fDoubleResiduals.clear();
+
+      // Make sure fCoords, fResiduals, and fDoubleResiduals are clear
       for(Int_t iplane=0;iplane < fNPlanes; iplane++) {
-	fTrackSP[itrack].fCoords.push_back(0.0);
-	fTrackSP[itrack].fResiduals.push_back(1000.0);
-	fTrackSP[itrack].fDoubleResiduals.push_back(1000.0);
+	Double_t coord=0.0;
 	for(Int_t ir=0;ir<NUM_FPRAY;ir++) {
-	  fTrackSP[itrack].fCoords[iplane] += fPlaneCoeffs[iplane][raycoeffmap[ir]]*dray[ir];
+	  coord += fPlaneCoeffs[iplane][raycoeffmap[ir]]*dray[ir];
 	}
+	theDCTrack->SetCoord(iplane,coord);
       }
       // Compute Chi2 and residuals
       chi2 = 0.0;
-      fTrackSP[itrack].fResiduals.clear();
-      for(Int_t ihit=0;ihit < fTrackSP[itrack].fNHits;ihit++) {
-	THcDCHit* hit=fTrackSP[itrack].fHits[ihit];
+      for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) {
+	THcDCHit* hit=theDCTrack->GetHit(ihit);
 	Int_t plane=hit->GetPlaneNum()-1;
-	Double_t residual = hit->GetCoord() - fTrackSP[itrack].fCoords[plane];
-	fTrackSP[itrack].fResiduals[plane] = residual;
+	Double_t residual = hit->GetCoord() - theDCTrack->GetCoord(plane);
+	theDCTrack->SetResidual(plane, residual);
 	chi2 += pow(residual/fSigma[plane],2);
       }
       if (fDebugDC) {
 	cout << "Residuals:" << endl;
-	for(Int_t ihit=0;ihit < fTrackSP[itrack].fNHits;ihit++) {
-	  THcDCHit* hit=fTrackSP[itrack].fHits[ihit];
+	for(Int_t ihit=0;ihit < theDCTrack->GetNHits();ihit++) {
+	  THcDCHit* hit=theDCTrack->GetHit(ihit);
 	  Int_t plane=hit->GetPlaneNum()-1;
-	  cout << "   " << plane << ": " << fTrackSP[itrack].fResiduals[ihit] << endl;
+	  cout << "   " << plane << ": " << theDCTrack->GetResidual(plane) << endl;
 	}
       }
-      fTrackSP[itrack].x_fp = dray[0];
-      fTrackSP[itrack].y_fp = dray[1];
-      fTrackSP[itrack].z_fp = 0.0;
-      fTrackSP[itrack].xp_fp = dray[2];
-      fTrackSP[itrack].xp_fp = dray[3];
+      theDCTrack->SetVector(dray[0], dray[1], 0.0, dray[2], dray[3]);
     }
-    fTrackSP[itrack].chi2_fp = chi2;
+    theDCTrack->SetChisq(chi2);
   }
 
   // Calculate residuals for each chamber if in single stub mode
@@ -791,46 +794,42 @@ void THcDC::TrackFit()
   // Specific for two chambers.  Can/should it be generalized?
 
   if(fSingleStub != 0) {
-    if(ntracks_fp == 2) {
+    if(fNDCTracks == 2) {
+      THcDCTrack *theDCTrack1 = static_cast<THcDCTrack*>( fDCTracks->At(0));
+      THcDCTrack *theDCTrack2 = static_cast<THcDCTrack*>( fDCTracks->At(1));
       Int_t itrack=0;
       Int_t ihit=0;
-      THcDCHit* hit=fTrackSP[itrack].fHits[ihit];
+      THcDCHit* hit=theDCTrack1->GetHit(ihit);
       Int_t plane=hit->GetPlaneNum()-1;
       Int_t chamber=fNChamber[plane];
       if(chamber==1) {
 	itrack=1;
-	hit=fTrackSP[itrack].fHits[ihit];
+	hit=theDCTrack2->GetHit(ihit);
 	plane=hit->GetPlaneNum()-1;
 	chamber=fNChamber[plane];
 	if(chamber==2) {
 	  Double_t ray1[4];
 	  Double_t ray2[4];
-	  ray1[0] = fTrackSP[0].x_fp;
-	  ray1[1] = fTrackSP[0].y_fp;
-	  ray1[2] = fTrackSP[0].xp_fp;
-	  ray1[3] = fTrackSP[0].yp_fp;
-	  ray2[0] = fTrackSP[1].x_fp;
-	  ray2[1] = fTrackSP[1].y_fp;
-	  ray2[2] = fTrackSP[1].xp_fp;
-	  ray2[3] = fTrackSP[1].yp_fp;
+	  theDCTrack1->GetRay(ray1);
+	  theDCTrack2->GetRay(ray2);
 	  itrack = 1;
 	  // Loop over hits in second chamber
-	  for(Int_t ihit=0;ihit < fTrackSP[itrack].fNHits;ihit++) {
+	  for(Int_t ihit=0;ihit < theDCTrack2->GetNHits();ihit++) {
 	    // Calculate residual in second chamber from first chamber track
-	    THcDCHit* hit=fTrackSP[itrack].fHits[ihit];
+	    THcDCHit* hit=theDCTrack2->GetHit(ihit);
 	    Int_t plane=hit->GetPlaneNum()-1;
 	    Double_t pos = DpsiFun(ray1,plane);
-	    fTrackSP[itrack-1].fDoubleResiduals[plane] = hit->GetCoord() - pos;
+	    theDCTrack1->SetDoubleResidual(plane,hit->GetCoord() - pos);
 	    //  hdc_dbl_res(pln) = hdc_double_residual(1,pln)  for hists
 	  }
 	  itrack=0;
 	  // Loop over hits in first chamber
-	  for(Int_t ihit=0;ihit < fTrackSP[itrack].fNHits;ihit++) {
+	  for(Int_t ihit=0;ihit < theDCTrack1->GetNHits();ihit++) {
 	    // Calculate residual in first chamber from second chamber track
-	    THcDCHit* hit=fTrackSP[itrack].fHits[ihit];
+	    THcDCHit* hit=theDCTrack1->GetHit(ihit);
 	    Int_t plane=hit->GetPlaneNum()-1;
 	    Double_t pos = DpsiFun(ray1,plane);
-	    fTrackSP[itrack+1].fDoubleResiduals[plane] = hit->GetCoord() - pos;
+	    theDCTrack2->SetDoubleResidual(plane,hit->GetCoord() - pos);
 	    //  hdc_dbl_res(pln) = hdc_double_residual(1,pln)  for hists
 	  }
 	}
diff --git a/src/THcDC.h b/src/THcDC.h
index ed6163a2a9962c89deca8f2e394c73e795d98132..2f68470d324c7b3e80c19a33915ae4d397ef1290 100644
--- a/src/THcDC.h
+++ b/src/THcDC.h
@@ -75,6 +75,9 @@ public:
   THcDC();  // for ROOT I/O
 protected:
   Int_t fDebugDC;
+
+  Int_t fNDCTracks;
+  TClonesArray* fDCTracks;     // Tracks found from stubs (THcDCTrack obj)
   // Calibration
 
   // Per-event data
@@ -129,19 +132,6 @@ protected:
   
   // Intermediate structure for building 
   static const char MAXTRACKS = 50;
-  struct TrackSP {
-    Int_t nSP; /* Number of space points in this track */
-    Int_t spID[10];		/* List of space points in this track */
-    Int_t fNHits;
-    Int_t fNfree;		  /* Number of degrees of freedom */
-    std::vector<THcDCHit*> fHits; /* List of hits for this track */
-    std::vector<Double_t> fCoords; /* Coordinate on each plane */
-    std::vector<Double_t> fResiduals; /* Residual on each plane */
-    std::vector<Double_t> fDoubleResiduals; /* Residual on each plane for single stub mode */
-    Double_t x_fp, y_fp, z_fp;
-    Double_t xp_fp, yp_fp;
-    Double_t chi2_fp;
-  } fTrackSP[MAXTRACKS];
 
   std::vector<THcDriftChamberPlane*> fPlanes; // List of plane objects
   std::vector<THcDriftChamber*> fChambers; // List of chamber objects
diff --git a/src/THcDCTrack.cxx b/src/THcDCTrack.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..1423c49980cadea8db12fccbf51b877e91057498
--- /dev/null
+++ b/src/THcDCTrack.cxx
@@ -0,0 +1,49 @@
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcDCTrack                                                                //
+//                                                                           //
+// Class representing a track found from linking DC Space points             //
+///////////////////////////////////////////////////////////////////////////////
+
+#include "THcDCHit.h"
+#include "THcDCTrack.h"
+THcDCTrack::THcDCTrack(Int_t nplanes) : fnSP(0), fNHits(0)
+{
+  fHits.clear();
+  fCoords.resize(nplanes);
+  fResiduals.resize(nplanes);
+  fDoubleResiduals.resize(nplanes);
+}  
+
+void THcDCTrack::AddHit(THcDCHit * hit)
+{
+  // Add a hit to the track
+  fHits.push_back(hit);
+  fNHits++;
+}
+void THcDCTrack::AddSpacePoint( Int_t spid )
+{
+  // Add to list of space points in this track
+  // Need a check for maximum spacepoints of 10
+  fspID[fnSP++] = spid;
+}
+
+void THcDCTrack::Clear( const Option_t* )
+{
+  // Clear the space point and hit lists
+  fnSP = 0;
+  ClearHits();
+  // Need to set default values  (0 or -100)
+  //fCoords.clear();
+  //fResiduals.clear();
+  //fDoubleResiduals.clear();
+}
+void THcDCTrack::ClearHits( )
+{
+  fNHits = 0;
+  fHits.clear();
+}
+
+ClassImp(THcDCTrack)
+
+///////////////////////////////////////////////////////////////////////////////
diff --git a/src/THcDCTrack.h b/src/THcDCTrack.h
new file mode 100644
index 0000000000000000000000000000000000000000..2b67faf1aacf7a94090d1ed975911859068dd6c7
--- /dev/null
+++ b/src/THcDCTrack.h
@@ -0,0 +1,73 @@
+#ifndef ROOT_THcDCTrack
+#define ROOT_THcDCTrack
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// THcDCTrack                                                             //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+//#include "THaCluster.h"
+#include "TVector3.h"
+#include "TObject.h"
+
+//class THaVDCCluster;
+class THcDCPlane;
+class THaTrack;
+class THcDCHit;
+
+class THcDCTrack : public TObject {
+
+public:
+  THcDCTrack(Int_t nplanes);
+  virtual ~THcDCTrack() {};
+
+  virtual void AddHit(THcDCHit * hit);
+  virtual void AddSpacePoint(Int_t spid);
+
+  //Get and Set Functions
+  Int_t* GetSpacePoints()               {return fspID;}
+  Int_t GetNSpacePoints()         const { return fnSP;}
+  Int_t GetSpacePointID(Int_t i)  const {return fspID[i];}
+  THcDCHit* GetHit(Int_t i)       const {return fHits[i];}
+  Int_t GetNHits()                const {return fNHits;}
+  Int_t GetNFree()                const {return fNfree;}
+  Double_t GetCoord(Int_t ip)     const {return fCoords[ip];}
+  Double_t GetResidual(Int_t ip)     const {return fResiduals[ip];}
+  void GetRay(Double_t *ray) const {ray[0]=fX_fp; ray[1]=fY_fp; ray[2]=fXp_fp; ray[3]=fYp_fp;}
+  void SetNFree(Int_t nfree)           {fNfree = nfree;}
+  void SetCoord(Int_t ip, Double_t coord) {fCoords[ip] = coord;}
+  void SetResidual(Int_t ip, Double_t coord) {fResiduals[ip] = coord;}
+  void SetDoubleResidual(Int_t ip, Double_t coord) {fDoubleResiduals[ip] = coord;}
+  void SetVector(Double_t x, Double_t y, Double_t z,
+		 Double_t xp, Double_t yp) {fX_fp = x; fY_fp=y; fZ_fp=z; fXp_fp=xp; fYp_fp=yp;}
+  void SetChisq(Double_t chi2)   {fChi2_fp = chi2;}
+
+  virtual void ClearHits( );
+
+  // TObject functions redefined
+  virtual void Clear( Option_t* opt="" );
+
+ protected:
+    Int_t fnSP; /* Number of space points in this track */
+                /* Should we have a list of pointers to space points
+		   instead of their indices? */
+    Int_t fspID[10];		/* List of space points in this track */
+    Int_t fNHits;
+    Int_t fNfree;		  /* Number of degrees of freedom */
+    std::vector<THcDCHit*> fHits; /* List of hits for this track */
+    std::vector<Double_t> fCoords; /* Coordinate on each plane */
+    std::vector<Double_t> fResiduals; /* Residual on each plane */
+    std::vector<Double_t> fDoubleResiduals; /* Residual on each plane for single stub mode */
+    Double_t fX_fp, fY_fp, fZ_fp;
+    Double_t fXp_fp, fYp_fp;
+    Double_t fChi2_fp;
+
+ private:
+  // Hide copy ctor and op=
+  THcDCTrack( const THcDCTrack& );
+  THcDCTrack& operator=( const THcDCTrack& );
+
+  ClassDef(THcDCTrack,0)	// DCTrack class
+};
+#endif