diff --git a/extensions/openpower-pels/manager.cpp b/extensions/openpower-pels/manager.cpp
index 66f5ee5..fea2ba9 100644
--- a/extensions/openpower-pels/manager.cpp
+++ b/extensions/openpower-pels/manager.cpp
@@ -120,6 +120,11 @@
                               entry("PEL_ID=0x%X", pel->id()));
 
             _repo.add(pel);
+
+            if (_repo.sizeWarning())
+            {
+                scheduleRepoPrune();
+            }
         }
         catch (std::exception& e)
         {
@@ -281,6 +286,11 @@
 
         _repo.add(pel);
 
+        if (_repo.sizeWarning())
+        {
+            scheduleRepoPrune();
+        }
+
         auto src = pel->primarySRC();
         if (src)
         {
@@ -414,5 +424,25 @@
     }
 }
 
+void Manager::scheduleRepoPrune()
+{
+    sdeventplus::Event event = sdeventplus::Event::get_default();
+
+    _repoPrunerEventSource = std::make_unique<sdeventplus::source::Defer>(
+        event, std::bind(std::mem_fn(&Manager::pruneRepo), this,
+                         std::placeholders::_1));
+}
+
+void Manager::pruneRepo(sdeventplus::source::EventBase& source)
+{
+    auto idsToDelete = _repo.prune();
+
+    // Remove the OpenBMC event logs for the PELs that were just removed.
+    std::for_each(idsToDelete.begin(), idsToDelete.end(),
+                  [this](auto id) { this->_logManager.erase(id); });
+
+    _repoPrunerEventSource.reset();
+}
+
 } // namespace pels
 } // namespace openpower
diff --git a/extensions/openpower-pels/manager.hpp b/extensions/openpower-pels/manager.hpp
index d58b36b..2d443c6 100644
--- a/extensions/openpower-pels/manager.hpp
+++ b/extensions/openpower-pels/manager.hpp
@@ -254,6 +254,23 @@
     PelFFDC convertToPelFFDC(const phosphor::logging::FFDCEntries& ffdc);
 
     /**
+     * @brief Schedules a PEL repository prune to occur from
+     *        the event loop.
+     *
+     * Uses sd_event_add_defer
+     */
+    void scheduleRepoPrune();
+
+    /**
+     * @brief Prunes old PELs out of the repository to save space.
+     *
+     * This is called from the event loop.
+     *
+     * @param[in] source - The event source object used
+     */
+    void pruneRepo(sdeventplus::source::EventBase& source);
+
+    /**
      * @brief Reference to phosphor-logging's Manager class
      */
     phosphor::logging::internal::Manager& _logManager;
@@ -290,6 +307,12 @@
      *        it has been returned from the getPEL D-Bus method.
      */
     std::unique_ptr<sdeventplus::source::Defer> _fdCloserEventSource;
+
+    /**
+     * @brief The even source for removing old PELs when the repo is
+     *        running out of space to make room for new ones.
+     */
+    std::unique_ptr<sdeventplus::source::Defer> _repoPrunerEventSource;
 };
 
 } // namespace pels
diff --git a/extensions/openpower-pels/repository.cpp b/extensions/openpower-pels/repository.cpp
index e608927..59b3eaa 100644
--- a/extensions/openpower-pels/repository.cpp
+++ b/extensions/openpower-pels/repository.cpp
@@ -30,6 +30,8 @@
 using namespace phosphor::logging;
 namespace file_error = sdbusplus::xyz::openbmc_project::Common::File::Error;
 
+constexpr size_t warningPercentage = 95;
+
 /**
  * @brief Returns the amount of space the file uses on disk.
  *
@@ -499,6 +501,12 @@
     }
 }
 
+bool Repository::sizeWarning() const
+{
+    return (_sizes.total > (_maxRepoSize * warningPercentage / 100)) ||
+           (_pelAttributes.size() > _maxNumPELs);
+}
+
 std::vector<Repository::AttributesReference>
     Repository::getAllPELAttributes(SortOrder order) const
 {
diff --git a/extensions/openpower-pels/repository.hpp b/extensions/openpower-pels/repository.hpp
index f33289c..c7cb39a 100644
--- a/extensions/openpower-pels/repository.hpp
+++ b/extensions/openpower-pels/repository.hpp
@@ -357,6 +357,16 @@
     static bool isServiceableSev(const PELAttributes& pel);
 
     /**
+     * @brief Returns true if the total amount of disk space occupied
+     *        by the PELs in the repo is over 95% of the maximum
+     *        size, or if there are over the maximum number of
+     *        PELs allowed.
+     *
+     * @return bool - true if repo is > 95% full or too many PELs
+     */
+    bool sizeWarning() const;
+
+    /**
      * @brief Deletes PELs to bring the repository size down
      *        to at most 90% full by placing PELs into 4 different
      *        catogories and then removing PELs until those catogories
diff --git a/test/openpower-pels/pel_manager_test.cpp b/test/openpower-pels/pel_manager_test.cpp
index 92713e9..bbc89a6 100644
--- a/test/openpower-pels/pel_manager_test.cpp
+++ b/test/openpower-pels/pel_manager_test.cpp
@@ -90,6 +90,21 @@
     return std::nullopt;
 }
 
+size_t countPELsInRepo()
+{
+    size_t count = 0;
+    std::regex expr{"\\d+_\\d+"};
+
+    for (auto& f : fs::directory_iterator(getPELRepoPath() / "logs"))
+    {
+        if (std::regex_search(f.path().string(), expr))
+        {
+            count++;
+        }
+    }
+    return count;
+}
+
 // Test that using the RAWPEL=<file> with the Manager::create() call gets
 // a PEL saved in the repository.
 TEST_F(ManagerTest, TestCreateWithPEL)
@@ -522,3 +537,75 @@
         EXPECT_EQ(logger.errLevel, phosphor::logging::Entry::Level::Error);
     }
 }
+
+// Test that PELs will be pruned when necessary
+TEST_F(ManagerTest, TestPruning)
+{
+    sdeventplus::Event e{sdEvent};
+
+    std::unique_ptr<DataInterfaceBase> dataIface =
+        std::make_unique<MockDataInterface>();
+
+    openpower::pels::Manager manager{
+        logManager, std::move(dataIface),
+        std::bind(std::mem_fn(&TestLogger::log), &logger, std::placeholders::_1,
+                  std::placeholders::_2, std::placeholders::_3)};
+
+    // Create 25 1000B (4096B on disk each, which is what is used for pruning)
+    // BMC non-informational PELs in the 100KB repository.  After the 24th one,
+    // the repo will be 96% full and a prune should be triggered to remove all
+    // but 7 to get under 30% full.  Then when the 25th is added there will be
+    // 8 left.
+
+    auto dir = makeTempDir();
+    for (int i = 1; i <= 25; i++)
+    {
+        auto data = pelFactory(42, 'O', 0x40, 0x8800, 1000);
+
+        fs::path pelFilename = dir / "rawpel";
+        std::ofstream pelFile{pelFilename};
+        pelFile.write(reinterpret_cast<const char*>(data.data()), data.size());
+        pelFile.close();
+
+        std::string adItem = "RAWPEL=" + pelFilename.string();
+        std::vector<std::string> additionalData{adItem};
+        std::vector<std::string> associations;
+
+        manager.create("error message", 42, 0,
+                       phosphor::logging::Entry::Level::Error, additionalData,
+                       associations);
+
+        // Simulate the code getting back to the event loop
+        // after each create.
+        e.run(std::chrono::milliseconds(1));
+
+        if (i < 24)
+        {
+            EXPECT_EQ(countPELsInRepo(), i);
+        }
+        else if (i == 24)
+        {
+            // Prune occured
+            EXPECT_EQ(countPELsInRepo(), 7);
+        }
+        else // i == 25
+        {
+            EXPECT_EQ(countPELsInRepo(), 8);
+        }
+    }
+
+    try
+    {
+        // Make sure the 8 newest ones are still found.
+        for (uint32_t i = 0; i < 8; i++)
+        {
+            manager.getPEL(0x50000012 + i);
+        }
+    }
+    catch (sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument& e)
+    {
+        ADD_FAILURE() << "PELs should have all been found";
+    }
+
+    fs::remove_all(dir);
+}
diff --git a/test/openpower-pels/repository_test.cpp b/test/openpower-pels/repository_test.cpp
index a4f8bef..3fa2290 100644
--- a/test/openpower-pels/repository_test.cpp
+++ b/test/openpower-pels/repository_test.cpp
@@ -784,3 +784,55 @@
     EXPECT_EQ(IDs[1], 500 + 2);
     EXPECT_EQ(IDs[2], 500 + 3);
 }
+
+// Test the sizeWarning function
+TEST_F(RepositoryTest, TestSizeWarning)
+{
+    uint32_t id = 1;
+    Repository repo{repoPath, 100 * 4096, 500};
+
+    EXPECT_FALSE(repo.sizeWarning());
+
+    // 95% is still OK (disk size for these is 4096)
+    for (uint32_t i = 1; i <= 95; i++)
+    {
+        auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
+        auto pel = std::make_unique<PEL>(data);
+        repo.add(pel);
+    }
+
+    EXPECT_FALSE(repo.sizeWarning());
+
+    // Now at 96%
+    auto data = pelFactory(id++, 'B', 0x20, 0x8800, 400);
+    auto pel = std::make_unique<PEL>(data);
+    repo.add(pel);
+
+    EXPECT_TRUE(repo.sizeWarning());
+}
+
+// Test sizeWarning when there are too many PEls
+TEST_F(RepositoryTest, TestSizeWarningNumPELs)
+{
+    Repository repo{repoPath, 4096 * 100, 5};
+
+    EXPECT_FALSE(repo.sizeWarning());
+
+    for (uint32_t i = 1; i <= 5; i++)
+    {
+        auto data = pelFactory(i, 'O', 0x20, 0x8800, 500);
+        auto pel = std::make_unique<PEL>(data);
+        repo.add(pel);
+    }
+
+    EXPECT_FALSE(repo.sizeWarning());
+
+    // Add 1 more for a total of 6, now over the limit
+    {
+        auto data = pelFactory(6, 'O', 0x20, 0x8800, 500);
+        auto pel = std::make_unique<PEL>(data);
+        repo.add(pel);
+    }
+
+    EXPECT_TRUE(repo.sizeWarning());
+}
