diff --git a/src/item_updater.cpp b/src/item_updater.cpp
index 6472fe1..13e6bf4 100644
--- a/src/item_updater.cpp
+++ b/src/item_updater.cpp
@@ -4,6 +4,7 @@
 
 #include "utils.hpp"
 
+#include <cassert>
 #include <filesystem>
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/log.hpp>
@@ -271,6 +272,7 @@
     sdbusplus::xyz::openbmc_project::Software::server::Version::VersionPurpose
         versionPurpose)
 {
+    versionStrings.insert(versionString);
     auto version = std::make_unique<Version>(
         bus, objPath, versionId, versionString, versionPurpose,
         std::bind(&ItemUpdater::erase, this, std::placeholders::_1));
@@ -412,6 +414,27 @@
     }
 }
 
+std::optional<std::string> ItemUpdater::getLatestVersionId()
+{
+    auto latestVersion = utils::getLatestVersion(versionStrings);
+    if (latestVersion.empty())
+    {
+        return {};
+    }
+
+    std::optional<std::string> versionId;
+    for (const auto& v : versions)
+    {
+        if (v.second->version() == latestVersion)
+        {
+            versionId = v.first;
+            break;
+        }
+    }
+    assert(versionId.has_value());
+    return versionId;
+}
+
 } // namespace updater
 } // namespace software
 } // namespace phosphor
diff --git a/src/item_updater.hpp b/src/item_updater.hpp
index 2cccf68..2f23b1e 100644
--- a/src/item_updater.hpp
+++ b/src/item_updater.hpp
@@ -55,6 +55,7 @@
     {
         processPSUImage();
         processStoredImage();
+        getLatestVersionId();
     }
 
     /** @brief Deletes version
@@ -150,6 +151,9 @@
     /** @brief Scan a directory and create PSU Version from stored images */
     void scanDirectory(const fs::path& p);
 
+    /** @brief Get the versionId of the latest PSU version */
+    std::optional<std::string> getLatestVersionId();
+
     /** @brief Persistent sdbusplus D-Bus bus connection. */
     sdbusplus::bus::bus& bus;
 
@@ -174,6 +178,9 @@
 
     /** @brief This entry's associations */
     AssociationList assocs;
+
+    /** @brief A collection of the version strings */
+    std::set<std::string> versionStrings;
 };
 
 } // namespace updater
diff --git a/src/utils.cpp b/src/utils.cpp
index 33e56be..171de29 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -154,6 +154,21 @@
     return (rc == 0) ? r : "";
 }
 
+std::string Utils::getLatestVersion(const std::set<std::string>& versions) const
+{
+    if (versions.empty())
+    {
+        return {};
+    }
+    std::stringstream args;
+    for (const auto& s : versions)
+    {
+        args << s << " ";
+    }
+    auto [rc, r] = internal::exec(PSU_VERSION_COMPARE_UTIL, args.str());
+    return (rc == 0) ? r : "";
+}
+
 any Utils::getPropertyImpl(sdbusplus::bus::bus& bus, const char* service,
                            const char* path, const char* interface,
                            const char* propertyName) const
diff --git a/src/utils.hpp b/src/utils.hpp
index fe376a8..bb5f13f 100644
--- a/src/utils.hpp
+++ b/src/utils.hpp
@@ -2,6 +2,7 @@
 
 #include <experimental/any>
 #include <sdbusplus/bus.hpp>
+#include <set>
 #include <string>
 #include <vector>
 
@@ -82,6 +83,14 @@
  */
 std::string getVersion(const std::string& inventoryPath);
 
+/** @brief Get latest version from the PSU versions
+ *
+ * @param[in] versions - The list of the versions
+ *
+ * @return The latest version string
+ */
+std::string getLatestVersion(const std::set<std::string>& versions);
+
 /**
  * @brief The interface for utils
  */
@@ -107,6 +116,9 @@
 
     virtual std::string getVersion(const std::string& inventoryPath) const = 0;
 
+    virtual std::string
+        getLatestVersion(const std::set<std::string>& versions) const = 0;
+
     virtual any getPropertyImpl(sdbusplus::bus::bus& bus, const char* service,
                                 const char* path, const char* interface,
                                 const char* propertyName) const = 0;
@@ -140,6 +152,9 @@
 
     std::string getVersion(const std::string& inventoryPath) const override;
 
+    std::string
+        getLatestVersion(const std::set<std::string>& versions) const override;
+
     any getPropertyImpl(sdbusplus::bus::bus& bus, const char* service,
                         const char* path, const char* interface,
                         const char* propertyName) const override;
@@ -173,6 +188,11 @@
     return getUtils().getVersion(inventoryPath);
 }
 
+inline std::string getLatestVersion(const std::set<std::string>& versions)
+{
+    return getUtils().getLatestVersion(versions);
+}
+
 template <typename T>
 T getProperty(sdbusplus::bus::bus& bus, const char* service, const char* path,
               const char* interface, const char* propertyName)
