diff --git a/msl_verify.cpp b/msl_verify.cpp
new file mode 100644
index 0000000..3cd2278
--- /dev/null
+++ b/msl_verify.cpp
@@ -0,0 +1,96 @@
+#include "config.h"
+
+#include "msl_verify.hpp"
+
+#include "version.hpp"
+
+#include <phosphor-logging/log.hpp>
+
+#include <regex>
+
+using namespace phosphor::logging;
+
+int minimum_ship_level::compare(const Version& versionToCompare,
+                                const Version& mslVersion)
+{
+    if (versionToCompare.major > mslVersion.major)
+        return (1);
+    if (versionToCompare.major < mslVersion.major)
+        return (-1);
+
+    if (versionToCompare.minor > mslVersion.minor)
+        return (1);
+    if (versionToCompare.minor < mslVersion.minor)
+        return (-1);
+
+    if (versionToCompare.rev > mslVersion.rev)
+        return (1);
+    if (versionToCompare.rev < mslVersion.rev)
+        return (-1);
+
+    // Both string are equal and there is no need to make an upgrade return 0.
+    return 0;
+}
+
+// parse Function copy  inpVersion onto outVersion in Version format
+// {major,minor,rev}.
+void minimum_ship_level::parse(const std::string& inpVersion,
+                               Version& outVersion)
+{
+    std::smatch match;
+    outVersion = {0, 0, 0};
+
+    std::regex rx{REGEX_BMC_MSL, std::regex::extended};
+
+    if (!std::regex_search(inpVersion, match, rx))
+    {
+        log<level::ERR>("Unable to parse BMC version",
+                        entry("VERSION=%s", inpVersion.c_str()));
+        return;
+    }
+
+    outVersion.major = std::stoi(match[2]);
+    outVersion.minor = std::stoi(match[3]);
+    outVersion.rev = std::stoi(match[4]);
+}
+
+bool minimum_ship_level::verify(const std::string& versionManifest)
+{
+
+    //  If there is no msl or mslRegex return upgrade is needed.
+    std::string msl{BMC_MSL};
+    std::string mslRegex{REGEX_BMC_MSL};
+    if (msl.empty() || mslRegex.empty())
+    {
+        return true;
+    }
+
+    // Define mslVersion variable and populate in Version format
+    // {major,minor,rev} using parse function.
+
+    Version mslVersion = {0, 0, 0};
+    parse(msl, mslVersion);
+
+    // Define actualVersion variable and populate in Version format
+    // {major,minor,rev} using parse function.
+    std::string tmpStr{};
+
+    tmpStr = versionManifest;
+    Version actualVersion = {0, 0, 0};
+    parse(versionManifest, actualVersion);
+
+    // Compare actualVersion vs MSL.
+    auto rc = compare(actualVersion, mslVersion);
+    if (rc < 0)
+    {
+        log<level::ERR>(
+            "BMC Minimum Ship Level NOT met",
+            entry("MIN_VERSION=%s", msl.c_str()),
+            entry("ACTUAL_VERSION=%s", tmpStr.c_str()),
+            entry("VERSION_PURPOSE=%s",
+                  "xyz.openbmc_project.Software.Version.VersionPurpose.BMC"));
+        return false;
+    }
+
+    return true;
+}
