diff --git a/include/FruUtils.hpp b/include/FruUtils.hpp
index 4417ece..5e96696 100644
--- a/include/FruUtils.hpp
+++ b/include/FruUtils.hpp
@@ -69,3 +69,16 @@
 /// \param area - the area
 /// \return the field offset
 unsigned int getHeaderAreaFieldOffset(fruAreas area);
+
+/// \brief Get name of FRU areas
+/// \param area - the area
+/// \return the name of Fru areas
+std::string getFruAreaName(fruAreas area);
+
+/// \brief verifies overlapping of other offsets against given offset area
+/// \param fruBytes Start of Fru data
+/// \param currentArea Index of current area offset to be compared
+/// \param len Length of current area space
+/// \return true on success
+bool verifyOffset(const std::vector<uint8_t>& fruBytes, fruAreas currentArea,
+                  uint8_t len);
diff --git a/src/FruDevice.cpp b/src/FruDevice.cpp
index 6eaccbe..0b2f9fa 100644
--- a/src/FruDevice.cpp
+++ b/src/FruDevice.cpp
@@ -113,10 +113,6 @@
 
 static const std::string FRU_CUSTOM_FIELD_NAME = "INFO_AM";
 
-static inline const std::string& getFruAreaName(fruAreas area)
-{
-    return FRU_AREA_NAMES[static_cast<unsigned int>(area)];
-}
 uint8_t calculateChecksum(std::vector<uint8_t>::const_iterator iter,
                           std::vector<uint8_t>::const_iterator end);
 bool updateFRUProperty(
@@ -807,81 +803,6 @@
     }
 }
 
-/* This function verifies for other offsets to check if they are not
- * falling under other field area
- *
- * fruBytes:    Start of Fru data
- * currentArea: Index of current area offset to be compared against all area
- *              offset and it is a multiple of 8 bytes as per specification
- * len:         Length of current area space and it is a multiple of 8 bytes
- *              as per specification
- */
-static bool verifyOffset(const std::vector<uint8_t>& fruBytes,
-                         fruAreas currentArea, uint8_t len)
-{
-
-    unsigned int fruBytesSize = fruBytes.size();
-
-    // check if Fru data has at least 8 byte header
-    if (fruBytesSize <= fruBlockSize)
-    {
-        std::cerr << "Error: trying to parse empty FRU\n";
-        return false;
-    }
-
-    // Check range of passed currentArea value
-    if (currentArea > fruAreas::fruAreaMultirecord)
-    {
-        std::cerr << "Error: Fru area is out of range\n";
-        return false;
-    }
-
-    unsigned int currentAreaIndex = getHeaderAreaFieldOffset(currentArea);
-    if (currentAreaIndex > fruBytesSize)
-    {
-        std::cerr << "Error: Fru area index is out of range\n";
-        return false;
-    }
-
-    unsigned int start = fruBytes[currentAreaIndex];
-    unsigned int end = start + len;
-
-    /* Verify each offset within the range of start and end */
-    for (fruAreas area = fruAreas::fruAreaInternal;
-         area <= fruAreas::fruAreaMultirecord; ++area)
-    {
-        // skip the current offset
-        if (area == currentArea)
-        {
-            continue;
-        }
-
-        unsigned int areaIndex = getHeaderAreaFieldOffset(area);
-        if (areaIndex > fruBytesSize)
-        {
-            std::cerr << "Error: Fru area index is out of range\n";
-            return false;
-        }
-
-        unsigned int areaOffset = fruBytes[areaIndex];
-        // if areaOffset is 0 means this area is not available so skip
-        if (areaOffset == 0)
-        {
-            continue;
-        }
-
-        // check for overlapping of current offset with given areaoffset
-        if (areaOffset == start || (areaOffset > start && areaOffset < end))
-        {
-            std::cerr << getFruAreaName(currentArea)
-                      << " offset is overlapping with " << getFruAreaName(area)
-                      << " offset\n";
-            return false;
-        }
-    }
-    return true;
-}
-
 resCodes formatFRU(const std::vector<uint8_t>& fruBytes,
                    boost::container::flat_map<std::string, std::string>& result)
 {
diff --git a/src/FruUtils.cpp b/src/FruUtils.cpp
index 4d8354c..9bfcf30 100644
--- a/src/FruUtils.cpp
+++ b/src/FruUtils.cpp
@@ -33,6 +33,21 @@
 static constexpr bool DEBUG = false;
 constexpr size_t fruVersion = 1; // Current FRU spec version number is 1
 
+static constexpr std::array<const char*, 5> FRU_AREAS_NAMES = {
+    "INTERNAL", "CHASSIS", "BOARD", "PRODUCT", "MULTIRECORD"};
+
+std::string getFruAreaName(fruAreas area)
+{
+    // Check range of passed area value
+    if (static_cast<unsigned int>(area) >= FRU_AREAS_NAMES.size())
+    {
+        std::cerr << "Error: Fru area is out of range\n";
+        return "";
+    }
+
+    return std::string(FRU_AREAS_NAMES[static_cast<unsigned int>(area)]);
+}
+
 bool validateHeader(const std::array<uint8_t, I2C_SMBUS_BLOCK_MAX>& blockData)
 {
     // ipmi spec format version number is currently at 1, verify it
@@ -94,6 +109,81 @@
     return true;
 }
 
+/* This function verifies for other offsets to check if they are not
+ * falling under other field area
+ *
+ * fruBytes:    Start of Fru data
+ * currentArea: Index of current area offset to be compared against all area
+ *              offset and it is a multiple of 8 bytes as per specification
+ * len:         Length of current area space and it is a multiple of 8 bytes
+ *              as per specification
+ */
+bool verifyOffset(const std::vector<uint8_t>& fruBytes, fruAreas currentArea,
+                  uint8_t len)
+{
+
+    unsigned int fruBytesSize = fruBytes.size();
+
+    // check if Fru data has at least 8 byte header
+    if (fruBytesSize <= fruBlockSize)
+    {
+        std::cerr << "Error: trying to parse empty FRU\n";
+        return false;
+    }
+
+    // Check range of passed currentArea value
+    if (currentArea > fruAreas::fruAreaMultirecord)
+    {
+        std::cerr << "Error: Fru area is out of range\n";
+        return false;
+    }
+
+    unsigned int currentAreaIndex = getHeaderAreaFieldOffset(currentArea);
+    if (currentAreaIndex > fruBytesSize)
+    {
+        std::cerr << "Error: Fru area index is out of range\n";
+        return false;
+    }
+
+    unsigned int start = fruBytes[currentAreaIndex];
+    unsigned int end = start + len;
+
+    /* Verify each offset within the range of start and end */
+    for (fruAreas area = fruAreas::fruAreaInternal;
+         area <= fruAreas::fruAreaMultirecord; ++area)
+    {
+        // skip the current offset
+        if (area == currentArea)
+        {
+            continue;
+        }
+
+        unsigned int areaIndex = getHeaderAreaFieldOffset(area);
+        if (areaIndex > fruBytesSize)
+        {
+            std::cerr << "Error: Fru area index is out of range\n";
+            return false;
+        }
+
+        unsigned int areaOffset = fruBytes[areaIndex];
+        // if areaOffset is 0 means this area is not available so skip
+        if (areaOffset == 0)
+        {
+            continue;
+        }
+
+        // check for overlapping of current offset with given areaoffset
+        if (areaOffset == start || (areaOffset > start && areaOffset < end))
+        {
+            std::cerr << getFruAreaName(currentArea)
+                      << " offset is overlapping with " << getFruAreaName(area)
+                      << " offset\n";
+            return false;
+        }
+    }
+    return true;
+}
+
 std::vector<uint8_t> readFRUContents(int flag, int file, uint16_t address,
                                      ReadBlockFunc readBlock,
                                      const std::string& errorHelp)
