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)
