diff --git a/src/THcAerogel.cxx b/src/THcAerogel.cxx
index 3b53d464d25481e83701a50dec76ca3a64cd4a4d..2addeded249a0f044cbc46ee0761c9ffb91f27fe 100644
--- a/src/THcAerogel.cxx
+++ b/src/THcAerogel.cxx
@@ -36,51 +36,56 @@ using namespace std;
 //_____________________________________________________________________________
 THcAerogel::THcAerogel( const char* name, const char* description,
                         THaApparatus* apparatus ) :
-  THaNonTrackingDetector(name,description,apparatus)
+  THaNonTrackingDetector(name,description,apparatus), fPresentP(0),
+  fAdcPosTimeWindowMin(0), fAdcPosTimeWindowMax(0), fAdcNegTimeWindowMin(0),
+  fAdcNegTimeWindowMax(0), fRegionValue(0), fPosGain(0), fNegGain(0),
+  frPosAdcPedRaw(0), frPosAdcPulseIntRaw(0), frPosAdcPulseAmpRaw(0),
+  frPosAdcPulseTimeRaw(0), frPosAdcPed(0), frPosAdcPulseInt(0),
+  frPosAdcPulseAmp(0), frPosAdcPulseTime(0), frNegAdcPedRaw(0),
+  frNegAdcPulseIntRaw(0), frNegAdcPulseAmpRaw(0), frNegAdcPulseTimeRaw(0),
+  frNegAdcPed(0), frNegAdcPulseInt(0), frNegAdcPulseAmp(0),
+  frNegAdcPulseTime(0), fPosAdcErrorFlag(0),
+  fNegAdcErrorFlag(0), fPosPedSum(0), fPosPedSum2(0), fPosPedLimit(0),
+  fPosPedCount(0), fNegPedSum(0), fNegPedSum2(0), fNegPedLimit(0), fNegPedCount(0),
+  fA_Pos(0), fA_Neg(0), fA_Pos_p(0), fA_Neg_p(0), fT_Pos(0), fT_Neg(0),
+  fPosPed(0), fPosSig(0), fPosThresh(0), fNegPed(0), fNegSig(0),
+  fNegThresh(0), fPosPedMean(0), fNegPedMean(0),
+  fPosTDCHits(0), fNegTDCHits(0), fPosADCHits(0), fNegADCHits(0)
 {
-
-  InitArrays();
-
 }
 
 //_____________________________________________________________________________
 THcAerogel::THcAerogel( ) :
-  THaNonTrackingDetector()
+  THaNonTrackingDetector(),
+  fAdcPosTimeWindowMin(0), fAdcPosTimeWindowMax(0), fAdcNegTimeWindowMin(0),
+  fAdcNegTimeWindowMax(0), fRegionValue(0), fPosGain(0), fNegGain(0),
+  frPosAdcPedRaw(0), frPosAdcPulseIntRaw(0), frPosAdcPulseAmpRaw(0),
+  frPosAdcPulseTimeRaw(0), frPosAdcPed(0), frPosAdcPulseInt(0),
+  frPosAdcPulseAmp(0), frPosAdcPulseTime(0), frNegAdcPedRaw(0),
+  frNegAdcPulseIntRaw(0), frNegAdcPulseAmpRaw(0), frNegAdcPulseTimeRaw(0),
+  frNegAdcPed(0), frNegAdcPulseInt(0), frNegAdcPulseAmp(0),
+  frNegAdcPulseTime(0), fPosAdcErrorFlag(0),
+  fNegAdcErrorFlag(0), fPosPedSum(0), fPosPedSum2(0), fPosPedLimit(0),
+  fPosPedCount(0), fNegPedSum(0), fNegPedSum2(0), fNegPedLimit(0), fNegPedCount(0),
+  fA_Pos(0), fA_Neg(0), fA_Pos_p(0), fA_Neg_p(0), fT_Pos(0), fT_Neg(0),
+  fPosPed(0), fPosSig(0), fPosThresh(0), fNegPed(0), fNegSig(0),
+  fNegThresh(0), fPosPedMean(0), fNegPedMean(0),
+  fPosTDCHits(0), fNegTDCHits(0), fPosADCHits(0), fNegADCHits(0)
 {
-  // Constructor
-  frPosAdcPedRaw       = NULL;
-  frPosAdcPulseIntRaw  = NULL;
-  frPosAdcPulseAmpRaw  = NULL;
-  frPosAdcPulseTimeRaw = NULL;
-  frPosAdcPed          = NULL;
-  frPosAdcPulseInt     = NULL;
-  frPosAdcPulseAmp     = NULL;
-  frPosAdcPulseTime    = NULL;
-  frNegAdcPedRaw       = NULL;
-  frNegAdcPulseIntRaw  = NULL;
-  frNegAdcPulseAmpRaw  = NULL;
-  frNegAdcPulseTimeRaw = NULL;
-  frNegAdcPed          = NULL;
-  frNegAdcPulseInt     = NULL;
-  frNegAdcPulseAmp     = NULL;
-  frNegAdcPulseTime    = NULL;
-  fPosAdcErrorFlag     = NULL;
-  fNegAdcErrorFlag     = NULL;
-
-  // 6 GeV variables
-  fPosTDCHits = NULL;
-  fNegTDCHits = NULL;
-  fPosADCHits = NULL;
-  fNegADCHits = NULL;
-
-  InitArrays();
-
 }
 
 //_____________________________________________________________________________
 THcAerogel::~THcAerogel()
 {
   // Destructor
+  DeleteArrays();
+}
+
+//_____________________________________________________________________________
+void THcAerogel::DeleteArrays()
+{
+  // Delete all dynamically allocated memory
+
   delete frPosAdcPedRaw;       frPosAdcPedRaw       = NULL;
   delete frPosAdcPulseIntRaw;  frPosAdcPulseIntRaw  = NULL;
   delete frPosAdcPulseAmpRaw;  frPosAdcPulseAmpRaw  = NULL;
@@ -100,59 +105,37 @@ THcAerogel::~THcAerogel()
   delete fPosAdcErrorFlag;     fPosAdcErrorFlag     = NULL;
   delete fNegAdcErrorFlag;     fNegAdcErrorFlag     = NULL;
 
+  delete [] fRegionValue;         fRegionValue = 0;
+  delete [] fAdcPosTimeWindowMin; fAdcPosTimeWindowMin = 0;
+  delete [] fAdcPosTimeWindowMax; fAdcPosTimeWindowMax = 0;
+  delete [] fAdcNegTimeWindowMin; fAdcNegTimeWindowMin = 0;
+  delete [] fAdcNegTimeWindowMax; fAdcNegTimeWindowMax = 0;
+
   // 6 GeV variables
   delete fPosTDCHits; fPosTDCHits = NULL;
   delete fNegTDCHits; fNegTDCHits = NULL;
   delete fPosADCHits; fPosADCHits = NULL;
   delete fNegADCHits; fNegADCHits = NULL;
 
-  DeleteArrays();
-
-}
-
-//_____________________________________________________________________________
-void THcAerogel::InitArrays()
-{
-  fPosGain = NULL;
-  fNegGain = NULL;
-
-  // 6 GeV variables
-  fA_Pos       = NULL;
-  fA_Neg       = NULL;
-  fA_Pos_p     = NULL;
-  fA_Neg_p     = NULL;
-  fT_Pos       = NULL;
-  fT_Neg       = NULL;
-  fPosPedLimit = NULL;
-  fNegPedLimit = NULL;
-  fPosPedMean  = NULL;
-  fNegPedMean  = NULL;
-  fPosPedSum   = NULL;
-  fPosPedSum2  = NULL;
-  fPosPedCount = NULL;
-  fNegPedSum   = NULL;
-  fNegPedSum2  = NULL;
-  fNegPedCount = NULL;
-  fPosPed      = NULL;
-  fPosSig      = NULL;
-  fPosThresh   = NULL;
-  fNegPed      = NULL;
-  fNegSig      = NULL;
-  fNegThresh   = NULL;
-}
-//_____________________________________________________________________________
-void THcAerogel::DeleteArrays()
-{
   delete [] fPosGain; fPosGain = NULL;
   delete [] fNegGain; fNegGain = NULL;
 
-  // 6 GeV variables
   delete [] fA_Pos;       fA_Pos       = NULL;
   delete [] fA_Neg;       fA_Neg       = NULL;
   delete [] fA_Pos_p;     fA_Pos_p     = NULL;
   delete [] fA_Neg_p;     fA_Neg_p     = NULL;
   delete [] fT_Pos;       fT_Pos       = NULL;
   delete [] fT_Neg;       fT_Neg       = NULL;
+
+  if (fSixGevData)
+    DeletePedestalArrays();
+}
+
+//_____________________________________________________________________________
+void THcAerogel::DeletePedestalArrays()
+{
+  // Delete all dynamically allocated memory for pedestal processing
+
   delete [] fPosPedLimit; fPosPedLimit = NULL;
   delete [] fNegPedLimit; fNegPedLimit = NULL;
   delete [] fPosPedMean;  fPosPedMean  = NULL;
@@ -232,26 +215,24 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date )
 
   gHcParms->LoadParmValues((DBRequest*)&listextra, prefix);
 
-  Bool_t optional = true ;
+  Bool_t optional = true;
 
   cout << "Created aerogel detector " << GetApparatus()->GetName() << "."
        << GetName() << " with " << fNelem << " PMT pairs" << endl;
 
+  DeleteArrays(); // avoid memory leak when reinitializing
+
   fPosGain = new Double_t[fNelem];
   fNegGain = new Double_t[fNelem];
 
   // 6 GeV variables
   fTdcOffset   = 0; // Offset to make reference time subtracted times positve
-  fPosPedLimit = new Int_t[fNelem];
-  fNegPedLimit = new Int_t[fNelem];
   fA_Pos       = new Float_t[fNelem];
   fA_Neg       = new Float_t[fNelem];
   fA_Pos_p     = new Float_t[fNelem];
   fA_Neg_p     = new Float_t[fNelem];
   fT_Pos       = new Float_t[fNelem];
   fT_Neg       = new Float_t[fNelem];
-  fPosPedMean  = new Double_t[fNelem];
-  fNegPedMean  = new Double_t[fNelem];
 
   // Normal constructor with name and description
   frPosAdcPedRaw       = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
@@ -273,28 +254,28 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date )
   fPosAdcErrorFlag     = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
   fNegAdcErrorFlag     = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
 
-  fNumPosAdcHits         = vector<Int_t>    (fNelem, 0.0);
-  fNumGoodPosAdcHits     = vector<Int_t>    (fNelem, 0.0);
-  fNumNegAdcHits         = vector<Int_t>    (fNelem, 0.0);
-  fNumGoodNegAdcHits     = vector<Int_t>    (fNelem, 0.0);
-  fNumTracksMatched      = vector<Int_t>    (fNelem, 0.0);
-  fNumTracksFired        = vector<Int_t>    (fNelem, 0.0);
-  fPosNpe                = vector<Double_t> (fNelem, 0.0);
-  fNegNpe                = vector<Double_t> (fNelem, 0.0);
-  fGoodPosAdcPed         = vector<Double_t> (fNelem, 0.0);
-  fGoodPosAdcMult         = vector<Double_t> (fNelem, 0.0);
-  fGoodPosAdcPulseInt    = vector<Double_t> (fNelem, 0.0);
-  fGoodPosAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0);
-  fGoodPosAdcPulseAmp    = vector<Double_t> (fNelem, 0.0);
-  fGoodPosAdcPulseTime   = vector<Double_t> (fNelem, 0.0);
-  fGoodPosAdcTdcDiffTime   = vector<Double_t> (fNelem, 0.0);
-  fGoodNegAdcPed         = vector<Double_t> (fNelem, 0.0);
-  fGoodNegAdcMult        = vector<Double_t> (fNelem, 0.0);
-  fGoodNegAdcPulseInt    = vector<Double_t> (fNelem, 0.0);
-  fGoodNegAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0);
-  fGoodNegAdcPulseAmp    = vector<Double_t> (fNelem, 0.0);
-  fGoodNegAdcPulseTime   = vector<Double_t> (fNelem, 0.0);
-  fGoodNegAdcTdcDiffTime   = vector<Double_t> (fNelem, 0.0);
+  fNumPosAdcHits.assign(fNelem, 0);
+  fNumGoodPosAdcHits.assign(fNelem, 0);
+  fNumNegAdcHits.assign(fNelem, 0);
+  fNumGoodNegAdcHits.assign(fNelem, 0);
+  fNumTracksMatched.assign(fNelem, 0);
+  fNumTracksFired.assign(fNelem, 0);
+  fPosNpe.assign(fNelem, 0.0);
+  fNegNpe.assign(fNelem, 0.0);
+  fGoodPosAdcPed.assign(fNelem, 0.0);
+  fGoodPosAdcMult.assign(fNelem, 0.0);
+  fGoodPosAdcPulseInt.assign(fNelem, 0.0);
+  fGoodPosAdcPulseIntRaw.assign(fNelem, 0.0);
+  fGoodPosAdcPulseAmp.assign(fNelem, 0.0);
+  fGoodPosAdcPulseTime.assign(fNelem, 0.0);
+  fGoodPosAdcTdcDiffTime.assign(fNelem, 0.0);
+  fGoodNegAdcPed.assign(fNelem, 0.0);
+  fGoodNegAdcMult.assign(fNelem, 0.0);
+  fGoodNegAdcPulseInt.assign(fNelem, 0.0);
+  fGoodNegAdcPulseIntRaw.assign(fNelem, 0.0);
+  fGoodNegAdcPulseAmp.assign(fNelem, 0.0);
+  fGoodNegAdcPulseTime.assign(fNelem, 0.0);
+  fGoodNegAdcTdcDiffTime.assign(fNelem, 0.0);
 
   // 6 GeV variables
   fPosTDCHits = new TClonesArray("THcSignalHit", fNelem*16);
@@ -302,15 +283,12 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date )
   fPosADCHits = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
   fNegADCHits = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse);
 
-  fPosNpeSixGev = vector<Double_t> (fNelem, 0.0);
-  fNegNpeSixGev = vector<Double_t> (fNelem, 0.0);
-
-  // Create arrays to hold pedestal results
-  if (fSixGevData) InitializePedestals();
+  fPosNpeSixGev.assign(fNelem, 0.0);
+  fNegNpeSixGev.assign(fNelem, 0.0);
 
   // Region parameters
   fRegionsValueMax = fNRegions * 8;
-  fRegionValue     = new Double_t[fRegionsValueMax];
+  fRegionValue         = new Double_t[fRegionsValueMax];
 
   fAdcPosTimeWindowMin = new Double_t [fNelem];
   fAdcPosTimeWindowMax = new Double_t [fNelem];
@@ -340,12 +318,7 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date )
     {"aero_six_gev_data",     &fSixGevData,       kInt,    0, 1},
     {"aero_pos_gain",         fPosGain,           kDouble, (UInt_t) fNelem},
     {"aero_neg_gain",         fNegGain,           kDouble, (UInt_t) fNelem},
-    {"aero_pos_ped_limit",    fPosPedLimit,       kInt,    (UInt_t) fNelem, optional},
-    {"aero_neg_ped_limit",    fNegPedLimit,       kInt,    (UInt_t) fNelem, optional},
-    {"aero_pos_ped_mean",     fPosPedMean,        kDouble, (UInt_t) fNelem, optional},
-    {"aero_neg_ped_mean",     fNegPedMean,        kDouble, (UInt_t) fNelem, optional},
     {"aero_tdc_offset",       &fTdcOffset,        kInt,    0,               optional},
-    {"aero_min_peds",         &fMinPeds,          kInt,    0,               optional},
     {"aero_region",           &fRegionValue[0],   kDouble, (UInt_t) fRegionsValueMax},
     {"aero_adcrefcut",        &fADC_RefTimeCut,   kInt,    0, 1},
     {0}
@@ -365,7 +338,22 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date )
 
   gHcParms->LoadParmValues((DBRequest*)&list, prefix);
 
-  if (fSixGevData) cout << "6 GeV Data Analysis Flag Set To TRUE" << endl;
+  if (fSixGevData) {
+    // Create arrays to hold pedestal results
+    InitializePedestals();
+
+    DBRequest list2[]={
+      {"aero_pos_ped_limit",    fPosPedLimit,       kInt,    (UInt_t) fNelem, optional},
+      {"aero_neg_ped_limit",    fNegPedLimit,       kInt,    (UInt_t) fNelem, optional},
+      {"aero_pos_ped_mean",     fPosPedMean,        kDouble, (UInt_t) fNelem, optional},
+      {"aero_neg_ped_mean",     fNegPedMean,        kDouble, (UInt_t) fNelem, optional},
+      {"aero_min_peds",         &fMinPeds,          kInt,    0,               optional},
+      {0}
+    };
+    gHcParms->LoadParmValues((DBRequest*)&list2, prefix);
+
+    cout << "6 GeV Data Analysis Flag Set To TRUE" << endl;
+  }
 
   fIsInit = true;
 
@@ -700,7 +688,7 @@ Int_t THcAerogel::CoarseProcess( TClonesArray&  ) //tracks
 {
   Double_t StartTime = 0.0;
   if( fglHod ) StartTime = fglHod->GetStartTime();
-  //cout << " starttime = " << StartTime << endl ;
+  //cout << " starttime = " << StartTime << endl;
     // Loop over the elements in the TClonesArray
     for(Int_t ielem = 0; ielem < frPosAdcPulseInt->GetEntries(); ielem++) {
 
@@ -946,17 +934,20 @@ void THcAerogel::InitializePedestals()
   fNPedestalEvents = 0;
   fMinPeds         = 0;                    // Do not calculate pedestals by default
 
+  DeletePedestalArrays();
+  fPosPedLimit = new Int_t [fNelem];
+  fNegPedLimit = new Int_t [fNelem];
+  fPosPedMean  = new Double_t[fNelem];
+  fNegPedMean  = new Double_t[fNelem];
   fPosPedSum   = new Int_t [fNelem];
   fPosPedSum2  = new Int_t [fNelem];
-  fPosPedLimit = new Int_t [fNelem];
   fPosPedCount = new Int_t [fNelem];
   fNegPedSum   = new Int_t [fNelem];
   fNegPedSum2  = new Int_t [fNelem];
-  fNegPedLimit = new Int_t [fNelem];
   fNegPedCount = new Int_t [fNelem];
   fPosPed      = new Double_t [fNelem];
-  fNegPed      = new Double_t [fNelem];
   fPosThresh   = new Double_t [fNelem];
+  fNegPed      = new Double_t [fNelem];
   fNegThresh   = new Double_t [fNelem];
 
   for(Int_t i = 0;i < fNelem; i++) {
@@ -1052,14 +1043,16 @@ void THcAerogel::Print(const Option_t* opt) const
   THaNonTrackingDetector::Print(opt);
 
   // Print out the pedestals
-  cout << endl;
-  cout << "Aerogel Pedestals" << endl;
-  cout << "No.   Neg    Pos" << endl;
-  for(Int_t i=0; i<fNelem; i++)
-    cout << " " << i << "\t" << fNegPedMean[i] << "\t" << fPosPedMean[i] << endl;
-  cout << endl;
-  cout << " fMinPeds = " << fMinPeds << endl;
-  cout << endl;
+  if (fSixGevData) {
+    cout << endl;
+    cout << "Aerogel Pedestals" << endl;
+    cout << "No.   Neg    Pos" << endl;
+    for(Int_t i=0; i<fNelem; i++)
+      cout << " " << i << "\t" << fNegPedMean[i] << "\t" << fPosPedMean[i] << endl;
+    cout << endl;
+    cout << " fMinPeds = " << fMinPeds << endl;
+    cout << endl;
+  }
 }
 //_____________________________________________________________________________
 Int_t THcAerogel::End(THaRunBase* run)
diff --git a/src/THcAerogel.h b/src/THcAerogel.h
index a3e7176b52a8a2b3990eb427df1e6d234920b8e2..5177cfe93449aec21398b0bde6c23257dfdf9dd8 100644
--- a/src/THcAerogel.h
+++ b/src/THcAerogel.h
@@ -32,8 +32,6 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList {
   virtual EStatus Init(const TDatime& run_time);
   Int_t           End(THaRunBase* run=0);
 
-  void  InitArrays();
-  void  DeleteArrays();
   Int_t GetIndex(Int_t nRegion, Int_t nValue);
 
   THcAerogel();  // for ROOT I/O
@@ -131,7 +129,7 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList {
   vector<Double_t> fGoodNegAdcPulseIntRaw;
   vector<Double_t> fGoodNegAdcPulseAmp;
   vector<Double_t> fGoodNegAdcPulseTime;
- vector<Double_t> fGoodNegAdcTdcDiffTime;
+  vector<Double_t> fGoodNegAdcTdcDiffTime;
 
   // 6 GeV era variables
   Int_t     fAnalyzePedestals;
@@ -179,8 +177,10 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList {
   vector<Double_t> fNegNpeSixGev;
 
   void Setup(const char* name, const char* description);
+  void  DeleteArrays();
+  void  DeletePedestalArrays();
   virtual void  InitializePedestals( );
- THcHodoscope* fglHod;		// Hodoscope to get start time
+  THcHodoscope* fglHod;		// Hodoscope to get start time
 
   ClassDef(THcAerogel,0)   // Generic aerogel class
 }
diff --git a/src/THcAnalyzer.cxx b/src/THcAnalyzer.cxx
index e4101d6293ec9d1f7cb9b3ec3f605272946d26c1..3f2b619010fdbe93feff0aa5e055926a1de57780 100644
--- a/src/THcAnalyzer.cxx
+++ b/src/THcAnalyzer.cxx
@@ -103,6 +103,7 @@ void THcAnalyzer::PrintReport(const char* templatefile, const char* ofile)
       } else {
 	THcFormula* formula = new THcFormula("temp",expression.c_str(),gHcParms,gHaVars,gHaCuts);
 	Double_t value=formula->Eval();
+	delete formula; formula = 0;
 	// If the value is close to integer and no format is defined
 	// use "%.0f" to print out integer
 	if(format.empty()) {
diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx
index b1042b46cebe6c8afba08b5a98f9964e078b2e43..c0cdd177be1e14175f13544499b3f144177287ac 100644
--- a/src/THcCherenkov.cxx
+++ b/src/THcCherenkov.cxx
@@ -135,6 +135,10 @@ void THcCherenkov::DeleteArrays()
   delete [] fPedCount; fPedCount = NULL;
   delete [] fPed;      fPed      = NULL;
   delete [] fThresh;   fThresh   = NULL;
+
+  delete [] fAdcTimeWindowMin; fAdcTimeWindowMin = 0;
+  delete [] fAdcTimeWindowMax; fAdcTimeWindowMax = 0;
+  delete [] fRegionValue; fRegionValue = 0;
 }
 
 //_____________________________________________________________________________
@@ -166,7 +170,7 @@ THaAnalysisObject::EStatus THcCherenkov::Init( const TDatime& date )
     Warning(Here(here),"Hodoscope \"%s\" not found. ","hod");
   }
 
- fPresentP = 0;
+  fPresentP = 0;
   THaVar* vpresent = gHaVars->Find(Form("%s.present",GetApparatus()->GetName()));
   if(vpresent) {
     fPresentP = (Bool_t *) vpresent->GetValuePointer();
diff --git a/src/THcConfigEvtHandler.cxx b/src/THcConfigEvtHandler.cxx
index a6d13335d2af741cb70ae6af29ca730278a7e856..1ecb3e754bd06421bac06435eb64a37577cd2711 100644
--- a/src/THcConfigEvtHandler.cxx
+++ b/src/THcConfigEvtHandler.cxx
@@ -41,6 +41,9 @@ THcConfigEvtHandler::THcConfigEvtHandler(const char *name, const char* descripti
 
 THcConfigEvtHandler::~THcConfigEvtHandler()
 {
+  // TODO: remove the parameters we've added to gHcParms
+
+  DeleteCrateInfoMap();
 }
 
 //Float_t THcConfigEvtHandler::GetData(const std::string& tag)
@@ -51,6 +54,26 @@ THcConfigEvtHandler::~THcConfigEvtHandler()
 // return theDataMap[tag];
 //}
 
+void THcConfigEvtHandler::DeleteCrateInfoMap()
+{
+  // Clear the CrateInfoMap, deallocating its elements' dynamic memory
+
+  //TODO: don't manage memory manually, contain the object, use STL vectors
+  typedef std::map<Int_t, CrateInfo_t *> cmap_t;
+  typedef std::map<Int_t, Int_t *> imap_t;
+  for( cmap_t::iterator it = CrateInfoMap.begin();
+       it != CrateInfoMap.end(); ++it ) {
+    CrateInfo_t* cinfo = it->second;
+    if( cinfo ) {
+      for( imap_t::iterator jt = cinfo->FADC250.thresholds.begin();
+	   jt != cinfo->FADC250.thresholds.end(); ++jt ) {
+	delete [] jt->second;
+      }
+      delete cinfo;
+    }
+  }
+  CrateInfoMap.clear();
+}
 
 Int_t THcConfigEvtHandler::Analyze(THaEvData *evdata)
 {
@@ -73,6 +96,7 @@ Int_t THcConfigEvtHandler::Analyze(THaEvData *evdata)
   cinfo->FADC250.present=0;
   cinfo->CAEN1190.present=0;
   cinfo->TI.present=0;  
+  // FIXME: check if entry for this roc already present in the map
   CrateInfoMap.insert(std::make_pair(roc, cinfo));
   ip++;
   // Three possible blocks of config data
@@ -199,12 +223,13 @@ void THcConfigEvtHandler::MakeParms(Int_t roc)
       while(itt != cinfo->FADC250.thresholds.end()) {
         Int_t slot = itt->first;
 
-	Int_t *threshp = itt->second;
-	Int_t *thresholds = new Int_t[16];
-	for(Int_t ichan=0;ichan<16;ichan++) {
-	  thresholds[ichan] = threshp[ichan];
-	}
-	gHcParms->Define(Form("g%s_adc_thresholds_%d_%d[16]",fName.Data(),roc,slot),"ADC Thresholds",*thresholds);
+	// this memory would leak
+//	Int_t *thresholds = new Int_t[16];
+//	memcpy(thresholds,itt->second,16*sizeof(Int_t));
+//	gHcParms->Define(Form("g%s_adc_thresholds_%d_%d[16]",fName.Data(),roc,slot),"ADC Thresholds",*thresholds);
+	// Define the variable directly on the CrateInfo_t that resides in CrateInfoMap where it will stay
+	// until the end of the life of this object
+	gHcParms->Define(Form("g%s_adc_thresholds_%d_%d[16]",fName.Data(),roc,slot),"ADC Thresholds",*itt->second);
 
 	Int_t mode = cinfo->FADC250.mode;
 	gHcParms->Define(Form("g%s_adc_mode_%d_%d",fName.Data(),roc,slot),"ADC Mode",mode);
@@ -359,7 +384,7 @@ THaAnalysisObject::EStatus THcConfigEvtHandler::Init(const TDatime& date)
     eventtypes.push_back(125);  // what events to look for
   }
 
-  CrateInfoMap.clear();
+  DeleteCrateInfoMap();
 
   fStatus = kOK;
   return kOK;
diff --git a/src/THcConfigEvtHandler.h b/src/THcConfigEvtHandler.h
index d72c7a1dadc551dd07100689fa4579a9f333a9fb..e62ece45ec1ddf49db72c345a75898bfb5760144 100644
--- a/src/THcConfigEvtHandler.h
+++ b/src/THcConfigEvtHandler.h
@@ -72,6 +72,8 @@ private:
 
   std::map<Int_t, CrateInfo_t *> CrateInfoMap;
 
+  void DeleteCrateInfoMap();
+
   THcConfigEvtHandler(const THcConfigEvtHandler& fh);
   THcConfigEvtHandler& operator=(const THcConfigEvtHandler& fh);
 
diff --git a/src/THcDC.cxx b/src/THcDC.cxx
index 67a9039831a11de00efb5d40ac25fcd218186bf9..25c71281f4bb2d5f53e3f46ea5870eaa8a5fe071 100644
--- a/src/THcDC.cxx
+++ b/src/THcDC.cxx
@@ -302,9 +302,6 @@ Int_t THcDC::ReadDatabase( const TDatime& date )
   delete [] fSigma;  fSigma = new Double_t [fNPlanes];
 
   Bool_t optional = true;
-  fReadoutLR = new Int_t[fNPlanes];
-  fReadoutTB = new Int_t[fNPlanes];
-
 
   DBRequest list[]={
     {"dc_tdc_time_per_channel",&fNSperChan, kDouble},
@@ -484,6 +481,15 @@ void THcDC::DeleteArrays()
   delete [] fNChamHits; fNChamHits = NULL;
   delete [] fPlaneEvents; fPlaneEvents = NULL;
 
+  for( Int_t i = 0; i<fNPlanes; ++i )
+    delete [] fPlaneNames[i];
+  delete [] fPlaneNames;
+
+  delete [] fPlaneCoeffs; fPlaneCoeffs = 0;
+  delete [] fResiduals; fResiduals = 0;
+  delete [] fResidualsExclPlane; fResidualsExclPlane = 0;
+  delete [] fWire_hit_did; fWire_hit_did = 0;
+  delete [] fWire_hit_should; fWire_hit_should = 0;
 }
 
 //_____________________________________________________________________________
diff --git a/src/THcDCLookupTTDConv.cxx b/src/THcDCLookupTTDConv.cxx
index cfedc55685ecd2df41beded7c620ce6b85501113..01c49cd622df83840d71b0f1f56a831a1809a3ab 100644
--- a/src/THcDCLookupTTDConv.cxx
+++ b/src/THcDCLookupTTDConv.cxx
@@ -5,7 +5,8 @@
 
 */
 #include "THcDCLookupTTDConv.h"
-
+#include <cstring>
+#include <cassert>
 ClassImp(THcDCLookupTTDConv)
 
 
@@ -18,18 +19,17 @@ fT0(T0), fMaxDriftDistance(MaxDriftDistance), fBinSize(BinSize),
 {
   //Normal constructor
 
+  assert( fNumBins > 0 );
   fTable = new Double_t[fNumBins];
-  for(Int_t i=0;i<fNumBins;i++) {
-    fTable[i] = Table[i];
-  }
-
+  memcpy( fTable, Table, fNumBins*sizeof(Double_t) );
 }
 
 //______________________________________________________________________________
 THcDCLookupTTDConv::~THcDCLookupTTDConv()
 {
-  // Destructor. Remove variables from global list.
+  // Destructor
 
+  delete [] fTable;
 }
 
 //______________________________________________________________________________
diff --git a/src/THcDriftChamber.cxx b/src/THcDriftChamber.cxx
index a47dea84f6143fb494246dc86190543c1d4167cc..6f2dac9964fdd2e2362f6684e90c53980b6e3c0e 100644
--- a/src/THcDriftChamber.cxx
+++ b/src/THcDriftChamber.cxx
@@ -196,22 +196,23 @@ Int_t THcDriftChamber::ReadDatabase( const TDatime& date )
   for(Int_t ipm1=0;ipm1<fNPlanes+1;ipm1++) { // Loop over missing plane1
     for(Int_t ipm2=ipm1;ipm2<fNPlanes+1;ipm2++) {
       if(ipm1==ipm2 && ipm1<fNPlanes) continue;
-      TMatrixD* AA3 = new TMatrixD(3,3);
+      TMatrixD AA3(3,3);
       for(Int_t i=0;i<3;i++) {
 	for(Int_t j=i;j<3;j++) {
-	  (*AA3)[i][j] = 0.0;
+	  AA3[i][j] = 0.0;
 	  for(Int_t ip=0;ip<fNPlanes;ip++) {
 	    if(ipm1 != ip && ipm2 != ip) {
-	      (*AA3)[i][j] += fStubCoefs[ip][i]*fStubCoefs[ip][j];
+	      AA3[i][j] += fStubCoefs[ip][i]*fStubCoefs[ip][j];
 	    }
 	  }
-	  (*AA3)[j][i] = (*AA3)[i][j];
+	  AA3[j][i] = AA3[i][j];
 	}
       }
       Int_t bitpat = allplanes & ~(1<<ipm1) & ~(1<<ipm2);
       // Should check that it is invertable
       //      if (fhdebugflagpr) cout << bitpat << " Determinant: " << AA3->Determinant() << endl;
-      AA3->Invert();
+      AA3.Invert();
+      fAA3Inv[bitpat].ResizeTo(AA3);
       fAA3Inv[bitpat] = AA3;
     }
   }
@@ -1326,11 +1327,11 @@ Double_t THcDriftChamber::FindStub(Int_t nhits, THcSpacePoint *sp,
 	/fSigma[plane_list[ihit]];
     }
   }
-  //  fAA3Inv[bitpat]->Print();
+  //  fAA3Inv[bitpat].Print();
   //  if (fhdebugflagpr) cout << TT[0] << " " << TT[1] << " " << TT[2] << endl;
-  //  TT->Print();
+  //  TT.Print();
 
-  TT *= *fAA3Inv[bitpat];
+  TT *= fAA3Inv[bitpat];
   // if (fhdebugflagpr) cout << TT[0] << " " << TT[1] << " " << TT[2] << endl;
 
   // Calculate Chi2.  Remember one power of sigma is in fStubCoefs
@@ -1373,14 +1374,12 @@ THcDriftChamber::~THcDriftChamber()
 void THcDriftChamber::DeleteArrays()
 {
   // Delete member arrays. Used by destructor.
-  delete fCosBeta; fCosBeta = NULL;
-  delete fSinBeta; fSinBeta = NULL;
-  delete fTanBeta; fTanBeta = NULL;
-  delete fSigma; fSigma = NULL;
-  delete fPsi0; fPsi0 = NULL;
-  delete fStubCoefs; fStubCoefs = NULL;
-
-  // Need to delete each element of the fAA3Inv map
+  delete [] fCosBeta; fCosBeta = NULL;
+  delete [] fSinBeta; fSinBeta = NULL;
+  delete [] fTanBeta; fTanBeta = NULL;
+  delete [] fSigma; fSigma = NULL;
+  delete [] fPsi0; fPsi0 = NULL;
+  delete [] fStubCoefs; fStubCoefs = NULL;
 
 }
 
diff --git a/src/THcDriftChamber.h b/src/THcDriftChamber.h
index 91f102dbda38f689b861ea00d7d47dae83555b94..f04b024d746588418e95679fd6a45a908e3338f6 100644
--- a/src/THcDriftChamber.h
+++ b/src/THcDriftChamber.h
@@ -135,7 +135,7 @@ protected:
   Int_t fEasySpacePoint;	/* This event is an easy space point */
 
   Double_t* stubcoef[4];
-  std::map<int,TMatrixD*> fAA3Inv;
+  std::map<int,TMatrixD> fAA3Inv;
 
   THaDetectorBase* fParent;
 
diff --git a/src/THcDriftChamberPlane.cxx b/src/THcDriftChamberPlane.cxx
index 8e9ef6f41d56a5b6ed3bbb8ce737fd00f60eb3ab..e6f97ebb86546569cfa06838f0acb678b76e7bff 100644
--- a/src/THcDriftChamberPlane.cxx
+++ b/src/THcDriftChamberPlane.cxx
@@ -33,15 +33,13 @@ THcDriftChamberPlane::THcDriftChamberPlane( const char* name,
 					    const char* description,
 					    const Int_t planenum,
 					    THaDetectorBase* parent )
-  : THaSubDetector(name,description,parent)
+: THaSubDetector(name,description,parent), fTTDConv(0)
 {
   // Normal constructor with name and description
   fHits = new TClonesArray("THcDCHit",100);
   fRawHits = new TClonesArray("THcDCHit",100);
   fWires = new TClonesArray("THcDCWire", 100);
 
-  fTTDConv = NULL;
-
   fPlaneNum = planenum;
 }
 
@@ -59,6 +57,8 @@ THcDriftChamberPlane::THcDriftChamberPlane() :
 THcDriftChamberPlane::~THcDriftChamberPlane()
 {
   // Destructor
+  delete [] fTzeroWire;
+  delete [] fSigmaWire;
   delete fWires;
   delete fHits;
   delete fRawHits;
diff --git a/src/THcHallCSpectrometer.cxx b/src/THcHallCSpectrometer.cxx
index a9070e25f3e504baed2dd77fb690679b206beae5..d977987922cb5d8da2a4c3308a66f1d146605eb5 100644
--- a/src/THcHallCSpectrometer.cxx
+++ b/src/THcHallCSpectrometer.cxx
@@ -762,8 +762,8 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
   if ( fNtracks > 0 ) {
     chi2Min   = 10000000000.0;
     fGoodTrack = 0;
-    Bool_t* keep      = new Bool_t [fNtracks];
-    Int_t* reject    = new Int_t  [fNtracks];
+    vector<bool> keep(fNtracks);
+    vector<Int_t> reject(fNtracks);
 
     THaTrack *testTracks[fNtracks];
 
@@ -772,7 +772,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       keep[ptrack] = kTRUE;
       reject[ptrack] = 0;
       testTracks[ptrack] = static_cast<THaTrack*>( fTracks->At(ptrack) );
-      if (!testTracks[ptrack]) {delete[] keep; delete[] reject; return -1;}
+      if (!testTracks[ptrack]) return -1;
     }
 
     // ! Prune on xptar
@@ -786,7 +786,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( TMath::Abs( testTracks[ptrack]->GetTTheta() ) >= fPruneXp ){
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 1;
+	  reject[ptrack] += 1;
 	}
       }
     }
@@ -802,7 +802,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( TMath::Abs( testTracks[ptrack]->GetTPhi() ) >= fPruneYp ){
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 2;
+	  reject[ptrack] += 2;
 
 	}
       }
@@ -819,7 +819,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( TMath::Abs( testTracks[ptrack]->GetTY() ) >= fPruneYtar ){
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 10;
+	  reject[ptrack] += 10;
 	}
       }
     }
@@ -835,7 +835,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( TMath::Abs( testTracks[ptrack]->GetDp() ) >= fPruneDelta ){
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 20;
+	  reject[ptrack] += 20;
 	}
       }
     }
@@ -855,7 +855,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
 	Double_t betaP = p / TMath::Sqrt( p * p + fPartMass * fPartMass );
 	if ( TMath::Abs( testTracks[ptrack]->GetBeta() - betaP ) >= fPruneBeta ) {
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 100;
+	  reject[ptrack] += 100;
 	}
       }
     }
@@ -871,7 +871,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( testTracks[ptrack]->GetNDoF() < fPruneDf ){
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 200;
+	  reject[ptrack] += 200;
 	}
       }
     }
@@ -887,7 +887,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( testTracks[ptrack]->GetNPMT() < fPruneNPMT ){
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 100000;
+	  reject[ptrack] += 100000;
 	}
       }
     }
@@ -905,7 +905,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
 	if ( ( testTracks[ptrack]->GetBetaChi2() >= fPruneChiBeta ) ||
 	     ( testTracks[ptrack]->GetBetaChi2() <= 0.01          ) ){
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 1000;
+	  reject[ptrack] += 1000;
 	}
       }
     }
@@ -922,7 +922,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( TMath::Abs( testTracks[ptrack]->GetFPTime() - fHodo->GetStartTimeCenter() ) >= fPruneFpTime ) {
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 2000;
+	  reject[ptrack] += 2000;
 	}
       }
     }
@@ -938,7 +938,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( testTracks[ptrack]->GetGoodPlane4() != 1 ) {
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 10000;
+	  reject[ptrack] += 10000;
 	}
       }
     }
@@ -954,7 +954,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune()
       for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
 	if ( testTracks[ptrack]->GetGoodPlane3() != 1 ) {
 	  keep[ptrack] = kFALSE;
-	  reject[ptrack] = reject[ptrack] + 20000;
+	  reject[ptrack] += 20000;
 	}
       }
     }
diff --git a/src/THcHitList.cxx b/src/THcHitList.cxx
index 8422139db38f86c6dc2f2e238db95cc394349346..6b7ed91f86ceec5ee051edff16017f6ae773aaf5 100644
--- a/src/THcHitList.cxx
+++ b/src/THcHitList.cxx
@@ -33,7 +33,8 @@ THcHitList::THcHitList() : fMap(0), fTISlot(0), fDisableSlipCorrection(kFALSE)
 
 THcHitList::~THcHitList() {
   /// Destructor
-  delete fSignalTypes;
+  delete fRawHitList;
+  delete [] fSignalTypes;
 }
 /**
 
diff --git a/src/THcHodoEff.cxx b/src/THcHodoEff.cxx
index 9bb9d5fe40f8e41d6ac5d5e4de8ee2bb7e6fe756..d40453b415e914829153ef15aa2ded6a5aa932ca 100644
--- a/src/THcHodoEff.cxx
+++ b/src/THcHodoEff.cxx
@@ -36,6 +36,24 @@ THcHodoEff::~THcHodoEff()
 {
   // Destructor
 
+  delete [] fPlanes; fPlanes = 0;
+  delete [] fPosZ; fPosZ = 0;
+  delete [] fSpacing; fSpacing = 0;
+  delete [] fCenterFirst; fCenterFirst = 0;
+  delete [] fNCounters; fNCounters = 0;
+  delete [] fHodoSlop; fHodoSlop = 0;
+  delete [] fStatTrkSum; fStatTrkSum = 0;
+  delete [] fStatAndSum; fStatAndSum = 0;
+  delete [] fStatAndEff; fStatAndEff = 0;
+
+  delete [] fHodoPosEffi; fHodoPosEffi = 0;
+  delete [] fHodoNegEffi; fHodoNegEffi = 0;
+  delete [] fHodoOrEffi; fHodoOrEffi = 0;
+  delete [] fHodoAndEffi; fHodoAndEffi = 0;
+  delete [] fStatTrk; fStatTrk = 0;
+
+  delete [] fHitPlane; fHitPlane = 0;
+
   RemoveVariables();
 }
 
diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx
index 7d5ee6dff8e55cd97857237a409476f3c2e6b173..1a8061b8184f9e89f588244d9a570edf85a118e9 100644
--- a/src/THcHodoscope.cxx
+++ b/src/THcHodoscope.cxx
@@ -566,10 +566,13 @@ THcHodoscope::~THcHodoscope()
     RemoveVariables();
   if( fIsInit )
     DeleteArrays();
-  if (fTrackProj) {
-    fTrackProj->Clear();
-    delete fTrackProj; fTrackProj = 0;
+
+  for( int i = 0; i < fNPlanes; ++i ) {
+    delete fPlanes[i];
+    delete [] fPlaneNames[i];
   }
+  delete [] fPlanes;
+  delete [] fPlaneNames;
 }
 
 //_____________________________________________________________________________
@@ -584,6 +587,8 @@ void THcHodoscope::DeleteArrays()
 
   delete [] fxLoScin;             fxLoScin = NULL;
   delete [] fxHiScin;             fxHiScin = NULL;
+  delete [] fyLoScin;             fyLoScin = NULL;
+  delete [] fyHiScin;             fyHiScin = NULL;
   delete [] fHodoSlop;            fHodoSlop = NULL;
 
   delete [] fNPaddle;             fNPaddle = NULL;
@@ -603,11 +608,13 @@ void THcHodoscope::DeleteArrays()
   delete [] fHodoPosInvAdcLinear; fHodoPosInvAdcLinear = NULL;
   delete [] fHodoNegInvAdcLinear; fHodoNegInvAdcLinear = NULL;
   delete [] fHodoPosInvAdcAdc;    fHodoPosInvAdcAdc = NULL;
+  delete [] fHodoNegInvAdcAdc;    fHodoNegInvAdcAdc = NULL;
   delete [] fGoodPlaneTime;       fGoodPlaneTime = NULL;
   delete [] fNPlaneTime;          fNPlaneTime = NULL;
   delete [] fSumPlaneTime;        fSumPlaneTime = NULL;
   delete [] fNScinHits;           fNScinHits = NULL;
   delete [] fTdcOffset;           fTdcOffset = NULL;
+  delete [] fAdcTdcOffset;        fAdcTdcOffset = NULL;
   delete [] fHodoNegAdcTimeWindowMin;    fHodoNegAdcTimeWindowMin = NULL;
   delete [] fHodoNegAdcTimeWindowMax;    fHodoNegAdcTimeWindowMax = NULL;
   delete [] fHodoPosAdcTimeWindowMin;    fHodoPosAdcTimeWindowMin = NULL;
@@ -973,8 +980,8 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks )
   if (tracks.GetLast()+1 > 0 ) {
 
     // **MAIN LOOP: Loop over all tracks and get corrected time, tof, beta...
-    Double_t* nPmtHit = new Double_t [ntracks];
-    Double_t* timeAtFP = new Double_t [ntracks];
+    vector<Double_t> nPmtHit(ntracks);
+    vector<Double_t> timeAtFP(ntracks);
     for ( Int_t itrack = 0; itrack < ntracks; itrack++ ) { // Line 133
       nPmtHit[itrack]=0;
       timeAtFP[itrack]=0;
diff --git a/src/THcParmList.cxx b/src/THcParmList.cxx
index 445b1ea57c9b817b007cdfea8a5b2d47ef2f47a5..240344ce5a66838db2c0015aaf1af5f6f9f52cd7 100644
--- a/src/THcParmList.cxx
+++ b/src/THcParmList.cxx
@@ -56,10 +56,17 @@ An instance of THaTextvars is created to hold the string parameters.
 #include <cassert>
 #include <cstdlib>
 #include <stdexcept>
+#include <memory>
 
 using namespace std;
 Int_t  fDebug   = 1;  // Keep this at one while we're working on the code
 
+#if __cplusplus < 201103L
+# define SMART_PTR auto_ptr
+#else
+# define SMART_PTR unique_ptr
+#endif
+
 ClassImp(THcParmList)
 
 /// Create empty numerical and string parameter lists
@@ -261,7 +268,7 @@ The ENGINE CTP support parameter "blocks" which were marked with
       if(line.find_first_not_of("0123456789-,")==string::npos) { // Interpret as runnum range
 	// Interpret line as a list of comma separated run numbers or ranges
 	TString runnums(line.c_str());
-	TObjArray *runnumarr = runnums.Tokenize(",");
+	SMART_PTR<TObjArray> runnumarr( runnums.Tokenize(",") );
 	Int_t nranges=runnumarr->GetLast()+1;
 
 	InRunRange = 0;
diff --git a/src/THcScalerEvtHandler.cxx b/src/THcScalerEvtHandler.cxx
index f5170eb670ab11852d19fda62735f9da558597b5..aeaabd8c658c8284fba984462696ef75785c0c5d 100644
--- a/src/THcScalerEvtHandler.cxx
+++ b/src/THcScalerEvtHandler.cxx
@@ -50,6 +50,7 @@ To enable debugging you may try this in the setup script
 #include "TNamed.h"
 #include "TMath.h"
 #include "TString.h"
+#include "TROOT.h"
 #include <cstring>
 #include <cstdio>
 #include <cstdlib>
@@ -59,6 +60,7 @@ To enable debugging you may try this in the setup script
 #include <iterator>
 #include "THaVarList.h"
 #include "VarDef.h"
+#include "Helper.h"
 
 using namespace std;
 using namespace Decoder;
@@ -73,7 +75,9 @@ static const UInt_t MAXCHAN   = 32;
 static const UInt_t defaultDT = 4;
 
 THcScalerEvtHandler::THcScalerEvtHandler(const char *name, const char* description)
-  : THaEvtTypeHandler(name,description), evcount(0), evcountR(0.0), ifound(0), fNormIdx(-1),
+  : THaEvtTypeHandler(name,description),
+    fBCM_Gain(0), fBCM_Offset(0), fBCM_delta_charge(0),
+    evcount(0), evcountR(0.0), ifound(0), fNormIdx(-1),
     fNormSlot(-1),
     dvars(0),dvars_prev_read(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kTRUE),
     fOnlySyncEvents(kFALSE), fOnlyBanks(kFALSE), fDelayedType(-1),
@@ -88,9 +92,24 @@ THcScalerEvtHandler::THcScalerEvtHandler(const char *name, const char* descripti
 
 THcScalerEvtHandler::~THcScalerEvtHandler()
 {
-  if (fScalerTree) {
+  // The tree object is owned by ROOT since it gets associated wth the output
+  // file, so DO NOT delete it here. 
+  if (!TROOT::Initialized()) {
     delete fScalerTree;
   }
+  Podd::DeleteContainer(scalers);
+  Podd::DeleteContainer(scalerloc);
+  delete [] dvars_prev_read;
+  delete [] dvars;
+  delete [] dvarsFirst;
+  delete [] fBCM_Gain;
+  delete [] fBCM_Offset;
+  delete [] fBCM_delta_charge;
+
+  for( vector<UInt_t*>::iterator it = fDelayedEvents.begin();
+       it != fDelayedEvents.end(); ++it )
+    delete [] *it;
+  fDelayedEvents.clear();
 }
 
 Int_t THcScalerEvtHandler::End( THaRunBase* )
@@ -107,7 +126,10 @@ Int_t THcScalerEvtHandler::End( THaRunBase* )
     evNumberR = -1;
   if (fScalerTree) fScalerTree->Fill();
 
-  fDelayedEvents.clear();	// Does this free the arrays?
+  for( vector<UInt_t*>::iterator it = fDelayedEvents.begin();
+       it != fDelayedEvents.end(); ++it )
+    delete [] *it;
+  fDelayedEvents.clear();
 
   if (fScalerTree) fScalerTree->Write();
   return 0;
@@ -222,9 +244,7 @@ Int_t THcScalerEvtHandler::Analyze(THaEvData *evdata)
     
     UInt_t *datacopy = new UInt_t[evlen];
     fDelayedEvents.push_back(datacopy);
-    for(Int_t i=0;i<evlen;i++) {
-      datacopy[i] = rdata[i];
-    }
+    memcpy(datacopy,rdata,evlen*sizeof(UInt_t));
     return 1;
   } else { 			// A normal event
     if (fDebugFile) *fDebugFile<<"\n\nTHcScalerEvtHandler :: Debugging event type "<<dec<<evdata->GetEvType()<< " event num = " << evdata->GetEvNum() << endl<<endl;
@@ -535,7 +555,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
       UInt_t scaldata = scalers[idx]->GetData(ichan);
       if ( scal_current > fbcm_Current_Threshold) {
 	UInt_t diff;
-	if(scaldata < scal_prev_read[nscal-1]) {
+	if(nscal > 0 && scaldata < scal_prev_read[nscal-1]) {
 	  diff = (kMaxUInt-(dvars_prev_read[ivar] - 1)) + scaldata;
 	} else {
 	  diff = scaldata - dvars_prev_read[ivar];
@@ -586,6 +606,9 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date)
   fStatus = kOK;
   fNormIdx = -1;
 
+  for( vector<UInt_t*>::iterator it = fDelayedEvents.begin();
+       it != fDelayedEvents.end(); ++it )
+    delete [] *it;
   fDelayedEvents.clear();
 
   cout << "Howdy !  We are initializing THcScalerEvtHandler !!   name =   "
diff --git a/src/THcScalerEvtHandler.h b/src/THcScalerEvtHandler.h
index 41ce88c40416f21d83feb7b06546651694e7ff0b..c4749ffcb6a2393f9e664f6a9884ca7472b48b26 100644
--- a/src/THcScalerEvtHandler.h
+++ b/src/THcScalerEvtHandler.h
@@ -26,7 +26,7 @@ class HCScalerLoc { // Utility class used by THcScalerEvtHandler
 	      UInt_t iki, Int_t iv) :
    name(nm), description(desc), index(idx), islot(s1), ichan(ich),
    ikind(iki), ivar(iv) { };
-  ~HCScalerLoc();
+  ~HCScalerLoc() {}
   TString name, description;
   UInt_t index, islot, ichan, ikind, ivar;
 };
diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx
index 38033103faf6282a290bc04b300eea391a3faa2b..175ab79d04d556d24da87c1591bf99a7572abff4 100644
--- a/src/THcScintillatorPlane.cxx
+++ b/src/THcScintillatorPlane.cxx
@@ -33,7 +33,30 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name,
 					    const char* description,
 					    const Int_t planenum,
 					    THaDetectorBase* parent )
-: THaSubDetector(name,description,parent)
+: THaSubDetector(name,description,parent),
+  fParentHitList(0), frPosAdcErrorFlag(0), frNegAdcErrorFlag(0),
+  frPosTDCHits(0), frNegTDCHits(0), frPosADCHits(0), frNegADCHits(0),
+  frPosADCSums(0), frNegADCSums(0), frPosADCPeds(0), frNegADCPeds(0),
+  fHodoHits(0), frPosTdcTimeRaw(0), frPosAdcPedRaw(0),
+  frPosAdcPulseIntRaw(0), frPosAdcPulseAmpRaw(0),
+  frPosAdcPulseTimeRaw(0), frPosTdcTime(0), frPosAdcPed(0),
+  frPosAdcPulseInt(0), frPosAdcPulseAmp(0), frPosAdcPulseTime(0),
+  frNegTdcTimeRaw(0), frNegAdcPedRaw(0), frNegAdcPulseIntRaw(0),
+  frNegAdcPulseAmpRaw(0), frNegAdcPulseTimeRaw(0), frNegTdcTime(0),
+  frNegAdcPed(0), frNegAdcPulseInt(0), frNegAdcPulseAmp(0),
+  frNegAdcPulseTime(0), fPosCenter(0), fHodoPosMinPh(0),
+  fHodoNegMinPh(0), fHodoPosPhcCoeff(0), fHodoNegPhcCoeff(0),
+  fHodoPosTimeOffset(0), fHodoNegTimeOffset(0), fHodoVelLight(0),
+  fHodoPosInvAdcOffset(0), fHodoNegInvAdcOffset(0),
+  fHodoPosAdcTimeWindowMin(0), fHodoPosAdcTimeWindowMax(0),
+  fHodoNegAdcTimeWindowMin(0), fHodoNegAdcTimeWindowMax(0),
+  fHodoPosInvAdcLinear(0), fHodoNegInvAdcLinear(0),
+  fHodoPosInvAdcAdc(0), fHodoNegInvAdcAdc(0), fHodoVelFit(0),
+  fHodoCableFit(0), fHodo_LCoeff(0), fHodoPos_c1(0), fHodoNeg_c1(0),
+  fHodoPos_c2(0), fHodoNeg_c2(0), fHodoSigma(0), fPosPedSum(0),
+  fPosPedSum2(0), fPosPedLimit(0), fPosPedCount(0), fNegPedSum(0),
+  fNegPedSum2(0), fNegPedLimit(0), fNegPedCount(0), fPosPed(0),
+  fPosSig(0), fPosThresh(0), fNegPed(0), fNegSig(0), fNegThresh(0)
 {
   // Normal constructor with name and description
   fHodoHits = new TClonesArray("THcHodoHit",16);
@@ -77,14 +100,14 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name,
   fPlaneNum = planenum;
   fTotPlanes = planenum;
   fNScinHits = 0;
-
-  fPosCenter = NULL;
 }
 
 //______________________________________________________________________________
 THcScintillatorPlane::~THcScintillatorPlane()
 {
   // Destructor
+  if( fIsSetup )
+    RemoveVariables();
   delete  frPosAdcErrorFlag; frPosAdcErrorFlag = NULL;
   delete  frNegAdcErrorFlag; frNegAdcErrorFlag = NULL;
 
@@ -122,7 +145,7 @@ THcScintillatorPlane::~THcScintillatorPlane()
   delete frNegAdcPulseAmp;
   delete frNegAdcPulseTime;
 
-  delete [] fPosCenter;
+  delete [] fPosCenter; fPosCenter = 0;
 
   delete [] fHodoPosMinPh; fHodoPosMinPh = NULL;
   delete [] fHodoNegMinPh; fHodoNegMinPh = NULL;
@@ -153,6 +176,18 @@ THcScintillatorPlane::~THcScintillatorPlane()
   delete [] fHodoVelLight; fHodoVelLight = NULL;
   delete [] fHodoSigma; fHodoSigma = NULL;
 
+  delete [] fPosPedSum; fPosPedSum = 0;
+  delete [] fPosPedSum2; fPosPedSum2 = 0;
+  delete [] fPosPedLimit; fPosPedLimit = 0;
+  delete [] fPosPedCount; fPosPedCount = 0;
+  delete [] fNegPedSum; fNegPedSum = 0;
+  delete [] fNegPedSum2; fNegPedSum2 = 0;
+  delete [] fNegPedLimit; fNegPedLimit = 0;
+  delete [] fNegPedCount; fNegPedCount = 0;
+  delete [] fPosPed; fPosPed = 0;
+  delete [] fNegPed; fNegPed = 0;
+  delete [] fPosThresh; fPosThresh = 0;
+  delete [] fNegThresh; fNegThresh = 0;
 }
 
 //______________________________________________________________________________
diff --git a/src/THcShower.cxx b/src/THcShower.cxx
index ae23af024489e6cf8e2729c43a3dba4d17ed8210..bdaf6084e7ba152ccba87527dcb44f1dd9801509 100644
--- a/src/THcShower.cxx
+++ b/src/THcShower.cxx
@@ -19,19 +19,26 @@
 #include "TClonesArray.h"
 #include "THaTrackProj.h"
 #include "TMath.h"
+#include "Helper.h"
 
 #include <cstring>
 #include <cstdio>
 #include <cstdlib>
 #include <iostream>
 #include <numeric>
+#include <cassert>
 
 using namespace std;
 
 //_____________________________________________________________________________
 THcShower::THcShower( const char* name, const char* description,
 				  THaApparatus* apparatus ) :
-  THaNonTrackingDetector(name,description,apparatus)
+  THaNonTrackingDetector(name,description,apparatus),
+  fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0),
+  fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0),
+  fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0),
+  fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0),
+  fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0)
 {
   // Constructor
   fNLayers = 0;			// No layers until we make them
@@ -43,7 +50,12 @@ THcShower::THcShower( const char* name, const char* description,
 
 //_____________________________________________________________________________
 THcShower::THcShower( ) :
-  THaNonTrackingDetector()
+  THaNonTrackingDetector(),
+  fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0),
+  fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0),
+  fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0),
+  fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0),
+  fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0)
 {
   // Constructor
 }
@@ -572,14 +584,24 @@ THcShower::~THcShower()
 {
   // Destructor. Remove variables from global list.
 
+  Clear();
   if( fIsSetup )
     RemoveVariables();
   if( fIsInit )
     DeleteArrays();
-  if (fTrackProj) {
-    fTrackProj->Clear();
-    delete fTrackProj; fTrackProj = 0;
+
+  for (THcShowerClusterListIt i=fClusterList->begin(); i!=fClusterList->end();
+       ++i) {
+    Podd::DeleteContainer(**i);
+    delete *i;
+  }
+  delete fClusterList; fClusterList = 0;
+
+  for( UInt_t i = 0; i<fNLayers; ++i) {
+    delete fPlanes[i];
   }
+  delete [] fPlanes; fPlanes = 0;
+  delete fArray; fArray = 0;
 }
 
 //_____________________________________________________________________________
@@ -587,10 +609,25 @@ void THcShower::DeleteArrays()
 {
   // Delete member arrays. Used by destructor.
 
+  for (UInt_t i = 0; i<fNTotLayers; ++i)
+    delete [] fLayerNames[i];
+  delete [] fLayerNames; fLayerNames = 0;
+
+  delete [] fPosAdcTimeWindowMin; fPosAdcTimeWindowMin = 0;
+  delete [] fNegAdcTimeWindowMin; fNegAdcTimeWindowMin = 0;
+  delete [] fPosAdcTimeWindowMax; fPosAdcTimeWindowMax = 0;
+  delete [] fNegAdcTimeWindowMax; fNegAdcTimeWindowMax = 0;
+  delete [] fShPosPedLimit; fShPosPedLimit = 0;
+  delete [] fShNegPedLimit; fShNegPedLimit = 0;
+  delete [] fPosGain; fPosGain = 0;
+  delete [] fNegGain; fNegGain = 0;
   delete [] BlockThick;  BlockThick = NULL;
   delete [] fNBlocks;  fNBlocks = NULL;
   delete [] fLayerZPos;  fLayerZPos = NULL;
+  for (UInt_t i = 0; i<fNLayers; ++i)
+    delete [] fXPos[i];
   delete [] fXPos;  fXPos = NULL;
+  delete [] fYPos;  fYPos = NULL;
   delete [] fZPos;  fZPos = NULL;
 }
 
@@ -635,11 +672,10 @@ void THcShower::Clear(Option_t* opt)
 
   for (THcShowerClusterListIt i=fClusterList->begin(); i!=fClusterList->end();
        ++i) {
+    Podd::DeleteContainer(**i);
     delete *i;
-    *i = 0;
   }
   fClusterList->clear();
-
 }
 
 //_____________________________________________________________________________
@@ -766,6 +802,7 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks)
   // Fill list of clusters.
 
   ClusterHits(HitSet, fClusterList);
+  assert( HitSet.empty() );  // else bug in ClusterHits()
 
   fNclust = (*fClusterList).size();   //number of clusters
 
diff --git a/src/THcShower.h b/src/THcShower.h
index c03fa438c21b47eec961d19e619ec121d8cd6030..9b39f4e69ebd6d6ea893a59fc8068f801129a0b1 100644
--- a/src/THcShower.h
+++ b/src/THcShower.h
@@ -268,8 +268,6 @@ protected:
   THcShowerPlane** fPlanes;     // [fNLayers] Shower Plane objects
   THcShowerArray* fArray;
 
-  TClonesArray*  fTrackProj;    // projection of track onto plane
-
   void           ClearEvent();
   void           DeleteArrays();
   virtual Int_t  ReadDatabase( const TDatime& date );
diff --git a/src/THcShowerArray.cxx b/src/THcShowerArray.cxx
index 2efd325caaeca442f5dd1e0019de1cada25971a7..4c5fedf5269b6161f65705e9640ff507613a35a1 100644
--- a/src/THcShowerArray.cxx
+++ b/src/THcShowerArray.cxx
@@ -20,12 +20,13 @@
 #include "THaTrackProj.h"
 #include "THcCherenkov.h"         //for efficiency calculations
 #include "THcHallCSpectrometer.h"
+#include "Helper.h"
 
 #include <cstring>
 #include <cstdio>
 #include <cstdlib>
 #include <iostream>
-
+#include <cassert>
 #include <fstream>
 
 using namespace std;
@@ -61,11 +62,15 @@ THcShowerArray::~THcShowerArray()
 {
   // Destructor
 
+  Clear(); // deletes allocations in fClusterList
   for (UInt_t i=0; i<fNRows; i++) {
     delete [] fXPos[i];
     delete [] fYPos[i];
     delete [] fZPos[i];
   }
+  delete [] fXPos; fXPos = 0;
+  delete [] fYPos; fYPos = 0;
+  delete [] fZPos; fZPos = 0;
 
   delete [] fPedLimit;
   delete [] fGain;
@@ -95,6 +100,11 @@ THcShowerArray::~THcShowerArray()
 
   //delete [] fE;
   delete [] fBlock_ClusterID;
+
+  delete fClusterList; fClusterList = 0;
+
+  delete [] fAdcTimeWindowMin; fAdcTimeWindowMin = 0;
+  delete [] fAdcTimeWindowMax; fAdcTimeWindowMax = 0;
 }
 
 //_____________________________________________________________________________
@@ -479,8 +489,8 @@ void THcShowerArray::Clear( Option_t* )
 
   for (THcShowerClusterListIt i=fClusterList->begin(); i!=fClusterList->end();
        ++i) {
+    Podd::DeleteContainer(**i);
     delete *i;
-    *i = 0;
   }
   fClusterList->clear();
 
@@ -570,6 +580,7 @@ Int_t THcShowerArray::CoarseProcess( TClonesArray& tracks )
   // Cluster hits and fill list of clusters.
 
   static_cast<THcShower*>(fParent)->ClusterHits(HitSet, fClusterList);
+  assert( HitSet.empty() );  // else bug in ClusterHits()
 
   fNclust = (*fClusterList).size();         //number of clusters