diff --git a/src/hei_chip.hpp b/src/hei_chip.hpp
index fbb7e6c..3b17164 100644
--- a/src/hei_chip.hpp
+++ b/src/hei_chip.hpp
@@ -25,10 +25,12 @@
      * @param i_chip See description for iv_chip.
      * @param i_type See description for iv_type.
      */
-    Chip(void* i_chip, ChipType_t i_type) : iv_chip(i_chip), iv_type(i_type) {}
+    Chip(const void* i_chip, ChipType_t i_type) :
+        iv_chip(i_chip), iv_type(i_type)
+    {}
 
   public: // Accessors
-    void* getChip() const
+    const void* getChip() const
     {
         return iv_chip;
     }
@@ -58,7 +60,7 @@
      * purpose is to eventually get passed back to the user application with
      * information associated with each chip.
      */
-    void* iv_chip = nullptr;
+    const void* iv_chip = nullptr;
 
     /**
      * When doing analysis on a chip, the isolator will need to know the chip
diff --git a/src/hei_main.hpp b/src/hei_main.hpp
index e812bef..21f2f66 100644
--- a/src/hei_main.hpp
+++ b/src/hei_main.hpp
@@ -57,7 +57,7 @@
  *                     this function is called and a chip type has already been
  *                     initialized:
  *                      - false (default), the function will return
- *                        RC_CDF_INITIALIZED and exit.
+ *                        RC_CHIP_DATA_INITIALIZED and exit.
  *                      - true, the function will delete the previous isolation
  *                        objects for this chip type and reinitialize.
  *
diff --git a/src/hei_user_interface.hpp b/src/hei_user_interface.hpp
index 6fb887c..9849ca1 100644
--- a/src/hei_user_interface.hpp
+++ b/src/hei_user_interface.hpp
@@ -16,12 +16,9 @@
 /**
  * @brief Performs a hardware register read operation.
  *
- * @param i_chip     This is a pointer to a user application object that
- *                   represents the target chip. It is provided to the isolator
- *                   by the user application via the isolator main APIs. The
- *                   isolator does not know anything about this object nor how
- *                   to use it. The user application is responsible for knowing
- *                   what to do with this parameter.
+ * @param i_chip     The target chip for the register access. It is provided to
+ *                   the isolator by the user application via the isolator main
+ *                   APIs.
  *
  * @param o_buffer   Allocated memory space for the returned contents of the
  *                   register.
@@ -44,7 +41,7 @@
  *         failure the user application is responsible for reporting why the
  *         register access failed.
  */
-ReturnCode registerRead(void* i_chip, void* o_buffer, size_t& io_bufSize,
+ReturnCode registerRead(const Chip& i_chip, void* o_buffer, size_t& io_bufSize,
                         uint64_t i_regType, uint64_t i_address);
 
 #ifndef __HEI_READ_ONLY
@@ -52,12 +49,9 @@
 /**
  * @brief Performs a hardware register write operation.
  *
- * @param i_chip     This is a pointer to a user application object that
- *                   represents the target chip. It is provided to the isolator
- *                   by the user application via the isolator main APIs. The
- *                   isolator does not know anything about this object nor how
- *                   to use it. The user application is responsible for knowing
- *                   what to do with this parameter.
+ * @param i_chip     The target chip for the register access. It is provided to
+ *                   the isolator by the user application via the isolator main
+ *                   APIs.
  *
  * @param i_buffer   Allocated memory space containing the register contents to
  *                   write to hardware.
@@ -80,7 +74,7 @@
  *         failure the user application is responsible for reporting why the
  *         register access failed.
  */
-ReturnCode registerWrite(void* i_chip, void* i_buffer, size_t& io_bufSize,
+ReturnCode registerWrite(const Chip& i_chip, void* i_buffer, size_t& io_bufSize,
                          uint64_t i_regType, uint64_t i_address);
 
 #endif
diff --git a/src/isolator/hei_isolation_node.cpp b/src/isolator/hei_isolation_node.cpp
index 8d67094..e2bf61a 100644
--- a/src/isolator/hei_isolation_node.cpp
+++ b/src/isolator/hei_isolation_node.cpp
@@ -21,7 +21,7 @@
     const BitString* bs = rule_itr->second->getBitString(i_chip);
 
     // Ensure this BitString is not longer than the maximum bit field.
-    HEI_ASSERT(bs->getBitLen() <= sizeof(RegisterBit_t) * 8);
+    HEI_ASSERT(bs->getBitLen() <= (1 << (sizeof(RegisterBit_t) * 8)));
 
     // Find all active bits for this rule.
     for (RegisterBit_t bit = 0; bit < bs->getBitLen(); bit++)
diff --git a/src/isolator/hei_isolator.cpp b/src/isolator/hei_isolator.cpp
index 759eb13..68dda7d 100644
--- a/src/isolator/hei_isolator.cpp
+++ b/src/isolator/hei_isolator.cpp
@@ -5,6 +5,7 @@
 #include <util/hei_flyweight.hpp>
 
 // BEGIN temporary code
+#include <isolator/hei_isolation_node.hpp>
 #include <register/hei_scom_register.hpp>
 // END temporary code
 
@@ -20,18 +21,28 @@
     HEI_INF("Isolator::initialize(%p,%lu,%d)", i_buffer, i_bufferSize,
             i_forceInit);
 
-    Flyweight<ScomRegister>& sfw   = Flyweight<ScomRegister>::getSingleton();
-    Flyweight<IdScomRegister>& ifw = Flyweight<IdScomRegister>::getSingleton();
+    auto& scom_fw    = Flyweight<ScomRegister>::getSingleton();
+    auto& idScom_fw  = Flyweight<IdScomRegister>::getSingleton();
+    auto& isoNode_fw = Flyweight<IsolationNode>::getSingleton();
 
-    sfw.get(ScomRegister{CHIP_TYPE_INVALID, REG_ID_INVALID, REG_INST_DEFAULT,
-                         REG_ACCESS_RW, 0x01234567});
-    sfw.get(ScomRegister{CHIP_TYPE_INVALID, REG_ID_INVALID, REG_INST_DEFAULT,
-                         REG_ACCESS_RW, 0x00112233});
+    auto& idScom0 = idScom_fw.get(IdScomRegister{
+        static_cast<ChipType_t>(0xdeadbeef), static_cast<RegisterId_t>(0x1111),
+        REG_INST_DEFAULT, REG_ACCESS_RW, 0x80000000FF000000});
 
-    ifw.get(IdScomRegister{CHIP_TYPE_INVALID, REG_ID_INVALID, REG_INST_DEFAULT,
-                           REG_ACCESS_RW, 0x0123456789abcdef});
-    ifw.get(IdScomRegister{CHIP_TYPE_INVALID, REG_ID_INVALID, REG_INST_DEFAULT,
-                           REG_ACCESS_RW, 0x0011223344556677});
+    auto& scom0 = scom_fw.get(ScomRegister{
+        static_cast<ChipType_t>(0xdeadbeef), static_cast<RegisterId_t>(0x2222),
+        REG_INST_DEFAULT, REG_ACCESS_RW, 0x00FF0000});
+
+    auto& node0 = isoNode_fw.get(IsolationNode{idScom0});
+    auto& node1 = isoNode_fw.get(IsolationNode{scom0});
+
+    node0.addRule(ATTN_TYPE_CHECKSTOP, &idScom0);
+    node0.addChild(48, &node1);
+
+    node1.addRule(ATTN_TYPE_CHECKSTOP, &scom0);
+
+    iv_isoStart[static_cast<ChipType_t>(0xdeadbeef)].push_back(
+        {&node0, ATTN_TYPE_CHECKSTOP});
     // END temporary code
 
     return rc;
@@ -68,6 +79,23 @@
     {
         // BEGIN temporary code
         HEI_INF("Isolator::isolate(%p,%u)", chip.getChip(), chip.getType());
+
+        // Isolation objects for this chip's type must exist.
+        const auto& chip_itr = iv_isoStart.find(chip.getType());
+        HEI_ASSERT(iv_isoStart.end() != chip_itr);
+
+        for (const auto& pair : chip_itr->second)
+        {
+            if (pair.first->analyze(chip, pair.second, o_isoData))
+            {
+                for (const auto& sig : o_isoData.getSignatureList())
+                {
+                    HEI_INF("Signature(%p,0x%x,0x%x,0x%x,0x%x)",
+                            sig.getChip().getChip(), sig.getId(),
+                            sig.getInstance(), sig.getBit(), sig.getAttnType());
+                }
+            }
+        }
         // END temporary code
     }
 
diff --git a/src/isolator/hei_isolator.hpp b/src/isolator/hei_isolator.hpp
index d779b7b..c60835d 100644
--- a/src/isolator/hei_isolator.hpp
+++ b/src/isolator/hei_isolator.hpp
@@ -2,6 +2,7 @@
 
 #include <hei_includes.hpp>
 #include <hei_isolation_data.hpp>
+#include <isolator/hei_isolation_node.hpp>
 
 namespace libhei
 {
@@ -68,6 +69,18 @@
     /** @brief See API wrapper description in hei_main.hpp. */
     ReturnCode isolate(const std::vector<Chip>& i_chipList,
                        IsolationData& o_isoData) const;
+
+  private:
+    // BEGIN temporary code
+    /**
+     * Provides a list of isolation tree nodes used to start analysis based on
+     * the chip type and attention type.
+     */
+    std::map<ChipType_t,
+             std::vector<std::pair<const IsolationNode*, AttentionType_t>>>
+        iv_isoStart;
+    // END temporary code
+
 }; // end class Isolator
 
 } // end namespace libhei
diff --git a/src/isolator/hei_signature.hpp b/src/isolator/hei_signature.hpp
index 844aad6..2bf91e1 100644
--- a/src/isolator/hei_signature.hpp
+++ b/src/isolator/hei_signature.hpp
@@ -78,6 +78,51 @@
     {
         return iv_attnType;
     }
+
+  public: // Operators
+    /** @brief Equals operator. */
+    bool operator==(const Signature& i_r) const
+    {
+        return (getChip() == i_r.getChip() && getId() == i_r.getId() &&
+                getInstance() == i_r.getInstance() &&
+                getBit() == i_r.getBit() && getAttnType() == i_r.getAttnType());
+    }
+
+    /** @brief Less than operator. */
+    bool operator<(const Signature& i_r) const
+    {
+        if (getChip() < i_r.getChip())
+        {
+            return true;
+        }
+        else if (getChip() == i_r.getChip())
+        {
+            if (getId() < i_r.getId())
+            {
+                return true;
+            }
+            else if (getId() == i_r.getId())
+            {
+                if (getInstance() < i_r.getInstance())
+                {
+                    return true;
+                }
+                else if (getInstance() == i_r.getInstance())
+                {
+                    if (getBit() < i_r.getBit())
+                    {
+                        return true;
+                    }
+                    else if (getBit() == i_r.getBit())
+                    {
+                        return (getAttnType() < i_r.getAttnType());
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
 };
 
 } // end namespace libhei
diff --git a/src/register/hei_hardware_register.cpp b/src/register/hei_hardware_register.cpp
index 7df5a3e..7629a06 100644
--- a/src/register/hei_hardware_register.cpp
+++ b/src/register/hei_hardware_register.cpp
@@ -88,8 +88,8 @@
         size_t sz_buffer = BitString::getMinBytes(bs.getBitLen());
 
         // Read this register from hardware.
-        rc = registerRead(i_chip.getChip(), bs.getBufAddr(), sz_buffer,
-                          getRegisterType(), getAddress());
+        rc = registerRead(i_chip, bs.getBufAddr(), sz_buffer, getRegisterType(),
+                          getAddress());
         if (RC_SUCCESS != rc)
         {
             // The read failed and we can't trust what was put in the register
@@ -132,8 +132,8 @@
     size_t sz_buffer = BitString::getMinBytes(bs.getBitLen());
 
     // Write to this register to hardware.
-    rc = registerWrite(i_chip.getChip(), bs.getBufAddr(), sz_buffer,
-                       getRegisterType(), getAddress());
+    rc = registerWrite(i_chip, bs.getBufAddr(), sz_buffer, getRegisterType(),
+                       getAddress());
 
     if (RC_SUCCESS == rc)
     {
