diff --git a/extensions/openpower-pels/tools/peltool.cpp b/extensions/openpower-pels/tools/peltool.cpp
index 7d1e304..61fb257 100644
--- a/extensions/openpower-pels/tools/peltool.cpp
+++ b/extensions/openpower-pels/tools/peltool.cpp
@@ -209,13 +209,15 @@
  *        stdout the full PEL in JSON if fullPEL is true
  * @param[in] itr - std::map iterator of <uint32_t, BCDTime>
  * @param[in] hidden - Boolean to include hidden PELs
+ * @param[in] includeInfo - Boolean to include informational PELs
  * @param[in] fullPEL - Boolean to print full JSON representation of PEL
  * @param[in] foundPEL - Boolean to check if any PEL is present
  * @param[in] scrubRegex - SRC regex object
  * @return std::string - JSON string of PEL entry (empty if fullPEL is true)
  */
 template <typename T>
-std::string genPELJSON(T itr, bool hidden, bool fullPEL, bool& foundPEL,
+std::string genPELJSON(T itr, bool hidden, bool includeInfo, bool fullPEL,
+                       bool& foundPEL,
                        const std::optional<std::regex>& scrubRegex)
 {
     std::size_t found;
@@ -243,6 +245,10 @@
         {
             return listStr;
         }
+        if (!includeInfo && pel.userHeader().severity() == 0)
+        {
+            return listStr;
+        }
         std::bitset<16> actionFlags{pel.userHeader().actionFlags()};
         if (!hidden && actionFlags.test(hiddenFlagBit))
         {
@@ -350,10 +356,11 @@
  * @brief Print a list of PELs or a JSON array of PELs
  * @param[in] order - Boolean to print in reverse orser
  * @param[in] hidden - Boolean to include hidden PELs
+ * @param[in] includeInfo - Boolean to include informational PELs
  * @param[in] fullPEL - Boolean to print full PEL into a JSON array
  * @param[in] scrubRegex - SRC regex object
  */
-void printPELs(bool order, bool hidden, bool fullPEL,
+void printPELs(bool order, bool hidden, bool includeInfo, bool fullPEL,
                const std::optional<std::regex>& scrubRegex)
 {
     std::string listStr;
@@ -373,9 +380,10 @@
         }
     }
     bool foundPEL = false;
-    auto buildJSON = [&listStr, &hidden, &fullPEL, &foundPEL,
+    auto buildJSON = [&listStr, &hidden, &includeInfo, &fullPEL, &foundPEL,
                       &scrubRegex](const auto& i) {
-        listStr += genPELJSON(i, hidden, fullPEL, foundPEL, scrubRegex);
+        listStr +=
+            genPELJSON(i, hidden, includeInfo, fullPEL, foundPEL, scrubRegex);
     };
     if (order)
     {
@@ -548,9 +556,11 @@
 /**
  * @brief Print number of PELs
  * @param[in] hidden - Bool to include hidden logs
+ * @param[in] includeInfo - Bool to include informational logs
  * @param[in] scrubRegex - SRC regex object
  */
-void printPELCount(bool hidden, const std::optional<std::regex>& scrubRegex)
+void printPELCount(bool hidden, bool includeInfo,
+                   const std::optional<std::regex>& scrubRegex)
 {
     std::size_t count = 0;
     for (auto it = fs::directory_iterator(EXTENSION_PERSIST_DIR "/pels/logs");
@@ -570,6 +580,10 @@
         {
             continue;
         }
+        if (!includeInfo && pel.userHeader().severity() == 0)
+        {
+            continue;
+        }
         std::bitset<16> actionFlags{pel.userHeader().actionFlags()};
         if (!hidden && actionFlags.test(hiddenFlagBit))
         {
@@ -684,19 +698,20 @@
     bool listPEL = false;
     bool listPELDescOrd = false;
     bool hidden = false;
+    bool includeInfo = false;
     bool deleteAll = false;
     bool showPELCount = false;
     bool fullPEL = false;
 
     app.set_help_flag("--help", "Print this help message and exit");
-    app.add_option("-f,--file", fileName,
-                   "Display a PEL using its Raw PEL file");
+    app.add_option("--file", fileName, "Display a PEL using its Raw PEL file");
     app.add_option("-i, --id", idPEL, "Display a PEL based on its ID");
     app.add_flag("-a", fullPEL, "Display all PELs");
     app.add_flag("-l", listPEL, "List PELs");
     app.add_flag("-n", showPELCount, "Show number of PELs");
     app.add_flag("-r", listPELDescOrd, "Reverse order of output");
     app.add_flag("-h", hidden, "Include hidden PELs");
+    app.add_flag("-f,--info", includeInfo, "Include informational PELs");
     app.add_option("-d, --delete", idToDelete, "Delete a PEL based on its ID");
     app.add_flag("-D, --delete-all", deleteAll, "Delete all PELs");
     app.add_option("-s, --scrub", scrubFile,
@@ -728,7 +743,7 @@
         {
             scrubRegex = genRegex(scrubFile);
         }
-        printPELs(listPELDescOrd, hidden, fullPEL, scrubRegex);
+        printPELs(listPELDescOrd, hidden, includeInfo, fullPEL, scrubRegex);
     }
     else if (showPELCount)
     {
@@ -736,7 +751,7 @@
         {
             scrubRegex = genRegex(scrubFile);
         }
-        printPELCount(hidden, scrubRegex);
+        printPELCount(hidden, includeInfo, scrubRegex);
     }
     else if (!idToDelete.empty())
     {
