diff --git a/extensions/openpower-pels/data_interface.cpp b/extensions/openpower-pels/data_interface.cpp
index 95de4bb..f84e80f 100644
--- a/extensions/openpower-pels/data_interface.cpp
+++ b/extensions/openpower-pels/data_interface.cpp
@@ -308,7 +308,6 @@
 }
 
 void DataInterface::getHWCalloutFields(const std::string& inventoryPath,
-                                       std::string& locationCode,
                                        std::string& fruPartNumber,
                                        std::string& ccin,
                                        std::string& serialNumber) const
@@ -320,13 +319,7 @@
     // will provide this info.  Any missing interfaces will result
     // in exceptions being thrown.
 
-    auto service = getService(inventoryPath, interface::locCode);
-
-    DBusValue locCode;
-    getProperty(service, inventoryPath, interface::locCode, "LocationCode",
-                locCode);
-
-    locationCode = std::get<std::string>(locCode);
+    auto service = getService(inventoryPath, interface::viniRecordVPD);
 
     auto properties =
         getAllProperties(service, inventoryPath, interface::viniRecordVPD);
@@ -341,5 +334,17 @@
     serialNumber = std::string{value.begin(), value.end()};
 }
 
+std::string
+    DataInterface::getLocationCode(const std::string& inventoryPath) const
+{
+    auto service = getService(inventoryPath, interface::locCode);
+
+    DBusValue locCode;
+    getProperty(service, inventoryPath, interface::locCode, "LocationCode",
+                locCode);
+
+    return std::get<std::string>(locCode);
+}
+
 } // namespace pels
 } // namespace openpower
diff --git a/extensions/openpower-pels/data_interface.hpp b/extensions/openpower-pels/data_interface.hpp
index 6a3e326..d6153b0 100644
--- a/extensions/openpower-pels/data_interface.hpp
+++ b/extensions/openpower-pels/data_interface.hpp
@@ -215,18 +215,26 @@
      *        a callout on an inventory path.
      *
      * @param[in] inventoryPath - The item to get the data for
-     * @param[out] locationCode - Filled in with the  location code
      * @param[out] fruPartNumber - Filled in with the VINI/FN keyword
      * @param[out] ccin - Filled in with the VINI/CC keyword
      * @param[out] serialNumber - Filled in with the VINI/SN keyword
      */
     virtual void getHWCalloutFields(const std::string& inventoryPath,
-                                    std::string& locationCode,
                                     std::string& fruPartNumber,
                                     std::string& ccin,
                                     std::string& serialNumber) const = 0;
 
     /**
+     * @brief Get the location code for an inventory item.
+     *
+     * @param[in] inventoryPath - The item to get the data for
+     *
+     * @return std::string - The location code
+     */
+    virtual std::string
+        getLocationCode(const std::string& inventoryPath) const = 0;
+
+    /**
      * @brief Gets the system type from Entity Manager
      *
      * @param[in] std::string - The system type string
@@ -407,16 +415,27 @@
      *        a callout on an inventory path.
      *
      * @param[in] inventoryPath - The item to get the data for
-     * @param[out] locationCode - Filled in with the  location code
      * @param[out] fruPartNumber - Filled in with the VINI/FN keyword
      * @param[out] ccin - Filled in with the VINI/CC keyword
      * @param[out] serialNumber - Filled in with the VINI/SN keyword
      */
     void getHWCalloutFields(const std::string& inventoryPath,
-                            std::string& locationCode,
                             std::string& fruPartNumber, std::string& ccin,
                             std::string& serialNumber) const override;
 
+    /**
+     * @brief Get the location code for an inventory item.
+     *
+     * Throws an exception if the inventory item doesn't have the
+     * location code interface.
+     *
+     * @param[in] inventoryPath - The item to get the data for
+     *
+     * @return std::string - The location code
+     */
+    std::string
+        getLocationCode(const std::string& inventoryPath) const override;
+
   private:
     /**
      * @brief Reads the BMC firmware version string and puts it into
diff --git a/extensions/openpower-pels/src.cpp b/extensions/openpower-pels/src.cpp
index 0899417..c2edd90 100644
--- a/extensions/openpower-pels/src.cpp
+++ b/extensions/openpower-pels/src.cpp
@@ -529,25 +529,39 @@
     std::string sn;
     std::unique_ptr<src::Callout> callout;
 
-    createCalloutsObject();
-
     try
     {
-        dataIface.getHWCalloutFields(inventoryPath, locCode, fn, ccin, sn);
+        locCode = dataIface.getLocationCode(inventoryPath);
 
-        callout = std::make_unique<src::Callout>(CalloutPriority::high, locCode,
-                                                 fn, ccin, sn);
+        try
+        {
+            dataIface.getHWCalloutFields(inventoryPath, fn, ccin, sn);
+
+            callout = std::make_unique<src::Callout>(CalloutPriority::high,
+                                                     locCode, fn, ccin, sn);
+        }
+        catch (const SdBusError& e)
+        {
+            std::string msg = "No VPD found for " + inventoryPath;
+            log<level::WARNING>(msg.c_str(), entry("ERROR=%s", e.what()));
+
+            // Just create the callout with empty FRU fields
+            callout = std::make_unique<src::Callout>(CalloutPriority::high,
+                                                     locCode, fn, ccin, sn);
+        }
     }
     catch (const SdBusError& e)
     {
-        log<level::INFO>("No VPD found for FRU callout",
-                         entry("PATH=%s", inventoryPath.c_str()));
+        std::string msg = "Could not get location code for " + inventoryPath;
+        log<level::WARNING>(msg.c_str(), entry("ERROR=%s", e.what()));
 
-        // Use the 'NoVPDforFRU' maintenance procedure instead
+        // If this were to happen, people would have to look in the UserData
+        // section that contains CALLOUT_INVENTORY_PATH to see what failed.
         callout = std::make_unique<src::Callout>(CalloutPriority::high,
                                                  "no_vpd_for_fru");
     }
 
+    createCalloutsObject();
     _callouts->addCallout(std::move(callout));
 }
 
diff --git a/test/openpower-pels/mocks.hpp b/test/openpower-pels/mocks.hpp
index c003dd8..1fd679f 100644
--- a/test/openpower-pels/mocks.hpp
+++ b/test/openpower-pels/mocks.hpp
@@ -30,10 +30,11 @@
     MOCK_METHOD(std::string, getHostState, (), (const override));
     MOCK_METHOD(std::string, getMotherboardCCIN, (), (const override));
     MOCK_METHOD(void, getHWCalloutFields,
-                (const std::string&, std::string&, std::string&, std::string&,
-                 std::string&),
+                (const std::string&, std::string&, std::string&, std::string&),
                 (const override));
     MOCK_METHOD(std::string, getSystemType, (), (const override));
+    MOCK_METHOD(std::string, getLocationCode, (const std::string&),
+                (const override));
 
     void changeHostState(bool newState)
     {
diff --git a/test/openpower-pels/src_test.cpp b/test/openpower-pels/src_test.cpp
index 9342050..e9abb8e 100644
--- a/test/openpower-pels/src_test.cpp
+++ b/test/openpower-pels/src_test.cpp
@@ -329,11 +329,13 @@
     AdditionalData ad{adData};
     NiceMock<MockDataInterface> dataIface;
 
-    EXPECT_CALL(dataIface, getHWCalloutFields("motherboard", _, _, _, _))
+    EXPECT_CALL(dataIface, getLocationCode("motherboard"))
+        .WillOnce(Return("UTMS-P1"));
+
+    EXPECT_CALL(dataIface, getHWCalloutFields("motherboard", _, _, _))
         .Times(1)
-        .WillOnce(DoAll(SetArgReferee<1>("UTMS-P1"),
-                        SetArgReferee<2>("1234567"), SetArgReferee<3>("CCCC"),
-                        SetArgReferee<4>("123456789ABC")));
+        .WillOnce(DoAll(SetArgReferee<1>("1234567"), SetArgReferee<2>("CCCC"),
+                        SetArgReferee<3>("123456789ABC")));
 
     SRC src{entry, ad, dataIface};
     EXPECT_TRUE(src.valid());
@@ -364,8 +366,62 @@
     EXPECT_EQ(src.callouts()->callouts().size(), 1);
 }
 
-// Test that when the FRU fields can't be obtained that
+// Test that when the location code can't be obtained that
 // a procedure callout is used.
+TEST_F(SRCTest, InventoryCalloutNoLocCodeTest)
+{
+    message::Entry entry;
+    entry.src.type = 0xBD;
+    entry.src.reasonCode = 0xABCD;
+    entry.subsystem = 0x42;
+    entry.src.powerFault = false;
+
+    std::vector<std::string> adData{"CALLOUT_INVENTORY_PATH=motherboard"};
+    AdditionalData ad{adData};
+    NiceMock<MockDataInterface> dataIface;
+
+    auto func = []() {
+        throw sdbusplus::exception::SdBusError(5, "Error");
+        return std::string{};
+    };
+
+    EXPECT_CALL(dataIface, getLocationCode("motherboard"))
+        .Times(1)
+        .WillOnce(InvokeWithoutArgs(func));
+
+    EXPECT_CALL(dataIface, getHWCalloutFields(_, _, _, _)).Times(0);
+
+    SRC src{entry, ad, dataIface};
+    EXPECT_TRUE(src.valid());
+
+    ASSERT_TRUE(src.callouts());
+
+    EXPECT_EQ(src.callouts()->callouts().size(), 1);
+
+    auto& callout = src.callouts()->callouts().front();
+    EXPECT_EQ(callout->locationCodeSize(), 0);
+
+    auto& fru = callout->fruIdentity();
+
+    EXPECT_EQ(fru->getMaintProc().value(), "BMCSP01");
+    EXPECT_FALSE(fru->getPN());
+    EXPECT_FALSE(fru->getSN());
+    EXPECT_FALSE(fru->getCCIN());
+
+    // flatten and unflatten
+    std::vector<uint8_t> data;
+    Stream stream{data};
+    src.flatten(stream);
+
+    stream.offset(0);
+    SRC newSRC{stream};
+    EXPECT_TRUE(newSRC.valid());
+    ASSERT_TRUE(src.callouts());
+    EXPECT_EQ(src.callouts()->callouts().size(), 1);
+}
+
+// Test that when the VPD can't be obtained that
+// a callout is still created.
 TEST_F(SRCTest, InventoryCalloutNoVPDTest)
 {
     message::Entry entry;
@@ -378,28 +434,31 @@
     AdditionalData ad{adData};
     NiceMock<MockDataInterface> dataIface;
 
+    EXPECT_CALL(dataIface, getLocationCode("motherboard"))
+        .Times(1)
+        .WillOnce(Return("UTMS-P10"));
+
     auto func = []() { throw sdbusplus::exception::SdBusError(5, "Error"); };
 
-    EXPECT_CALL(dataIface, getHWCalloutFields("motherboard", _, _, _, _))
+    EXPECT_CALL(dataIface, getHWCalloutFields("motherboard", _, _, _))
         .Times(1)
         .WillOnce(InvokeWithoutArgs(func));
 
     SRC src{entry, ad, dataIface};
     EXPECT_TRUE(src.valid());
-
     ASSERT_TRUE(src.callouts());
-
     EXPECT_EQ(src.callouts()->callouts().size(), 1);
 
     auto& callout = src.callouts()->callouts().front();
+    EXPECT_EQ(callout->locationCode(), "UTMS-P10");
 
     auto& fru = callout->fruIdentity();
 
-    EXPECT_EQ(fru->getMaintProc().value(), "BMCSP01");
-    EXPECT_FALSE(fru->getPN());
-    EXPECT_FALSE(fru->getSN());
-    EXPECT_FALSE(fru->getCCIN());
-    //
+    EXPECT_EQ(fru->getPN(), "");
+    EXPECT_EQ(fru->getCCIN(), "");
+    EXPECT_EQ(fru->getSN(), "");
+    EXPECT_FALSE(fru->getMaintProc());
+
     // flatten and unflatten
     std::vector<uint8_t> data;
     Stream stream{data};
