diff --git a/extensions/openpower-pels/fru_identity.cpp b/extensions/openpower-pels/fru_identity.cpp
index 8cf6382..b8dc94f 100644
--- a/extensions/openpower-pels/fru_identity.cpp
+++ b/extensions/openpower-pels/fru_identity.cpp
@@ -93,6 +93,17 @@
     _size = flattenedSize();
 }
 
+FRUIdentity::FRUIdentity(const std::string& symbolicFRUFromRegistry,
+                         bool trustedLocationCode)
+{
+    _type = substructureType;
+    _flags = (trustedLocationCode) ? symbolicFRUTrustedLocCode : symbolicFRU;
+
+    setSymbolicFRU(symbolicFRUFromRegistry);
+
+    _size = flattenedSize();
+}
+
 std::optional<std::string> FRUIdentity::getPN() const
 {
     if (hasPN())
@@ -231,6 +242,30 @@
     _pnOrProcedureID.back() = 0;
 }
 
+void FRUIdentity::setSymbolicFRU(const std::string& symbolicFRUFromRegistry)
+{
+
+    // Treat this has a HW callout.
+    _flags |= pnSupplied;
+    _flags &= ~maintProcSupplied;
+
+    if (pel_values::symbolicFRUs.count(symbolicFRUFromRegistry))
+    {
+        strncpy(_pnOrProcedureID.data(),
+                pel_values::symbolicFRUs.at(symbolicFRUFromRegistry).c_str(),
+                _pnOrProcedureID.size());
+    }
+    else
+    {
+        log<level::ERR>("Invalid symbolic FRU",
+                        entry("FRU=%s", symbolicFRUFromRegistry.c_str()));
+        strncpy(_pnOrProcedureID.data(), "INVALID", _pnOrProcedureID.size());
+    }
+
+    // ensure null terminated
+    _pnOrProcedureID.back() = 0;
+}
+
 } // namespace src
 } // namespace pels
 } // namespace openpower
diff --git a/extensions/openpower-pels/fru_identity.hpp b/extensions/openpower-pels/fru_identity.hpp
index 669dc01..e5eb864 100644
--- a/extensions/openpower-pels/fru_identity.hpp
+++ b/extensions/openpower-pels/fru_identity.hpp
@@ -95,6 +95,19 @@
     FRUIdentity(const std::string& procedureFromRegistry);
 
     /**
+     * @brief Constructor
+     *
+     * Creates the object with a symbolic FRU callout.
+     *
+     * @param[in] symbolicFRUFromRegistry - The symbolic FRU name as
+     *                                      defined in the message registry.
+     * @param[in] trustedLocationCode - If this FRU callout's location code
+     *                                  can be trusted to be correct.
+     */
+    FRUIdentity(const std::string& symbolicFRUFromRegistry,
+                bool trustedLocationCode);
+
+    /**
      * @brief Flatten the object into the stream
      *
      * @param[in] stream - The stream to write to
@@ -238,6 +251,16 @@
     void setMaintenanceProcedure(const std::string& procedureFromRegistry);
 
     /**
+     * @brief Sets the 8 character null terminated symbolic FRU
+     *        field.  This is in the same field as the part
+     *        number since they are mutually exclusive.
+     *
+     * @param[in] symbolicFRUFromRegistry - The symbolic FRU name as
+     *                                      defined in the message registry.
+     */
+    void setSymbolicFRU(const std::string& symbolicFRUFromRegistry);
+
+    /**
      * @brief The callout substructure type field. Will be "ID".
      */
     uint16_t _type;
diff --git a/extensions/openpower-pels/pel_values.cpp b/extensions/openpower-pels/pel_values.cpp
index 07a0671..baf302a 100644
--- a/extensions/openpower-pels/pel_values.cpp
+++ b/extensions/openpower-pels/pel_values.cpp
@@ -218,6 +218,13 @@
 const std::map<std::string, std::string> maintenanceProcedures = {
     {"no_vpd_for_fru", "BMCSP01"}};
 
+/**
+ * @brief Map of the registry names for the symbolic FRUs to their
+ *        actual names.
+ */
+const std::map<std::string, std::string> symbolicFRUs = {
+    {"service_docs", "SVCDOCS"}};
+
 PELValues::const_iterator findByValue(uint32_t value, const PELValues& fields)
 {
     return std::find_if(fields.begin(), fields.end(),
diff --git a/extensions/openpower-pels/pel_values.hpp b/extensions/openpower-pels/pel_values.hpp
index 04c287d..5f8b852 100644
--- a/extensions/openpower-pels/pel_values.hpp
+++ b/extensions/openpower-pels/pel_values.hpp
@@ -136,6 +136,11 @@
  */
 extern const std::map<std::string, std::string> maintenanceProcedures;
 
+/**
+ * @brief Map for symbolic FRUs.
+ */
+extern const std::map<std::string, std::string> symbolicFRUs;
+
 } // namespace pel_values
 } // namespace pels
 } // namespace openpower
diff --git a/test/openpower-pels/fru_identity_test.cpp b/test/openpower-pels/fru_identity_test.cpp
index e31ffad..b13bf3f 100644
--- a/test/openpower-pels/fru_identity_test.cpp
+++ b/test/openpower-pels/fru_identity_test.cpp
@@ -202,3 +202,65 @@
         EXPECT_FALSE(fru.getSN());
     }
 }
+
+// Test the constructor that takes in a symbolic FRU.
+TEST(FRUIdentityTest, CreateSymbolicFRUCalloutTest)
+{
+    // Symbolic FRU (not trusted)
+    {
+        FRUIdentity fru{"service_docs", false};
+
+        EXPECT_EQ(fru.flattenedSize(), 12);
+        EXPECT_EQ(fru.type(), 0x4944);
+        EXPECT_EQ(fru.failingComponentType(), FRUIdentity::symbolicFRU);
+        EXPECT_EQ(fru.getPN().value(), "SVCDOCS");
+        EXPECT_FALSE(fru.getMaintProc());
+        EXPECT_FALSE(fru.getCCIN());
+        EXPECT_FALSE(fru.getSN());
+
+        // Flatten and unflatten, then compare again
+        std::vector<uint8_t> data;
+        Stream stream{data};
+        fru.flatten(stream);
+
+        EXPECT_EQ(data.size(), fru.flattenedSize());
+
+        stream.offset(0);
+        FRUIdentity newFRU{stream};
+
+        EXPECT_EQ(newFRU.flattenedSize(), 12);
+        EXPECT_EQ(newFRU.type(), 0x4944);
+        EXPECT_EQ(newFRU.failingComponentType(), FRUIdentity::symbolicFRU);
+        EXPECT_EQ(newFRU.getPN().value(), "SVCDOCS");
+        EXPECT_FALSE(newFRU.getMaintProc());
+        EXPECT_FALSE(newFRU.getCCIN());
+        EXPECT_FALSE(newFRU.getSN());
+    }
+
+    // Trusted symbolic FRU
+    {
+        FRUIdentity fru{"service_docs", true};
+
+        EXPECT_EQ(fru.flattenedSize(), 12);
+        EXPECT_EQ(fru.type(), 0x4944);
+        EXPECT_EQ(fru.failingComponentType(),
+                  FRUIdentity::symbolicFRUTrustedLocCode);
+        EXPECT_EQ(fru.getPN().value(), "SVCDOCS");
+        EXPECT_FALSE(fru.getMaintProc());
+        EXPECT_FALSE(fru.getCCIN());
+        EXPECT_FALSE(fru.getSN());
+    }
+
+    // Invalid symbolic FRU
+    {
+        FRUIdentity fru{"garbage", false};
+
+        EXPECT_EQ(fru.flattenedSize(), 12);
+        EXPECT_EQ(fru.type(), 0x4944);
+        EXPECT_EQ(fru.failingComponentType(), FRUIdentity::symbolicFRU);
+        EXPECT_EQ(fru.getPN().value(), "INVALID");
+        EXPECT_FALSE(fru.getMaintProc());
+        EXPECT_FALSE(fru.getCCIN());
+        EXPECT_FALSE(fru.getSN());
+    }
+}
