diff --git a/openpower/package/hostboot/hostboot-0007-Fix-handling-of-ECC-protected-partitions-at-runtime.patch b/openpower/package/hostboot/hostboot-0003-Fix-handling-of-ECC-protected-partitions-at-runtime.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0007-Fix-handling-of-ECC-protected-partitions-at-runtime.patch
rename to openpower/package/hostboot/hostboot-0003-Fix-handling-of-ECC-protected-partitions-at-runtime.patch
diff --git a/openpower/package/hostboot/hostboot-0003-mss_thermal_undo.patch b/openpower/package/hostboot/hostboot-0003-mss_thermal_undo.patch
deleted file mode 100644
index 455b3c7..0000000
--- a/openpower/package/hostboot/hostboot-0003-mss_thermal_undo.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From d7b5b4a29107c17ad97b2c25cec11f51df485ea1 Mon Sep 17 00:00:00 2001
-From: Brian Horton <brianh@linux.ibm.com>
-Date: Tue, 31 Mar 2015 13:26:40 -0500
-Subject: [PATCH] undo 1.18 change
-
-Change-Id: I477dd4a478fc3c752a7f4f9dd1dff9f03ce39cc1
----
- .../mss_thermal_init/mss_thermal_init.C            |    5 +++--
- 1 files changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C b/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
-index a98b58d..b90d1d6 100644
---- a/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
-+++ b/src/usr/hwpf/hwp/dram_initialization/mss_thermal_init/mss_thermal_init.C
-@@ -22,7 +22,7 @@
- /* permissions and limitations under the License.                         */
- /*                                                                        */
- /* IBM_PROLOG_END_TAG                                                     */
--// $Id: mss_thermal_init.C,v 1.20 2015/03/02 20:43:37 pardeik Exp $
-+// $Id: mss_thermal_init.C,v 1.20a CHANGED IN OPENPOWER PATCH brianh Exp $
- // $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/centaur/working/procedures/ipl/fapi/mss_thermal_init.C,v $
- //------------------------------------------------------------------------------
- // *! (C) Copyright International Business Machines Corp. 2011
-@@ -49,6 +49,7 @@
- //------------------------------------------------------------------------------
- // Version:|  Author: |  Date:  | Comment:
- //---------|----------|---------|-----------------------------------------------
-+//   1.20a | brianh   |31-MAR-15| under 1.18
- //   1.20  | pardeik  |02-MAR-15| initialize l_dimm_ranks_array to zero
- //                              | use const variables in for loops instead of numbers
- //   1.18  | pardeik  |12-FEB-15| change ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP to
-@@ -295,7 +296,7 @@ fapi::ReturnCode mss_thermal_init(const fapi::Target & i_target)
-       else
-       {
- 	  // sensor cache address map for non custom dimm temperature sensors (which i2c bus and i2c address they are)
--	  l_rc = FAPI_ATTR_GET(ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP, &i_target, l_dimm_sensor_cache_addr_map);
-+	  l_rc = FAPI_ATTR_GET(ATTR_MRW_MEM_SENSOR_CACHE_ADDR_MAP, NULL, l_dimm_sensor_cache_addr_map);
- 	  if (l_rc) return l_rc;
-       }
- 
--- 
-1.7.4.1
-
diff --git a/openpower/package/hostboot/hostboot-0010-Remove-gard-actions-for-memory-plugging-errors.patch b/openpower/package/hostboot/hostboot-0004-Remove-gard-actions-for-memory-plugging-errors.patch
similarity index 100%
rename from openpower/package/hostboot/hostboot-0010-Remove-gard-actions-for-memory-plugging-errors.patch
rename to openpower/package/hostboot/hostboot-0004-Remove-gard-actions-for-memory-plugging-errors.patch
diff --git a/openpower/package/hostboot/hostboot-0005-SW311560-HWP-error-prevent-IPL-on-habanero.patch b/openpower/package/hostboot/hostboot-0005-SW311560-HWP-error-prevent-IPL-on-habanero.patch
new file mode 100644
index 0000000..cb4e060
--- /dev/null
+++ b/openpower/package/hostboot/hostboot-0005-SW311560-HWP-error-prevent-IPL-on-habanero.patch
@@ -0,0 +1,60 @@
+From 58a3d0ad88b91c7c9cab1e2c4c9e3dbc7377303f Mon Sep 17 00:00:00 2001
+From: Prachi Gupta <pragupta@us.ibm.com>
+Date: Wed, 17 Jun 2015 09:22:10 -0500
+Subject: [PATCH] SW311560: HWP error prevent IPL on habanero
+
+Change-Id: Ibd19f1986c768e08a97acdbd8b39c174f51bb399
+CQ:SW311560
+---
+ .../hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C  | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C b/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C
+index 1f1bb7e..996a1e0 100644
+--- a/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C
++++ b/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_config_thermal.C
+@@ -22,7 +22,7 @@
+ /* permissions and limitations under the License.                         */
+ /*                                                                        */
+ /* IBM_PROLOG_END_TAG                                                     */
+-// $Id: mss_eff_config_thermal.C,v 1.31 2015/04/06 22:33:11 pardeik Exp $
++// $Id: mss_eff_config_thermal.C,v 1.32 2015/06/16 21:57:30 pardeik Exp $
+ // $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/
+ //          centaur/working/procedures/ipl/fapi/mss_eff_config_thermal.C,v $
+ //------------------------------------------------------------------------------
+@@ -55,6 +55,9 @@
+ //------------------------------------------------------------------------------
+ // Version:|  Author: |  Date:  | Comment:
+ //---------|----------|---------|-----------------------------------------------
++//   1.32  | pardeik  | 06/16/15| fix for ISDIMM systems to prevent a zero
++//         |          |         |   ATTR_MSS_MEM_WATT_TARGET value
++//         |          |         | Removed unneeded TODO commented section
+ //   1.31  | pardeik  | 04/06/15 | attribute name changed for adjustment enable
+ //   1.30  | pardeik  |12-FEB-15| CDIMM DDR4 throttle updates (set Nmba to Nchip)
+ //         |          |         | Support for vmem regulator power adjustment
+@@ -131,10 +134,6 @@
+ //         |          |         | case. 
+ //   1.1   | pardeik  |01-NOV-11| First Draft.
+ 
+-/*
+-TODO ITEMS:
+-1.  Update ISDIMM power table after hardware measurements are done (GA3)
+-*/
+ 
+ //------------------------------------------------------------------------------
+ //  My Includes
+@@ -583,6 +582,11 @@ extern "C" {
+ //------------------------------------------------------------------------------
+ 
+ // adjust the regulator power limit per dimm if enabled and use this if less than the thermal limit
++// If reg power limit is zero, then set to thermal limit - needed for ISDIMM systems since some of these MRW attributes are not defined
++	if (l_dimm_reg_power_limit_per_dimm == 0)
++	{
++	    l_dimm_reg_power_limit_per_dimm = dimm_thermal_power_limit;
++	}
+ 	l_dimm_reg_power_limit_per_dimm_adj = l_dimm_reg_power_limit_per_dimm;
+ 	if (l_dimm_reg_power_limit_adj_enable == fapi::ENUM_ATTR_MRW_VMEM_REGULATOR_POWER_LIMIT_PER_DIMM_ADJ_ENABLE_TRUE)
+ 	{
+-- 
+1.8.2.2
+
diff --git a/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch b/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch
deleted file mode 100644
index 3777b11..0000000
--- a/openpower/package/hostboot/hostboot-0008-Fix-PCIe-swap-issue.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From a4f739abb72b8ac5748138183b274cca5eef50ff Mon Sep 17 00:00:00 2001
-From: Matt Ploetz <maploetz@us.ibm.com>
-Date: Tue, 12 May 2015 15:32:20 -0500
-Subject: [PATCH] PCIe lane swap fix in processMRW.pl
-
-Change-Id: Iee7127fef7f4a911a77e0c24c896d840b1b45ff4
----
- src/usr/targeting/common/processMrw.pl | 25 +++++++++++--------------
- 1 file changed, 11 insertions(+), 14 deletions(-)
-
-diff --git a/src/usr/targeting/common/processMrw.pl b/src/usr/targeting/common/processMrw.pl
-index 5d44e74..bbdb936 100644
---- a/src/usr/targeting/common/processMrw.pl
-+++ b/src/usr/targeting/common/processMrw.pl
-@@ -805,8 +805,8 @@ sub processPcie
-     $iop_swap{0}{1}{'11'}=$t[7];
- 
-     $iop_swap{1}{0}{'00'}=$t[8];
--    $iop_swap{1}{0}{'01'}=$t[9];
--    $iop_swap{1}{0}{'10'}=$t[10];
-+    $iop_swap{1}{0}{'10'}=$t[9];
-+    $iop_swap{1}{0}{'01'}=$t[10];
-     $iop_swap{1}{0}{'11'}=$t[11];
-     $iop_swap{1}{1}{'00'}=$t[12];
-     $iop_swap{1}{1}{'10'}=$t[13];
-@@ -906,25 +906,22 @@ sub processPcie
-           die "PCIE config for $iop,$iop_lane_swap[$iop],$lane_rev not found\n";
-         }
-     }
--    my $lane_swap_attr0 = sprintf("%s,%s",$iop_lane_swap[0],
--                          $iop_lane_swap[1]);
--    my $lane_swap_attr1 = sprintf("%s,0,%s,0",$iop_lane_swap[0],
--                          $iop_lane_swap[1]);
-+
-+    my $lane_rev_attr0 = sprintf("%s,%s",
-+                         oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
-+    my $lane_rev_attr1 = sprintf("%s,0,%s,0",
-+                         oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
- 
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP",
--        $lane_swap_attr0);
-+        $lane_rev_attr0);
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP_NON_BIFURCATED",
--        $lane_swap_attr1);
-+        $lane_rev_attr1);
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_SWAP_BIFURCATED",
-         "0,0,0,0");
--
--    my $lane_rev_attr = sprintf("%s,0,%s,0",
--                         oct($iop_swap_lu[0]),oct($iop_swap_lu[1]));
--
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_REVERSAL",
--        $lane_rev_attr);
-+        "0,0,0,0");
-     $targetObj->setAttribute($parentTarget,
--        "PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED",$lane_rev_attr);
-+        "PROC_PCIE_IOP_REVERSAL_NON_BIFURCATED","0,0,0,0");
-     $targetObj->setAttribute($parentTarget, "PROC_PCIE_IOP_REVERSAL_BIFURCATED",
-         "0,0,0,0");
- 
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch b/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch
deleted file mode 100644
index eb8d12a..0000000
--- a/openpower/package/hostboot/hostboot-0009-ATTN-IPOLL-interrupt-workaround.patch
+++ /dev/null
@@ -1,141 +0,0 @@
-From d2bdfed735f6c5e69b606f0251aba131fec4275d Mon Sep 17 00:00:00 2001
-From: Brian Stegmiller <bjs@us.ibm.com>
-Date: Thu, 14 May 2015 13:47:36 -0500
-Subject: [PATCH] ATTN: IPOLL interrupt workaround
-
-Circumvents issue where interrupts happen before OPAL is ready
-to handle them
-
-Change-Id: I3d378cd03dac51aaa5b2f77e8940eb63f170016b
-Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/17795
-Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
-Tested-by: Jenkins Server
----
- src/usr/diag/attn/common/attnsvc_common.C | 83 +++++++++++++++++++++++++++++--
- 1 file changed, 79 insertions(+), 4 deletions(-)
-
-diff --git a/src/usr/diag/attn/common/attnsvc_common.C b/src/usr/diag/attn/common/attnsvc_common.C
-index c56b8a8..5067438 100644
---- a/src/usr/diag/attn/common/attnsvc_common.C
-+++ b/src/usr/diag/attn/common/attnsvc_common.C
-@@ -43,6 +43,13 @@ using namespace ERRORLOG;
- 
- namespace ATTN
- {
-+const uint64_t MCIFIRACT0     = 0x02011846;
-+const uint64_t MCIFIRACT1     = 0x02011847;
-+
-+const uint64_t MCIFIRMASK     = 0x02011843;
-+const uint64_t MCIFIRMASK_AND = 0x02011844;
-+const uint64_t MCIFIRMASK_OR  = 0x02011845;
-+
- 
- void getPbGp2Mask(uint64_t i_pos, void * i_data)
- {
-@@ -104,11 +111,11 @@ errlHndl_t ServiceCommon::configureInterrupts(
-         ConfigureMode i_mode)
- {
-     errlHndl_t err = NULL;
--
--    TargetHandleList procs;
-+    TargetHandleList  procs;
-     getTargetService().getAllChips(procs, TYPE_PROC);
-     TargetHandleList::iterator it = procs.begin();
- 
-+
-     while(it != procs.end())
-     {
-         uint64_t mask = 0;
-@@ -172,12 +179,10 @@ errlHndl_t ServiceCommon::configureInterrupts(
- 
-         #ifndef __HOSTBOOT_RUNTIME
-         // enable attentions in ipoll mask
--
-         mask = HostMask::nonHost();
-         mask |= HostMask::host();
- 
-         // this doesn't have an and/or reg for some reason...
--
-         err = modifyScom(*it,
-                          IPOLL::address,
-                          i_mode == UP ? ~mask : mask,
-@@ -187,6 +192,76 @@ errlHndl_t ServiceCommon::configureInterrupts(
-         {
-             break;
-         }
-+
-+        #else  // HOSTBOOT_RUNTIME
-+
-+        if (i_mode == UP)
-+        {
-+            HwasState         l_functional;
-+            uint64_t          l_mciAct0 = 0;
-+            uint64_t          l_mciAct1 = 0;
-+            uint64_t          l_mciBitMask = 0;
-+            TargetHandleList  l_mcsList;
-+            // Get list of MCS units associated with this proc
-+            getTargetService().getMcsList( *it, l_mcsList );
-+
-+            // We need to set/clear mask bits in the MCIFIRs that
-+            // are associated with host attentions.  This should
-+            // cause interrupts to re-occur if they had happened
-+            // prior to starting the opal-prd application.
-+            TargetHandleList::iterator  l_mcsIt = l_mcsList.begin();
-+
-+            while(l_mcsIt != l_mcsList.end())
-+            {
-+                // Make sure functional prior to using
-+                if (!((*l_mcsIt)->tryGetAttr<ATTR_HWAS_STATE>(l_functional)))
-+                {
-+                    // Can't tell if functional so skip this MCS
-+                    break;
-+                }
-+
-+                if ( !(l_functional.functional) )
-+                {
-+                    // Not functional MCS so skip it
-+                    break;
-+                }
-+
-+                // Read ACTION registers to see if HOST ATTN
-+                err = getScom(*l_mcsIt, MCIFIRACT0, l_mciAct0);
-+
-+                if (NULL == err)
-+                {
-+                    err = getScom(*l_mcsIt, MCIFIRACT1, l_mciAct1);
-+                }
-+
-+                if (NULL == err)
-+                {
-+                    // Create bit mask we will use to write to MCIFIR
-+                    // (ACT0=1, ACT1=0) indicate bits we want
-+                    l_mciBitMask = l_mciAct0 & ~l_mciAct1;
-+                    // Set mask bits
-+                    err = putScom(*l_mcsIt, MCIFIRMASK_OR, l_mciBitMask);
-+                }
-+
-+                if (NULL == err)
-+                {
-+                    // Clear mask bits
-+                    err = putScom(*l_mcsIt, MCIFIRMASK_AND, ~l_mciBitMask);
-+                }
-+
-+                // Commit any failure we had and move to next MCS unit
-+                if (NULL != err)
-+                {
-+                    errlCommit(err, ATTN_COMP_ID);
-+                }
-+
-+                l_mcsIt++;
-+
-+            } // end while on MCS units
-+
-+            l_mcsList.clear();
-+        } // end if UP MODE -- enabling
-+
-         #endif //__HOSTBOOT_RUNTIME
- 
-         ++it;
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch b/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch
deleted file mode 100644
index e51afbf..0000000
--- a/openpower/package/hostboot/hostboot-0010-add-support-backplane-vpd.patch
+++ /dev/null
@@ -1,2271 +0,0 @@
-From 9597cf58b44fd0c16da9d3592e8fd586a4dbf04d Mon Sep 17 00:00:00 2001
-From: Bill Schwartz <whs@us.ibm.com>
-Date: Fri, 27 Feb 2015 15:41:10 -0600
-Subject: [PATCH] Add support for backplane VPD
-
-Replace the temporary use of mem buf to access planar vpd with new
-planar vpd interfaces.
-
-Change-Id: I24cda4d713806330a9f61d588006d63966f92550
-RTC: 118373
-Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/16326
-Tested-by: Jenkins Server
-Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
----
- src/include/usr/devicefw/userif.H                  |  23 +
- src/include/usr/vpd/cvpdenums.H                    |   1 -
- src/include/usr/vpd/pvpdenums.H                    |  96 ++++
- src/include/usr/vpd/vpd_if.H                       |   8 +
- src/include/usr/vpd/vpdreasoncodes.H               |   4 +
- src/usr/devtree/bld_devtree.C                      |  85 ++--
- src/usr/hwas/hwasPlat.C                            |   6 +-
- src/usr/hwas/hwasPlatCallout.C                     |   6 +-
- src/usr/i2c/eepromdd.C                             |   5 +
- src/usr/ipmi/ipmifruinv.C                          | 502 +++++++++++++--------
- src/usr/ipmi/ipmifruinvprvt.H                      | 112 ++++-
- src/usr/targeting/common/xmltohb/target_types.xml  |   2 +
- .../targeting/common/xmltohb/target_types_hb.xml   |   5 +
- src/usr/vpd/HBconfig                               |  27 ++
- src/usr/vpd/cvpd.C                                 |  36 +-
- src/usr/vpd/cvpd.H                                 |  22 +-
- src/usr/vpd/ipvpd.C                                |  50 +-
- src/usr/vpd/ipvpd.H                                |  22 +-
- src/usr/vpd/pvpd.C                                 | 369 +++++++++++++++
- src/usr/vpd/pvpd.H                                 | 149 ++++++
- src/usr/vpd/vpd.C                                  |  17 +-
- src/usr/vpd/vpd.H                                  |   1 +
- src/usr/vpd/vpd.mk                                 |   5 +-
- 23 files changed, 1307 insertions(+), 246 deletions(-)
- create mode 100644 src/include/usr/vpd/pvpdenums.H
- create mode 100644 src/usr/vpd/pvpd.C
- create mode 100644 src/usr/vpd/pvpd.H
-
-diff --git a/src/include/usr/devicefw/userif.H b/src/include/usr/devicefw/userif.H
-index 6d041f2..eac5366 100644
---- a/src/include/usr/devicefw/userif.H
-+++ b/src/include/usr/devicefw/userif.H
-@@ -61,6 +61,7 @@ namespace DeviceFW
-         GPIO,
-         LPC,
-         IPMIBT,    // As opposed to other phy's
-+        PVPD,
- 
-         LAST_ACCESS_TYPE,
-     };
-@@ -166,6 +167,28 @@ namespace DeviceFW
-             static_cast<uint64_t>(( i_location ))
- 
-     /**
-+     * Construct the device addressing parameters for the PVPD device ops.
-+     * @param[in] i_record - The enumeration of the PVPD record to access.
-+     * @param[in] i_keyword - The enumeration of the PVPD keyword, located
-+     *      within the i_record Record to access.
-+     */
-+    #define DEVICE_PVPD_ADDRESS( i_record, i_keyword )\
-+        DEVICE_PVPD_FORCE_ADDRESS( i_record, i_keyword, VPD::AUTOSELECT )
-+
-+    /**
-+     * Construct the device addressing parameters for the PVPD device ops.
-+     * @param[in] i_record - The enumeration of the PVPD record to access.
-+     * @param[in] i_keyword - The enumeration of the PVPD keyword, located
-+     *      within the i_record Record to access.
-+     * @param[in] i_location - The location of the data (PNOR/SEEPROM)
-+            see vpd_if.H
-+     */
-+    #define DEVICE_PVPD_FORCE_ADDRESS( i_record, i_keyword, i_location )\
-+        DeviceFW::PVPD, static_cast<uint64_t>(( i_record )),\
-+            static_cast<uint64_t>(( i_keyword )),\
-+            static_cast<uint64_t>(( i_location ))
-+
-+    /**
-      * Construct the device addressing parameters for the SCAN device ops.
-      * @param[in] i_ring - The ring address to scan
-      * @param[in] i_ringlen - The length of the ring to scan in bits
-diff --git a/src/include/usr/vpd/cvpdenums.H b/src/include/usr/vpd/cvpdenums.H
-index 4b5adb2..79b8109 100644
---- a/src/include/usr/vpd/cvpdenums.H
-+++ b/src/include/usr/vpd/cvpdenums.H
-@@ -45,7 +45,6 @@ namespace CVPD
-         OPFR        = 0x05,
-         VNDR        = 0x06,
-         SPDX        = 0x07,
--        OSYS        = 0x08,
-         // Last Record
-         CVPD_LAST_RECORD,
-         CVPD_TEST_RECORD,   // Test purposes ONLY!
-diff --git a/src/include/usr/vpd/pvpdenums.H b/src/include/usr/vpd/pvpdenums.H
-new file mode 100644
-index 0000000..acf3bbd
---- /dev/null
-+++ b/src/include/usr/vpd/pvpdenums.H
-@@ -0,0 +1,96 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/include/usr/vpd/pvpdenums.H $                             */
-+/*                                                                        */
-+/* OpenPOWER HostBoot Project                                             */
-+/*                                                                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
-+/* [+] International Business Machines Corp.                              */
-+/*                                                                        */
-+/*                                                                        */
-+/* Licensed under the Apache License, Version 2.0 (the "License");        */
-+/* you may not use this file except in compliance with the License.       */
-+/* You may obtain a copy of the License at                                */
-+/*                                                                        */
-+/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-+/*                                                                        */
-+/* Unless required by applicable law or agreed to in writing, software    */
-+/* distributed under the License is distributed on an "AS IS" BASIS,      */
-+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-+/* implied. See the License for the specific language governing           */
-+/* permissions and limitations under the License.                         */
-+/*                                                                        */
-+/* IBM_PROLOG_END_TAG                                                     */
-+#ifndef __PVPDENUMS_H
-+#define __PVPDENUMS_H
-+
-+#include <vpd/ipvpdenums.H>
-+
-+namespace PVPD
-+{
-+
-+    /**
-+     * @brief Enumeration for the PVPD Records that contain
-+     *       the keyword enumerations below.
-+     *
-+     */
-+    enum pvpdRecord
-+    {
-+        PVPD_FIRST_RECORD   = 0x00,
-+        VINI        = PVPD_FIRST_RECORD,
-+        OSYS        = 0x01,
-+        OPFR        = 0x02,
-+        VNDR        = 0x03,
-+        // Last Record
-+        PVPD_LAST_RECORD,
-+        PVPD_TEST_RECORD,   // Test purposes ONLY!
-+
-+        //Start common IPVPD enums
-+        PVPD_INVALID_RECORD = IPVPD::INVALID_RECORD,
-+    };
-+
-+    /**
-+     * @brief Enumerations for PVPD keywords that can be
-+     *       accessed in the PVPD.
-+     */
-+    enum pvpdKeyword
-+    {
-+        PVPD_FIRST_KEYWORD      = 0x00,
-+        pdI         = PVPD_FIRST_KEYWORD,
-+        B3         = 0x01,
-+        B4         = 0x02,
-+        B7         = 0x03,
-+        CC         = 0x04,
-+        CE         = 0x05,
-+        CT         = 0x06,
-+        DR         = 0x07,
-+        ET         = 0x08,
-+        FN         = 0x09,
-+        HE         = 0x0a,
-+        HW         = 0x0b,
-+        IN         = 0x0c,
-+        MM         = 0x0d,
-+        PF         = 0x0e,
-+        PN         = 0x0f,
-+        RT         = 0x10,
-+        SN         = 0x11,
-+        SS         = 0x12,
-+        VD         = 0x13,
-+        VN         = 0x14,
-+        VP         = 0x15,
-+        VS         = 0x16,
-+        VZ         = 0x17,
-+
-+        // Last Keyword
-+        PVPD_LAST_KEYWORD,
-+        PVPD_TEST_KEYWORD,  // Test purposes ONLY!
-+
-+        //Start common IPVPD enums
-+        FULL_RECORD = IPVPD::FULL_RECORD,
-+        PVPD_INVALID_KEYWORD    = IPVPD::INVALID_KEYWORD,
-+    };
-+
-+};  // end PVPD
-+
-+#endif
-diff --git a/src/include/usr/vpd/vpd_if.H b/src/include/usr/vpd/vpd_if.H
-index 0b3298a..d3915ee 100644
---- a/src/include/usr/vpd/vpd_if.H
-+++ b/src/include/usr/vpd/vpd_if.H
-@@ -71,6 +71,14 @@ namespace VPD
-     bool cvpdPresent ( TARGETING::Target * i_target );
- 
-     /**
-+     * @brief This function checks to see if the given pvpd target
-+     *      is present
-+     * @param[in] i_target - Target device to search for pvpd
-+     * @return bool - true if pvpd is present, false if it is not.
-+     */
-+    bool pvpdPresent ( TARGETING::Target * i_target );
-+
-+    /**
-      * @brief This function checks if the PNOR cache for this target is in
-      *      sync with the SEEPROM, if not it loads the PNOR cache from SEEPROM.
-      * @param[in] i_target - Target device
-diff --git a/src/include/usr/vpd/vpdreasoncodes.H b/src/include/usr/vpd/vpdreasoncodes.H
-index 88668b7..2cfe8a6 100644
---- a/src/include/usr/vpd/vpdreasoncodes.H
-+++ b/src/include/usr/vpd/vpdreasoncodes.H
-@@ -61,6 +61,9 @@ enum vpdModuleId
-     VPD_IPVPD_LOAD_PNOR                     = 0x33,
-     VPD_IPVPD_GET_RECORD_LIST_SEEPROM       = 0x34,
- 
-+    // PVPD
-+    VPD_PVPD_PRESENCEDETECT                 = 0x50,
-+
-     // DIMM SPD
-     VPD_SPD_GET_KEYWORD_VALUE               = 0x61,
-     VPD_SPD_GET_VALUE                       = 0x62,
-@@ -131,6 +134,7 @@ enum vpdReasonCode
-     VPD_UNEXPECTED_TARGET_TYPE          = VPD_COMP_ID | 0x33,
-     VPD_WRITE_DEST_UNRESOLVED           = VPD_COMP_ID | 0x34,
-     VPD_CACHE_SIZE_EXCEEDED             = VPD_COMP_ID | 0x35,
-+    VPD_INVALID_LENGTH                  = VPD_COMP_ID | 0x36,
- };
- 
- 
-diff --git a/src/usr/devtree/bld_devtree.C b/src/usr/devtree/bld_devtree.C
-index a8ece97..a311efe 100644
---- a/src/usr/devtree/bld_devtree.C
-+++ b/src/usr/devtree/bld_devtree.C
-@@ -45,7 +45,7 @@
- #include <fsi/fsiif.H>
- #include <config.h>
- #include <devicefw/userif.H>
--#include <vpd/cvpdenums.H>
-+#include <vpd/pvpdenums.H>
- #include <i2c/i2cif.H>
- #include <i2c/eepromif.H>
- #include <ipmi/ipmisensor.H>
-@@ -351,12 +351,9 @@ void add_i2c_info( const TARGETING::Target* i_targ,
-                 }
-                 else if( l_type == TARGETING::TYPE_MEMBUF )
-                 {
--                    //@fixme-RTC:118373-Remove Hab/Palm workaround
--                    //   once node vpd is supported
--                    sprintf( l_label, "system-vpd" );
--                    /*sprintf( l_label, "memb-vpd-%d",
-+                    sprintf( l_label, "memb-vpd-%d",
-                              eep2->assocTarg
--                             ->getAttr<TARGETING::ATTR_POSITION>() );*/
-+                             ->getAttr<TARGETING::ATTR_POSITION>() );
-                 }
-                 else if( l_type == TARGETING::TYPE_DIMM )
-                 {
-@@ -1054,39 +1051,46 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-            3) Default to 'unknown'
-          */
-         bool foundvpd = false;
--        // TODO RTC 118373 -- update to account for firestone/memory riser
--        TARGETING::TargetHandleList l_membTargetList;
--        getAllChips(l_membTargetList, TYPE_MEMBUF);
--
--        //if can't find a centaur for the CVPD, default to unknown
--        if (l_membTargetList.size())
-+        TARGETING::TargetHandleList l_nodeTargetList;
-+        PredicateCTM predNode(CLASS_ENC, TYPE_NODE);
-+        PredicateHwas predFunctional;
-+        predFunctional.functional(true);
-+        PredicatePostfixExpr nodeCheckExpr;
-+        nodeCheckExpr.push(&predNode).push(&predFunctional).And();
-+
-+        targetService().getAssociated(l_nodeTargetList, sys,
-+                    TargetService::CHILD, TargetService::IMMEDIATE,
-+                    &nodeCheckExpr);
-+
-+        //if can't find a node for the PVPD, default to unknown
-+        if (l_nodeTargetList.size())
-         {
--            TARGETING::Target * l_pMem = l_membTargetList[0];
-+            TARGETING::Target * l_pNode = l_nodeTargetList[0];
-             size_t vpdSize = 0x0;
- 
-             // Note: First read with NULL for o_buffer sets vpdSize to the
-             // correct length
--            errhdl = deviceRead( l_pMem,
-+            errhdl = deviceRead( l_pNode,
-                                  NULL,
-                                  vpdSize,
--                                 DEVICE_CVPD_ADDRESS( CVPD::OSYS,
--                                                      CVPD::MM ));
-+                                 DEVICE_PVPD_ADDRESS( PVPD::OSYS,
-+                                                      PVPD::MM ));
- 
-             if(errhdl)
-             {
-                 TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:MM size for HUID=0x%.8X",
--                          TARGETING::get_huid(l_pMem));
-+                          TARGETING::get_huid(l_pNode));
- 
-                 // Try the OPFR record
--                errlHndl_t opfr_errhdl = deviceRead( l_pMem,
-+                errlHndl_t opfr_errhdl = deviceRead( l_pNode,
-                                            NULL,
-                                            vpdSize,
--                                           DEVICE_CVPD_ADDRESS( CVPD::OPFR,
--                                                                CVPD::DR ));
-+                                           DEVICE_PVPD_ADDRESS( PVPD::OPFR,
-+                                                                PVPD::DR ));
-                 if(opfr_errhdl)
-                 {
-                     TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OPFR:DR size for HUID=0x%.8X",
--                              TARGETING::get_huid(l_pMem));
-+                              TARGETING::get_huid(l_pNode));
-                     delete opfr_errhdl; //delete OPFR log, VPD is just bad
-                 }
-                 else
-@@ -1095,16 +1099,16 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-                     errhdl = NULL;
-                     char drBuf[vpdSize+1];
-                     memset(&drBuf, 0x0, (vpdSize+1)); //null terminated str
--                    errhdl = deviceRead( l_pMem,
-+                    errhdl = deviceRead( l_pNode,
-                                          reinterpret_cast<void*>( &drBuf ),
-                                          vpdSize,
--                                         DEVICE_CVPD_ADDRESS( CVPD::OPFR,
--                                                              CVPD::DR ));
-+                                         DEVICE_PVPD_ADDRESS( PVPD::OPFR,
-+                                                              PVPD::DR ));
- 
-                     if(errhdl)
-                     {
-                         TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OPFR:DR for HUID=0x%.8X",
--                                  TARGETING::get_huid(l_pMem));
-+                                  TARGETING::get_huid(l_pNode));
-                     }
-                     else
-                     {
-@@ -1117,16 +1121,16 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-             {
-                 char mmBuf[vpdSize+1];
-                 memset(&mmBuf, 0x0, (vpdSize+1)); //ensure null terminated str
--                errhdl = deviceRead( l_pMem,
-+                errhdl = deviceRead( l_pNode,
-                                      reinterpret_cast<void*>( &mmBuf ),
-                                      vpdSize,
--                                     DEVICE_CVPD_ADDRESS( CVPD::OSYS,
--                                                          CVPD::MM ));
-+                                     DEVICE_PVPD_ADDRESS( PVPD::OSYS,
-+                                                          PVPD::MM ));
- 
-                 if(errhdl)
-                 {
-                     TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:MM for HUID=0x%.8X",
--                              TARGETING::get_huid(l_pMem));
-+                              TARGETING::get_huid(l_pNode));
-                 }
-                 else
-                 {
-@@ -1153,42 +1157,40 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-            1) OSYS:SS
-            2) Default to 'unavailable'
-          */
--        // TODO RTC 118373 -- update to account for firestone/memory riser
-         foundvpd = false;
--        if( l_membTargetList.size() )
-+        if( l_nodeTargetList.size() )
-         {
--            // TODO RTC 118373 - Should be able to read from attribute
--            TARGETING::Target * l_pMem = l_membTargetList[0];
-+            TARGETING::Target * l_pNode = l_nodeTargetList[0];
-             size_t vpdSize = 0x0;
- 
-             // Note: First read with NULL for o_buffer sets vpdSize to the
-             // correct length
--            errhdl = deviceRead( l_pMem,
-+            errhdl = deviceRead( l_pNode,
-                                  NULL,
-                                  vpdSize,
--                                 DEVICE_CVPD_ADDRESS( CVPD::OSYS,
--                                                      CVPD::SS ));
-+                                 DEVICE_PVPD_ADDRESS( PVPD::OSYS,
-+                                                      PVPD::SS ));
- 
-             if(errhdl)
-             {
-                 TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't get OSYS:SS size for HUID=0x%.8X",
--                          TARGETING::get_huid(l_pMem));
-+                          TARGETING::get_huid(l_pNode));
-                 // Note - not supporting old vpd versions without OSYS here
-             }
-             else
-             {
-                 char ssBuf[vpdSize+1];
-                 memset(&ssBuf, 0x0, (vpdSize+1)); //ensure null terminated str
--                errhdl = deviceRead( l_pMem,
-+                errhdl = deviceRead( l_pNode,
-                                      reinterpret_cast<void*>( &ssBuf ),
-                                      vpdSize,
--                                     DEVICE_CVPD_ADDRESS( CVPD::OSYS,
--                                                          CVPD::SS ));
-+                                     DEVICE_PVPD_ADDRESS( PVPD::OSYS,
-+                                                          PVPD::SS ));
- 
-                 if(errhdl)
-                 {
-                     TRACFCOMP(g_trac_devtree,ERR_MRK" Couldn't read OSYS:SS for HUID=0x%.8X",
--                              TARGETING::get_huid(l_pMem));
-+                              TARGETING::get_huid(l_pNode));
-                 }
-                 else
-                 {
-@@ -1205,7 +1207,6 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
-             delete errhdl;
-             errhdl = NULL;
-         }
--
-         if( !foundvpd ) //serial number not found, default to unavailable
-         {
-             i_dt->addPropertyString(rootNode, "system-id", "unavailable");
-diff --git a/src/usr/hwas/hwasPlat.C b/src/usr/hwas/hwasPlat.C
-index 80c36f9..ef631b5 100644
---- a/src/usr/hwas/hwasPlat.C
-+++ b/src/usr/hwas/hwasPlat.C
-@@ -421,9 +421,13 @@ errlHndl_t platPresenceDetect(TargetHandleList &io_targets)
-             HWAS_DBG("pTarget %.8X - detected present",
-                 pTarget->getAttr<ATTR_HUID>());
- 
--            // on to the next target
-+        // If there is planar VPD, then don't skip the presence detect.
-+        // The presence detect will log any problems and load pnor.
-+#if !defined(CONFIG_HAVE_PVPD)
-+            // on to the next target if there is no Planar VPD
-             pTarget_it++;
-             continue;
-+#endif
-         }
- 
-         // call deviceRead() to see if they are present
-diff --git a/src/usr/hwas/hwasPlatCallout.C b/src/usr/hwas/hwasPlatCallout.C
-index 0f15082..03756a8 100644
---- a/src/usr/hwas/hwasPlatCallout.C
-+++ b/src/usr/hwas/hwasPlatCallout.C
-@@ -122,10 +122,12 @@ errlHndl_t platHandleHWCallout(
-         } // switch i_deconfigState
- 
-         // check to see if this target is the master processor
--        //  and if it's been deconfigured.
-+        //  and if it's being deconfigured.
-+        //  NOTE: will be non-functional early in IPL before discovery complete.
-         TARGETING::Target *l_masterProc;
-         TARGETING::targetService().masterProcChipTargetHandle(l_masterProc);
--        if (i_pTarget == l_masterProc)
-+        if ( (i_pTarget == l_masterProc) &&
-+             (NO_DECONFIG != i_deconfigState) )
-         {
-             const TARGETING::HwasState hwasState =
-                     l_masterProc->getAttr<TARGETING::ATTR_HWAS_STATE>();
-diff --git a/src/usr/i2c/eepromdd.C b/src/usr/i2c/eepromdd.C
-index 372fcc7..b2e1c90 100755
---- a/src/usr/i2c/eepromdd.C
-+++ b/src/usr/i2c/eepromdd.C
-@@ -97,6 +97,11 @@ DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD,
-                        TARGETING::TYPE_MEMBUF,
-                        eepromPerformOp );
- 
-+// Register the perform Op with the routing code for Nodes.
-+DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD,
-+                       DeviceFW::EEPROM,
-+                       TARGETING::TYPE_NODE,
-+                       eepromPerformOp );
- 
- // ------------------------------------------------------------------
- // eepromPerformOp
-diff --git a/src/usr/ipmi/ipmifruinv.C b/src/usr/ipmi/ipmifruinv.C
-index cc2f06a..49c5e7e 100644
---- a/src/usr/ipmi/ipmifruinv.C
-+++ b/src/usr/ipmi/ipmifruinv.C
-@@ -29,6 +29,7 @@
- #include <devicefw/userif.H>
- #include <vpd/spdenums.H>
- #include <vpd/cvpdenums.H>
-+#include <vpd/pvpdenums.H>
- #include <targeting/common/commontargeting.H>
- #include <targeting/common/utilFilter.H>
- #include <errl/errlmanager.H>
-@@ -51,7 +52,17 @@ inline static bool comparePairs(
-               const std::pair<TARGETING::TargetHandle_t, uint8_t>& i_lhs,
-               const std::pair<TARGETING::TargetHandle_t, uint8_t>& i_rhs)
- {
--        return (i_lhs.second < i_rhs.second);
-+    bool l_compare = i_lhs.second < i_rhs.second;
-+
-+    // in case of a tie, if the left is a Node, sort it first.
-+    if (i_lhs.second == i_rhs.second)
-+    {
-+        if (TARGETING::TYPE_NODE==i_lhs.first->getAttr<TARGETING::ATTR_TYPE>())
-+        {
-+           l_compare = true;
-+        }
-+    }
-+    return l_compare;
- }
- 
- IpmiFruInv::IpmiFruInv(TARGETING::TargetHandle_t i_target)
-@@ -82,7 +93,14 @@ IpmiFruInv *IpmiFruInv::Factory(TARGETING::TargetHandleList i_targets,
-             l_fru = new procIpmiFruInv(l_target, i_updateData);
-             break;
-         case TARGETING::TYPE_MEMBUF:
--            // @todo-RTC:117702
-+            // A memory riser card will have a mem buff with a distinct FRU ID
-+            l_fru = new membufIpmiFruInv(l_target, i_targets, i_updateData);
-+            break;
-+        case TARGETING::TYPE_NODE:
-+            // When the planar eeprom is shared for planar vpd and memory vpd,
-+            // the node and membufs will have the same FRU ID. The node has
-+            // been sorted ahead of the membufs. The membufs are extra targets
-+            // for their ECIDs.
-             l_fru = new backplaneIpmiFruInv(l_target, i_targets, i_updateData);
-             break;
-         case TARGETING::TYPE_SYS:
-@@ -425,11 +443,11 @@ errlHndl_t isdimmIpmiFruInv::buildProductInfoArea(std::vector<uint8_t> &io_data)
-         io_data.push_back(uint8_t(0)); // Empty FRU File ID bytes
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Finalize section formatting
--        postFormatProcessing(io_data);
--
-     } while (0);
- 
-+    //Finalize section formatting
-+    postFormatProcessing(io_data);
-+
-     if (l_errl)
-     {
-         TRACFCOMP(g_trac_ipmi,"isdimIpmiFruInv::buildProductInfoArea - Errors "
-@@ -580,11 +598,11 @@ errlHndl_t procIpmiFruInv::buildBoardInfoArea(std::vector<uint8_t> &io_data)
-         //Indicate end of custom fields
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Complete formatting for this data record
--        postFormatProcessing(io_data);
--
-     } while (0);
- 
-+    //Complete formatting for this data record
-+    postFormatProcessing(io_data);
-+
-     if (l_errl)
-     {
-         TRACFCOMP(g_trac_ipmi,"buildBoardInfoArea - Errors Collecting ISDimm "
-@@ -610,64 +628,18 @@ errlHndl_t procIpmiFruInv::buildMultiRecordInfoArea(
- errlHndl_t procIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
-                                      uint8_t i_record,
-                                      uint8_t i_keyword,
--                                     bool i_ascii)
-+                                     bool i_ascii,
-+                                     bool i_typeLengthByte)
- {
--    size_t     l_vpdSize = 0;
-     errlHndl_t l_errl = NULL;
- 
--    do {
--
--        //First get size of data by passing NULL
--        l_errl = deviceRead(iv_target,
--                                      NULL,
--                                      l_vpdSize,
--                                      DEVICE_MVPD_ADDRESS(i_record, i_keyword));
--
--        if (l_errl)
--        {
--            TRACFCOMP(g_trac_ipmi,"procIpmiFruInv::addVpdData - Error while "
--                      "reading MVPD keyword size");
--            break;
--        }
--
--        //Assert if vpd field is too large to fit in IPMI fru inventory format
--        assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
--
--        if (l_vpdSize > 0)
--        {
--            //Determine how big data is and expand it to handle the soon to
--            //be read VPD data
--            uint8_t l_offset = io_data.size();
--            io_data.resize(l_offset + 1 + l_vpdSize);
--
--            //Add on the data to the type/length byte indicating it is ascii
--            // otherwise leave it as binary
--            if (i_ascii)
--            {
--                io_data.at(l_offset) = l_vpdSize
--                                       + IPMIFRUINV::TYPELENGTH_BYTE_ASCII;
--            }
--            else
--            {
--                io_data.at(l_offset) = l_vpdSize;
--            }
--
--            //Read the VPD data directly into fru inventory data buffer
--            l_errl = deviceRead(iv_target,&io_data[l_offset+1],l_vpdSize,
--                                DEVICE_MVPD_ADDRESS(i_record, i_keyword));
--        }
--        else
--        {
--            TRACFCOMP(g_trac_ipmi,"procIpmiFruInv::addVpdData - "
--                      " No size returned for MVPD keyword");
--        }
--    } while(0);
--
--    if (l_errl)
--    {
--        TRACFCOMP(g_trac_ipmi, "addVpdData - Error acquiring data from Vpd.");
--    }
--
-+    l_errl = addCommonVpdData(iv_target,
-+                              io_data,
-+                              DeviceFW::MVPD,
-+                              i_record,
-+                              i_keyword,
-+                              i_ascii,
-+                              i_typeLengthByte);
-     return l_errl;
- }
- 
-@@ -699,8 +671,7 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
-         preFormatProcessing(io_data, false);
-         //Set Chassis Enclosure Type - Not Ascii
-         // Also, do not include type/length byte
--        //@fixme RTC Story 118373
--        l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::ET, false, false);
-+        l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::ET, false, false);
- 
-         //Support Legacy VPD without OSYS record
-         if (l_errl)
-@@ -714,12 +685,10 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
-             //Set default chassis type
-             io_data.push_back(IPMIFRUINV::DEFAULT_CHASSIS_TYPE);
-             //Set chassis part number - ascii formatted field
--            //@fixme RTC Story 118373
--            l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
-+            l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VP, true);
-             if (l_errl) { break; }
-             //Set chassis serial number - ascii formatted field
--            //@fixme RTC Story 118373
--            l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
-+            l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VS, true);
-             if (l_errl) { break; }
-         }
-         else
-@@ -728,13 +697,11 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
-                       " Using NEW OSYS RECORD FOR Chassis VPD Data");
- 
-             //Set chassis part number - ascii formatted field
--            //@fixme RTC Story 118373
--            l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::MM, true);
-+            l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::MM, true);
-             if (l_errl) { break; }
- 
-             //Set chassis serial number - ascii formatted field
--            //@fixme RTC Story 118373
--            l_errl = addVpdData(io_data, CVPD::OSYS, CVPD::SS, true);
-+            l_errl = addVpdData(io_data, PVPD::OSYS, PVPD::SS, true);
-             if (l_errl) { break; }
- 
-         }
-@@ -743,10 +710,11 @@ errlHndl_t backplaneIpmiFruInv::buildChassisInfoArea(
-         io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Complete record data formatting
--        postFormatProcessing(io_data);
-     } while (0);
- 
-+    //Complete record data formatting
-+    postFormatProcessing(io_data);
-+
-     if (l_errl)
-     {
-         TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::buildChassisInfoArea - "
-@@ -771,67 +739,39 @@ errlHndl_t backplaneIpmiFruInv::buildBoardInfoArea(
-         io_data.push_back(0);
- 
-         //Set Vendor Name - ascii formatted data
--        //@fixme RTC Story 118373
--        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VN, true);
-+        l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VN, true);
-         if (l_errl) { break; }
- 
-         //Set Product Name - ascii formatted data
--        //@fixme RTC Story 118373
--        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::DR, true);
-+        l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::DR, true);
-         if (l_errl) { break; }
- 
-         //Set Product Serial number - ascii formatted data
--        //@fixme RTC Story 118373
--        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
-+        //TODO RTC:117702 use attribute when 122890 is available
-+        l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VS, true);
-         if (l_errl) { break; }
- 
-         //Set Product Part number - ascii formatted data
--        //@fixme RTC Story 118373
--        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
--        if (l_errl) { break; }
-+        //TODO RTC:117702 use attribute when 122890 is available
-+        l_errl = addVpdData(io_data, PVPD::OPFR, PVPD::VP, true);
- 
-         //Push Fru File ID Byte - NULL
-         io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
- 
--        bool l_setCustomData = false;
--        // Check if we should add ECID
--        for (TARGETING::TargetHandleList::const_iterator extraTargets_it =
--                iv_extraTargets.begin();
--                extraTargets_it != iv_extraTargets.end();
--                ++extraTargets_it
--            )
-+        //Only set the ECID Data during an update scenario
-+        if (iv_isUpdate == true)
-         {
--            TARGETING::TargetHandle_t l_extraTarget = *extraTargets_it;
--
--            //Only set the ECID Data during an update scenario
--            if (iv_isUpdate == true &&
--                (l_extraTarget->getAttr<TARGETING::ATTR_TYPE>() ==
--                                                        TARGETING::TYPE_MEMBUF))
--            {
--                TARGETING::ATTR_ECID_type ecidInfo;
--                bool getEcid =
--                      l_extraTarget->tryGetAttr<TARGETING::ATTR_ECID>(ecidInfo);
--                if (getEcid)
--                {
--                    l_setCustomData = true;
--                    addEcidData(l_extraTarget, ecidInfo, io_data);
--                }
--            }
-+            customEcidData (iv_extraTargets, io_data);
-         }
- 
--        //If no Custom data was sent, an Empty Byte is needed
--        if (!l_setCustomData)
--        {
--            io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
--        }
-         //Indicate End of Custom Fields
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Complete record data formatting
--        postFormatProcessing(io_data);
--
-     } while (0);
- 
-+    //Complete record data formatting
-+    postFormatProcessing(io_data);
-+
-     if (l_errl)
-     {
-         TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::buildBoardInfoArea - "
-@@ -860,74 +800,17 @@ errlHndl_t backplaneIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
-                                      uint8_t i_keyword,
-                                      bool i_ascii,
-                                      bool i_typeLengthByte)
-+
- {
--    size_t     l_vpdSize = 0;
-     errlHndl_t l_errl = NULL;
- 
--    do {
--        //First get size of data with NULL parameter
--        l_errl = deviceRead(iv_target,
--                                      NULL,
--                                      l_vpdSize,
--                                      //@fixme RTC Story 118373
--                                      DEVICE_CVPD_ADDRESS(i_record, i_keyword));
--
--        if (l_errl)
--        {
--            TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::addVpdData - Error "
--                      "while reading CVPD keyword size");
--            break;
--        }
--
--        //Assert if vpd field is too large to fit in IPMI fru inventory format
--        assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
--
--        if (l_vpdSize > 0)
--        {
--            uint8_t l_offset = 0;
--            //Add on the typelength byte if requested
--            if (i_typeLengthByte)
--            {
--                //Determine how big data is and expand it to handle the soon to
--                //be read VPD data
--                l_offset = io_data.size();
--                io_data.resize(l_offset + 1 + l_vpdSize);
--                //Add on the data to the type/length byte indicating it is ascii
--                // otherwise leave it as binary
--                if (i_ascii)
--                {
--                    io_data.at(l_offset) = l_vpdSize
--                                           + IPMIFRUINV::TYPELENGTH_BYTE_ASCII;
--                }
--                else
--                {
--                    io_data.at(l_offset) = l_vpdSize;
--                }
--                l_offset += 1;
--            }
--            else
--            {
--                //Determine how big data is and expand it to handle the soon to
--                //be read VPD data
--                l_offset = io_data.size();
--                io_data.resize(l_offset + l_vpdSize);
--            }
--            //Read the VPD data directly into fru inventory data buffer
--            l_errl = deviceRead(iv_target,&io_data[l_offset],l_vpdSize,
--                                     DEVICE_CVPD_ADDRESS(i_record, i_keyword));
--        }
--        else
--        {
--            TRACFCOMP(g_trac_ipmi,"backplaneIpmiFruInv::addVpdData - "
--                      " No size returned for CVPD keyword");
--        }
--    } while(0);
--
--    if (l_errl)
--    {
--        TRACFCOMP(g_trac_ipmi, "backplaneIpmiFruInv::addVpdData - Error "
--                  "acquiring data from Vpd.");
--    }
-+    l_errl = addCommonVpdData(iv_target,
-+                              io_data,
-+                              DeviceFW::PVPD,
-+                              i_record,
-+                              i_keyword,
-+                              i_ascii,
-+                              i_typeLengthByte);
- 
-     return l_errl;
- }
-@@ -1106,11 +989,11 @@ errlHndl_t systemFwIpmiFruInv::buildProductInfoArea(std::vector<uint8_t>
- 
-         io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
- 
--        //Finalize section formatting
--        postFormatProcessing(io_data);
--
-     } while(0);
- 
-+    //Finalize section formatting
-+    postFormatProcessing(io_data);
-+
-     return l_errl;
- }
- 
-@@ -1121,7 +1004,155 @@ errlHndl_t systemFwIpmiFruInv::buildMultiRecordInfoArea(std::vector<uint8_t>
-     return IpmiFruInv::buildEmptyArea(io_data);
- }
- 
-+//##############################################################################
-+membufIpmiFruInv::membufIpmiFruInv( TARGETING::TargetHandle_t i_target,
-+                                     TARGETING::TargetHandleList i_extraTargets,
-+                                     bool i_isUpdate)
-+    :IpmiFruInv(i_target),
-+    iv_isUpdate(i_isUpdate),
-+    iv_extraTargets(i_extraTargets)
-+{
-+};
-+
-+errlHndl_t membufIpmiFruInv::buildInternalUseArea(
-+                                                 std::vector<uint8_t> &io_data)
-+{
-+    //This section not needed for the mem buf type
-+    return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t membufIpmiFruInv::buildChassisInfoArea(
-+                                                  std::vector<uint8_t> &io_data)
-+{
-+    //This section not needed for the mem buf type
-+    return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t membufIpmiFruInv::buildBoardInfoArea(
-+                                              std::vector<uint8_t> &io_data)
-+{
-+    errlHndl_t l_errl = NULL;
-+
-+    do {
-+        //Set formatting data that goes at the beginning of the record
-+        preFormatProcessing(io_data, true);
-+
-+        //Set MFG Date/Time - Blank
-+        io_data.push_back(0);
-+        io_data.push_back(0);
-+        io_data.push_back(0);
-+
-+        //Set Vendor Name - ascii formatted data
-+        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VN, true);
-+        if (l_errl) { break; }
-+
-+        //Set Product Name - ascii formatted data
-+        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::DR, true);
-+        if (l_errl) { break; }
-+
-+        //Set Product Serial number - ascii formatted data
-+        //TODO RTC:117702 use attribute when 122890 is available
-+        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VS, true);
-+        if (l_errl) { break; }
-+
-+        //Set Product Part number - ascii formatted data
-+        //TODO RTC:117702 use attribute when 122890 is available
-+        l_errl = addVpdData(io_data, CVPD::OPFR, CVPD::VP, true);
-+        if (l_errl) { break; }
-+
-+        //Push Fru File ID Byte - NULL
-+        io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
-+
-+        //Only set the ECID Data during an update scenario
-+        if (iv_isUpdate == true)
-+        {
-+            customEcidData (iv_extraTargets, io_data);
-+        }
-+
-+        //Indicate End of Custom Fields
-+        io_data.push_back(IPMIFRUINV::END_OF_CUSTOM_FIELDS);
-+
-+    } while (0);
-+
-+    //Complete record data formatting
-+    postFormatProcessing(io_data);
-+
-+    if (l_errl)
-+    {
-+        TRACFCOMP(g_trac_ipmi,"membufIpmiFruInv::buildBoardInfoArea - "
-+                  "Errors collecting board info data");
-+    }
-+
-+    return l_errl;
-+}
-+
-+errlHndl_t membufIpmiFruInv::buildProductInfoArea(
-+                                                  std::vector<uint8_t> &io_data)
-+{
-+    //This section not needed for the mem buf type
-+    return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t membufIpmiFruInv::buildMultiRecordInfoArea(
-+                                                  std::vector<uint8_t> &io_data)
-+{
-+    //This section not needed for the mem buf type
-+    return IpmiFruInv::buildEmptyArea(io_data);
-+}
-+
-+errlHndl_t membufIpmiFruInv::addVpdData(std::vector<uint8_t> &io_data,
-+                                     uint8_t i_record,
-+                                     uint8_t i_keyword,
-+                                     bool i_ascii,
-+                                     bool i_typeLengthByte)
-+{
-+    errlHndl_t l_errl = NULL;
-+
-+    l_errl = addCommonVpdData(iv_target,
-+                              io_data,
-+                              DeviceFW::CVPD,
-+                              i_record,
-+                              i_keyword,
-+                              i_ascii,
-+                              i_typeLengthByte);
-+    return l_errl;
-+}
-+//##############################################################################
-+void IpmiFruInv::customEcidData(TARGETING::TargetHandleList i_extraTargets,
-+                     std::vector<uint8_t> &io_data)
-+{
-+
-+    bool l_setCustomData = false;
-+    // Check if we should add ECID
-+    for (TARGETING::TargetHandleList::const_iterator extraTargets_it =
-+                i_extraTargets.begin();
-+                extraTargets_it != i_extraTargets.end();
-+                ++extraTargets_it
-+            )
-+    {
-+        TARGETING::TargetHandle_t l_extraTarget = *extraTargets_it;
-+
-+        //Only set the ECID Data during an update scenario
-+        if ( l_extraTarget->getAttr<TARGETING::ATTR_TYPE>() ==
-+                                                        TARGETING::TYPE_MEMBUF)
-+        {
-+            TARGETING::ATTR_ECID_type ecidInfo;
-+            bool getEcid =
-+                      l_extraTarget->tryGetAttr<TARGETING::ATTR_ECID>(ecidInfo);
-+            if (getEcid)
-+            {
-+                l_setCustomData = true;
-+                addEcidData(l_extraTarget, ecidInfo, io_data);
-+            }
-+        }
-+    }
- 
-+    //If no Custom data was sent, an Empty Byte is needed
-+    if (!l_setCustomData)
-+    {
-+        io_data.push_back(IPMIFRUINV::TYPELENGTH_BYTE_NULL);
-+    }
-+}
- 
- void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
-                              const TARGETING::ATTR_ECID_type& i_ecidInfo,
-@@ -1149,6 +1180,94 @@ void IpmiFruInv::addEcidData(const TARGETING::TargetHandle_t& i_target,
-     return;
- }
- 
-+errlHndl_t IpmiFruInv::addCommonVpdData(
-+                                     const TARGETING::TargetHandle_t& i_target,
-+                                     std::vector<uint8_t> &io_data,
-+                                     DeviceFW::AccessType i_accessType,
-+                                     uint8_t i_record,
-+                                     uint8_t i_keyword,
-+                                     bool i_ascii,
-+                                     bool i_typeLengthByte)
-+{
-+    size_t     l_vpdSize = 0;
-+    errlHndl_t l_errl = NULL;
-+
-+    do {
-+        // First get size with NULL call:
-+        // Bypass DEVICE_?VPD_ADDRESS inorder to maximize common code
-+        l_errl = deviceRead(i_target,
-+                            NULL,
-+                            l_vpdSize,
-+                            i_accessType,
-+                            i_record,
-+                            i_keyword,
-+                            VPD::AUTOSELECT);
-+
-+        if (l_errl)
-+        {
-+            TRACFCOMP(g_trac_ipmi,"addCommonVpdData - Error "
-+                      "while reading keyword size");
-+            break;
-+        }
-+
-+        //Assert if vpd field is too large to fit in IPMI fru inventory format
-+        assert(l_vpdSize < IPMIFRUINV::TYPELENGTH_BYTE_ASCII);
-+
-+        if (l_vpdSize > 0)
-+        {
-+            uint8_t l_offset = 0;
-+            //Add on the typelength byte if requested
-+            if (i_typeLengthByte)
-+            {
-+                //Determine how big data is and expand it to handle the soon to
-+                //be read VPD data
-+                l_offset = io_data.size();
-+                io_data.resize(l_offset + 1 + l_vpdSize);
-+                //Add on the data to the type/length byte indicating it is ascii
-+                // otherwise leave it as binary
-+                if (i_ascii)
-+                {
-+                    io_data.at(l_offset) = l_vpdSize
-+                                           + IPMIFRUINV::TYPELENGTH_BYTE_ASCII;
-+                }
-+                else
-+                {
-+                    io_data.at(l_offset) = l_vpdSize;
-+                }
-+                l_offset += 1;
-+            }
-+            else
-+            {
-+                //Determine how big data is and expand it to handle the soon to
-+                //be read VPD data
-+                l_offset = io_data.size();
-+                io_data.resize(l_offset + l_vpdSize);
-+            }
-+            //Read the VPD data directly into fru inventory data buffer
-+            l_errl = deviceRead(i_target,
-+                            &io_data[l_offset],
-+                            l_vpdSize,
-+                            i_accessType,
-+                            i_record,
-+                            i_keyword,
-+                            VPD::AUTOSELECT);
-+        }
-+        else
-+        {
-+            TRACFCOMP(g_trac_ipmi,"addCommonVpdData - "
-+                      " No size returned for keyword");
-+        }
-+    } while(0);
-+
-+    if (l_errl)
-+    {
-+        TRACFCOMP(g_trac_ipmi, "addCommonVpdData - Error "
-+                  "acquiring data from Vpd.");
-+    }
-+
-+    return l_errl;
-+}
-+
- void IPMIFRUINV::clearData(uint8_t i_fruId)
- {
-     uint8_t l_clearData[] =
-@@ -1292,10 +1411,12 @@ void IPMIFRUINV::gatherClearData(const TARGETING::Target* i_pSys,
-                                     std::map<uint8_t,bool>& io_frusToClear)
- {
-     TARGETING::PredicateCTM predChip(TARGETING::CLASS_CHIP);
-+    TARGETING::PredicateCTM predNode(TARGETING::CLASS_ENC,
-+                                     TARGETING::TYPE_NODE);
-     TARGETING::PredicateCTM predDimm(TARGETING::CLASS_LOGICAL_CARD,
-                                          TARGETING::TYPE_DIMM);
-     TARGETING::PredicatePostfixExpr checkAllExpr;
--    checkAllExpr.push(&predChip).push(&predDimm).Or();
-+    checkAllExpr.push(&predChip).push(&predNode).Or().push(&predDimm).Or();
-     TARGETING::TargetHandleList l_allPossibleFrus;
-     TARGETING::targetService().getAssociated( l_allPossibleFrus, i_pSys,
-     TARGETING::TargetService::CHILD, TARGETING::TargetService::ALL,
-@@ -1336,14 +1457,19 @@ void IPMIFRUINV::gatherSetData(const TARGETING::Target* i_pSys,
-     //                    may be needed
-     l_present.present(true);
- 
-+    checkExpr.push(&predChip);
-+    TARGETING::PredicateCTM predNode(TARGETING::CLASS_ENC,
-+                                     TARGETING::TYPE_NODE);
-+    checkExpr.push(&predNode).Or();
-+
-     //When updating data on a later pass ignore dimms
-     if (i_updateData)
-     {
--        checkExpr.push(&predChip).push(&l_present).And();
-+        checkExpr.push(&l_present).And();
-     }
-     else
-     {
--        checkExpr.push(&predChip).push(&predDimm).Or().push(&l_present).And();
-+        checkExpr.push(&predDimm).Or().push(&l_present).And();
-     }
- 
-     TARGETING::TargetHandleList pCheckPres;
-@@ -1374,6 +1500,10 @@ void IPMIFRUINV::gatherSetData(const TARGETING::Target* i_pSys,
-     }
- 
-     //Sort the vector by FRU_ID for later use.
-+    //When the planar eeprom is shared for planar and memory buffer vpd, the
-+    //node and membuffs will have the same FRU ID. For this case, sort the Node
-+    //to be ahead of the mem buffs. The mem buffs will be extra targets for
-+    //their ECIDs.
-     std::sort(io_potentialFrus.begin(),
-               io_potentialFrus.end(),
-               comparePairs);
-diff --git a/src/usr/ipmi/ipmifruinvprvt.H b/src/usr/ipmi/ipmifruinvprvt.H
-index 468a47f..57d6e13 100644
---- a/src/usr/ipmi/ipmifruinvprvt.H
-+++ b/src/usr/ipmi/ipmifruinvprvt.H
-@@ -186,6 +186,32 @@ class IpmiFruInv
-                      const TARGETING::ATTR_ECID_type& i_ecidInfo,
-                      std::vector<uint8_t> &io_data);
- 
-+    /**
-+      * @brief Adds Ecid attribute data from extra targets as custom data
-+      * @param[in] TargetHandleList, Handle to list of extra
-+      *             targets associated with this FRU Record
-+      * @param[in/out] data, The container to put ECID attribute data in
-+      */
-+    void customEcidData(TARGETING::TargetHandleList i_extraTargets,
-+                     std::vector<uint8_t> &io_data);
-+
-+    /**
-+     * @brief Retrieve vpd record keyword and add to IPMI Fru Inventory record
-+     * @param[in/out] data, The container with record data
-+     * @param[in] access, Indicates vpd module to access (MVPD,PVPD,CPVD)
-+     * @param[in] record,  Indicates major offset in the VPD to get more data
-+     * @param[in] keyword, Indicates minor offset in the VPD to get more data
-+     * @param[in] ascii, Indicates if VPD field is in ascii format or not
-+     */
-+    errlHndl_t addCommonVpdData(
-+                          const TARGETING::TargetHandle_t& i_target,
-+                          std::vector<uint8_t> &io_data,
-+                          DeviceFW::AccessType i_accessType,
-+                          uint8_t i_record,
-+                          uint8_t i_keyword,
-+                          bool i_ascii,
-+                          bool i_typeLengthByte);
-+
-   private:
- 
-     /**
-@@ -376,11 +402,13 @@ class procIpmiFruInv : public IpmiFruInv
-      * @param[in] record,  Indicates major offset in the VPD to get more data
-      * @param[in] keyword, Indicates minor offset in the VPD to get more data
-      * @param[in] ascii, Indicates if VPD field is in ascii format or not
-+     * @param[in] typeLengthBtye, Indicates whether type length to be added.
-      */
-     errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
-                           uint8_t i_record,
-                           uint8_t i_keyword,
--                          bool i_ascii=false);
-+                          bool i_ascii=false,
-+                          bool i_typeLengthByte=true);
- 
- };
- 
-@@ -453,13 +481,13 @@ class backplaneIpmiFruInv : public IpmiFruInv
-      * @param[in] record,  Indicates major offset in the VPD to get more data
-      * @param[in] keyword, Indicates minor offset in the VPD to get more data
-      * @param[in] ascii, Indicates if VPD field is in ascii format or not
-+     * @param[in] typeLengthBtye, Indicates whether type length to be added.
-      */
-     errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
-                           uint8_t i_record,
-                           uint8_t i_keyword,
-                           bool i_ascii=false,
-                           bool i_typeLengthByte=true);
--
- };
- 
- //Child class for building up System Firwmare Fru Inventory Record Data
-@@ -507,4 +535,84 @@ class systemFwIpmiFruInv : public IpmiFruInv
- 
- };
- 
-+//Child class for building up membuf Fru Inventory Record Data. For example,
-+//for a memory riser card Fru.
-+class membufIpmiFruInv : public IpmiFruInv
-+{
-+
-+  public:
-+
-+     /**
-+     * @brief Constructor
-+     *
-+     * @param[in] TargetHandle_t, Handle to target for which
-+     *             to get relevant IPMI FRU Data from
-+     * @param[in] TargetHandleList, Handle to list of extra
-+     *             targets associated with this FRU Record
-+     * @param[in] isUpdate, Indicator if the code is updating
-+     *             existing data, or setting base data.
-+     */
-+    membufIpmiFruInv( TARGETING::TargetHandle_t i_target,
-+                         TARGETING::TargetHandleList i_extraTargets,
-+                         bool i_isUpdate );
-+
-+    /**
-+     * @brief Builds the Internal Use Area Data Section
-+     * @param[in/out] data, The container to put internal use area data in
-+     */
-+    errlHndl_t buildInternalUseArea(std::vector<uint8_t> &io_data);
-+
-+    /**
-+     * @brief Builds the Chassis Info Area Data Section
-+     * @param[in/out] data, The container to put chassis info area data in
-+     */
-+    errlHndl_t buildChassisInfoArea(std::vector<uint8_t> &io_data);
-+
-+    /**
-+     * @brief Builds the Board Info Area Data Section
-+     * @param[in/out] data, The container to put board info area data in
-+     */
-+    errlHndl_t buildBoardInfoArea(std::vector<uint8_t> &io_data);
-+
-+    /**
-+     * @brief Builds the Product Info Area Data Section
-+     * @param[in/out] data, The container to put product info area data in
-+     */
-+    errlHndl_t buildProductInfoArea(std::vector<uint8_t>& io_data);
-+
-+    /**
-+     * @brief Builds the MultiRecord Info Area Data Section
-+     * @param[in/out] data, The container to put multirecord info area data in
-+     */
-+    errlHndl_t buildMultiRecordInfoArea(std::vector<uint8_t>& io_data);
-+
-+  protected:
-+    //Indicator if a data update is happening.
-+    //True - means we are solely updating certain data
-+    //False - means we are doing the initial 'base' data set
-+    bool iv_isUpdate;
-+
-+    //The list of Extra Targets if multiple targets are
-+    //associated with one FRU_ID
-+    TARGETING::TargetHandleList iv_extraTargets;
-+
-+  private:
-+
-+    /**
-+     * @brief Adds the specified VPD data to the data to build up a given
-+     *        IPMI Fru Inventory record
-+     * @param[in/out] data, The container with record data
-+     * @param[in] record,  Indicates major offset in the VPD to get more data
-+     * @param[in] keyword, Indicates minor offset in the VPD to get more data
-+     * @param[in] ascii, Indicates if VPD field is in ascii format or not
-+     * @param[in] typeLengthBtye, Indicates whether type length to be added.
-+     */
-+    errlHndl_t addVpdData(std::vector<uint8_t> &io_data,
-+                          uint8_t i_record,
-+                          uint8_t i_keyword,
-+                          bool i_ascii=false,
-+                          bool i_typeLengthByte=true);
-+
-+};
-+
- #endif
-diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
-index 82ec014..759b73e 100644
---- a/src/usr/targeting/common/xmltohb/target_types.xml
-+++ b/src/usr/targeting/common/xmltohb/target_types.xml
-@@ -913,6 +913,8 @@
-     <attribute><id>FRU_ID</id></attribute>
-     <attribute><id>TPM_PRIMARY_INFO</id></attribute>
-     <attribute><id>TPM_BACKUP_INFO</id></attribute>
-+    <attribute><id>EEPROM_VPD_PRIMARY_INFO</id></attribute>
-+    <attribute><id>VPD_REC_NUM</id></attribute>
- </targetType>
- 
- <targetType>
-diff --git a/src/usr/targeting/common/xmltohb/target_types_hb.xml b/src/usr/targeting/common/xmltohb/target_types_hb.xml
-index b0429da..d023f50 100644
---- a/src/usr/targeting/common/xmltohb/target_types_hb.xml
-+++ b/src/usr/targeting/common/xmltohb/target_types_hb.xml
-@@ -180,6 +180,11 @@
- </targetTypeExtension>
- 
- <targetTypeExtension>
-+    <id>enc-node-power8</id>
-+    <attribute><id>VPD_SWITCHES</id></attribute>
-+</targetTypeExtension>
-+
-+<targetTypeExtension>
-     <id>lcard-dimm</id>
-     <attribute><id>VPD_SWITCHES</id></attribute>
-     <attribute><id>IPMI_SENSORS</id></attribute>
-diff --git a/src/usr/vpd/HBconfig b/src/usr/vpd/HBconfig
-index 1361834..1d6e6f1 100644
---- a/src/usr/vpd/HBconfig
-+++ b/src/usr/vpd/HBconfig
-@@ -33,6 +33,28 @@ config CVPD_WRITE
-     help
-         Ensure at least one of the CVPD WRITEs are enabled
- 
-+config PVPD_READ_FROM_PNOR
-+    default n
-+    help
-+        Read Planar VPD data from PNOR cache
-+
-+config PVPD_READ_FROM_HW
-+    default n
-+    help
-+        Read Planar VPD data from HW resources
-+
-+config PVPD_WRITE_TO_PNOR
-+    default y if PVPD_READ_FROM_PNOR
-+    depends on PVPD_READ_FROM_PNOR
-+    help
-+        Write Planar VPD data to PNOR cache
-+
-+config PVPD_WRITE_TO_HW
-+    default y if PVPD_READ_FROM_HW
-+    depends on PVPD_READ_FROM_HW
-+    help
-+        Write Planar VPD data to HW resources
-+
- config MVPD_READ_FROM_PNOR
-     default y
-     help
-@@ -105,6 +127,11 @@ config HAVE_MBVPD
-     help
-         Have MemBuff/Centaur VPD, PNOR or HW
- 
-+config HAVE_PVPD
-+    default y if PVPD_READ_FROM_PNOR || PVPD_READ_FROM_HW
-+    help
-+        Have Planar VPD, PNOR or HW
-+
- config PALMETTO_PASS1
-     default n
-     help
-diff --git a/src/usr/vpd/cvpd.C b/src/usr/vpd/cvpd.C
-index 50815f1..fa37dc9 100644
---- a/src/usr/vpd/cvpd.C
-+++ b/src/usr/vpd/cvpd.C
-@@ -5,7 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2013,2014                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
- /* [+] Google Inc.                                                        */
- /* [+] International Business Machines Corp.                              */
- /*                                                                        */
-@@ -31,7 +31,10 @@
- #include <trace/interface.H>
- #include <errl/errlentry.H>
- #include <errl/errlmanager.H>
-+#include <targeting/common/commontargeting.H>
- #include <targeting/common/targetservice.H>
-+#include <targeting/common/util.H>
-+#include <targeting/common/utilFilter.H>
- #include <devicefw/driverif.H>
- #include <vfs/vfs.H>
- #include <vpd/vpdreasoncodes.H>
-@@ -40,6 +43,7 @@
- #include <i2c/eepromif.H>
- #include <config.h>
- #include "cvpd.H"
-+#include "pvpd.H"
- #include "vpd.H"
- 
- // ----------------------------------------------
-@@ -233,15 +237,41 @@ IpVpdFacade(CVPD::SECTION_SIZE,
-     iv_configInfo.vpdReadHW = true;
- #else
-     iv_configInfo.vpdReadHW = false;
--#endif    
-+#endif
- #ifdef CONFIG_CVPD_WRITE_TO_PNOR
-     iv_configInfo.vpdWritePNOR = true;
- #else
-     iv_configInfo.vpdWritePNOR = false;
--#endif    
-+#endif
- #ifdef CONFIG_CVPD_WRITE_TO_HW
-     iv_configInfo.vpdWriteHW = true;
- #else
-     iv_configInfo.vpdWriteHW = false;
- #endif
- }
-+
-+// Retrun lists of records that should be copied to pnor.
-+void CvpdFacade::getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize)
-+{
-+    // Always return this object's list
-+    o_primaryVpdRecords = iv_vpdRecords;
-+    o_primaryRecSize = iv_recSize;
-+
-+    // If the planar errprom  being shared with a mem buf,
-+    // then return the pvpd list as the alternative record list.
-+    // At thip point, if the membufs are be processed, then the node
-+    // might not have been discovered yet. If pvpd is being cached, then
-+    // include the pvpd list as the altnative.
-+#ifdef CONFIG_PVPD_READ_FROM_PNOR
-+    o_altVpdRecords = Singleton<PvpdFacade>::instance().iv_vpdRecords;
-+    o_altRecSize = Singleton<PvpdFacade>::instance().iv_recSize;
-+#else
-+    o_altVpdRecords = NULL;
-+    o_altRecSize = 0;
-+#endif
-+}
-+
-diff --git a/src/usr/vpd/cvpd.H b/src/usr/vpd/cvpd.H
-index e7a2d9f..9c729c3 100644
---- a/src/usr/vpd/cvpd.H
-+++ b/src/usr/vpd/cvpd.H
-@@ -79,7 +79,6 @@ namespace CVPD
-         { OPFR, "OPFR" },
-         { VNDR, "VNDR" },
-         { SPDX, "SPDX" },
--        { OSYS, "OSYS" },
-         // -------------------------------------------------------------------
-         // DO NOT USE!!  This is for test purposes ONLY!
-         { CVPD_TEST_RECORD, "TEST" },
-@@ -182,5 +181,26 @@ class CvpdFacade: public IpVpdFacade
-      */
-     CvpdFacade( );
- 
-+  private:
-+
-+    /**
-+     * @brief This function returns a primary and an alternate list of records
-+     *       that should be copied to pnor. The Alternate list is optional.
-+     *
-+     * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_primaryRecSize -    Size of o_primaryVpdRecords array
-+     *
-+     * @param[out] o_altVpdRecords -     Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_altRecSize -        Size of o_altVpdRecords array
-+     *
-+     */
-+    void getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize);
-+
- };
- #endif  // __CVPD_H
-diff --git a/src/usr/vpd/ipvpd.C b/src/usr/vpd/ipvpd.C
-index 3da20b2..e148bc9 100644
---- a/src/usr/vpd/ipvpd.C
-+++ b/src/usr/vpd/ipvpd.C
-@@ -43,6 +43,7 @@
- #include <vpd/ipvpdenums.H>
- 
- #include "vpd.H"
-+#include "cvpd.H"
- #include "ipvpd.H"
- #include "errlud_vpd.H"
- 
-@@ -1336,6 +1337,19 @@ IpVpdFacade::getRecordListSeeprom ( std::list<TocPtRecord> & o_recList,
-         return err;
-     }
- 
-+    // Get the list of records that should be copied to pnor.
-+    // The list of records for this vpd sub class will be the primary list.
-+    // If the eeprom is being shared, then their might be an alternate list
-+    // to also include.
-+    const  recordInfo* l_primaryVpdRecords = NULL;
-+    uint64_t           l_primaryRecSize = 0;
-+    const  recordInfo* l_altVpdRecords = NULL;
-+    uint64_t           l_altRecSize = 0;
-+    getRecordLists(l_primaryVpdRecords,
-+                   l_primaryRecSize,
-+                   l_altVpdRecords,
-+                   l_altRecSize);
-+
-     offset = le16toh( toc_rec->record_offset ) + 1;  // skip 'large resource'
- 
-     // Read the PT keyword(s) from the VTOC
-@@ -1367,20 +1381,36 @@ IpVpdFacade::getRecordListSeeprom ( std::list<TocPtRecord> & o_recList,
-               vtoc_pt_offset < pt_len;
-               vtoc_pt_offset += sizeof(TocPtRecord) )
-         {
-+            bool l_found = false;
-             toc_rec =
-                 reinterpret_cast<TocPtRecord*>(l_buffer + vtoc_pt_offset);
- 
-             // Save record if on the list for this target
--            for ( uint32_t rec = 0; rec < iv_recSize; rec++ )
-+            for ( uint32_t rec = 0; rec < l_primaryRecSize; rec++ )
-             {
-                 if ( memcmp( toc_rec->record_name,
--                            iv_vpdRecords[rec].recordName,
-+                            l_primaryVpdRecords[rec].recordName,
-                             RECORD_BYTE_SIZE ) == 0 )
-                 {
-                     o_recList.push_back(*toc_rec);
-+                    l_found = true;
-                     break;
-                 }
-             }
-+            // if not found, check the alternate list
-+            if (!l_found)
-+            {
-+                for ( uint32_t rec = 0; rec < l_altRecSize; rec++ )
-+                {
-+                    if ( memcmp( toc_rec->record_name,
-+                            l_altVpdRecords[rec].recordName,
-+                            RECORD_BYTE_SIZE ) == 0 )
-+                    {
-+                        o_recList.push_back(*toc_rec);
-+                        break;
-+                    }
-+                }
-+            }
-         }
-     }
- 
-@@ -2182,3 +2212,19 @@ void IpVpdFacade::setConfigFlagsHW ( )
-         iv_configInfo.vpdWriteHW = true;
-     }
- }
-+
-+// Return the lists of records that should be copied to pnor.
-+// The default lists to use are this object's record list and size.
-+// No Alternate.
-+void IpVpdFacade::getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize)
-+{
-+    o_primaryVpdRecords = iv_vpdRecords;
-+    o_primaryRecSize = iv_recSize;
-+    o_altVpdRecords = NULL;
-+    o_altRecSize = 0;
-+}
-+
-diff --git a/src/usr/vpd/ipvpd.H b/src/usr/vpd/ipvpd.H
-index 5cc7bec..e4c4162 100644
---- a/src/usr/vpd/ipvpd.H
-+++ b/src/usr/vpd/ipvpd.H
-@@ -677,7 +677,24 @@ class IpVpdFacade
-     errlHndl_t checkBufferSize( size_t i_bufferSize,
-                                 size_t i_expectedSize,
-                                 TARGETING::Target * i_target );
--
-+    /**
-+     * @brief This function returns a primary and an alternate list of records
-+     *       that should be copied to pnor. The Alternate list is optional.
-+     *
-+     * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_primaryRecSize -    Size of o_primaryVpdRecords array
-+     *
-+     * @param[out] o_altVpdRecords -     Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_altRecSize -        Size of o_altVpdRecords array
-+     *
-+     */
-+    virtual void getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize);
- 
-   protected: // Variables
- 
-@@ -693,6 +710,8 @@ class IpVpdFacade
-      */
-     uint64_t iv_vpdMaxSections;
- 
-+
-+  public: // Variables
-     /**
-      * @brief Pointer to array of VPD Record information
-      *
-@@ -705,6 +724,7 @@ class IpVpdFacade
-      */
-     uint64_t iv_recSize;
- 
-+  protected: // Variables
-     /**
-      * @brief Pointer to array of VPD Keyword information
-      *
-diff --git a/src/usr/vpd/pvpd.C b/src/usr/vpd/pvpd.C
-new file mode 100644
-index 0000000..ec62237
---- /dev/null
-+++ b/src/usr/vpd/pvpd.C
-@@ -0,0 +1,369 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/usr/vpd/pvpd.C $                                          */
-+/*                                                                        */
-+/* OpenPOWER HostBoot Project                                             */
-+/*                                                                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
-+/* [+] International Business Machines Corp.                              */
-+/*                                                                        */
-+/*                                                                        */
-+/* Licensed under the Apache License, Version 2.0 (the "License");        */
-+/* you may not use this file except in compliance with the License.       */
-+/* You may obtain a copy of the License at                                */
-+/*                                                                        */
-+/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-+/*                                                                        */
-+/* Unless required by applicable law or agreed to in writing, software    */
-+/* distributed under the License is distributed on an "AS IS" BASIS,      */
-+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-+/* implied. See the License for the specific language governing           */
-+/* permissions and limitations under the License.                         */
-+/*                                                                        */
-+/* IBM_PROLOG_END_TAG                                                     */
-+// ----------------------------------------------
-+// Includes
-+// ----------------------------------------------
-+#include <string.h>
-+#include <endian.h>
-+#include <trace/interface.H>
-+#include <errl/errlentry.H>
-+#include <errl/errlmanager.H>
-+#include <targeting/common/targetservice.H>
-+#include <targeting/common/util.H>
-+#include <targeting/common/utilFilter.H>
-+#include <devicefw/driverif.H>
-+#include <vfs/vfs.H>
-+#include <vpd/vpdreasoncodes.H>
-+#include <vpd/pvpdenums.H>
-+#include <vpd/vpd_if.H>
-+#include <i2c/eepromif.H>
-+#include <config.h>
-+#include "pvpd.H"
-+#include "cvpd.H"
-+#include "vpd.H"
-+
-+// ----------------------------------------------
-+// Trace definitions
-+// ----------------------------------------------
-+extern trace_desc_t* g_trac_vpd;
-+
-+
-+// ------------------------
-+// Macros for unit testing
-+//#define TRACUCOMP(args...)  TRACFCOMP(args)
-+#define TRACUCOMP(args...)
-+//#define TRACSSCOMP(args...)  TRACFCOMP(args)
-+#define TRACSSCOMP(args...)
-+
-+namespace PVPD
-+{
-+    // ----------------------------------------------
-+    // Globals
-+    // ----------------------------------------------
-+    mutex_t g_mutex = MUTEX_INITIALIZER;
-+
-+
-+    /**
-+     * @brief This function will perform the steps required to do a read from
-+     *      the Hostboot PVPD data.
-+     *
-+     * @param[in] i_opType - Operation Type - See DeviceFW::OperationType in
-+     *       driververif.H
-+     *
-+     * @param[in] i_target - Processor Target device
-+     *
-+     * @param [in/out] io_buffer - Pointer to the data that was read from
-+     *       the target device.  This parameter, when set to NULL, will return
-+     *       the keyword size value in io_buflen.
-+     *
-+     * @param [in/out] io_buflen - Length of the buffer to be read or written
-+     *       to/from the target.  This value should indicate the size of the
-+     *       io_buffer parameter that has been allocated.  Being returned it
-+     *       will indicate the number of valid bytes in the buffer being
-+     *       returned. This parameter will contain the size of a keyword when
-+     *       the io_buffer parameter is passed in NULL.
-+     *
-+     * @param [in] i_accessType - Access Type - See DeviceFW::AccessType in
-+     *       usrif.H
-+     *
-+     * @param [in] i_args - This is an argument list for the device driver
-+     *       framework.
-+     *
-+     * @return errlHndl_t - NULL if successful, otherwise a pointer to the
-+     *       error log.
-+     */
-+    errlHndl_t pvpdRead ( DeviceFW::OperationType i_opType,
-+                          TARGETING::Target * i_target,
-+                          void * io_buffer,
-+                          size_t & io_buflen,
-+                          int64_t i_accessType,
-+                          va_list i_args )
-+    {
-+        errlHndl_t err = NULL;
-+        IpVpdFacade::input_args_t args;
-+        args.record = ((pvpdRecord)va_arg( i_args, uint64_t ));
-+        args.keyword = ((pvpdKeyword)va_arg( i_args, uint64_t ));
-+        args.location = ((VPD::vpdCmdTarget)va_arg( i_args, uint64_t ));
-+
-+        TRACSSCOMP( g_trac_vpd,
-+                    ENTER_MRK"pvpdRead()" );
-+
-+        err = Singleton<PvpdFacade>::instance().read(i_target,
-+                                                     io_buffer,
-+                                                     io_buflen,
-+                                                     args);
-+
-+        return err;
-+    }
-+
-+
-+    /**
-+     * @brief This function will perform the steps required to do a write to
-+     *      the Hostboot PVPD data.
-+     *
-+     * @param[in] i_opType - Operation Type - See DeviceFW::OperationType in
-+     *       driververif.H
-+     *
-+     * @param[in] i_target - Processor Target device
-+     *
-+     * @param [in/out] io_buffer - Pointer to the data that was read from
-+     *       the target device.  It will also be used to contain data to
-+     *       be written to the device.
-+     *
-+     * @param [in/out] io_buflen - Length of the buffer to be read or written
-+     *       to/from the target.  This value should indicate the size of the
-+     *       io_buffer parameter that has been allocated.  Being returned it
-+     *       will indicate the number of valid bytes in the buffer being
-+     *       returned.
-+     *
-+     * @param [in] i_accessType - Access Type - See DeviceFW::AccessType in
-+     *       usrif.H
-+     *
-+     * @param [in] i_args - This is an argument list for the device driver
-+     *       framework.
-+     *
-+     * @return errlHndl_t - NULL if successful, otherwise a pointer to the
-+     *       error log.
-+     */
-+    errlHndl_t pvpdWrite ( DeviceFW::OperationType i_opType,
-+                           TARGETING::Target * i_target,
-+                           void * io_buffer,
-+                           size_t & io_buflen,
-+                           int64_t i_accessType,
-+                           va_list i_args )
-+    {
-+        errlHndl_t err = NULL;
-+        IpVpdFacade::input_args_t args;
-+        args.record = ((pvpdRecord)va_arg( i_args, uint64_t ));
-+        args.keyword = ((pvpdKeyword)va_arg( i_args, uint64_t ));
-+        args.location = ((VPD::vpdCmdTarget)va_arg( i_args, uint64_t ));
-+
-+        TRACSSCOMP( g_trac_vpd,
-+                    ENTER_MRK"pvpdWrite()" );
-+
-+
-+        err = Singleton<PvpdFacade>::instance().write(i_target,
-+                                                      io_buffer,
-+                                                      io_buflen,
-+                                                      args);
-+
-+        return err;
-+    }
-+
-+    // Register with the routing code
-+    DEVICE_REGISTER_ROUTE( DeviceFW::READ,
-+                           DeviceFW::PVPD,
-+                           TARGETING::TYPE_NODE,
-+                           pvpdRead );
-+    DEVICE_REGISTER_ROUTE( DeviceFW::WRITE,
-+                           DeviceFW::PVPD,
-+                           TARGETING::TYPE_NODE,
-+                           pvpdWrite );
-+
-+}; // end namespace PVPD
-+
-+#if !defined(__HOSTBOOT_RUNTIME)
-+// --------------------------------------------------------
-+// Presence Detection
-+//---------------------------------------------------------
-+
-+/**
-+ * @brief Performs a presence detect operation on a Node card.
-+ *
-+ * There is no FSI presence detection, just Planar vpd detection.
-+ * Presence is always returned as Success (unless the unlikely case of too
-+ * small of a buffer passed). A problem with planar EEPROM is logged but
-+ * not passed up so that the enclosure and everything inside is not
-+ * deconfigured.
-+ *
-+ * @param[in]   i_opType        Operation type, see DeviceFW::OperationType
-+ *                              in driverif.H
-+ * @param[in]   i_target        Presence detect target
-+ * @param[in/out] io_buffer     Read: Pointer to output data storage
-+ *                              Write: Pointer to input data storage
-+ * @param[in/out] io_buflen     Input: size of io_buffer (in bytes, always 1)
-+ *                              Output: Success = 1, Failure = 0
-+ * @param[in]   i_accessType    DeviceFW::AccessType enum (userif.H)
-+ * @param[in]   i_args          This is an argument list for DD framework.
-+ *                              In this function, there are no arguments.
-+ * @return  errlHndl_t
-+ */
-+errlHndl_t nodePresenceDetect(DeviceFW::OperationType i_opType,
-+                              TARGETING::Target* i_target,
-+                              void* io_buffer,
-+                              size_t& io_buflen,
-+                              int64_t i_accessType,
-+                              va_list i_args)
-+{
-+    errlHndl_t l_errl = NULL;
-+    bool pvpd_present = true;
-+
-+    if (unlikely(io_buflen < sizeof(bool)))
-+    {
-+        TRACFCOMP(g_trac_vpd,
-+                  ERR_MRK "nodePresenceDetect> Invalid data length: %d",
-+                  io_buflen);
-+        /*@
-+         * @errortype
-+         * @moduleid     VPD::VPD_PVPD_PRESENCEDETECT
-+         * @reasoncode   VPD::VPD_INVALID_LENGTH
-+         * @userdata1    Data Length
-+         * @devdesc      presenceDetect> Invalid data length (!= 1 bytes)
-+         */
-+        l_errl =
-+                new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-+                                        VPD::VPD_PVPD_PRESENCEDETECT,
-+                                        VPD::VPD_INVALID_LENGTH,
-+                                        TO_UINT64(io_buflen),
-+                                        true /*SW error*/);
-+        io_buflen = 0;
-+        return l_errl;
-+    }
-+
-+#if defined(CONFIG_PVPD_READ_FROM_HW) && defined(CONFIG_PVPD_READ_FROM_PNOR)
-+    pvpd_present = VPD::pvpdPresent( i_target );
-+    if( pvpd_present )
-+    {
-+        // Check if the VPD data in the PNOR matches the SEEPROM
-+        l_errl = VPD::ensureCacheIsInSync( i_target );
-+        if( l_errl )
-+        {
-+            TRACFCOMP(g_trac_vpd,ERR_MRK "nodePresenceDetect>"
-+                    " Error during ensureCacheIsInSync (PVPD)" );
-+            errlCommit( l_errl, FSI_COMP_ID );
-+        }
-+    }
-+    else
-+    {
-+        TRACFCOMP(g_trac_vpd,
-+                  ERR_MRK "nodePresenceDetect> failed presence detect");
-+
-+        // Invalidate PVPD in the PNOR
-+        l_errl = VPD::invalidatePnorCache(i_target);
-+        if (l_errl)
-+        {
-+            TRACFCOMP( g_trac_vpd, "Error invalidating PVPD in PNOR" );
-+            errlCommit( l_errl, VPD_COMP_ID );
-+        }
-+        pvpd_present = true;
-+    }
-+#endif
-+
-+    // Always return presence.
-+    // A returned error deconfigures the node and stops the IPL.
-+    memcpy(io_buffer, &pvpd_present, sizeof(pvpd_present));
-+    io_buflen = sizeof(pvpd_present);
-+
-+    return NULL;
-+}
-+
-+// Register as the presence detect for nodes.
-+DEVICE_REGISTER_ROUTE(DeviceFW::READ,
-+                      DeviceFW::PRESENT,
-+                      TARGETING::TYPE_NODE,
-+                      nodePresenceDetect);
-+#endif
-+
-+bool VPD::pvpdPresent( TARGETING::Target * i_target )
-+{
-+    TRACSSCOMP( g_trac_vpd, ENTER_MRK"pvpdPresent()");
-+#if(defined( CONFIG_PVPD_READ_FROM_HW ) && !defined( __HOSTBOOT_RUNTIME) )
-+
-+    return EEPROM::eepromPresence( i_target );
-+
-+#else
-+    return Singleton<PvpdFacade>::instance().hasVpdPresent( i_target,
-+                                                            PVPD::OPFR,
-+                                                            PVPD::VP );
-+#endif
-+}
-+
-+
-+//PVPD Class Functions
-+/**
-+ * @brief  Constructor
-+ * Planar VPD is included in the Centaur PNOR section.
-+ * Including with Centaur vpd minimizes the number of PNOR sections.
-+ */
-+PvpdFacade::PvpdFacade() :
-+IpVpdFacade(CVPD::SECTION_SIZE, // note use of CVPD
-+            CVPD::MAX_SECTIONS, // note use of CVPD
-+            PVPD::pvpdRecords,
-+            (sizeof(PVPD::pvpdRecords)/sizeof(PVPD::pvpdRecords[0])),
-+            PVPD::pvpdKeywords,
-+            (sizeof(PVPD::pvpdKeywords)/sizeof(PVPD::pvpdKeywords[0])),
-+            PNOR::CENTAUR_VPD,  // note use of CVPD
-+            PVPD::g_mutex,
-+            VPD::VPD_WRITE_PLANAR)
-+{
-+    TRACUCOMP(g_trac_vpd, "PvpdFacade::PvpdFacade> " );
-+
-+#ifdef CONFIG_PVPD_READ_FROM_PNOR
-+    iv_configInfo.vpdReadPNOR = true;
-+#else
-+    iv_configInfo.vpdReadPNOR = false;
-+#endif
-+#ifdef CONFIG_PVPD_READ_FROM_HW
-+    iv_configInfo.vpdReadHW = true;
-+#else
-+    iv_configInfo.vpdReadHW = false;
-+#endif
-+#ifdef CONFIG_PVPD_WRITE_TO_PNOR
-+    iv_configInfo.vpdWritePNOR = true;
-+#else
-+    iv_configInfo.vpdWritePNOR = false;
-+#endif
-+#ifdef CONFIG_PVPD_WRITE_TO_HW
-+    iv_configInfo.vpdWriteHW = true;
-+#else
-+    iv_configInfo.vpdWriteHW = false;
-+#endif
-+}
-+
-+// Retrun lists of records that should be copied to pnor.
-+void PvpdFacade::getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize)
-+{
-+    // Always return this object's list
-+    o_primaryVpdRecords = iv_vpdRecords;
-+    o_primaryRecSize = iv_recSize;
-+
-+    // If the planar eeprom is being shared with a mem buf,
-+    // then return the cvpd list as the alternative record list.
-+    // At thip point, if the node is be processed, then the mem buffs
-+    // might have not been discovered yet. If cvpd is being cached, then
-+    // include the cvpd list as the altnative.
-+#ifdef CONFIG_CVPD_READ_FROM_PNOR
-+    o_altVpdRecords = Singleton<CvpdFacade>::instance().iv_vpdRecords;
-+    o_altRecSize = Singleton<CvpdFacade>::instance().iv_recSize;
-+#else
-+    o_altVpdRecords = NULL;
-+    o_altRecSize = 0;
-+#endif
-+}
-+
-diff --git a/src/usr/vpd/pvpd.H b/src/usr/vpd/pvpd.H
-new file mode 100644
-index 0000000..092dd45
---- /dev/null
-+++ b/src/usr/vpd/pvpd.H
-@@ -0,0 +1,149 @@
-+/* IBM_PROLOG_BEGIN_TAG                                                   */
-+/* This is an automatically generated prolog.                             */
-+/*                                                                        */
-+/* $Source: src/usr/vpd/pvpd.H $                                          */
-+/*                                                                        */
-+/* OpenPOWER HostBoot Project                                             */
-+/*                                                                        */
-+/* Contributors Listed Below - COPYRIGHT 2013,2015                        */
-+/* [+] International Business Machines Corp.                              */
-+/*                                                                        */
-+/*                                                                        */
-+/* Licensed under the Apache License, Version 2.0 (the "License");        */
-+/* you may not use this file except in compliance with the License.       */
-+/* You may obtain a copy of the License at                                */
-+/*                                                                        */
-+/*     http://www.apache.org/licenses/LICENSE-2.0                         */
-+/*                                                                        */
-+/* Unless required by applicable law or agreed to in writing, software    */
-+/* distributed under the License is distributed on an "AS IS" BASIS,      */
-+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
-+/* implied. See the License for the specific language governing           */
-+/* permissions and limitations under the License.                         */
-+/*                                                                        */
-+/* IBM_PROLOG_END_TAG                                                     */
-+#ifndef __PVPD_H
-+#define __PVPD_H
-+
-+
-+/**
-+ * @file pvpd.H
-+ *
-+ * @brief Provides the interfaces for the PVPD device driver
-+ *
-+ */
-+
-+// ----------------------------------------------
-+// Includes
-+// ----------------------------------------------
-+#include <errl/errlentry.H>
-+#include <vpd/pvpdenums.H>
-+
-+#include "ipvpd.H"
-+#include <config.h>
-+
-+namespace PVPD
-+{
-+
-+    /**
-+     * @brief Conversion of PVPD Records to corresponding character
-+     *        representation.
-+     */
-+    const IpVpdFacade::recordInfo pvpdRecords[] =
-+    {
-+        // -------------------------------------------------------------------
-+        // NOTE: This list must remain an ordered list!  There will be a
-+        //      testcase that checks this.  When adding new entries to the
-+        //      list, be sure that the keyword in each entry (value 0)
-+        //      are in ascending order.
-+        // -------------------------------------------------------------------
-+        { VINI, "VINI" },
-+        { OSYS, "OSYS" },
-+        { OPFR, "OPFR" },
-+        { VNDR, "VNDR" },
-+        // -------------------------------------------------------------------
-+        // DO NOT USE!!  This is for test purposes ONLY!
-+        { PVPD_TEST_RECORD, "TEST" },
-+        // -------------------------------------------------------------------
-+    };
-+
-+    /**
-+     * @brief Conversion of PVPD Keywords to corresponding character
-+     *        representation.
-+     */
-+    const IpVpdFacade::keywordInfo pvpdKeywords[] =
-+    {
-+        // -------------------------------------------------------------------
-+        // NOTE: This list must remain an ordered list!  There will be a
-+        //      testcase that checks this.  When adding new entries to
-+        //      the list, be sure that the keyword in each entry (value 0)
-+        //      are in ascending order.
-+        // -------------------------------------------------------------------
-+        { pdI, "#I" },
-+        { B3,  "B3" },
-+        { B4,  "B4" },
-+        { B7,  "B7" },
-+        { CC,  "CC" },
-+        { CE,  "CE" },
-+        { CT,  "CT" },
-+        { DR,  "DR" },
-+        { ET,  "ET" },
-+        { FN,  "FN" },
-+        { HE,  "HE" },
-+        { HW,  "HW" },
-+        { IN,  "IN" },
-+        { MM,  "MM" },
-+        { PF,  "PF" },
-+        { PN,  "PN" },
-+        { RT,  "RT" },
-+        { SN,  "SN" },
-+        { SS,  "SS" },
-+        { VD,  "VD" },
-+        { VN,  "VN" },
-+        { VP,  "VP" },
-+        { VS,  "VS" },
-+        { VZ,  "VZ" },
-+
-+        // -------------------------------------------------------------------
-+        // DO NOT USE!!  This is for test purposes ONLY!
-+        { PVPD_TEST_KEYWORD, "XX" },
-+        // -------------------------------------------------------------------
-+
-+        //Common ipvpd
-+        { FULL_RECORD, "FL"},
-+    };
-+
-+}; // end PVPD namespace
-+
-+class PvpdFacade: public IpVpdFacade
-+{
-+  public:
-+
-+    /**
-+     * @brief Constructor
-+     */
-+    PvpdFacade( );
-+
-+  private:
-+
-+    /**
-+     * @brief This function returns a primary and an alternate list of records
-+     *       that should be copied to pnor. The Alternate list is optional.
-+     *
-+     * @param[out] o_primaryVpdRecords - Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_primaryRecSize -    Size of o_primaryVpdRecords array
-+     *
-+     * @param[out] o_altVpdRecords -     Pointer to array of VPD Records to use
-+     *
-+     * @param[out] o_altRecSize -        Size of o_altVpdRecords array
-+     *
-+     */
-+    void getRecordLists(
-+                const  recordInfo* & o_primaryVpdRecords,
-+                uint64_t           & o_primaryRecSize,
-+                const  recordInfo* & o_altVpdRecords,
-+                uint64_t           & o_altRecSize);
-+
-+};
-+#endif  // __PVPD_H
-diff --git a/src/usr/vpd/vpd.C b/src/usr/vpd/vpd.C
-index 9b4e1f8..3656696 100755
---- a/src/usr/vpd/vpd.C
-+++ b/src/usr/vpd/vpd.C
-@@ -34,10 +34,9 @@
- #include "vpd.H"
- #include "mvpd.H"
- #include "cvpd.H"
-+#include "pvpd.H"
- #include "spd.H"
- 
--
--
- // ----------------------------------------------
- // Trace definitions
- // ----------------------------------------------
-@@ -456,6 +455,13 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
-         l_keywordPN = CVPD::VP;
-         l_keywordSN = CVPD::VS;
-     }
-+    else if( l_type == TARGETING::TYPE_NODE )
-+    {
-+        l_ipvpd     = &(Singleton<PvpdFacade>::instance());
-+        l_record    = PVPD::OPFR;
-+        l_keywordPN = PVPD::VP;
-+        l_keywordSN = PVPD::VS;
-+    }
-     else if( l_type == TARGETING::TYPE_DIMM )
-     {
-         // SPD does not have a singleton instance
-@@ -487,7 +493,8 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
-     do
-     {
-         // Make sure we are comparing the correct pn/sn for CVPD
--        if( l_type == TARGETING::TYPE_MEMBUF )
-+        if( ( l_type == TARGETING::TYPE_MEMBUF ) ||
-+            ( l_type == TARGETING::TYPE_NODE   ) )
-         {
-             bool l_zeroPN;
-             l_err = l_ipvpd->cmpSeepromToZero( i_target,
-@@ -523,6 +530,7 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
-         // Compare the Part Numbers in PNOR/SEEPROM
-         bool l_matchPN = false;
-         if( ( l_type == TARGETING::TYPE_PROC   ) ||
-+            ( l_type == TARGETING::TYPE_NODE   ) ||
-             ( l_type == TARGETING::TYPE_MEMBUF ) )
-         {
-             l_err = l_ipvpd->cmpPnorToSeeprom( i_target,
-@@ -577,7 +585,8 @@ errlHndl_t ensureCacheIsInSync ( TARGETING::Target * i_target )
-             HWAS::markTargetChanged(i_target);
- 
-             // Load the PNOR data from the SEEPROM
--            if( ( l_type == TARGETING::TYPE_PROC   ) ||
-+            if( ( l_type == TARGETING::TYPE_PROC ) ||
-+                ( l_type == TARGETING::TYPE_NODE ) ||
-                 ( l_type == TARGETING::TYPE_MEMBUF ) )
-             {
-                 l_err = l_ipvpd->loadPnor( i_target );
-diff --git a/src/usr/vpd/vpd.H b/src/usr/vpd/vpd.H
-index 9c39a7f..e6cada7 100644
---- a/src/usr/vpd/vpd.H
-+++ b/src/usr/vpd/vpd.H
-@@ -50,6 +50,7 @@ enum VPD_MSG_TYPE
-     VPD_WRITE_DIMM    = 0x00C1, //< DIMM SPD
-     VPD_WRITE_PROC    = 0x00C2, //< Processor MVPD
-     VPD_WRITE_MEMBUF  = 0x00C3, //< Centaur FRU VPD
-+    VPD_WRITE_PLANAR  = 0x00C4, //< Planar VPD
- };
- 
- /**
-diff --git a/src/usr/vpd/vpd.mk b/src/usr/vpd/vpd.mk
-index 9f85755..65d22e3 100644
---- a/src/usr/vpd/vpd.mk
-+++ b/src/usr/vpd/vpd.mk
-@@ -5,7 +5,9 @@
- #
- # OpenPOWER HostBoot Project
- #
--# COPYRIGHT International Business Machines Corp. 2013,2014
-+# Contributors Listed Below - COPYRIGHT 2013,2015
-+# [+] International Business Machines Corp.
-+#
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
-@@ -24,5 +26,6 @@
- OBJS += ipvpd.o
- OBJS += mvpd.o
- OBJS += cvpd.o
-+OBJS += pvpd.o
- OBJS += spd.o
- OBJS += errlud_vpd.o
--- 
-1.8.2.2
-
diff --git a/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch b/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch
deleted file mode 100644
index bbbc2ff..0000000
--- a/openpower/package/hostboot/hostboot-0011-Support-for-OCC-Centaur-numbering.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 9d5d91597d325d63465a4f62a98bb5d8ff0f90a4 Mon Sep 17 00:00:00 2001
-From: Doug Gilbert <dgilbert@us.ibm.com>
-Date: Wed, 3 Jun 2015 14:06:09 -0500
-Subject: [PATCH] Support for OCC Centaur numbering
-
-Change-Id: I11f6641548dbb0a0f4f586f592fa0d357a6c9a84
-RTC: 127111
-Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/18179
-Tested-by: Jenkins Server
-Reviewed-by: Christopher Cain <cjcain@us.ibm.com>
-Reviewed-by: Martha Broyles <mbroyles@us.ibm.com>
-Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
----
- src/usr/htmgt/htmgt_cfgdata.C | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/usr/htmgt/htmgt_cfgdata.C b/src/usr/htmgt/htmgt_cfgdata.C
-index dcf1f9d..f4bcfd8 100644
---- a/src/usr/htmgt/htmgt_cfgdata.C
-+++ b/src/usr/htmgt/htmgt_cfgdata.C
-@@ -307,6 +307,8 @@ void getMemConfigMessageData(const TargetHandle_t i_occ,
- 
-             //Centaur #
-             centPos = (*centaur)->getAttr<ATTR_POSITION>();
-+            // ATTR_POSITION is system wide. Must be 0-7 on each OCC
-+            centPos = centPos % 8;
-             o_data[index++] = centPos;
- 
-             //Dimm # (0xFF since a centaur)
-@@ -425,6 +427,8 @@ void getMemThrottleMessageData(const TargetHandle_t i_occ,
-     for (centaur=centaurs.begin(); centaur!=centaurs.end(); ++centaur)
-     {
-         centPos = (*centaur)->getAttr<ATTR_POSITION>();
-+        // ATTR_POSITION is system wide. Must 0-7 on each OCC
-+        centPos = centPos % 8;
- 
-         mbas.clear();
-         getChildAffinityTargets(mbas, *centaur,
--- 
-2.3.0
-
diff --git a/openpower/package/hostboot/hostboot.mk b/openpower/package/hostboot/hostboot.mk
index 3b7bc6f..63e2123 100644
--- a/openpower/package/hostboot/hostboot.mk
+++ b/openpower/package/hostboot/hostboot.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOSTBOOT_VERSION ?= c646754e720b5cd21534425ca90bb414a4a3ff12
+HOSTBOOT_VERSION ?= 17f94afce9979da7c750fd8022604dc0b43dcf4f
 HOSTBOOT_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_VERSION))
 
 HOSTBOOT_LICENSE = Apache-2.0
