diff --git a/extensions/openpower-pels/repository.hpp b/extensions/openpower-pels/repository.hpp
index 5b15506..289541c 100644
--- a/extensions/openpower-pels/repository.hpp
+++ b/extensions/openpower-pels/repository.hpp
@@ -4,6 +4,7 @@
 
 #include <algorithm>
 #include <filesystem>
+#include <map>
 
 namespace openpower
 {
@@ -18,6 +19,72 @@
 class Repository
 {
   public:
+    /**
+     * @brief A structure that holds both the PEL and corresponding
+     *        OpenBMC IDs.
+     * Used for correlating the IDs with their data files for quick
+     * lookup.  To find a PEL based on just one of the IDs, just use
+     * the constructor that takes that ID.
+     */
+    struct LogID
+    {
+        struct Pel
+        {
+            uint32_t id;
+            explicit Pel(uint32_t i) : id(i)
+            {
+            }
+        };
+        struct Obmc
+        {
+            uint32_t id;
+            explicit Obmc(uint32_t i) : id(i)
+            {
+            }
+        };
+
+        Pel pelID;
+
+        Obmc obmcID;
+
+        LogID(Pel pel, Obmc obmc) : pelID(pel), obmcID(obmc)
+        {
+        }
+
+        explicit LogID(Pel id) : pelID(id), obmcID(0)
+        {
+        }
+
+        explicit LogID(Obmc id) : pelID(0), obmcID(id)
+        {
+        }
+
+        LogID() = delete;
+
+        /**
+         * @brief A == operator that will match on either ID
+         *        being equal if the other is zero, so that
+         *        one can look up a PEL with just one of the IDs.
+         */
+        bool operator==(const LogID& id) const
+        {
+            if (id.pelID.id != 0)
+            {
+                return id.pelID.id == pelID.id;
+            }
+            if (id.obmcID.id != 0)
+            {
+                return id.obmcID.id == obmcID.id;
+            }
+            return false;
+        }
+
+        bool operator<(const LogID& id) const
+        {
+            return pelID.id < id.pelID.id;
+        }
+    };
+
     Repository() = delete;
     ~Repository() = default;
     Repository(const Repository&) = default;
@@ -42,6 +109,13 @@
     void add(std::unique_ptr<PEL>& pel);
 
     /**
+     * @brief Removes a PEL from the repository
+     *
+     * @param[in] id - the ID (either the pel ID, OBMC ID, or both) to remove
+     */
+    void remove(const LogID& id);
+
+    /**
      * @brief Generates the filename to use for the PEL ID and BCDTime.
      *
      * @param[in] pelID - the PEL ID
@@ -51,11 +125,46 @@
      */
     static std::string getPELFilename(uint32_t pelID, const BCDTime& time);
 
+    /**
+     * @brief Returns true if the PEL with the specified ID is in the repo.
+     *
+     * @param[in] id - the ID (either the pel ID, OBMC ID, or both)
+     * @return bool - true if that PEL is present
+     */
+    inline bool hasPEL(const LogID& id)
+    {
+        return findPEL(id) != _idsToPELs.end();
+    }
+
   private:
     /**
+     * @brief Finds an entry in the _idsToPELs map.
+     *
+     * @param[in] id - the ID (either the pel ID, OBMC ID, or both)
+     *
+     * @return an iterator to the entry
+     */
+    std::map<LogID, std::filesystem::path>::iterator findPEL(const LogID& id)
+    {
+        return std::find_if(_idsToPELs.begin(), _idsToPELs.end(),
+                            [&id](const auto& i) { return i.first == id; });
+    }
+
+    /**
+     * @brief Restores the _idsToPELs map on startup based on the existing
+     *        PEL data files.
+     */
+    void restore();
+
+    /**
      * @brief The filesystem path to the PEL logs.
      */
     const std::filesystem::path _logPath;
+
+    /**
+     * @brief A map of the PEL/OBMC IDs to the PEL data files.
+     */
+    std::map<LogID, std::filesystem::path> _idsToPELs;
 };
 
 } // namespace pels
