diff --git a/src/isolator/hei_signature.hpp b/src/isolator/hei_signature.hpp
new file mode 100644
index 0000000..018673a
--- /dev/null
+++ b/src/isolator/hei_signature.hpp
@@ -0,0 +1,71 @@
+#pragma once
+
+#include <hei_includes.hpp>
+
+namespace libhei
+{
+
+/**
+ * @brief A signature represents an active attention from a single bit on a
+ *        register within a chip.
+ *
+ * The isolator will gather a list of all active attentions on a chip and return
+ * a list of signatures to the user application. The user application should be
+ * able to determine what actions to take based on these signatures.
+ */
+class Signature
+{
+  public: // Constructors, destructor, assignment, etc.
+
+    /**
+     * @brief Constructor from components.
+     * @param i_chip     The chip containing this register.
+     * @param i_id       The register ID.
+     * @param i_instance The instance of this register.
+     * @param i_bit      The target bit within this register.
+     * @param i_attnType The attention type reported by this bit.
+     */
+    Signature( const Chip & i_chip, RegisterId_t i_id,
+               RegisterInstance_t i_instance, RegisterBit_t i_bit,
+               AttentionType_t i_attnType ) :
+        iv_chip( i_chip ), iv_id( i_id ), iv_instance( i_instance ),
+        iv_bit( i_bit ), iv_attnType( i_attnType )
+    {}
+
+    /** @brief Destructor. */
+    ~Signature() = default;
+
+    /** @brief Copy constructor. */
+    Signature( const Signature & ) = default;
+
+    /** @brief Assignment operator. */
+    Signature & operator=( const Signature & ) = default;
+
+  private: // Instance variables.
+
+    Chip               iv_chip;     ///< Chip containing this register.
+    RegisterId_t       iv_id;       ///< Register ID.
+    RegisterInstance_t iv_instance; ///< Instance of this register.
+    RegisterBit_t      iv_bit;      ///< Target bit within this register.
+    AttentionType_t    iv_attnType; ///< Attention type reported by this bit.
+
+  public: // Member functions
+
+    /** @return The chip containing this register. */
+    const Chip & getChip() const { return iv_chip; }
+
+    /** @return The register ID. */
+    RegisterId_t getId() const { return iv_id; }
+
+    /** @return The instance of this register. */
+    RegisterInstance_t getInstance() const { return iv_instance; }
+
+    /** @return The target bit within this register. */
+    RegisterBit_t getBit() const { return iv_bit; }
+
+    /** @return The attention type reported by this bit. */
+    AttentionType_t getAttnType() const { return iv_attnType; }
+};
+
+} // end namespace libhei
+
