diff --git a/src/register/hei_register.cpp b/src/register/hei_register.cpp
deleted file mode 100755
index ac31f91..0000000
--- a/src/register/hei_register.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-
-/* Module Description *************************************************/
-/*                                                                    */
-/*  Description:  This module contains the implementation for the     */
-/*   Processor Runtime Diagnostics Scan Communication                 */
-/*   Register class.                                                  */
-/*                                                                    */
-/*  Notes:  Unless stated otherwise, assume that each function        */
-/*   specification has no side-effects, no dependencies, and          */
-/*   constant time complexity.                                        */
-/*                                                                    */
-/* End Module Description *********************************************/
-
-/*--------------------------------------------------------------------*/
-/*  Includes                                                          */
-/*--------------------------------------------------------------------*/
-
-#include <hei_includes.hpp>
-#include <register/hei_register.hpp>
-#include <util/hei_bit_string.hpp>
-
-namespace libhei
-{
-
-/*--------------------------------------------------------------------*/
-/*  User Types                                                        */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Constants                                                         */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Macros                                                            */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Internal Function Prototypes                                      */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Global Variables                                                  */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Static Variables                                                  */
-/*--------------------------------------------------------------------*/
-
-// Function Specification //////////////////////////////////////////
-//
-// Title:  ~SCAN_COMM_REGISTER_CLASS (Virtual destructor)
-//
-// Purpose:  This destructor deallocates the Bit String.
-//
-// Side-effects:  Memory is deallocated.
-//
-// Dependencies:  None.
-//
-// End Function Specification //////////////////////////////////////
-
-SCAN_COMM_REGISTER_CLASS::~SCAN_COMM_REGISTER_CLASS
-(
- void
- /*!i No parameters                                               */
- )
-/*!o No value returned                                           */
-{
-}
-
-// Function Specification ///////////////////////////////////////////
-//
-// Title:  Read
-//
-// Purpose:  This function reads the actual hardware register and
-//           sets the Bit String data member values.  The specified
-//           Bit String is then used to mask the Bit String data
-//           member.  If an error occur, then the error is reported
-//           and the Bit String values are undefined.
-//
-// Side-effects:  Hardware register is read.
-//                Bit String data member is modified.
-//                Memory is reallocated.
-//
-// End Function Specification //////////////////////////////////////
-
-uint32_t SCAN_COMM_REGISTER_CLASS::Read
-(
- BitString & mask
- /*!i Reference to Bit String mask                                */
- )
-/*!o Error return code                                           */
-{
-  uint32_t rc = Read();
-
-  if(rc == SUCCESS)
-  {
-    BitString & bitString = AccessBitString();
-    bitString.maskString(mask);
-  }
-
-  return(rc);
-}
-// Function Specification //////////////////////////////////////////
-//
-//  Title:  Set Bit
-//
-//  Purpose:  This function sets(1) the specified bit position in
-//            the Bit String.  If the Bit String is NULL, then a
-//            new Bit String is allocated and cleared to all zero
-//            before setting the bit.
-//
-//  Side-effects:  Bit String is modified.
-//                 Memory may be allocated.
-//
-//  Dependencies:  bit_position must be in the string
-//
-// End Function Specification //////////////////////////////////////
-
-void SCAN_COMM_REGISTER_CLASS::SetBit
-(
- uint32_t bit_position
- /*!i Bit position in string                                      */
- )
-/*!o No value returned                                           */
-{
-
-  BitString & bitString = AccessBitString();
-  bitString.setBit(bit_position);
-}
-
-// Function Specification //////////////////////////////////////////
-//
-//  Title:  Clear Bit
-//
-//  Purpose:  This function clears(0) the specified bit position in
-//            the Bit String.  If the Bit String is NULL, then a
-//            new Bit String is allocated and cleared to all zeros.
-//
-//  Side-effects:  Bit String is modified.
-//                 Memory may be allocated.
-//
-//  Dependencies:  bit_position must be in the string
-//
-// End Function Specification //////////////////////////////////////
-
-void SCAN_COMM_REGISTER_CLASS::ClearBit
-(
- uint32_t bit_position
- /*!i Bit position in string                                      */
- )
-/*!o No value returned                                           */
-{
-  BitString & bitString = AccessBitString();
-  bitString.clearBit(bit_position);
-}
-
-
-
-// Function Specification ///////////////////////////////////////////
-//
-// Title:  Clear Bit String
-//
-// Purpose:  This function clears the Bit String.  If the data
-//           member is NULL, then a new Bit String is allocated.
-//           Upon return, the state of the Bit String is all zero.
-//
-// Side-effects:  Bit String data member is modified.
-//                Memory is allocated or reallocated.
-//
-// End Function Specification //////////////////////////////////////
-
-void SCAN_COMM_REGISTER_CLASS::clearAllBits()
-{
-    BitString & bitString = AccessBitString();
-    bitString.clearAll();
-}
-
-void SCAN_COMM_REGISTER_CLASS::setAllBits()
-{
-    BitString & bitString = AccessBitString();
-    bitString.setAll();
-}
-
-//------------------------------------------------------------------------------
-
-uint64_t SCAN_COMM_REGISTER_CLASS::GetBitFieldJustified( uint32_t i_pos,
-                                                         uint32_t i_len ) const
-{
-    uint64_t o_value = 0;
-
-    const uint32_t len_cpu_word = sizeof(CPU_WORD) * 8;
-    const uint32_t len_uint64   = sizeof(uint64_t) * 8;
-    const uint32_t pos_end      = i_pos + i_len;
-
-    PRDF_ASSERT( pos_end <= len_uint64 );
-
-    const BitString * bs = GetBitString();
-
-    for ( uint32_t pos = i_pos; pos < pos_end; pos += len_cpu_word )
-    {
-        // Calculate chunk length.
-        uint32_t len_chunk = len_cpu_word;
-        if ( len_chunk > pos_end - pos )
-            len_chunk = pos_end - pos;
-
-        o_value <<= len_chunk; // Make room for new chunk.
-
-        // Get chunk.
-        o_value |= static_cast<uint64_t>(bs->getFieldJustify(pos, len_chunk));
-    }
-
-    return o_value;
-}
-
-//------------------------------------------------------------------------------
-
-void SCAN_COMM_REGISTER_CLASS::SetBitFieldJustified( uint32_t i_pos,
-                                                     uint32_t i_len,
-                                                     uint64_t i_value )
-{
-    const uint32_t len_cpu_word = sizeof(CPU_WORD) * 8;
-    const uint32_t len_uint64   = sizeof(uint64_t) * 8;
-
-    PRDF_ASSERT( i_pos + i_len <= len_uint64 );
-
-    BitString & bs = AccessBitString();
-
-    for ( uint32_t offset = 0; offset < i_len; offset += len_cpu_word )
-    {
-        // Calculate chunk length.
-        uint32_t len_chunk = len_cpu_word;
-        if ( len_chunk > i_len - offset )
-            len_chunk = i_len - offset;
-
-        uint64_t value = i_value;
-        value >>= i_len - (offset + len_chunk); // right justify
-
-        // Set chunk.
-        bs.setFieldJustify( i_pos + offset, len_chunk,
-                            static_cast<CPU_WORD>(value) );
-    }
-}
-
-} // end namespace libhei
-
diff --git a/src/register/hei_register.hpp b/src/register/hei_register.hpp
index be769f3..936d95e 100755
--- a/src/register/hei_register.hpp
+++ b/src/register/hei_register.hpp
@@ -1,404 +1,59 @@
 #pragma once
 
-// Module Description **************************************************
-//
-//  Description:  This module contains the declarations for the
-//                Processor Runtime Diagnostics Scan Communication
-//                Register class.
-//
-//  Notes:  Unless stated otherwise, assume that each function
-//          specification has no side-effects, no dependencies, and
-//          constant time complexity.
-//
-// End Module Description **********************************************
-
-
-//----------------------------------------------------------------------
-//  Includes
-//----------------------------------------------------------------------
-
+#include <stdio.h>
 #include <hei_includes.hpp>
 #include <util/hei_bit_string.hpp>
 
-#include <iipsdbug.h>
-#include <prdfMain.H>
-
 namespace libhei
 {
 
-/*--------------------------------------------------------------------*/
-/*  Forward References                                                */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  User Types                                                        */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Constants                                                         */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Macros                                                            */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Global Variables                                                  */
-/*--------------------------------------------------------------------*/
-
-/*--------------------------------------------------------------------*/
-/*  Function Prototypes                                               */
-/*--------------------------------------------------------------------*/
-
-// Class Specification *************************************************
-//
-//  Name:  SCAN_COMM_REGISTER_CLASS
-//
-//  Title:  Scan Communication Register
-//
-//  Purpose:  SCAN_COMM_REGISTER_CLASS provides the representation
-//            and access to a physical register.
-//
-//  Usage:  This is an abstract base class.
-//
-//  Side-effects:  Memory is allocated.
-//
-//  Dependencies:  None.
-//
-//  Notes: The Scan Communication Register is a model of an actual
-// physical register.  The bits in the register are represented by the
-// bit_string data member which is modified dynamically as operations
-// are preformed.  It acts as a temporarily cached value of the
-// register.  When a read is performed, the bit values are updated in
-// the bit string. When a write is performed, the current value of the
-// bits are used as the value to write.  The current value of this
-// cached bit string can be accessed or modified by other objects via
-// the public interface.  The physical address and bit length of the
-// hardware register are set during initialization and used on all
-// acceses.
-//
-// The basic Read() and Write() functions are virtual.  The
-// actual implemenations are dependent on the actual hardware
-// and the software Hardware Manual Ops Scan Control Routines.
-// These function specifications describe a common behaviour
-// that every derived class must follow.  Additional,
-// information may also be specified.
-//
-// A Read() function is also provided that has a Bit String
-// mask parameter.  This function calls the virtual Read()
-// and then applies the mask so that the internal Bit String
-// contains the hardware register contents with certain bits
-// ignored (masked off).
-//
-//  Cardinality:  0
-//
-//  Space Complexity:  Linear
-//                     K + Mn where K and M are constants and n is the
-//                     number of bits in the register.
-//
-// End Class Specification *********************************************
 /**
- SCAN_COMM_REGISTER_CLASS
- @author Doug Gilbert
- @V5R2
- */
-class SCAN_COMM_REGISTER_CLASS
+@brief Description:  The Register class.
+
+Purpose:  Register is an abstract base class for real and virtual registers.
+A few examples of these registers are; HardwareRegister, ConstantRegister,
+NotRegister, and AndRegister.  As a base class of register types, Register
+creates a place where these registers can be put together like logical
+building blocks.  For example, Register makes this possible:
+
+Register * fir = new HardwareRegister(REG_ADDRESS, REG_WIDTH,
+                                      DEFAULT_CHIP_TYPE, ACCESS_RO);
+Register * mask = new ConstantRegister( 0xffffffff00000000 );
+Register * fir_mask = new AndRegister(fir, mask);
+const BitString * bs = fir_mask->getBitString();
+
+The getBitString function (defined by each register) provides access to
+the BitString that manages each register's data.  In this example bs will
+contain the result of fir & mask.
+*/
+class Register
 {
-  public: // enums, structs, typedefs
-
-    /** The register access level */
-    enum AccessLevel
-    {
-        ACCESS_NONE = 0x0, ///< No access
-        ACCESS_RO   = 0x1, ///< Read-only access
-        ACCESS_WO   = 0x2, ///< Write-only access
-        ACCESS_RW   = 0x3, ///< Read/Write access
-    };
-
-  public: // functions
-
-  /**
-   Destructor
-   */
-  virtual ~SCAN_COMM_REGISTER_CLASS(void);
-
-  /**
-   Read hardware register (virtual)
-   <ul>
-   <br><b>Parameters:  </b> None
-   <br><b>Returns:     </b> [SUCCESS | MOPs return code]
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> Internal bit string represents the value of the
-                            hardware register (if rc == SUCCESS)
-   <br><b>Sideaffects: </b> Value guaranteed to be read from hardware.
-   <br><b>Exceptions:  </b> None.
-   <br><b>Notes:       </b> Default is to call Read().  If a child class cannot
-                            guarantee hardware access every time Read() is
-                            called then the function ForceRead() should be
-                            overridden.
-   </ul><br>
-   */
-  virtual uint32_t ForceRead(void) const { return Read(); }
-
-  /**
-   Read hardware register (pure virtual)
-   <ul>
-   <br><b>Parameters:  </b> None
-   <br><b>Returns:     </b> [SUCCESS | MOPs return code]
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> Internal bit string represents the value of the
-                            hardware register (if rc == SUCCESS)
-   <br><b>Sideaffects: </b> The bit string value may or may not be retrieved
-                            from hardware; a buffered copy may be used.
-   <br><b>Exceptions:  </b> None.
-   </ul><br>
-   */
-  virtual uint32_t Read(void) const = 0;
-
-  /**
-   Read hardware register and apply a mask
-   <ul>
-   <br><b>Parameters:  </b> Mask to apply
-   <br><b>Returns:     </b> [SUCCESS | MOPs return code]
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> Internal bit string represents the value of the
-                            hardware register with the bits turned off as
-                            specified by the mask.
-   <br><b>Sideaffects: </b> The bit string value may or may not be retrieved
-   from hardware. a buffered copy may be used.
-   <br><b>Exceptions:  </b> None.
-   <br><b>Notes:       </b> if bits read from hardware = '00110100'
-                            and mask =                   '01110000'
-                            then internal bit sting =    '00000100'
-
-                            if mask.Length() < GetBitString()->Length()
-                            then mask is right extended with 0's
-                            if mask.Length() > GetBitString()->Length()
-                            then extra mask bits are ignored.
-   </ul><br>
-   */
-  uint32_t Read(BitString & mask);
-
-  /**
-   Write hardware register (pure virtual)
-   <ul>
-   <br><b>Parameters:  </b> None
-   <br><b>Returns:     </b> [SUCCESS | MOPs return code]
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> Internal bit string value written to hardware
-   <br><b>Exceptions:  </b> None.
-   <br><b>Notes:       </b> If internal bitstring was never read/set/modified then
-                            zeros are written to corresponding hardware register.
-   </ul><br>
-   */
- virtual uint32_t Write(void) = 0;
-
-  /**
-   Access a copy of the scan comm address
-   <ul>
-   <br><b>Parameters:  </b> None
-   <br><b>Returns:     </b> Returns scom address
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> None.
-   <br><b>Exceptions:  </b> None.
-   </ul><br>
-   */
-  virtual uint64_t GetAddress(void) const {return 0 ;}
-
-  /**
-   Access a copy of the short id for signatures.
-   <ul>
-   <br><b>Parameters:  </b> None
-   <br><b>Returns:     </b> ID.
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> None.
-   <br><b>Exceptions:  </b> None.
-   </ul><br>
-   */
-  virtual uint16_t GetId(void) const = 0;
-
-  /**
-   Set the short id for signatures.
-   <ul>
-   <br><b>Parameters:  </b> ID.
-   <br><b>Returns:     </b> None.
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> None.
-   <br><b>Exceptions:  </b> For virtual registers, this is not required to have
-                            any effect.
-   </ul><br>
-   */
-  virtual void SetId(uint16_t) = 0;
-
-
-  /**
-   Access the bit length of the register
-   <ul>
-   <br><b>Parameters:  </b> None
-   <br><b>Returns:     </b> bit length of the register
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> None.
-   <br><b>Exceptions:  </b> None.
-   </ul><br>
-   */
-   virtual uint32_t GetBitLength(void) const { return DEFAULT_BIT_LENGTH ;}
-
-  /**
-   Access the internal bit string (pure virtual)
-   <ul>
-   <br><b>Parameters:  </b> None
-   <br><b>Returns:     </b> ptr to the internal bit string (const)
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> None.
-   <br><b>Exceptions:  </b> None.
-   <br><b>Notes:       </b> If the internal bit string was never read/modified then
-                            all bits are zero
-   </ul><br>
-   */
-  virtual
-  const BitString * GetBitString(ATTENTION_TYPE
-                                        i_type = INVALID_ATTENTION_TYPE
-                                       ) const = 0;
-
-  /**
-   Modify the internal bit string (pure virtual)
-   <ul>
-   <br><b>Parameters:  </b> a bit string
-   <br><b>Returns:     </b> Nothing
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> Internal bit string == *bs for first len bits where
-                            len is the smaller of the two lengths.
-                            Memory may be (re)allocated
-   <br><b>Exceptions:  </b> None.
-   <br><b>Notes:       </b> The hardware register value is not modified until
-                            Write() is called
-   </ul><br>
-   */
-  virtual void SetBitString(const BitString * bs) = 0;
-
-  /**
-   SetBit
-   <ul>
-   <br><b>Parameters:  </b> Position of bit to set (= 1)
-   <br><b>Returns:     </b> None.
-   <br><b>Requirements:</b> bit position < GetBitString()->Length()
-   <br><b>Promises:    </b> GetBitString()->isBitSet(bit_position) == true
-   <br><b>Exceptions:  </b> None.
-   <br><b> Notes:      </b> Register value is not reflected in hardware until
-                            Write() is called
-   </ul><br>
-   */
-  void SetBit(uint32_t bit_position);
-
-  /**
-   ClearBit (reset bit)
-   <ul>
-   <br><b>Parameters:  </b> Position of bit to clear (= 0)
-   <br><b>Returns:     </b> None.
-   <br><b>Requirements:</b> bit position < GetBitString()->Length()
-   <br><b>Promises:    </b> GetBitString()->isBitSet(bit_position) == false
-   <br><b>Exceptions:  </b> None.
-   <br><b> Notes:      </b> Register value is not reflected in hardware until
-                            Write() is called
-   </ul><br>
-   */
-  void ClearBit(uint32_t bit_position);
+  public:
 
     /**
-     * @brief  Will query if a bit is set.
-     * @param  i_bitPos The bit position to query.
-     * @pre    The bit position must be less than GetBitString()->Length()
-     * @return TRUE if the bit is set, FALSE otherwise.
-     */
-    bool IsBitSet( uint32_t i_bitPos )
-    {  return GetBitString()->isBitSet(i_bitPos);  }
-
-    /** @brief Flushes all bits to 0. */
-    void clearAllBits();
-
-    /** @brief Flushes all bits to 1. */
-    void setAllBits();
+    @brief Default constructor
+    */
+    Register() = default;
 
     /**
-     * @brief Returns target value from the BitString (right justified).
-     * @param i_pos   Starting position in the bit string.
-     * @param i_len   Length of target value.
-     * @pre   i_pos + i_len must be less than or equal 64 bits.
-     * @return The target value (right justified).
-     */
-    uint64_t GetBitFieldJustified( uint32_t i_pos, uint32_t i_len ) const;
+    @brief Delete copy, assignment, and move operators.  Deleting
+           copy causes the compiler to delete move.
+    */
+    Register(const Register&) = delete;
+    Register& operator=(const Register&) = delete;
 
     /**
-     * @brief Set a field within the BitString with a value (right justified).
-     * @param i_pos   Starting position in the bit string.
-     * @param i_len   Length of target value.
-     * @param i_value Value to add to BitString.
-     * @pre   i_pos + i_len must be less than or equal 64 bits.
-     */
-    void SetBitFieldJustified( uint32_t i_pos, uint32_t i_len,
-                               uint64_t i_value );
+    @brief Default destructor
+    */
+    virtual ~Register() = default;
 
-  /**
-   Query if bit string is all zeros
-   <ul>
-   <br><b>Parameters:  </b> None.
-   <br><b>Returns:     </b> [true | false]
-   <br><b>Requirements:</b> None.
-   <br><b>Promises:    </b> None.
-   <br><b>Exceptions:  </b> None.
-   </ul><br>
-   */
-  bool BitStringIsZero()
-  { return GetBitString()->isZero(); }
-
-   /**
-    *@brief    Returns TYPE_NA as type of Target associated with register.Actual
-    *          implementation is expected in derived class
-     *@return   TYPE_NA
-   */
-  virtual TARGETING::TYPE getChipType(void)const { return TARGETING::TYPE_NA; }
-
-    /** @return The register access level (see enum AccessLevel). */
-    virtual AccessLevel getAccessLevel() const { return ACCESS_RW; }
-
-    /** @brief Sets the register access level (see enum AccessLevel). */
-    virtual void setAccessLevel( AccessLevel i_op ) {}
-
-protected:
-
-  /**
-   Get modifiable reference to internal bit string (don't even thing about making this public!!!)
-   <ul>
-   <br><b>Parameters:    </b> None.
-   <br><b>Returns       </b> Reference to the internal bit string
-   <br><b>Requirments   </b> None.
-   <br><b>Promises      </b> None.
-   </ul><br>
-   */
-  virtual BitString & AccessBitString(void) = 0;
-private: // Data
-  static const int DEFAULT_BIT_LENGTH = 64;
-
-  // Enum Specification //////////////////////////////////////////////
-  //
-  // Purpose:  These enumerated constants specify implementation data.
-  //
-  // End Enum Specification //////////////////////////////////////////
-
-  enum
-  {
-    ODD_PARITY_SET_BIT_POSITION = 16
-  };
-
-  // Data Specification //////////////////////////////////////////////
-  //
-  // Purpose:  These data members specify the physical properties of
-  //           register.
-  //
-  // End Data Specification //////////////////////////////////////////
-
+    /**
+    @brief      Provides access to the BitString that manages
+                this register's data.
+    @return     A pointer to a BitString.
+    */
+    virtual const BitString * getBitString() const = 0;
 
 };
 
-} // end namespace libhei
-
+}//end namespace libhei
