diff --git a/include/mdrv2.hpp b/include/mdrv2.hpp
index 994598c..b4b5efe 100644
--- a/include/mdrv2.hpp
+++ b/include/mdrv2.hpp
@@ -59,22 +59,22 @@
     "xyz.openbmc_project.Inventory.Item.System";
 constexpr const int limitEntryLen = 0xff;
 
-class MDR_V2 :
+class MDRV2 :
     sdbusplus::server::object_t<
-        sdbusplus::xyz::openbmc_project::Smbios::server::MDR_V2>
+        sdbusplus::xyz::openbmc_project::Smbios::server::MDRV2>
 {
   public:
-    MDR_V2() = delete;
-    MDR_V2(const MDR_V2&) = delete;
-    MDR_V2& operator=(const MDR_V2&) = delete;
-    MDR_V2(MDR_V2&&) = delete;
-    MDR_V2& operator=(MDR_V2&&) = delete;
-    ~MDR_V2() = default;
+    MDRV2() = delete;
+    MDRV2(const MDRV2&) = delete;
+    MDRV2& operator=(const MDRV2&) = delete;
+    MDRV2(MDRV2&&) = delete;
+    MDRV2& operator=(MDRV2&&) = delete;
+    ~MDRV2() = default;
 
-    MDR_V2(sdbusplus::bus_t& bus, const char* path,
-           boost::asio::io_context& io) :
+    MDRV2(sdbusplus::bus_t& bus, const char* path,
+          boost::asio::io_context& io) :
         sdbusplus::server::object_t<
-            sdbusplus::xyz::openbmc_project::Smbios::server::MDR_V2>(bus, path),
+            sdbusplus::xyz::openbmc_project::Smbios::server::MDRV2>(bus, path),
         bus(bus), timer(io), smbiosInterface(getObjectServer().add_interface(
                                  smbiosPath, smbiosInterfaceName))
     {
diff --git a/src/mdrv2.cpp b/src/mdrv2.cpp
index e71d922..6fb5a40 100644
--- a/src/mdrv2.cpp
+++ b/src/mdrv2.cpp
@@ -31,7 +31,7 @@
 namespace smbios
 {
 
-std::vector<uint8_t> MDR_V2::getDirectoryInformation(uint8_t dirIndex)
+std::vector<uint8_t> MDRV2::getDirectoryInformation(uint8_t dirIndex)
 {
     std::vector<uint8_t> responseDir;
 
@@ -74,7 +74,7 @@
     return responseDir;
 }
 
-bool MDR_V2::smbiosIsAvailForUpdate(uint8_t index)
+bool MDRV2::smbiosIsAvailForUpdate(uint8_t index)
 {
     bool ret = false;
     if (index >= maxDirEntries)
@@ -116,7 +116,7 @@
     return ret;
 }
 
-std::vector<uint8_t> MDR_V2::getDataOffer()
+std::vector<uint8_t> MDRV2::getDataOffer()
 {
     std::vector<uint8_t> offer(sizeof(DataIdStruct));
     if (smbiosIsAvailForUpdate(0))
@@ -134,7 +134,7 @@
     return offer;
 }
 
-inline uint8_t MDR_V2::smbiosValidFlag(uint8_t index)
+inline uint8_t MDRV2::smbiosValidFlag(uint8_t index)
 {
     FlagStatus ret = FlagStatus::flagIsInvalid;
     MDR2SMBIOSStatusEnum stage = smbiosDir.dir[index].stage;
@@ -177,7 +177,7 @@
     std::reverse_copy(data, data + sizeof(value), std::back_inserter(vector));
 }
 
-std::vector<uint8_t> MDR_V2::getDataInformation(uint8_t idIndex)
+std::vector<uint8_t> MDRV2::getDataInformation(uint8_t idIndex)
 {
     std::vector<uint8_t> responseInfo;
     responseInfo.push_back(mdr2Version);
@@ -202,7 +202,7 @@
     return responseInfo;
 }
 
-bool MDR_V2::readDataFromFlash(MDRSMBIOSHeader* mdrHdr, uint8_t* data)
+bool MDRV2::readDataFromFlash(MDRSMBIOSHeader* mdrHdr, uint8_t* data)
 {
     if (mdrHdr == nullptr)
     {
@@ -254,10 +254,10 @@
     return true;
 }
 
-bool MDR_V2::sendDirectoryInformation(uint8_t dirVersion, uint8_t dirIndex,
-                                      uint8_t returnedEntries,
-                                      uint8_t remainingEntries,
-                                      std::vector<uint8_t> dirEntry)
+bool MDRV2::sendDirectoryInformation(uint8_t dirVersion, uint8_t dirIndex,
+                                     uint8_t returnedEntries,
+                                     uint8_t remainingEntries,
+                                     std::vector<uint8_t> dirEntry)
 {
     bool teminate = false;
     if ((dirIndex >= maxDirEntries) || (returnedEntries < 1))
@@ -309,9 +309,8 @@
     return teminate;
 }
 
-bool MDR_V2::sendDataInformation(uint8_t idIndex, uint8_t flag,
-                                 uint32_t dataLen, uint32_t dataVer,
-                                 uint32_t timeStamp)
+bool MDRV2::sendDataInformation(uint8_t idIndex, uint8_t flag, uint32_t dataLen,
+                                uint32_t dataVer, uint32_t timeStamp)
 {
     if (idIndex >= maxDirEntries)
     {
@@ -343,7 +342,7 @@
     return true;
 }
 
-int MDR_V2::findIdIndex(std::vector<uint8_t> dataInfo)
+int MDRV2::findIdIndex(std::vector<uint8_t> dataInfo)
 {
     if (dataInfo.size() != sizeof(DataIdStruct))
     {
@@ -375,7 +374,7 @@
     throw sdbusplus::xyz::openbmc_project::Smbios::MDR_V2::Error::InvalidId();
 }
 
-uint8_t MDR_V2::directoryEntries(uint8_t value)
+uint8_t MDRV2::directoryEntries(uint8_t value)
 {
     std::ifstream smbiosFile(mdrType2File, std::ios_base::binary);
     if (!smbiosFile.good())
@@ -388,11 +387,11 @@
     {
         value = smbiosDir.dirEntries;
     }
-    return sdbusplus::xyz::openbmc_project::Smbios::server::MDR_V2::
+    return sdbusplus::xyz::openbmc_project::Smbios::server::MDRV2::
         directoryEntries(value);
 }
 
-void MDR_V2::systemInfoUpdate()
+void MDRV2::systemInfoUpdate()
 {
     std::string motherboardPath;
     auto method = bus.new_method_call(mapperBusName, mapperPath,
@@ -508,7 +507,7 @@
         bus, systemPath, smbiosDir.dir[smbiosDirIndex].dataStorage);
 }
 
-int MDR_V2::getTotalCpuSlot()
+int MDRV2::getTotalCpuSlot()
 {
     uint8_t* dataIn = smbiosDir.dir[smbiosDirIndex].dataStorage;
     int num = 0;
@@ -542,7 +541,7 @@
     return num;
 }
 
-int MDR_V2::getTotalDimmSlot()
+int MDRV2::getTotalDimmSlot()
 {
     uint8_t* dataIn = smbiosDir.dir[smbiosDirIndex].dataStorage;
     uint8_t num = 0;
@@ -576,7 +575,7 @@
     return num;
 }
 
-int MDR_V2::getTotalPcieSlot()
+int MDRV2::getTotalPcieSlot()
 {
     uint8_t* dataIn = smbiosDir.dir[smbiosDirIndex].dataStorage;
     int num = 0;
@@ -617,7 +616,7 @@
     return num;
 }
 
-bool MDR_V2::checkSMBIOSVersion(uint8_t* dataIn)
+bool MDRV2::checkSMBIOSVersion(uint8_t* dataIn)
 {
     const std::string anchorString21 = "_SM_";
     const std::string anchorString30 = "_SM3_";
@@ -689,7 +688,7 @@
     return true;
 }
 
-bool MDR_V2::agentSynchronizeData()
+bool MDRV2::agentSynchronizeData()
 {
     struct MDRSMBIOSHeader mdr2SMBIOS;
     bool status = readDataFromFlash(&mdr2SMBIOS,
@@ -718,8 +717,8 @@
     return true;
 }
 
-std::vector<uint32_t> MDR_V2::synchronizeDirectoryCommonData(uint8_t idIndex,
-                                                             uint32_t size)
+std::vector<uint32_t> MDRV2::synchronizeDirectoryCommonData(uint8_t idIndex,
+                                                            uint32_t size)
 {
     std::chrono::microseconds usec(
         defaultTimeout); // default lock time out is 2s
@@ -743,7 +742,7 @@
 }
 
 std::vector<boost::container::flat_map<std::string, RecordVariant>>
-    MDR_V2::getRecordType(size_t type)
+    MDRV2::getRecordType(size_t type)
 {
 
     std::vector<boost::container::flat_map<std::string, RecordVariant>> ret;
diff --git a/src/mdrv2_main.cpp b/src/mdrv2_main.cpp
index 7ab907a..06a51cb 100644
--- a/src/mdrv2_main.cpp
+++ b/src/mdrv2_main.cpp
@@ -39,7 +39,7 @@
 
     bus.request_name("xyz.openbmc_project.Smbios.MDR_V2");
 
-    phosphor::smbios::MDR_V2 mdrV2(bus, phosphor::smbios::mdrV2Path, io);
+    phosphor::smbios::MDRV2 mdrV2(bus, phosphor::smbios::mdrV2Path, io);
 
     io.run();
 
