diff --git a/src/THcHelicityReader.cxx b/src/THcHelicityReader.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..e956fd1f07181a2e9815933917f20ea9bebb6507
--- /dev/null
+++ b/src/THcHelicityReader.cxx
@@ -0,0 +1,182 @@
+//*-- Author :    Ole Hansen    August 2006
+// Extracted from Bob Michaels' THaHelicity CVS 1.19
+////////////////////////////////////////////////////////////////////////
+//
+// THcHelicityReader
+//
+////////////////////////////////////////////////////////////////////////
+
+#include "THcHelicityReader.h"
+#include "THaEvData.h"
+#include "TMath.h"
+#include "TError.h"
+#include "VarDef.h"
+#include "THaAnalysisObject.h"   // For LoadDB
+#include <iostream>
+#include <vector>
+#include "TH1F.h"
+
+using namespace std;
+
+//____________________________________________________________________
+THcHelicityReader::THcHelicityReader()
+  : fTITime(0), fTITime_last(0), fTITime_rollovers(0), 
+    fHaveROCs(kFALSE)
+{
+  // Default constructor
+  
+}
+//____________________________________________________________________
+THcHelicityReader::~THcHelicityReader() 
+{
+  // Destructor
+
+  // Histograms will be deleted by ROOT
+  // for( Int_t i = 0; i < NHISTR; ++i ) {
+  //   delete fHistoR[i];
+  // }
+}
+
+//____________________________________________________________________
+void THcHelicityReader::Clear( Option_t* ) 
+{
+  
+  fIsMPS = fIsQrt = fIsHelp = fIsHelm = kFALSE;
+
+}
+
+//_____________________________________________________________________________
+Int_t THcHelicityReader::ReadDatabase( const char* /*dbfilename*/,
+					    const char* /*prefix*/,
+					    const TDatime& /*date*/,
+					    int /*debug_flag*/ )
+{
+
+  // Eventually get these from the parameter file
+
+  SetROCinfo(kHel,2,14,9);
+  SetROCinfo(kHelm,2,14,8);
+  SetROCinfo(kMPS,2,14,10);
+  SetROCinfo(kQrt,2,14,7);
+  SetROCinfo(kTime,2,21,2);
+
+  return THaAnalysisObject::kOK;
+}
+
+//_____________________________________________________________________________
+void THcHelicityReader::Begin()
+{ 
+  // static const char* const here = "THcHelicityReader::Begin";
+  // cout<<here<<endl;
+
+  fTITime_last = 0;
+  fTITime = 0;
+  fTITime_rollovers = 0;
+
+  return;
+}
+//____________________________________________________________________
+void THcHelicityReader::End()
+{
+  // static const char* const here = "THcHelicityReader::End";
+  // cout<<here<<endl;
+
+  return;
+}
+//____________________________________________________________________
+Int_t THcHelicityReader::ReadData( const THaEvData& evdata ) 
+{
+  // Obtain the present data from the event for QWEAK helicity mode.
+
+  static const char* here = "THcHelicityReader::ReadData";
+
+  //  std::cout<<" kHel, kTime, kRing="<< kHel<<" "<<kTime<<" "<<kRing<<endl;
+  //     for (int jk=0; jk<3; jk++)
+  //     {
+  //       std::cout<<" which="<<jk
+  // 	       <<" roc="<<fROCinfo[jk].roc
+  // 	       <<" header="<<fROCinfo[jk].header
+  // 	       <<" index="<<fROCinfo[jk].index 
+  // 	       <<endl;
+  //     }
+  
+  //  std::cout<<" fHaveROCs="<<fHaveROCs<<endl;
+  if( !fHaveROCs ) {
+    ::Error( here, "ROC data (detector map) not properly set up." );
+    return -1;
+  }
+
+  // Get the TI Data
+  //  Int_t fTIType = evData.GetData(fTICrate, fTISlot, 0, 0);
+  //  Int_t fTIEvNum = evData.GetData(fTICrate, fTISlot, 1, 0);
+  UInt_t titime = (UInt_t) evdata.GetData(fROCinfo[kTime].roc,
+					  fROCinfo[kTime].slot,
+					  fROCinfo[kTime].index, 0);
+  //cout << fTITime_last << " " << titime << endl;
+  if(titime < fTITime_last) {
+    fTITime_rollovers++;
+  }
+  fTITime = titime + fTITime_rollovers*4294967296;
+  fTITime_last = titime;
+
+  const_cast<THaEvData&>(evdata).SetEvTime(fTITime);
+
+  // Get the helicity control signals.  These are from the pedestals
+  // acquired by FADC channels.
+
+  UInt_t helpraw = evdata.GetData(Decoder::kPulsePedestal,
+				  fROCinfo[kHel].roc,
+				  fROCinfo[kHel].slot,
+				  fROCinfo[kHel].index, 0);
+  UInt_t helmraw = evdata.GetData(Decoder::kPulsePedestal,
+				  fROCinfo[kHelm].roc,
+				  fROCinfo[kHelm].slot,
+				  fROCinfo[kHelm].index, 0);
+  UInt_t mpsraw = evdata.GetData(Decoder::kPulsePedestal,
+				  fROCinfo[kMPS].roc,
+				  fROCinfo[kMPS].slot,
+				  fROCinfo[kMPS].index, 0);
+  UInt_t qrtraw = evdata.GetData(Decoder::kPulsePedestal,
+				  fROCinfo[kQrt].roc,
+				  fROCinfo[kQrt].slot,
+				  fROCinfo[kQrt].index, 0);
+
+  fIsQrt = qrtraw > 1000;
+  fIsMPS = mpsraw > 1000;
+  fIsHelp = helpraw > 1000;
+  fIsHelm = helmraw > 1000;
+
+  return 0;
+}
+
+//TODO: this should not be needed once LoadDB can fill fROCinfo directly
+//____________________________________________________________________
+Int_t THcHelicityReader::SetROCinfo( EROC which, Int_t roc,
+				       Int_t slot, Int_t index )
+{
+
+  // Define source and offset of data.  Normally called by ReadDatabase
+  // of the detector that is a THcHelicityReader.
+  //
+  // "which" is one of  { kHel, kKelm, kQrt, kTime }.
+  // You must define at least the kHel and kTime ROCs.
+  // Returns <0 if parameter error, 0 if success
+
+  if( which<kHel || which>=kCount )
+    return -1;
+  if( roc <= 0 || roc > 255 )
+    return -2;
+
+  fROCinfo[which].roc    = roc;
+  fROCinfo[which].slot = slot;
+  fROCinfo[which].index  = index;
+
+  cout << "SetROCInfo: " << which << " " << fROCinfo[kHel].roc << " " << fROCinfo[kTime].roc << endl;
+  fHaveROCs = ( fROCinfo[kHel].roc > 0 && fROCinfo[kTime].roc > 0 );
+  
+  return 0;
+}
+
+//____________________________________________________________________
+ClassImp(THcHelicityReader)
+
diff --git a/src/THcHelicityReader.h b/src/THcHelicityReader.h
new file mode 100644
index 0000000000000000000000000000000000000000..a65ad13d6abd9e3cd63b0d3eae70c2da73b23488
--- /dev/null
+++ b/src/THcHelicityReader.h
@@ -0,0 +1,70 @@
+#ifndef Podd_THcHelicityReader_h_
+#define Podd_THcHelicityReader_h_
+
+//////////////////////////////////////////////////////////////////////////
+//
+// THcHelicityReader
+//
+// Routines for decoding QWEAK helicity hardware
+//
+//////////////////////////////////////////////////////////////////////////
+
+#include "Rtypes.h"
+
+class THaEvData;
+class TDatime;
+class TH1F;
+
+class THcHelicityReader {
+  
+public:
+  THcHelicityReader();
+  virtual ~THcHelicityReader();
+  
+  void Print();
+
+  struct ROCinfo {
+    Int_t  roc;               // ROC to read out
+    Int_t  slot;            // Headers to search for (0 = ignore)
+    Int_t  index;             // Index into buffer
+  };
+  
+protected:
+
+  // Used by ReadDatabase
+  enum EROC { kHel = 0, kHelm, kMPS, kQrt, kTime, kCount };
+  Int_t SetROCinfo( EROC which, Int_t roc, Int_t slot, Int_t index );
+
+  virtual void  Clear( Option_t* opt="" );
+  virtual Int_t ReadData( const THaEvData& evdata );
+  Int_t         ReadDatabase( const char* dbfilename, const char* prefix,
+			      const TDatime& date, int debug_flag = 0 );
+  void Begin();
+  void End();
+
+  ULong64_t fTITime;
+  UInt_t fTITime_last;
+  UInt_t fTITime_rollovers;
+  
+  // Reported Helicity status for the event
+  Bool_t fIsMPS;
+  Bool_t fIsQrt;
+  Bool_t fIsHelp;
+  Bool_t fIsHelm;
+
+  ROCinfo  fROCinfo[kCount];
+
+  Int_t    fQWEAKDebug;          // Debug level
+  Bool_t   fHaveROCs;         // Required ROCs are defined
+  Bool_t   fNegGate;          // Invert polarity of gate, TO DO implement this functionality
+  static const Int_t NHISTR = 12;
+  //  TH1F*    fHistoR[12];  // Histograms
+
+private:
+
+  ClassDef(THcHelicityReader,0) // Helper class for reading QWEAK helicity data
+
+};
+
+#endif
+