diff --git a/src/isolator/hei_isolation_chip.hpp b/src/isolator/hei_isolation_chip.hpp
index d4acddf..4fabea1 100644
--- a/src/isolator/hei_isolation_chip.hpp
+++ b/src/isolator/hei_isolation_chip.hpp
@@ -47,7 +47,7 @@
     const ChipType_t iv_chipType;
 
     /** Root nodes for this chip type. */
-    RootNodeMap iv_rootNodes;
+    std::map<AttentionType_t, const IsolationNodePtr> iv_rootNodes;
 
   public: // Member functions
     /**
diff --git a/src/isolator/hei_isolation_node.cpp b/src/isolator/hei_isolation_node.cpp
index f5c58db..d41bdee 100644
--- a/src/isolator/hei_isolation_node.cpp
+++ b/src/isolator/hei_isolation_node.cpp
@@ -1,4 +1,5 @@
 #include <isolator/hei_isolation_node.hpp>
+#include <util/hei_bit_string.hpp>
 
 namespace libhei
 {
@@ -54,18 +55,16 @@
                 // io_isoData. If there are no other active attentions, the user
                 // application could use this signature to help determine, and
                 // circumvent, the isolation problem.
-                io_isoData.addSignature(Signature{i_chip, iv_hwReg.getId(),
-                                                  iv_hwReg.getInstance(), bit,
-                                                  i_attnType});
+                io_isoData.addSignature(
+                    Signature{i_chip, iv_id, iv_instance, bit, i_attnType});
             }
         }
         else
         {
             // We have reached a leaf in the isolation tree. Add this bit's
             // signature to io_isoData.
-            io_isoData.addSignature(Signature{i_chip, iv_hwReg.getId(),
-                                              iv_hwReg.getInstance(), bit,
-                                              i_attnType});
+            io_isoData.addSignature(
+                Signature{i_chip, iv_id, iv_instance, bit, i_attnType});
         }
     }
 
@@ -77,47 +76,43 @@
 
 //------------------------------------------------------------------------------
 
-void IsolationNode::addRule(AttentionType_t i_attnType, const Register* i_rule)
+void IsolationNode::addRule(AttentionType_t i_attnType, RegisterPtr i_rule)
 {
-    // A rule for this attention type should not already exist.
-    HEI_ASSERT(iv_rules.end() == iv_rules.find(i_attnType));
+    HEI_ASSERT(i_rule); // should not be null
 
-    // The rule should not be null.
-    HEI_ASSERT(nullptr != i_rule);
+    auto ret = iv_rules.emplace(i_attnType, i_rule);
 
-    // Add the new rule.
-    iv_rules[i_attnType] = i_rule;
+    // If an entry already existed, it must point to the same object.
+    HEI_ASSERT(ret.second || (ret.first->second == i_rule));
 }
 
 //------------------------------------------------------------------------------
 
-void IsolationNode::addChild(uint8_t i_bit, const IsolationNode* i_child)
+void IsolationNode::addChild(uint8_t i_bit, IsolationNodePtr i_child)
 {
-    // An entry for this bit should not already exist.
-    HEI_ASSERT(iv_children.end() == iv_children.find(i_bit));
+    HEI_ASSERT(i_child); // should not be null
 
-    // The child register should not be null.
-    HEI_ASSERT(nullptr != i_child);
+    auto ret = iv_children.emplace(i_bit, i_child);
 
-    // Add the new rule.
-    iv_children[i_bit] = i_child;
+    // If an entry already existed, it must point to the same object.
+    HEI_ASSERT(ret.second || (ret.first->second == i_child));
 }
 
 //------------------------------------------------------------------------------
 
-std::vector<const IsolationNode*> IsolationNode::cv_isolationStack{};
+std::vector<IsolationNodePtr> IsolationNode::cv_isolationStack{};
 
 //------------------------------------------------------------------------------
 
 void IsolationNode::pushIsolationStack() const
 {
     // Ensure this node does not already exist in cv_isolationStack.
-    auto itr =
-        std::find(cv_isolationStack.begin(), cv_isolationStack.end(), this);
+    auto itr = std::find(cv_isolationStack.begin(), cv_isolationStack.end(),
+                         IsolationNodePtr(this));
     HEI_ASSERT(cv_isolationStack.end() == itr);
 
     // Push to node to the stack.
-    cv_isolationStack.push_back(this);
+    cv_isolationStack.push_back(IsolationNodePtr(this));
 }
 
 //------------------------------------------------------------------------------
diff --git a/src/isolator/hei_isolation_node.hpp b/src/isolator/hei_isolation_node.hpp
index 4cf44dd..8d7cfac 100644
--- a/src/isolator/hei_isolation_node.hpp
+++ b/src/isolator/hei_isolation_node.hpp
@@ -2,46 +2,45 @@
 
 #include <hei_includes.hpp>
 #include <hei_isolation_data.hpp>
-#include <register/hei_hardware_register.hpp>
 #include <register/hei_register.hpp>
-#include <util/hei_bit_string.hpp>
-#include <util/hei_flyweight.hpp>
 
 namespace libhei
 {
 
 /**
- * @brief This class contains the isolation rules and bit definition of a
- *        HardwareRegister used for error isolation.
+ * @brief This class contains the isolation rules and bit definition for a node
+ *        in a chip's error reporting structure.
  *
- * These objects are linked together as a tree. Any active bits in the
- * associated register will either be a true active attention (leaf node) or
- * indicate one or more active attentions occurred in a child node.
+ * These objects are linked together to form a tree with a single root node. Any
+ * active bits found in a node will either indicate an active attention or that
+ * the attention originated in a child node.
  *
  * The primary function of this class is analyze(), which will do a depth-first
- * search of the tree to find all leaves and add their signatures to the
- * returned isolation data.
+ * search of the tree to find all active attentions and add their signatures to
+ * the returned isolation data.
  *
  * The tree structure is built from information in the Chip Data Files. It is
  * possible that the tree could be built with loop in the isolation. This would
  * be bug in the Chip Data Files. This class will keep track of all nodes that
  * have been analyzed to prevent cyclic isolation (an infinite loop).
  *
- * Each isolation register will have a rule for each supported attention type.
- * These rules are a combination of HardwareRegisters and operator registers to
- * define rules like "REG & ~MASK & CNFG", which reads "return all bits in REG
- * that are not in MASK and set in CNFG". See the definition of the Register
- * class for details on how this works.
+ * Each node instance will represent a register, or set of registers, that can
+ * be configured to represent one or more attention types. These configuration
+ * rules are a combination of hardware register objects and operator registers
+ * objects to define rules like "REG & ~MASK & CNFG", which reads "return all
+ * bits in REG that are not in MASK and set in CNFG". See the definition of the
+ * Register class for details on how this works.
  */
 class IsolationNode
 {
   public: // Constructors, destructor, assignment
     /**
      * @brief Constructor from components.
-     * @param i_hwReg A reference to the HardwareRegister targeted for
-     *                isolation.
+     * @param i_id       Unique ID for all instances of this node.
+     * @param i_instance Instance of this node.
      */
-    explicit IsolationNode(const HardwareRegister& i_hwReg) : iv_hwReg(i_hwReg)
+    IsolationNode(NodeId_t i_id, Instance_t i_instance) :
+        iv_id(i_id), iv_instance(i_instance)
     {}
 
     /** @brief Destructor. */
@@ -55,12 +54,14 @@
     IsolationNode& operator=(const IsolationNode&) = delete;
 
   private: // Instance variables
+    /** The unique ID for all instances of this node. */
+    const NodeId_t iv_id;
+
     /**
-     * This is a reference to the HardwareRegister targeted for isolation by
-     * this instance of the class. The reference is required to maintain
-     * polymorphism.
+     * A node may have multiple instances. All of which will have the same ID.
+     * This variable is used to distinguish between each instance of the node.
      */
-    const HardwareRegister& iv_hwReg;
+    const Instance_t iv_instance;
 
     /**
      * This register could report multiple types of attentions. We can use a
@@ -69,21 +70,22 @@
      * HardwareRegister objects and virtual operator registers (all children
      * of the Register class).
      */
-    std::map<AttentionType_t, const Register*> iv_rules;
+    std::map<AttentionType_t, const RegisterPtr> iv_rules;
 
     /**
      * Each bit (key) in this map indicates that an attention was driven from
      * another register (value).
      */
-    std::map<BitPosition_t, const IsolationNode*> iv_children;
+    std::map<BitPosition_t, const std::shared_ptr<const IsolationNode>>
+        iv_children;
 
   public: // Member functions
     /**
-     * @brief  Finds all active attentions on this register. If an active bit is
-     *         a leaf in the isolation tree, the bit's signature is added to the
+     * @brief  Finds all active attentions on this node. If an active bit is a
+     *         leaf in the isolation tree, the bit's signature is added to the
      *         isolation data. Otherwise, this function is recursively called
-     *         to analyze the child register that is driving the attention in
-     *         this register.
+     *         to analyze the child node that is driving the attention in this
+     *         node.
      * @param  i_chip     The target chip for isolation.
      * @param  i_attnType The target attention type to analyze on this register.
      *                    Will assert a rule must exist for this attention type.
@@ -95,48 +97,63 @@
     bool analyze(const Chip& i_chip, AttentionType_t i_attnType,
                  IsolationData& io_isoData) const;
 
-    // TODO: The next two functions are only intended to be used during
-    //       initialization of the isolator. Consider, making them private and
-    //       make the Chip Data File code friends of this class. So that it has
-    //       access to these init functions.
-
     /**
      * @brief Adds a register rule for the given attention type. See iv_rules
      *        for details.
      *
      * This is only intended to be used during initialization of the isolator.
-     * Will assert that nothing has already been defined for this rule.
+     * Will assert that a rule has not already been defined for this type.
      *
      * @param The target attention type.
      * @param The rule for this attention type.
      */
-    void addRule(AttentionType_t i_attnType, const Register* i_rule);
+    void addRule(AttentionType_t i_attnType, RegisterPtr i_rule);
 
     /**
-     * @brief Adds a child register to analyze for the given bit in this
-     *        register. See iv_children for details.
+     * @brief Adds a child node to analyze for the given bit position in this
+     *        node. See iv_children for details.
      *
      * This is only intended to be used during initialization of the isolator.
      * Will assert that nothing has already been defined for this bit.
      *
-     * @param The target bit on this register.
-     * @param The child register to analyze for the given bit.
+     * @param The target bit on this node.
+     * @param The child node to analyze for the given bit.
      */
-    void addChild(BitPosition_t i_bit, const IsolationNode* i_child);
+    void addChild(BitPosition_t i_bit,
+                  std::shared_ptr<const IsolationNode> i_child);
+
+    /** @return The node ID. */
+    NodeId_t getId() const
+    {
+        return iv_id;
+    }
+
+    /** @return The node instance. */
+    Instance_t getInstance() const
+    {
+        return iv_instance;
+    }
 
   public: // Operators
     /** @brief Equals operator. */
     bool operator==(const IsolationNode& i_r) const
     {
-        // iv_hwReg should be unique per IsolationNode.
-        return (iv_hwReg == i_r.iv_hwReg);
+        return (iv_id == i_r.iv_id) && (iv_instance == i_r.iv_instance);
     }
 
     /** @brief Less than operator. */
     bool operator<(const IsolationNode& i_r) const
     {
-        // iv_hwReg should be unique per IsolationNode.
-        return (iv_hwReg < i_r.iv_hwReg);
+        if (iv_id < i_r.iv_id)
+        {
+            return true;
+        }
+        else if (iv_id == i_r.iv_id)
+        {
+            return (iv_instance < i_r.iv_instance);
+        }
+
+        return false;
     }
 
   private: // Isolation stack and supporting functions.
@@ -152,7 +169,7 @@
      *  this node can be popped off the top of the stack. Once all the recursive
      *  calls have returned back to the root node the stack should be empty.
      */
-    static std::vector<const IsolationNode*> cv_isolationStack;
+    static std::vector<std::shared_ptr<const IsolationNode>> cv_isolationStack;
 
     /**
      * @brief Pushes this node to the top of the stack. Will assert that this
@@ -167,10 +184,7 @@
     }
 };
 
-/** Pointer management for isolation nodes. */
-using IsolationNodePtr = std::shared_ptr<IsolationNode>;
-
-/** Simple map to ensure only one root IsolationNode per attention type. */
-using RootNodeMap = std::map<AttentionType_t, const IsolationNodePtr>;
+/** Pointer management for IsolationNode objects. */
+using IsolationNodePtr = std::shared_ptr<const IsolationNode>;
 
 } // end namespace libhei
