diff --git a/openpower/configs/vesnin_defconfig b/openpower/configs/vesnin_defconfig
index 280c3b5..a755844 100644
--- a/openpower/configs/vesnin_defconfig
+++ b/openpower/configs/vesnin_defconfig
@@ -36,7 +36,7 @@
 BR2_OPENPOWER_POWER8=y
 BR2_HOSTBOOT_P8_CONFIG_FILE="vesnin.config"
 BR2_OPENPOWER_MACHINE_XML_GITHUB_PROJECT_VALUE="vesnin-xml"
-BR2_OPENPOWER_MACHINE_XML_VERSION="118e0a59c1a98283e2a33d8c18e8d0e556527317"
+BR2_OPENPOWER_MACHINE_XML_VERSION="4fb3a4b928a9e7702c154e447898b6b955072cf6"
 BR2_OPENPOWER_MACHINE_XML_FILENAME="vesnin.xml"
 BR2_OPENPOWER_SYSTEM_XML_FILENAME="VESNIN_hb.system.xml"
 BR2_OPENPOWER_MRW_XML_FILENAME="VESNIN_hb.mrw.xml"
diff --git a/openpower/package/hcode/Config.in b/openpower/package/hcode/Config.in
index 2b63240..1b77a56 100644
--- a/openpower/package/hcode/Config.in
+++ b/openpower/package/hcode/Config.in
@@ -31,7 +31,7 @@
 
 config BR2_HCODE_VERSION
 	string
-	default "hw090518a.930" if BR2_HCODE_LATEST_VERSION
+	default "hw100918a.930" if BR2_HCODE_LATEST_VERSION
 	default BR2_HCODE_CUSTOM_VERSION_VALUE \
 		if BR2_HCODE_CUSTOM_VERSION
 
diff --git a/openpower/package/hostboot-binaries/Config.in b/openpower/package/hostboot-binaries/Config.in
index 3e4be2a..09896df 100644
--- a/openpower/package/hostboot-binaries/Config.in
+++ b/openpower/package/hostboot-binaries/Config.in
@@ -24,7 +24,7 @@
 
 config BR2_HOSTBOOT_BINARIES_VERSION
 	string
-	default "hw090518a.930" if BR2_HOSTBOOT_BINARIES_LATEST_VERSION
+	default "hw091818a.930" if BR2_HOSTBOOT_BINARIES_LATEST_VERSION
 	default BR2_HOSTBOOT_BINARIES_CUSTOM_VERSION_VALUE \
 		if BR2_HOSTBOOT_BINARIES_CUSTOM_VERSION
 
diff --git a/openpower/package/hostboot-p8/hostboot-p8.mk b/openpower/package/hostboot-p8/hostboot-p8.mk
index 9f6d45f..fb3901d 100644
--- a/openpower/package/hostboot-p8/hostboot-p8.mk
+++ b/openpower/package/hostboot-p8/hostboot-p8.mk
@@ -3,7 +3,7 @@
 # hostboot for POWER8
 #
 ################################################################################
-HOSTBOOT_P8_VERSION ?= e74ef0f31e326658cb7165c205aa30978564b2df
+HOSTBOOT_P8_VERSION ?= 335b7ca02e5bd58fbd8cac6b3133a260327cd6b4
 
 HOSTBOOT_P8_SITE ?= $(call github,open-power,hostboot,$(HOSTBOOT_P8_VERSION))
 
diff --git a/openpower/package/hostboot/Config.in b/openpower/package/hostboot/Config.in
index 8ac7257..5349272 100644
--- a/openpower/package/hostboot/Config.in
+++ b/openpower/package/hostboot/Config.in
@@ -28,7 +28,7 @@
 
 config BR2_HOSTBOOT_VERSION
 	string
-	default "192ca8aa60bd0f568f0ec40d58294b761665d91e" if BR2_HOSTBOOT_LATEST_VERSION
+	default "52f52bb84c856d71466ee19acdd8943565be39cc" if BR2_HOSTBOOT_LATEST_VERSION
         default "876b79aacd9b14f4c3561e954daa0285747c9662" if BR2_HOSTBOOT_STABLE_VERSION
 	default BR2_HOSTBOOT_CUSTOM_VERSION_VALUE \
 		if BR2_HOSTBOOT_CUSTOM_VERSION
diff --git a/openpower/package/hostboot/hostboot-0002-Revert-Mark-Read-Only-Partitions-as-Such.patch b/openpower/package/hostboot/hostboot-0002-Revert-Mark-Read-Only-Partitions-as-Such.patch
deleted file mode 100644
index c572fee..0000000
--- a/openpower/package/hostboot/hostboot-0002-Revert-Mark-Read-Only-Partitions-as-Such.patch
+++ /dev/null
@@ -1,371 +0,0 @@
-From 3dba59d5b60a9ad307b91d4063279cb1535cda8f Mon Sep 17 00:00:00 2001
-From: Stewart Smith <stewart@linux.ibm.com>
-Date: Wed, 18 Apr 2018 17:06:09 +1000
-Subject: [PATCH] Revert "Mark Read-Only Partitions as Such"
-
-This reverts commit f5cd23d6c3be17356e0851ec5d5bb65cee48f15f.
-
-Only changing the presence of this commit, we go from failing to boot
-(error below) to being able to boot.
-
- 24.41069|ISTEP 10. 2 - host_slave_sbe_update
- 24.44213|System shutting down with error status 0x90000012
- 24.45270|================================================
- 24.45420|Error reported by initservice (0x0500) PLID 0x90000012
- 24.45422|  Initialization Service launched a function and
-the task returned an error.
- 24.45423|  ModuleId   0x01 BASE_INITSVC_MOD_ID
- 24.45573|  ReasonCode 0x0506 WAIT_FN_FAILED
- 24.45574|  UserData1  task id or task return code : 0x00000000000000ec
- 24.45574|  UserData2  returned status from task : 0x0000000000000001
- 24.45575|------------------------------------------------
- 24.45875|  Callout type             : Procedure Callout
- 24.45876|  Procedure                : EPUB_PRC_HB_CODE
- 24.45876|  Priority                 : SRCI_PRIORITY_HIGH
- 24.45877|------------------------------------------------
- 24.45878|  host_slave_sbe_update
- 24.45878|------------------------------------------------
- 24.45879|  Hostboot Build ID:
- 24.45879|================================================
-
-Change-Id: I7ac38afc8bed608d6272f1ef6f099e3fc03bb270
-Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
----
- src/include/usr/pnor/pnor_reasoncodes.H         |   1 -
- src/usr/pnor/pnorrp.C                           |  15 +-
- src/usr/pnor/test/pnorrptest.H                  | 188 ++++++++----------------
- src/usr/secureboot/base/test/securerommgrtest.H |  20 ---
- 4 files changed, 71 insertions(+), 153 deletions(-)
-
-diff --git a/src/include/usr/pnor/pnor_reasoncodes.H b/src/include/usr/pnor/pnor_reasoncodes.H
-index 2835f8a153d0..4dd2ef1c43de 100644
---- a/src/include/usr/pnor/pnor_reasoncodes.H
-+++ b/src/include/usr/pnor/pnor_reasoncodes.H
-@@ -187,7 +187,6 @@ namespace PNOR
-         RC_SECURE_SIZE_MISMATCH      = PNOR_COMP_ID | 0x3A,
-         RC_NOT_PAGE_ALIGNED          = PNOR_COMP_ID | 0x3B,
-         RC_SECURE_PRO_SIZE_MISMATCH  = PNOR_COMP_ID | 0x3C,
--        RC_READ_ONLY_PERM_FAIL       = PNOR_COMP_ID | 0x3D,
- 
-         //@fixme-RTC:131607-Temporary value to allow HWSV compile
-         //termination_rc
-diff --git a/src/usr/pnor/pnorrp.C b/src/usr/pnor/pnorrp.C
-index df88ba821b70..e33a1b0c377c 100644
---- a/src/usr/pnor/pnorrp.C
-+++ b/src/usr/pnor/pnorrp.C
-@@ -1776,31 +1776,32 @@ errlHndl_t PnorRP::setVirtAddrs(void)
-           // Handle section permissions
-         if (iv_TOC[i].misc & FFS_MISC_READ_ONLY)
-         {
--            // Partitions marked with readOnly flag should be
--            // READ_ONLY and not WRITABLE.
-+            // Need to set permissions to allow writing to virtual
-+            // addresses, but prevents the kernel from ejecting
-+            // dirty pages (no WRITE_TRACKED).
-             int rc = mm_set_permission(
-                                     (void*)iv_TOC[i].virtAddr,
-                                     iv_TOC[i].size,
--                                    READ_ONLY);
-+                                    WRITABLE);
-             if (rc)
-             {
--                TRACFCOMP(g_trac_pnor, "E>PnorRP::readTOC: Failed to set block permissions to READ_ONLY for section %s.",
-+                TRACFCOMP(g_trac_pnor, "E>PnorRP::readTOC: Failed to set block permissions to WRITABLE for section %s.",
-                           SectionIdToString(i));
-                 /*@
-                 * @errortype
-                 * @moduleid PNOR::MOD_PNORRP_READTOC
--                * @reasoncode PNOR::RC_READ_ONLY_PERM_FAIL
-+                * @reasoncode PNOR::RC_WRITABLE_PERM_FAIL
-                 * @userdata1 PNOR section id
-                 * @userdata2 PNOR section vaddr
-                 * @devdesc Could not set permissions of the
--                *          given PNOR section to READ_ONLY
-+                *          given PNOR section to WRITABLE
-                 * @custdesc A problem occurred while reading
-                 *           Processor NOR flash partition table
-                 */
-                 l_errhdl = new ERRORLOG::ErrlEntry(
-                                 ERRORLOG::ERRL_SEV_UNRECOVERABLE,
-                                 PNOR::MOD_PNORRP_READTOC,
--                                PNOR::RC_READ_ONLY_PERM_FAIL,
-+                                PNOR::RC_WRITABLE_PERM_FAIL,
-                                 i,
-                                 iv_TOC[i].virtAddr,
-                                 true /*Add HB SW Callout*/);
-diff --git a/src/usr/pnor/test/pnorrptest.H b/src/usr/pnor/test/pnorrptest.H
-index 5108840f5040..942eff9abdff 100644
---- a/src/usr/pnor/test/pnorrptest.H
-+++ b/src/usr/pnor/test/pnorrptest.H
-@@ -5,7 +5,7 @@
- /*                                                                        */
- /* OpenPOWER HostBoot Project                                             */
- /*                                                                        */
--/* Contributors Listed Below - COPYRIGHT 2011,2018                        */
-+/* Contributors Listed Below - COPYRIGHT 2011,2017                        */
- /* [+] Google Inc.                                                        */
- /* [+] International Business Machines Corp.                              */
- /*                                                                        */
-@@ -39,7 +39,6 @@
- #include <sys/msg.h>
- #include <limits.h>
- #include <sys/mm.h>
--#include <sys/task.h>
- #include <targeting/common/targetservice.H>
- #include <devicefw/userif.H>
- #include <config.h>
-@@ -626,53 +625,82 @@ class PnorRpTest : public CxxTest::TestSuite
-     }
- 
-     /**
--     * @brief PNOR RP test - read_ReadOnly_partition
--     *        Tests if we can read a readOnly partition
-+     * @brief PNOR RP test - ReadOnlyTag
-+     *        Tests if readOnly tag on a section is being processed correctly
-      *
-      */
--    void test_read_ReadOnly_partition(void)
-+    void test_ReadOnlyTag(void)
-     {
--        TRACFCOMP(g_trac_pnor,"PnorRpTest::test_read_ReadOnly_partition Start");
--
--        int l_status = TASK_STATUS_EXITED_CLEAN;
--        PNOR::SectionId l_testroSecId = PNOR::TESTRO;
--        tid_t l_childTask =
--                         task_create(readFromReadOnlyPartition, &l_testroSecId);
-+        TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag Start" );
-+        PNOR::SectionInfo_t l_info;
-+        errlHndl_t l_errhdl = NULL;
-+        uint64_t chip_select = 0xF;
-+        bool needs_ecc = false;
- 
--        if((l_childTask != task_wait_tid(l_childTask, &l_status, nullptr)) ||
--           (l_status != TASK_STATUS_EXITED_CLEAN))
-+        l_errhdl = PNOR::getSectionInfo(PNOR::TESTRO, l_info);
-+        if( l_errhdl )
-         {
--            TS_FAIL("Could not read from readOnly partition.");
-+            TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag> ERROR : getSectionInfo returned error for %d : RC=%X",
-+                      PNOR::TESTRO, l_errhdl->reasonCode());
-+            ERRORLOG::errlCommit(l_errhdl, PNOR_COMP_ID);
-+            TS_FAIL( "PnorRpTest::test_ReadOnlyTag> ERROR : could not read pnor section %d", PNOR::TESTRO);
-         }
--        TRACFCOMP(g_trac_pnor,"PnorRpTest::test_read_ReadOnly_partition End");
--    }
- 
--    /**
--     * @brief PNOR RP test - write_ReadOnly_partition
--     *        Tests if we can write to a readOnly partition (fail expected)
--     *
--     */
--    void test_write_ReadOnly_partition(void)
--    {
--        TRACFCOMP(g_trac_pnor,
--                             "PnorRpTest::test_write_ReadOnly_partition Start");
-+        // Write some data
-+        const uint64_t l_writeData = 0x1122334455667788;
-+        uint64_t* l_dataptr = reinterpret_cast<uint64_t*> (l_info.vaddr);
-+        l_dataptr[0] = l_writeData;
- 
--        int l_status = TASK_STATUS_EXITED_CLEAN;
--        PNOR::SectionId l_testroSecId = PNOR::TESTRO;
-+        // Flush the page to make sure it gets out to the device
-+        // Due to ReadOnly permissions set on TESTRO should be a no-op
-+        int rc = mm_remove_pages( RELEASE, l_dataptr, PAGESIZE );
-+        if( rc )
-+        {
-+            TRACFCOMP( g_trac_pnor, "PnorRpTest::test_ReadOnlyTag> ERROR : error on RELEASE : rc=%X", rc );
-+            TS_FAIL( "PnorRpTest::test_ReadOnlyTag> ERROR : error on RELEASE" );
-+        }
- 
--        printk("Test case: Expect to see uncaught exception! ");
--        tid_t l_childTask =
--                          task_create(writeToReadOnlyPartition, &l_testroSecId);
-+        // Get physical address of pnor section
-+        uint64_t l_address = 0;
-+        l_errhdl = PnorRP::getInstance().computeDeviceAddr((void*)l_info.vaddr,
-+                                                        l_address,
-+                                                        chip_select,
-+                                                        needs_ecc);
-+        if(l_errhdl)
-+        {
-+            TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag> ERROR : computeDeviceAddr vaddr = 0x%X",l_info.vaddr);
-+            errlCommit(l_errhdl,PNOR_COMP_ID);
-+            TS_FAIL( "PnorRpTest::test_ReadOnlyTag> ERROR : computeDeviceAddr vaddr = 0x%X",l_info.vaddr);
-+        }
- 
--        if((l_childTask != task_wait_tid(l_childTask, &l_status, nullptr)) ||
--           (l_status != TASK_STATUS_CRASHED))
-+        // Read pnor section and check if write did not occur
-+        uint64_t l_readData = 0;
-+        size_t l_size = sizeof(uint64_t);
-+        l_errhdl = deviceRead(TARGETING::MASTER_PROCESSOR_CHIP_TARGET_SENTINEL,
-+                              &l_readData,
-+                              l_size,
-+                              DEVICE_PNOR_ADDRESS(0, l_address));
-+        TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag> Read Data = 0x%X",l_readData);
-+        if(l_errhdl)
-         {
--            TS_FAIL("Write to readOnly partition exception not caught.");
-+            TS_FAIL("PnorRpTest::test_ReadOnlyTag: deviceRead() failed! Error committed.");
-+            ERRORLOG::errlCommit(l_errhdl, PNOR_COMP_ID);
-+        }
-+        if(l_readData == l_writeData)
-+        {
-+            TS_FAIL("PnorRpTest::test_ReadOnlyTag: Data was written to readOnly section = %s",
-+                     l_info.name);
-+        }
-+        if(l_size != sizeof(uint64_t))
-+        {
-+            TS_FAIL("PnorRpTest::test_ReadOnlyTag: deviceRead() Read length not expected value. Addr: 0x%llx, Exp: %d, Act: %d",
-+                    l_address, sizeof(uint64_t), l_size);
-         }
- 
--        TRACFCOMP(g_trac_pnor, "PnorRpTest::test_write_ReadOnly_partition End");
-+        TRACFCOMP(g_trac_pnor, "PnorRpTest::test_ReadOnlyTag End");
-     }
- 
-+
-     //@todo - import config data from build and compare to section info
- 
-     /**
-@@ -885,97 +913,7 @@ class PnorRpTest : public CxxTest::TestSuite
- 
-         } while (0);
- #endif
--    }
--
--    private:
--    static void* readFromReadOnlyPartition(void* i_section)
--    {
--        TRACFCOMP(g_trac_pnor, "readFromReadOnlyPartition Start");
--        PNOR::SectionId* l_section =
--                                reinterpret_cast<PNOR::SectionId*>(i_section);
--        PNOR::SectionInfo_t l_info;
--        errlHndl_t l_errhdl = nullptr;
--
--        do {
--
--        if(isEnforcedSecureSection(*l_section))
--        {
--            TS_FAIL("readFromReadOnlyPartition: section %d is secure."
--                    " readFromReadOnlyPartition does not support testing"
--                    " secure sections.", *l_section);
--            break;
--        }
--
--        l_errhdl = PNOR::getSectionInfo(*l_section, l_info);
--        if(l_errhdl)
--        {
--            TRACFCOMP(g_trac_pnor, "readFromReadOnlyPartition: getSectionInfo "
--                      " returned an error for section %d : RC = 0x%.04x",
--                      *l_section, l_errhdl->reasonCode());
--            ERRORLOG::errlCommit(l_errhdl, PNOR_COMP_ID);
--            TS_FAIL("readFromReadOnlyPartition: failed to getSectionInfo"
--                    " for section %d", *l_section);
--            break;
--        }
--
--        uint64_t l_data = 0;
--        memcpy(&l_data, (void*)l_info.vaddr, sizeof(l_data));
--        // For this testing purpose, it doesn't actually matter what the data is
--        } while(0);
--        TRACFCOMP(g_trac_pnor, "readFromReadOnlyPartition End");
--        return nullptr;
--    }
--
--    static void* writeToReadOnlyPartition(void* i_section)
--    {
--        TRACFCOMP(g_trac_pnor, "writeToReadOnlyPartition Start");
--        PNOR::SectionId* l_section =
--                                reinterpret_cast<PNOR::SectionId*>(i_section);
--        PNOR::SectionInfo_t l_info;
--        errlHndl_t l_errhdl = nullptr;
--
--        do {
--
--        if(isEnforcedSecureSection(*l_section))
--        {
--            TS_FAIL("writeToReadOnlyPartition: section %d is secure."
--                    " writeToReadOnlyPartition does not support testing secure"
--                    " sections.", *l_section);
--            break;
--        }
--
--        l_errhdl = PNOR::getSectionInfo(*l_section, l_info);
--        if(l_errhdl)
--        {
--            TRACFCOMP(g_trac_pnor, "writeToReadOnlyPartition:"
--                      " getSectionInfo returned"
--                      " an error for section %d : RC=0x%.04x",
--                      *l_section, l_errhdl->reasonCode());
--            ERRORLOG::errlCommit(l_errhdl, PNOR_COMP_ID);
--            TS_FAIL("writeToReadOnlyPartition: could not read pnor section %d",
--                                                                    *l_section);
--            break;
--        }
--
--        // Write some data; should cause a task crash
--        const uint64_t l_writeData = 0x1122334455667788;
--        uint64_t* l_dataptr = reinterpret_cast<uint64_t*> (l_info.vaddr);
--        l_dataptr[0] = l_writeData;
--
--        int rc = mm_remove_pages(RELEASE, l_dataptr, PAGESIZE);
--        if(!rc)
--        {
--            TRACFCOMP(g_trac_pnor, "writeToReadOnlyPartition : uncaught "
--                      "exception - write to a readOnly partition succeeded");
--            TS_FAIL("writeToReadOnlyPartition : no error returned on writing to"
--                    " a readOnly partition");
--            break;
--        }
--
--        } while(0);
--        TRACFCOMP(g_trac_pnor, "writeToReadOnlyPartition End");
--        return nullptr;
--    }
-+     }
- };
- 
- 
-diff --git a/src/usr/secureboot/base/test/securerommgrtest.H b/src/usr/secureboot/base/test/securerommgrtest.H
-index 35e70f707598..8ffa8375daff 100644
---- a/src/usr/secureboot/base/test/securerommgrtest.H
-+++ b/src/usr/secureboot/base/test/securerommgrtest.H
-@@ -380,16 +380,6 @@ class SecureRomManagerTest : public CxxTest::TestSuite
-                                - VFS::VfsRp::getInstance().iv_unprotectedOffset
-                                + l_vaddr;
-         memcpy(l_originPage, reinterpret_cast<uint8_t*>(l_pnorVaddr), PAGESIZE);
--        // Open the write permissions to allow the test to temporarily corrupt
--        // the partition.
--        int l_rc = mm_set_permission(reinterpret_cast<void*>(l_pnorVaddr),
--                                     2*PAGESIZE,
--                                     WRITABLE);
--        if(l_rc)
--        {
--            TS_FAIL("mm_set_permission: Cannot set permissions to write");
--            break;
--        }
- 
-         // Corrupt page
-         uint8_t l_corruptByte = 0xFF;
-@@ -410,16 +400,6 @@ class SecureRomManagerTest : public CxxTest::TestSuite
-         delete l_errl;
-         l_errl = nullptr;
- 
--        // Reset to read-only permissions.
--        l_rc = mm_set_permission(reinterpret_cast<void*>(l_pnorVaddr),
--                                     2*PAGESIZE,
--                                     READ_ONLY);
--        if(l_rc)
--        {
--            TS_FAIL("mm_set_permission: Cannot reset permissions to read only");
--            break;
--        }
--
-         } while(0);
- 
-         if ( signedFile_pageAddr != nullptr   )
--- 
-2.14.3
-
diff --git a/openpower/package/openpower-pnor/openpower-pnor.mk b/openpower/package/openpower-pnor/openpower-pnor.mk
index 04511fb..b96fc9a 100644
--- a/openpower/package/openpower-pnor/openpower-pnor.mk
+++ b/openpower/package/openpower-pnor/openpower-pnor.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-OPENPOWER_PNOR_VERSION ?= f6d970c6a600a7e248fa5d604eb471db4482760b
+OPENPOWER_PNOR_VERSION ?= 2e68ed6a605d709e09fe268366565a3f10afec31
 OPENPOWER_PNOR_SITE ?= $(call github,open-power,pnor,$(OPENPOWER_PNOR_VERSION))
 
 OPENPOWER_PNOR_LICENSE = Apache-2.0
@@ -149,7 +149,7 @@
             -targeting_binary_filename $(BR2_OPENPOWER_TARGETING_ECC_FILENAME) \
             -wofdata_binary_filename $(OPENPOWER_PNOR_SCRATCH_DIR)/$(BR2_WOFDATA_BINARY_FILENAME) \
             -memddata_binary_filename $(OPENPOWER_PNOR_SCRATCH_DIR)/$(BR2_MEMDDATA_BINARY_FILENAME) \
-            -openpower_version_filename $(OPENPOWER_PNOR_VERSION_FILE)
+            -openpower_version_filename $(OPENPOWER_PNOR_SCRATCH_DIR)/openpower_pnor_version.bin
 
         $(INSTALL) $(STAGING_DIR)/pnor/$(BR2_OPENPOWER_PNOR_FILENAME) $(BINARIES_DIR)
 
diff --git a/openpower/package/openpower-vpnor/openpower-vpnor.mk b/openpower/package/openpower-vpnor/openpower-vpnor.mk
index 6a6cdff..5666617 100644
--- a/openpower/package/openpower-vpnor/openpower-vpnor.mk
+++ b/openpower/package/openpower-vpnor/openpower-vpnor.mk
@@ -4,7 +4,7 @@
 #
 ################################################################################
 
-HOST_OPENPOWER_VPNOR_VERSION ?= 643e730e3b9818bdd878eebee209b268c234fc65
+HOST_OPENPOWER_VPNOR_VERSION ?= c39d923fee581533775e37be3f59f77c021718ee
 HOST_OPENPOWER_VPNOR_SITE ?= $(call github,openbmc,openpower-pnor-code-mgmt,$(HOST_OPENPOWER_VPNOR_VERSION))
 HOST_OPENPOWER_VPNOR_DEPENDENCIES = host-squashfs host-libflash
 
diff --git a/openpower/package/sb-signing-utils/sb-signing-utils.mk b/openpower/package/sb-signing-utils/sb-signing-utils.mk
index aa1f1cf..71a04ec 100644
--- a/openpower/package/sb-signing-utils/sb-signing-utils.mk
+++ b/openpower/package/sb-signing-utils/sb-signing-utils.mk
@@ -8,7 +8,7 @@
 
 SB_SIGNING_UTILS_LICENSE = Apache-2.0
 SB_SIGNING_UTILS_LICENSE_FILES = LICENSE
-SB_SIGNING_UTILS_VERSION ?= v0.5
+SB_SIGNING_UTILS_VERSION ?= v0.6
 
 HOST_SB_SIGNING_UTILS_DEPENDENCIES = host-openssl
 
diff --git a/openpower/package/sbe/Config.in b/openpower/package/sbe/Config.in
index b50fdcf..b41235d 100644
--- a/openpower/package/sbe/Config.in
+++ b/openpower/package/sbe/Config.in
@@ -26,7 +26,7 @@
 
 config BR2_SBE_VERSION
 	string
-	default "da99f39710df224314573b411f0fd5ca8743c743" if BR2_SBE_LATEST_VERSION
+	default "9f0712eccd007355c0101be54c6e7b0c21191e13" if BR2_SBE_LATEST_VERSION
 	default BR2_SBE_CUSTOM_VERSION_VALUE \
 		if BR2_SBE_CUSTOM_VERSION
 
diff --git a/openpower/package/skiboot/Config.in b/openpower/package/skiboot/Config.in
index 4cad09a..a8040d9 100644
--- a/openpower/package/skiboot/Config.in
+++ b/openpower/package/skiboot/Config.in
@@ -31,7 +31,7 @@
 
 config BR2_SKIBOOT_VERSION
 	string
-	default "v6.1-107-gaeb366970e0c" if BR2_SKIBOOT_LATEST_VERSION
+	default "v6.1-124-g7dbf80d1db45" if BR2_SKIBOOT_LATEST_VERSION
 	default BR2_SKIBOOT_CUSTOM_VERSION_VALUE \
 		if BR2_SKIBOOT_CUSTOM_VERSION
 
diff --git a/openpower/scripts/release-notes b/openpower/scripts/release-notes
index 1bb71fd..6cc966e 100755
--- a/openpower/scripts/release-notes
+++ b/openpower/scripts/release-notes
@@ -47,7 +47,7 @@
 
 open(OUTPUT, "> RELEASE.md") || die "Failed to open RELEASE.md";
 
-print OUTPUT "# Release Notes for OpenPower Firmware $end_release\n";
+print OUTPUT "# Release Notes for OpenPower Firmware $end_release  \n";
 
 if (-e $begin_worktree) {
     system("cd $begin_worktree && git checkout $begin_release && git submodule update --reference ../buildroot && git submodule update") and die "Could not update $begin_worktree";
@@ -117,11 +117,11 @@
     $sth->execute($begin_release, $end_release);
     my $r;
     print OUTPUT "\n## Removed platforms\n\n- ".$r->{p}."\n" if $r = $sth->fetchrow_hashref;
-    print OUTPUT "- ".$r->{p}."\n" while ($r = $sth->fetchrow_hashref);
+    print OUTPUT "- ".$r->{p}."  \n" while ($r = $sth->fetchrow_hashref);
 
     $sth->execute($end_release, $begin_release);
     print OUTPUT "\n## New platforms\n\n- ".$r->{p}."\n" if $r = $sth->fetchrow_hashref;
-    print OUTPUT "- ".$r->{p}."\n" while($r = $sth->fetchrow_hashref);
+    print OUTPUT "- ".$r->{p}."  \n" while($r = $sth->fetchrow_hashref);
 }
 
 my @common_platforms;
@@ -149,6 +149,7 @@
 	    $p = "witherspoon";
 	    $witherspoon_insanity = 1;
     }
+    next if ($p =~ /witherspoon_dev/);
     $repos->{"$p-xml"} = { REPO => "https://github.com/open-power/$p-xml" ,
 			   DIR => "openpower/package/$p-xml" };
 }
@@ -233,11 +234,11 @@
     $sth->execute();
 
     print OUTPUT "\n## Updated Packages\n\n";
-    print OUTPUT "Package | Old Version | New Version | Platforms\n";
+    print OUTPUT "Package | Old Version | New Version | Platforms  \n";
     my $t;
     my ($plen,$olen,$nlen,$platlen) = (3,3,3,3);
     while (my $r = $sth->fetchrow_hashref) {
-	$t.= join(' | ',($r->{pk}, $r->{o}, $r->{n}, $r->{ps}))."\n" ;
+	$t.= join(' | ',($r->{pk}, $r->{o}, $r->{n}, $r->{ps}))."  \n" ;
 	$plen = length($r->{pk}) if $plen < length($r->{pk});
 	$olen = length($r->{o}) if $olen < length($r->{o});
 	$nlen = length($r->{n}) if $nlen < length($r->{n});
@@ -252,7 +253,7 @@
 	}
     }
     print OUTPUT "-"x$plen." | "."-"x$olen." | "."-"x$nlen." | ".
-	"-"x$platlen."\n";
+	"-"x$platlen."  \n";
     print OUTPUT $t;
 }
 
@@ -268,10 +269,10 @@
     $sth->execute();
 
     print OUTPUT "\n\n## New Packages\n\n";
-    print OUTPUT "Package | Version | Platforms\n";
-    print OUTPUT "--- | --- | ---\n";
+    print OUTPUT "Package | Version | Platforms  \n";
+    print OUTPUT "--- | --- | ---  \n";
     while (my $r = $sth->fetchrow_hashref) {
-	print OUTPUT join(' | ',($r->{pk}, $r->{v}, $r->{ps}))."\n" ;
+	print OUTPUT join(' | ',($r->{pk}, $r->{v}, $r->{ps}))."  \n" ;
 	if ($r->{pk} eq 'machine-xml') {
 	    $new_level->{$r->{ps}."-xml"} = $r->{v};
 	}
@@ -290,10 +291,10 @@
     $sth->execute();
 
     print OUTPUT "\n\n## Removed Packages\n\n";
-    print OUTPUT "Package | Version | Platforms\n";
-    print OUTPUT "--- | --- | ---\n";
+    print OUTPUT "Package | Version | Platforms  \n";
+    print OUTPUT "--- | --- | ---  \n";
     while (my $r = $sth->fetchrow_hashref) {
-	print OUTPUT join(' | ',($r->{pk}, $r->{v}, $r->{ps}))."\n" ;
+	print OUTPUT join(' | ',($r->{pk}, $r->{v}, $r->{ps}))."  \n" ;
 	if ($r->{pk} eq $r->{ps}."-xml") {
 	    $old_level->{$r->{ps}."-xml"} = $r->{v};
 	}
@@ -325,36 +326,36 @@
     my $url = $repos->{$repo}->{REPO};
     my $dir = $repos->{$repo}->{DIR};
 
-    print OUTPUT "\n## Package: $repo\n";
-    print OUTPUT "[Repository]($url)\n";
+    print OUTPUT "\n## Package: $repo  \n";
+    print OUTPUT "[Repository]($url)  \n";
     print OUTPUT "\n";
 
     # Display patches.
     if (open(LSLOG, "ls op-build/$dir/*.patch | ".
                     "xargs -n1 --no-run-if-empty basename |"))
     {
-        print OUTPUT "### Patches\n";
+        print OUTPUT "### Patches  \n";
         while (my $logline = <LSLOG>)
         {
             chomp $logline;
             print OUTPUT "* [$logline]".
-                "($op_url/tree/$end_release/$dir/$logline)\n";
+                "($op_url/tree/$end_release/$dir/$logline)  \n";
         }
         close LSLOG;
         print OUTPUT "\n";
     }
     else
     {
-        print OUTPUT "None.\n";
+        print OUTPUT "None.  \n";
     }
 
     # Display changes.
-    print OUTPUT "### Commits\n";
+    print OUTPUT "### Commits  \n";
     if ((not exists $old_level->{$package}) &&
         (not exists $new_level->{$package}))
     {
         # No change identified.
-        print "No changes: $repo\n";
+        print "No changes: $repo  \n";
         print OUTPUT "No changes.\n\n";
         next;
     }
@@ -362,7 +363,7 @@
     if ((exists $old_level->{$package}) &&
         (exists $new_level->{$package}))
     {
-        print "Changes in $repo...\n";
+        print "Changes in $repo...  \n";
         open(GITLOG, "cd $repo; git shortlog $old_level->{$package}...".
                      "$new_level->{$package} --no-merges --format=".
                      "\"- [%h]($url/commit/%h) %s\" |");
@@ -372,24 +373,24 @@
             chomp $logline;
             $logline =~ s/^[[:space:]]*//;
             $logline =~ s/:$/:\n/;
-            print OUTPUT "$logline\n";
+            print OUTPUT "$logline  \n";
         }
         close GITLOG;
-        print OUTPUT "\n";
+        print OUTPUT "  \n";
         next;
     }
 
     if (not exists $old_level->{$package})
     {
         print "New package $repo.\n";
-        print OUTPUT "New package.\n";
+        print OUTPUT "New package.  \n";
         next;
     }
 
     if (not exists $new_level->{$package})
     {
         print "Deleted package $repo.\n";
-        print OUTPUT "Package removed.\n";
+        print OUTPUT "Package removed.  \n";
         next;
     }
 }
