diff --git a/src/THcRawShowerHit.cxx b/src/THcRawShowerHit.cxx
index 5c28eacf8a18bb751ef5eff4d5888c1b13551d92..d509621ef9bebeff0557ba74249d9fcbf2833fd3 100644
--- a/src/THcRawShowerHit.cxx
+++ b/src/THcRawShowerHit.cxx
@@ -6,10 +6,18 @@
 //                                                                           //
 // Contains plane, counter and pos/neg adc and tdc values                    //
 //                                                                           //
+// Enhanced to work with FADC250 data samples.  If fNPosSamples/fNNegSamples //
+// is greater than 1, assume that the data held in the hit is the sampled    //
+// waveform.  Signals 0,1 will return the integrated pulse with dynamic      //
+// pedestal subtraction (first four samples comprise the pedestal).  Signals //
+// 2,3 are reserved for time information.  Signals 4,5 are pedestals and     //
+// 6 and 7 are the straight sum of all the samples.                          //
+//                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "THcRawShowerHit.h"
 #include <iostream>
+#include <cassert>
 
 using namespace std;
 
@@ -22,9 +30,56 @@ void THcRawShowerHit::SetData(Int_t signal, Int_t data) {
   } 
 }
 
+Int_t THcRawShowerHit::GetData(Int_t signal, Int_t isamplow, Int_t isamphigh,
+	      Int_t iintegrallow, Int_t iintegralhigh) {
+  Int_t adcsum=0;
+  Double_t pedestal=0.0;
+
+  if(signal==0 || signal == 1) {
+    pedestal = GetPedestal(signal, isamplow, isamphigh);
+
+#if 0
+    for(Int_t i=0;i<fNPosSamples;i++) {
+      cout << fCounter << " " << i;
+      if(i >= isamplow && i<=isamphigh) {
+	cout << "P ";
+      }	else if (i >= iintegrallow && i<=iintegralhigh) {
+	cout << "D ";
+      } else {
+	cout << "  ";
+      }
+      cout << fADC_pos[i] << " " << fADC_pos[i] - pedestal << endl;
+    }
+#endif
+  }
+  if(signal==4 || signal==5) {
+    pedestal = GetPedestal(signal-4, isamplow, isamphigh);
+    return(pedestal);
+  }
+  if(signal==0 || signal==6) {
+    assert(iintegralhigh<(Int_t) fNPosSamples);
+    for(UInt_t isample=iintegrallow;isample<=iintegralhigh;isample++) {
+      adcsum += fADC_pos[isample] - pedestal;
+    }
+    return(adcsum);
+  } else if (signal==1 || signal==7) {
+    assert(iintegralhigh<(Int_t) fNNegSamples);
+    for(UInt_t isample=iintegrallow;isample<=iintegralhigh;isample++) {
+      adcsum += fADC_neg[isample] - pedestal;
+    }
+    return(adcsum);
+  } 
+  return(-1); // Actually should throw exception
+}
+  
 // Return sum of samples
+// For Fastbus ADC, this will simply be the hardware ADC value as there
+// is just one sample.  For Flash ADCs, this should return the
+// integrated ADC value if the FADC provided that, otherwise the sum
+// of all the samples
 Int_t THcRawShowerHit::GetData(Int_t signal) {
   Int_t adcsum=0;
+
   if(signal==0) {
     for(UInt_t isample=0;isample<fNPosSamples;isample++) {
       adcsum += fADC_pos[isample];
@@ -40,7 +95,7 @@ Int_t THcRawShowerHit::GetData(Int_t signal) {
 }
 
 // Return a requested sample
-Int_t THcRawShowerHit::GetData(Int_t signal, UInt_t isample) {
+Int_t THcRawShowerHit::GetSample(Int_t signal, UInt_t isample) {
   if(signal==0) {
     if(isample >=0 && isample< fNPosSamples) {
       return(fADC_pos[isample]);
@@ -53,6 +108,27 @@ Int_t THcRawShowerHit::GetData(Int_t signal, UInt_t isample) {
   return(-1);
 }
 
+Double_t THcRawShowerHit::GetPedestal(Int_t signal, Int_t isamplow, Int_t isamphigh) {
+  // No error checking on pedestal range
+  Double_t pedestal=0.0;
+  if(signal==0 && fNPosSamples > 1) {
+    if(fNPosSamples > isamphigh) {
+      for(Int_t i = isamplow;i<=isamphigh;i++) {
+	pedestal += fADC_pos[i];
+      }
+      return(pedestal/(isamphigh-isamplow+1));
+    }
+  } else if (signal==1 && fNNegSamples > 1) {
+    if(fNNegSamples > isamphigh) {
+      for(Int_t i = isamplow;i<=isamphigh;i++) {
+	pedestal += fADC_neg[i];
+      }
+      return(pedestal/(isamphigh-isamplow+1));
+    }
+  }
+  return(pedestal);
+}
+      
 // Return the number of samples
 Int_t THcRawShowerHit::GetNSamples(Int_t signal) {
   if(signal==0) {
diff --git a/src/THcRawShowerHit.h b/src/THcRawShowerHit.h
index f7cd000f214c883cd317657dc41ffe7e2334c168..5a1102d5a837c760eff1b579b7b211adb5711da2 100644
--- a/src/THcRawShowerHit.h
+++ b/src/THcRawShowerHit.h
@@ -22,7 +22,10 @@ class THcRawShowerHit : public THcRawHit {
 
   void SetData(Int_t signal, Int_t data);
   Int_t GetData(Int_t signal);
-  Int_t GetData(Int_t signal, UInt_t isample);
+  Int_t GetData(Int_t signal, Int_t isamplow, Int_t isamphigh,
+		Int_t iintegrallow, Int_t iintegralhigh);
+  Int_t GetSample(Int_t signal, UInt_t isample);
+  Double_t GetPedestal(Int_t signal, Int_t isamplow, Int_t isamphigh);
   Int_t GetNSamples(Int_t signal);
 
   //  virtual Bool_t  IsSortable () const {return kTRUE; }
diff --git a/src/THcShowerArray.cxx b/src/THcShowerArray.cxx
index 1d465859e9734b67cbbbd69e4f3b054f481b23a9..2c57c516491683fbfd2e21b07fb91961a3ccc005 100644
--- a/src/THcShowerArray.cxx
+++ b/src/THcShowerArray.cxx
@@ -46,6 +46,7 @@ THcShowerArray::~THcShowerArray()
   delete fADCHits;
 
   delete [] fA;
+  delete [] fP;
 }
 
 //_____________________________________________________________________________
@@ -77,9 +78,19 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date )
   prefix[1]='\0';
 
   cout << "Parent name: " << GetParent()->GetPrefix() << endl;
+  fUsingFADC=0;
+  fPedSampLow=0;
+  fPedSampHigh=9;
+  fDataSampLow=23;
+  fDataSampHigh=49;
   DBRequest list[]={
     {"cal_nrows", &fNRows, kInt},
     {"cal_ncolumns", &fNColumns, kInt},
+    {"cal_using_fadc", &fUsingFADC, kInt, 0, 1},
+    {"cal_ped_sample_low", &fPedSampLow, kInt, 0, 1},
+    {"cal_ped_sample_high", &fPedSampHigh, kInt, 0, 1},
+    {"cal_data_sample_low", &fDataSampLow, kInt, 0, 1},
+    {"cal_data_sample_high", &fDataSampHigh, kInt, 0, 1},
     {0}
   };
   gHcParms->LoadParmValues((DBRequest*)&list, prefix);
@@ -89,7 +100,9 @@ Int_t THcShowerArray::ReadDatabase( const TDatime& date )
   // Here read the 2-D arras of pedestals, gains, etc.
 
 
+  // Event by event amplitude and pedestal
   fA = new Double_t[fNelem];
+  fP = new Double_t[fNelem];
 
   return kOK;
 }
@@ -106,6 +119,7 @@ Int_t THcShowerArray::DefineVariables( EMode mode )
   RVarDef vars[] = {
     {"adchits", "List of ADC hits", "fADCHits.THcSignalHit.GetPaddleNumber()"},
     {"a", "Raw ADC Amplitude", "fA"},
+    {"p", "Dynamic ADC Pedestal", "fP"},
     { 0 }
   };
 
@@ -173,7 +187,13 @@ Int_t THcShowerArray::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
     THcRawShowerHit* hit = (THcRawShowerHit *) rawhits->At(ihit);
 
     // Should probably check that counter # is in range
-    fA[hit->fCounter-1] = hit->GetData(0);
+    if(fUsingFADC) {
+      fA[hit->fCounter-1] = hit->GetData(0,fPedSampLow,fPedSampHigh,
+					 fDataSampLow,fDataSampHigh);
+      fP[hit->fCounter-1] = hit->GetPedestal(0,fPedSampLow,fPedSampHigh);
+    } else {
+          fA[hit->fCounter-1] = hit->GetData(0);
+    }
 
     // Do other stuff like comparison to thresholds, signal hits, energy sums
 
diff --git a/src/THcShowerArray.h b/src/THcShowerArray.h
index be52dad31cd13c297d2952182a84cde5447a58e4..681e886d6be1b47a2cd128e1f00c3de1557ae62c 100644
--- a/src/THcShowerArray.h
+++ b/src/THcShowerArray.h
@@ -55,6 +55,7 @@ public:
 protected:
 
   Double_t* fA;                 // [fNelem] ADC amplitude of blocks
+  Double_t* fP;                 // [fNelem] Event by event pedestals
 
   TClonesArray* fADCHits;	// List of ADC hits
 
@@ -64,6 +65,11 @@ protected:
   // Parameters
   Int_t fNRows;
   Int_t fNColumns;
+  Int_t fUsingFADC;		// != 0 if using FADC in sample mode
+  Int_t fPedSampLow;		// Sample range for
+  Int_t fPedSampHigh;		// dynamic pedestal
+  Int_t fDataSampLow;		// Sample range for
+  Int_t fDataSampHigh;		// sample integration
 
   Int_t fLayerNum;		// 2 for SHMS
   // Accumulators for pedestals go here