diff --git a/include/FruUtils.hpp b/include/FruUtils.hpp
index 5e96696..45fea07 100644
--- a/include/FruUtils.hpp
+++ b/include/FruUtils.hpp
@@ -16,18 +16,36 @@
 /// \file FruUtils.hpp
 
 #pragma once
+#include <boost/container/flat_map.hpp>
 
 #include <cstdint>
 #include <functional>
+#include <regex>
 #include <string>
+#include <utility>
 #include <vector>
-
 extern "C"
 {
 // Include for I2C_SMBUS_BLOCK_MAX
 #include <linux/i2c.h>
 }
 
+constexpr size_t fruBlockSize = 8;
+
+enum class DecodeState
+{
+    ok,
+    end,
+    err,
+};
+
+enum class resCodes
+{
+    resOK,
+    resWarn,
+    resErr
+};
+
 enum class fruAreas
 {
     fruAreaInternal = 0,
@@ -36,19 +54,78 @@
     fruAreaProduct,
     fruAreaMultirecord
 };
+
+const std::vector<std::string> FRU_AREA_NAMES = {"INTERNAL", "CHASSIS", "BOARD",
+                                                 "PRODUCT", "MULTIRECORD"};
+const std::regex NON_ASCII_REGEX("[^\x01-\x7f]");
+
+const std::vector<std::string> CHASSIS_FRU_AREAS = {"PART_NUMBER",
+                                                    "SERIAL_NUMBER"};
+
+const std::vector<std::string> BOARD_FRU_AREAS = {
+    "MANUFACTURER", "PRODUCT_NAME", "SERIAL_NUMBER", "PART_NUMBER",
+    "FRU_VERSION_ID"};
+
+const std::vector<std::string> PRODUCT_FRU_AREAS = {
+    "MANUFACTURER",  "PRODUCT_NAME", "PART_NUMBER",   "VERSION",
+    "SERIAL_NUMBER", "ASSET_TAG",    "FRU_VERSION_ID"};
+
+const std::string FRU_CUSTOM_FIELD_NAME = "INFO_AM";
+
 inline fruAreas operator++(fruAreas& x)
 {
     return x = static_cast<fruAreas>(std::underlying_type<fruAreas>::type(x) +
                                      1);
 }
 
-inline constexpr size_t fruBlockSize =
-    8; // FRU areas are measured in 8-byte blocks
-
 using ReadBlockFunc =
     std::function<int64_t(int flag, int file, uint16_t address, uint16_t offset,
                           uint8_t length, uint8_t* outBuf)>;
 
+inline const std::string& getFruAreaName(fruAreas area)
+{
+    return FRU_AREA_NAMES[static_cast<unsigned int>(area)];
+}
+
+const std::tm intelEpoch(void);
+
+char sixBitToChar(uint8_t val);
+
+/* 0xd - 0xf are reserved values, but not fatal; use a placeholder char. */
+const char bcdHighChars[] = {
+    ' ', '-', '.', 'X', 'X', 'X',
+};
+
+char bcdPlusToChar(uint8_t val);
+
+bool verifyOffset(const std::vector<uint8_t>& fruBytes, fruAreas currentArea,
+                  uint8_t len);
+
+std::pair<DecodeState, std::string>
+    decodeFRUData(std::vector<uint8_t>::const_iterator& iter,
+                  const std::vector<uint8_t>::const_iterator& end,
+                  bool isLangEng);
+
+bool checkLangEng(uint8_t lang);
+
+resCodes
+    formatFRU(const std::vector<uint8_t>& fruBytes,
+              boost::container::flat_map<std::string, std::string>& result);
+
+std::vector<uint8_t>& getFRUInfo(const uint8_t& bus, const uint8_t& address);
+
+uint8_t calculateChecksum(std::vector<uint8_t>::const_iterator iter,
+                          std::vector<uint8_t>::const_iterator end);
+
+uint8_t calculateChecksum(std::vector<uint8_t>& fruAreaData);
+
+unsigned int updateFRUAreaLenAndChecksum(std::vector<uint8_t>& fruData,
+                                         size_t fruAreaStart,
+                                         size_t fruAreaEndOfFieldsOffset,
+                                         size_t fruAreaEndOffset);
+
+ssize_t getFieldLength(uint8_t fruFieldTypeLenValue);
+
 /// \brief Read and validate FRU contents.
 /// \param flag the flag required for raw i2c
 /// \param file the open file handle
@@ -69,16 +146,3 @@
 /// \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);
