diff --git a/src/THcScalerEvtHandler.cxx b/src/THcScalerEvtHandler.cxx
index dbdaf6cb200650ac89510a3bcc677e44ff3b0b7d..a33a85f309db77ddf1b66bae5f330c6a7bd89ee5 100644
--- a/src/THcScalerEvtHandler.cxx
+++ b/src/THcScalerEvtHandler.cxx
@@ -75,10 +75,14 @@ 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),
     dvars(0),dvars_prev_read(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kTRUE),
-    fOnlySyncEvents(kFALSE), fOnlyBanks(kFALSE), fDelayedType(-1)
+    fOnlySyncEvents(kFALSE), fOnlyBanks(kFALSE), fDelayedType(-1),
+    fClockChan(-1), fLastClock(0), fClockOverflows(0)
 {
   fRocSet.clear();
   fModuleSet.clear();
+  scal_prev_read.clear();
+  scal_present_read.clear();
+  scal_overflows.clear();
 }
 
 THcScalerEvtHandler::~THcScalerEvtHandler()
@@ -333,7 +337,12 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
   // The correspondance between dvars and the scaler and the channel
   // will be driven by a scaler.map file  -- later
   Double_t scal_current=0;
-  fTotalTime =  scalers[fNormIdx]->GetData(fClockChan)/fClockFreq;
+  UInt_t thisClock = scalers[fNormIdx]->GetData(fClockChan);
+  if(thisClock < fLastClock) {	// Count clock scaler wrap arounds
+    fClockOverflows++;
+  }
+  fTotalTime = (thisClock+(((Double_t) fClockOverflows)*kMaxUInt+fClockOverflows))/fClockFreq;
+  fLastClock = thisClock;
   fDeltaTime= fTotalTime - fPrevTotalTime;
   fPrevTotalTime=fTotalTime;
   Int_t nscal=0;
@@ -348,10 +357,12 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
 	  (ichan < MAXCHAN)){
 	if(fUseFirstEvent){
 	  if (scalerloc[ivar]->ikind == ICOUNT){
-	    dvars[ivar] = scalers[isca]->GetData(ichan);
-	    scal_present_read.push_back(dvars[ivar]);
-	    scal_prev_read.push_back(0.0);
-	    dvarsFirst[ivar] = 0;
+	    UInt_t scaldata = scalers[isca]->GetData(ichan);
+	    dvars[ivar] = scaldata;
+	    scal_present_read.push_back(scaldata);
+	    scal_prev_read.push_back(0);
+	    scal_overflows.push_back(0);
+	    dvarsFirst[ivar] = 0.0;
 	  }
 	  if (scalerloc[ivar]->ikind == ITIME){
 	    dvars[ivar] =fTotalTime;
@@ -378,8 +389,10 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
          	if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvars[ivar];
 	    }
 	    if (scalerloc[ivar]->ikind == ICHARGE) {
-	      if (bcm_ind != -1) fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
-	      if (bcm_ind != -1) dvars[ivar]+=fBCM_delta_charge[bcm_ind];
+	      if (bcm_ind != -1) {
+		fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
+		dvars[ivar]+=fBCM_delta_charge[bcm_ind];
+	      }
 	    }
 	    //	    printf("1st event %i index %i fBCMname %s scalerloc %s offset %f gain %f computed %f\n",evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],dvars[ivar]);
 	  }
@@ -390,7 +403,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
 	  if (scalerloc[ivar]->ikind == ICOUNT) {
               dvarsFirst[ivar] = scalers[isca]->GetData(ichan) ;
               scal_present_read.push_back(dvarsFirst[ivar]);
-              scal_prev_read.push_back(0.0);
+              scal_prev_read.push_back(0);
 	  }
 	  if (scalerloc[ivar]->ikind == ITIME){
 	    dvarsFirst[ivar] = fTotalTime;
@@ -416,8 +429,10 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
          	if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvarsFirst[ivar];
 	    }
 	    if (scalerloc[ivar]->ikind == ICHARGE) {
-	       if (bcm_ind != -1) fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
-               if (bcm_ind != -1) dvarsFirst[ivar]+=fBCM_delta_charge[bcm_ind];
+	      if (bcm_ind != -1) {
+		fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
+               dvarsFirst[ivar]+=fBCM_delta_charge[bcm_ind];
+	      }
 	    }
 	    }
 	  if (fDebugFile) *fDebugFile << "   dvarsFirst  "<<scalerloc[ivar]->ikind<<"  "<<dvarsFirst[ivar]<<endl;
@@ -426,21 +441,33 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
       else {
 	cout << "THcScalerEvtHandler:: ERROR:: incorrect index "<<ivar<<"  "<<isca<<"  "<<ichan<<endl;
       }
-    }else{ //evcount=/=0
+    }else{ // evcount != 0
       if (fDebugFile) *fDebugFile << "Debug dvars "<<i<<"   "<<ivar<<"  "<<isca<<"  "<<ichan<<endl;
       if ((ivar < scalerloc.size()) &&
 	  (isca < scalers.size()) &&
 	  (ichan < MAXCHAN)) {
 	if (scalerloc[ivar]->ikind == ICOUNT) {
-            dvars[ivar] = scalers[isca]->GetData(ichan)-dvarsFirst[ivar];
-            scal_present_read[nscal]=dvars[ivar];
+	    UInt_t scaldata = scalers[isca]->GetData(ichan);
+	    if(scaldata < scal_prev_read[nscal]) {
+	      scal_overflows[nscal]++;
+	    }
+            dvars[ivar] = scaldata + (1+((Double_t)kMaxUInt))*scal_overflows[nscal]
+	      -dvarsFirst[ivar];
+            scal_present_read[nscal]=scaldata;
 	    nscal++;
 	}
 	if (scalerloc[ivar]->ikind == ITIME) {
 	  dvars[ivar] = fTotalTime;
 	}
 	if (scalerloc[ivar]->ikind == IRATE) {
-	  dvars[ivar] =  (scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/fDeltaTime;
+	  UInt_t scaldata = scalers[isca]->GetData(ichan);
+	  UInt_t diff;
+	  if(scaldata < scal_prev_read[nscal-1]) {
+	    diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata;
+	  } else {
+	    diff = scaldata - scal_prev_read[nscal-1];
+	  }
+	  dvars[ivar] =  diff/fDeltaTime;
 	  // printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[isca]->GetRate(ichan));//checks
 	}
 	if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE)
@@ -456,12 +483,30 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
 	      }
 	    if (scalerloc[ivar]->ikind == ICURRENT) {
               dvars[ivar]=0;
-	      if (bcm_ind != -1) dvars[ivar]=((scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
-         	if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvars[ivar];
+	      if (bcm_ind != -1) {
+		UInt_t scaldata = scalers[isca]->GetData(ichan);
+		UInt_t diff;
+		if(scaldata < scal_prev_read[nscal-1]) {
+		  diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata;
+		} else {
+		  diff = scaldata - scal_prev_read[nscal-1];
+		}
+		dvars[ivar]=(diff/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
+	      }
+	      if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvars[ivar];
 	    }
 	    if (scalerloc[ivar]->ikind == ICHARGE) {
-	       if (bcm_ind != -1) fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
-               if (bcm_ind != -1) dvars[ivar]+=fBCM_delta_charge[bcm_ind];
+	      if (bcm_ind != -1) {
+		UInt_t scaldata = scalers[isca]->GetData(ichan);
+		UInt_t diff;
+		if(scaldata < scal_prev_read[nscal-1]) {
+		  diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata;
+		} else {
+		  diff = scaldata - scal_prev_read[nscal-1];
+		}
+		fBCM_delta_charge[bcm_ind]=fDeltaTime*(diff/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
+                dvars[ivar]+=fBCM_delta_charge[bcm_ind];
+	      }
 	    }
 	    //	    printf("event %i index %i fBCMname %s scalerloc %s offset %f gain %f computed %f\n",evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],dvars[ivar]);
 	  }
@@ -478,10 +523,17 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
     size_t isca = scalerloc[i]->iscaler;
     size_t ichan = scalerloc[i]->ichan;
     if (scalerloc[ivar]->ikind == ICUT+ICOUNT){
+      UInt_t scaldata = scalers[isca]->GetData(ichan);
       if ( scal_current > fbcm_Current_Threshold) {
-         dvars[ivar] += (scalers[isca]->GetData(ichan)-dvars_prev_read[ivar]);
+	UInt_t diff;
+	if(scaldata < scal_prev_read[nscal-1]) {
+	  diff = (kMaxUInt-(dvars_prev_read[ivar] - 1)) + scaldata;
+	} else {
+	  diff = scaldata - dvars_prev_read[ivar];
+	}
+	dvars[ivar] += diff;
       } 
-      dvars_prev_read[ivar] = scalers[isca]->GetData(ichan);
+      dvars_prev_read[ivar] = scaldata;
     }
     if (scalerloc[ivar]->ikind == ICUT+ICHARGE){
 	    Int_t bcm_ind=-1;
@@ -740,11 +792,11 @@ void THcScalerEvtHandler::DefVars()
   // called after AddVars has finished being called.
   Nvars = scalerloc.size();
   if (Nvars == 0) return;
-  dvars_prev_read = new Double_t[Nvars];  // dvars is a member of this class
+  dvars_prev_read = new UInt_t[Nvars];  // dvars_prev_read is a member of this class
   dvars = new Double_t[Nvars];  // dvars is a member of this class
   dvarsFirst = new Double_t[Nvars];  // dvarsFirst is a member of this class
   memset(dvars, 0, Nvars*sizeof(Double_t));
-  memset(dvars_prev_read, 0, Nvars*sizeof(Double_t));
+  memset(dvars_prev_read, 0, Nvars*sizeof(UInt_t));
   memset(dvarsFirst, 0, Nvars*sizeof(Double_t));
   if (gHaVars) {
     if(fDebugFile) *fDebugFile << "THcScalerEVtHandler:: Have gHaVars "<<gHaVars<<endl;
diff --git a/src/THcScalerEvtHandler.h b/src/THcScalerEvtHandler.h
index 0a406ae55dac14fd64a564182c3d891465c95c19..b31a5df71042a6de2296a1965fba551617af624e 100644
--- a/src/THcScalerEvtHandler.h
+++ b/src/THcScalerEvtHandler.h
@@ -60,7 +60,6 @@ private:
    Double_t fDeltaTime;
    Double_t fPrevTotalTime;
    Double_t fbcm_Current_Threshold;
-   size_t fClockChan;
    Double_t fClockFreq;
    Int_t fbcm_Current_Threshold_Index;
    char** fBCM_Name;
@@ -68,15 +67,19 @@ private:
    Double_t evcountR;
    Int_t Nvars, ifound, fNormIdx, nscalers;
    Double_t *dvars;
-   Double_t *dvars_prev_read;
-   std::vector<Int_t> scal_prev_read;
-   std::vector<Int_t> scal_present_read;
+   UInt_t *dvars_prev_read;
+   std::vector<UInt_t> scal_prev_read;
+   std::vector<UInt_t> scal_present_read;
+   std::vector<UInt_t> scal_overflows;
    Double_t *dvarsFirst;
    TTree *fScalerTree;
    Bool_t fUseFirstEvent;
    Bool_t fOnlySyncEvents;
    Bool_t fOnlyBanks;
    Int_t fDelayedType;
+   Int_t fClockChan;
+   UInt_t fLastClock;
+   Int_t fClockOverflows;
    std::vector<UInt_t*> fDelayedEvents;
    std::set<UInt_t> fRocSet;
    std::set<UInt_t> fModuleSet;