RDKTV-24021: Cherrypicked Thunder PR#1279 to R4.2

Reason for change: Potential fix for RDKTV-24021
Test Procedure: see JIRA ticket
Risks: Low

Signed-off-by: mateusz.hobgarski@redembedded.com
(cherry picked from commit 8441349d28f7b762a5a6963a150c099ba7ec5019)
Change-Id: Ifbece5b52e861ed964a427276153e150c7bd70e9

RDKTV-24922: increase ocdm subsample size

Taken from changes proposed by LGI:

https://code.rdkcentral.com/r/c/components/generic/rdk-oe/meta-cmf-video/+/82049/2/recipes-extended/cbcs/wpeframework-interfaces/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content.patch#8

Reason for change: Fix High bitrate WV tests
Test Procedure: See jira ticket
Risks: Low
Priority: P0
Change-Id: Id940efab3570b5deeb1360758dba8c8ca85a5e0b
Signed-off-by: Ievgen Mutavchi <Ievgen_Mutavchi@comcast.com>

DELIA-63390 : The autogenerated JDolbyOutput.h does not have dolby_ in R4.2

Reason for change: The autogenerated JDolbyOutput.h does not have dolby_ in R4.2. The Thunder Tools has some issue and Im working on back porting some changes from R4 branch as latest R4.3 fixed it already.
Meanwhile, here is the quick mitigation.
Test Procedure: DELIA-63390
Risks: Low
Change-Id: Ia9bfbc96ac1e7b7dc3ff1b2143ca2ca745180236
Signed-off-by: Karunakaran A <Karunakaran_Amirthalingam@cable.comcast.com>

RDK-42435 : Increase the timeout for JSONRPCLinkType

Reason for change: added wait for Websocket in Open() from R43 branch
to fix the thunder initiallize issue
Test Procedure: Verify in Jenkin Build
Risks: High
Signed-off-by: Thamim  Razith <tabbas651@cable.comcast.com>

(cherry picked from commit 1782569866489337340794c609d0cbe49bef368c)
Change-Id: Id8c8054a86c50cfdf54ef99e8674b984c4a8ef2b

DELIA-62085: Netflix protected playback issues with latest OCDM-CBCS changes

Reason for change: passing the initWithLast15 variable to fix netflix
playback failure
Signed-off-by: Krishna Priya Kanagaraj
<Krishnapriya_kanagaraj@comcast.com>
Priority: P0
Test Procedure: verify the Netflix OCDM playback
Risks: None
Change-Id: Ic9db213143913b8268adb884e4048f776d9d4be7

RDK-42896: Update Thunder & Thunder Components to R2-v1.15

Reason for change: Update the latest R2 git hash id for Thunder & its components
Test Procedure: Verify in Jenkin Build
Risks: High
Change-Id: I3d6b2193697ce0b78f99339aba8159d352e0bad3
Signed-off-by: Thamim  Razith <tabbas651@cable.comcast.com>

RDKTV-25123: GetMetrics Test Failed due to "NotSupported Error"

Reason for change: Add a new metrics punch through on the OCDM framework

Signed-off-by: Krishna Priya Kanagaraj <Krishnapriya_kanagaraj@comcast.com>
Test Procedure: Validate encrypted playabck
Priority: P1
Risks: None

Change-Id: I838f88ea483282d52bd13db9f3f7d6e55ac11fc6

RDK-40321: Add Rialto support into RDK-V builds

Reason for change: Migrate existent Rialto recipes and add a distro feature enable_rialto.
Test Procedure: Add distro feature enable_rialto and verify it builds.
Risks: low
Priority: P2
Change-Id: I82fb875d118b4500e440d17d67c75a2c5490590e
Signed-off-by: Mario Luzeiro <mario.luzeiro@sky.uk>
(cherry picked from commit 9d92dfb760a830720a73c05de5a593dca08e364b)
(cherry picked from commit a7c5f1069bd9fc187be6ea20bdd1640ab1a34c94)

RDK-43838: Getting the Configure Error on rialto-ocdm

Reason for change: Added the Wpeframerwork-native-tools as depende to avoid Configure error
Test Procedure: Verify in Jenkin Build
Risks: Medium

Signed-off-by: Thamim  Razith <tabbas651@cable.comcast.com>

(cherry picked from commit 52730a1714fbe9bb2c565b777a9cc7b6745c426b)
Change-Id: Ibb402657fb3d49b07fc70c7ad4289153df6f0862

RDK-42013: Uses Rialto repository tag version

Reason for change: Rialto to build based on its tag version instead of
of SHA hash
Test Procedure: Build Rialto
Risks: Low
Priority: P2
Signed-off-by: Mario Luzeiro <mario.luzeiro@sky.uk>

(cherry picked from commit 3b95c2fbe28ee928d38a44da968407e6a0a41a2f)
Change-Id: Ibbc02d270e9fd814b1de19475edad444a8b00f94

DELIA-63525 : Enable Thunder R4 Logging

Reason for change: Thunder R4 uses Messaging component for logging where as R2 was using Tracing. So we need to enable all the necessary logging levels in messaging component in R4 to continue to get what we were getting in R2.
Test Procedure: Verify wpeframework.log
Risks: Low
Signed-off-by: Karunakaran A <karunakaran_amirthalingam@cable.comcast.com>

(cherry picked from commit 24ec0eab9f4ca9c9b1ce0254ce64b425789584ea)
Change-Id: Ibf3e286ea2ad49d81611fe6c51a9a083bd4efd17

RDK-39525 : Thunder plugin start-up using systemd (generic)

Reason for change: Thunder plugins autostart false.
Build PluginActivator.
Notify type systemd service.
Thunder startup services.
Test Procedure: None
Risks: None
Signed-off-by: Sergey Borushevsky <Sergey_Borushevsky2@cable.comcast.com>

RDK-39525 : Removed patch for PluginActivator

Reason for change: It's already in 4.2.
Test Procedure: None
Risks: None
Signed-off-by: Sergey Borushevsky <Sergey_Borushevsky2@cable.comcast.com>

RDK-39525 : Removed 2 plugins from common list.

Reason for change: Some plugins are not available on SERCOMMXIONE images.
Test Procedure: None
Risks: None
Signed-off-by: Sergey Borushevsky <Sergey_Borushevsky2@cable.comcast.com>

RDK-39525 : Fixed "autostart":true patching.

Reason for change: pattern in sed command for "autostart":true patching doesn't match line for firebolt.json.
Test Procedure: Check that none of /etc/WPEFramework/plugins/ files contains "autostart":true.
Risks: None
Change-Id: Ia5050b85fda7b688391cf6b97715f9ba9fe7f025
Signed-off-by: Sergey Borushevsky <Sergey_Borushevsky2@cable.comcast.com>

DELIA-62843:TTS thunder plugin missing "speechrate" attribute

Reason for change: TTS thunder plugin missing "speechrate"
Test Procedure: Mentioned in ticket
Risks: Low

Signed-off-by: vdinak240 <Vishnu_Dinakaran@comcast.com>
Change-Id: I90da16eaeb8311f8f5dc259ca7668f0c745cc67f

DELIA-63402: Code Changes on TTS thunder plugin for PVS app restriction

Reason for change:Enable Access restriction on TTS for COM-RPC interface
Test Procedure: Mentioned in ticket
Risks: Low

Change-Id: Ib66a08735a9b3ff8d119e070c7d56f29517732a0
Signed-off-by: vdinak240 <Vishnu_Dinakaran@comcast.com>

RDKTV-24790: Failed to activate Messenger Plugin, response : ERROR_UNKNOWN_KEY

Reason for change: Bring Messenger support  in stable2 branch .
Test Procedure: Verify in Jenkin Build
Risks: High
Change-Id: I97a61b106e6fce8820b559ae0681f8ddab46ea3e
Signed-off-by: Thamim  Razith <tabbas651@cable.comcast.com>

RDK-43786: Implement Thunder Plugin Configuration for CMake-3.20 & above

Reason for change: set the legacy_generator to off to confirmed the generated json from <plugins>*.conf.in
Test Procedure: Verify in Jenkin Build
Risks: High
Signed-off-by: Thamim  Razith <tabbas651@cable.comcast.com>

RDK-43786: Implement Thunder Plugin Configuration for CMake-3.20 & above

Reason for change: updated the git hash id for recent cobalt-plugin.conf.in changes
Test Procedure: Verify in Jenkin Build
Risks: High
Signed-off-by: Thamim  Razith <tabbas651@cable.comcast.com>

Change-Id: Ic30c309bfc9821c5d497426cc92309b0e56acd01
(cherry picked from commit 576860d49a0b928e3eda6b503af5f68589bb644e)

RDK-42895 : Used R2.1.16 version of Wpeframework

Reason for change: for updates in PackageManager
Test Procedure: NONE
Risks: NONE
Signed-off-by: Sergey Borushevsky <Sergey_Borushevsky2@cable.comcast.com>

(cherry picked from commit 7fc318e131c1a7939b0f373c66d861bf8aef8b67)
Change-Id: I83ff71e1d075164f34cf277f548c8777af05dd4a

RDK-42435: Ctrlm-factory configure issue for Thunder R4.2

Reason for change: added the wpeframework-COM and wpeframework-Tracing library based on wpe_r4 distro features
Test Procedure: Verify in Jenkin Build
Risks: High
Signed-off-by: Thamim  Razith <tabbas651@cable.comcast.com>

(cherry picked from commit ba72d20681dd9c003f63be46397e89fa0972b39c)
Change-Id: Icd0096c47d5bfaafecf11c5d8b201dd15b2db3cc

RDK-43753: Default R4.2 Thunder release to Skyllama Devices

Reason for change: Added the python3 path to avoid SKY-LLAMA-PANEL Device Error and pull MotionDetection.conf.in changes from rdkservices
Test Procedure: Verify in Jenkin Build
Risks: High
Change-Id: I63a4fe7f3dc0b431d5c7646dfde3180776c90c18
Signed-off-by: Thamim  Razith <tabbas651@cable.comcast.com>

RDK-43918,RDKAAMP-1168 AAMP Federated / Remove aamp patch file in meta

RDKAAMP-1168 : [AAMP] Remove aamp patch file in meta and add as regular code fix

Reason for change: Remove aamp patch file in meta layer and add in actual aamp code
Test Procedure: Ensure no local or jenkins build failures and a general regression test
Risks: Low
Priority: P1

Signed-off-by: Alsameema.A <Alsameema_AhmedAnsar@Comcast.Com
(cherry picked from commit b5a7c4d8f6c5755da49087a7b208760e2e4bdc90)

RDK-43918 09-2023 AAMP Federated Release for Sprint 2309

Reason for change: 1st Tag for 2309 Sprint
Tickets listed in RDK ticket.
Test Procedure: IP Playback test
Risks:Low
Priority:P0
Signed-off-by: Paulpandian M <paulpandian_mariappan@cable.comcast.com>

Change-Id: Ia12e225f13868f3f663bd4aa9faa841b73aaa14f

RDKCOM-4245-Move syslog-ng variables to generic path

Reason for change: Move the syslog-ng variables to generic layer to let
community use it. Those variables should exist in generic layer and not
in comcast layer
Test Procedure: Ensure syslog-ng recipe is built and no issues observed in logging part.
Risks: Low

Change-Id: I2f1e2dca331ca112b13eb61b0347d9e89694a9ed
Signed-off-by: Arjun <arjun_daasuramdass@comcast.com>
(cherry picked from commit 77eaeef33f53f4ddb1c2303c614180193502cc00)

SERXIONE-3594: TTS plugin changes for offline tts flex2

Reason for change: support online/offline endpoint switch on supported device
Test Procedure: Mentioned in ticket
Risks: Low

Change-Id: I143ee8ae4046c975de0d1c880f6840bbf9f97f07
Signed-off-by: vdinak240 <Vishnu_Dinakaran@comcast.com>

RDK-44574 10-2023 AAMP Federated Release for Sprint 2310

Reason for change: 1st Tag for 2310 Sprint
Tickets listed in RDK ticket.
Test Procedure: IP Playback test
Risks: Low
Priority: P0
Change-Id: If2b44b10eb803b0097015f84540153e6e9715b6b
Signed-off-by: Paulpandian M <paulpandian_mariappan@cable.comcast.com>

RDK-44574,RDK-43751,RDKAAMP-1649,SERXIONE-3687,RDKAAMP-1159,RDKTV-25165

Reason for change: 2nd Tag for 2310 Sprint
RDK-43751,RDKAAMP-1649,SERXIONE-3687,RDKAAMP-1159,RDKTV-25165
Test Procedure: IP Playback test
Risks: Low
Priority: P0
Change-Id: I58c7f95821fe328eb6360df63c5510e526af52ab
Signed-off-by: Paulpandian M <paulpandian_mariappan@cable.comcast.com>

RDKCOM-4297 : Remove the IARM Patch from LocationSync Plugin

Reason for change: Remove the IARM Patch from LocationSync Plugin
Test Procedure: Perform reboot test and launch OTT apps
Risks: Low
Signed-off-by: Karunakaran A <karunakaran_amirthalingam@cable.comcast.com>

(cherry picked from commit 444ceb5c2d4bb69fbbb7cde7729a296cd091a438)
Change-Id: Ibb7f75f395350dedda0987a4b8ec58edde796ccc

RDKCOM-3963: Updating to the latest githash

Reason for change:
This commit is to update the latest githash in stabe2 and
refresh a patch to solve the build issue.

Test Procedure: Sanity.
Risks: None.
Change-Id: I4f4da16bc44582e5fbd7dfb3e91350eb331b2f82
Signed-off-by: Pradeepta Das <Pradeepta_Das@comcast.com>

RDK-32249: RCP refactor

Reason for change: RCP refactor recipe changes
Test Procedure: image builds
Risks: Low
Change-Id: I676ee2bf483c76eb20c20a8c63f2a72a3b1250cb
Signed-off-by: Kelvin Lu <Kelvin_Lu@comcast.com>

RDK-45031 11-2023 AAMP Federated Release for Sprint 2311

Reason for change: 1st Tag for 2311 Sprint
Tickets listed in RDK ticket.
Test Procedure: IP Playback test
Risks: Low
Priority: P0
Change-Id: I95de1e145910a16cbeb4dacc0294bb3bf8f602fd
Signed-off-by: Paulpandian M <paulpandian_mariappan@cable.comcast.com>

RDKTV-22161:DALS- DS bb file changes to support rfc

Reason for change: bb file changes to support rfc
Test Procedure: Test with methods
Risks: Low
Priority: P1
Signed-off-by: Krishna Prasad <krishna.prasad2@sky.uk>

(cherry picked from commit 988331d82500ab023b55a6d8e2144cede6ff9a6f)
Change-Id: I3e74cf0d5ee45962e8574e7287fd60c4914edb7a
(cherry picked from commit 9c58e34a0de1f21a6482de8ba2d0683435549694)

SERXIONE-2779, RDKTV-24454: Prefer systemproperties for Cobalt configuration

And unify Cobalt plugin properties configuration

Reason for change: YT certification.
Test Procedure: See Jira ticket.
Risks: YouTube apps
Priority: P1
Signed-off-by: Ievgen Mutavchi <Ievgen_Mutavchi@comcast.com>

(cherry picked from commit 0ff72b2d3abd06e23d473374c556bc8cdae852a5)
Change-Id: I87e83ce8b6945cd701a2d62dcf14fb53229616a6

DELIA-63096: Upgrade Cobalt version

Reason for change: YouTube request.
Test Procedure: See Jira ticket.
Risks: YouTube apps
Priority: P0
Signed-off-by: Ievgen Mutavchi <Ievgen_Mutavchi@comcast.com>

(cherry picked from commit 796e02d77f939c650892f859dbb7e9dda444c882)
Change-Id: I868bc177461ec3fc9dc0bd4bddd3bde685ad7d73

RDK-44629: Cobalt 24 initial recipes

Based on

https://code.rdkcentral.com/r/c/rdk/components/generic/rdk-oe/meta-rdk-video/+/91589

Reason for change: Cobalt upgrade
Test Procedure: Smoke test of YouTube apps
Priority: P2
Risks: None
Signed-off-by: Ievgen Mutavchi <Ievgen_Mutavchi@comcast.com>

DELIA-63627: pull cobalt sources from github

Reason for change: cobalt.googlesource.com/cobalt.git is deprecated,
see: https://groups.google.com/g/cobalt-dev/c/2YkqfcIV9a0
Test Procedure: Build verification and sanity test of YT apps
Priority: P1
Risks: Low
Change-Id: Ib5a6848a270c33140de3d4127451fc755cbc1089
Signed-off-by: Ievgen Mutavchi <Ievgen_Mutavchi@comcast.com>
diff --git a/recipes-core/images/comcast-mediaclient-%.bbappend b/recipes-core/images/comcast-mediaclient-%.bbappend
new file mode 100644
index 0000000..794ed8c
--- /dev/null
+++ b/recipes-core/images/comcast-mediaclient-%.bbappend
@@ -0,0 +1,6 @@
+# Turn off autostart if launching from systemd
+ROOTFS_POSTPROCESS_COMMAND += "${@bb.utils.contains('DISTRO_FEATURES', 'thunder_startup_services', 'thunder_services_autostart_patch; ','',d)}"
+
+thunder_services_autostart_patch() {
+   find  ${IMAGE_ROOTFS}/etc/WPEFramework/plugins/ -type f | xargs sed -i -r 's/"autostart"[[:space:]]*:[[:space:]]*true/"autostart":false/g'
+}
diff --git a/recipes-core/packagegroups/packagegroup-rdk-media-common.bbappend b/recipes-core/packagegroups/packagegroup-rdk-media-common.bbappend
index 44f04fe..d95fb5a 100644
--- a/recipes-core/packagegroups/packagegroup-rdk-media-common.bbappend
+++ b/recipes-core/packagegroups/packagegroup-rdk-media-common.bbappend
@@ -13,4 +13,6 @@
    ${@bb.utils.contains("DISTRO_FEATURES", "offline_apps", "lxapp-bt-audio  residentui", "", d)} \
    ${@bb.utils.contains("DISTRO_FEATURES", "build_rne", "rdkresidentapp wpeframework-ui", "", d)} \
    ${@bb.utils.contains('DISTRO_FEATURES', 'fwupgrader', 'rdkfwupgrader', '', d)} \
+   ${@bb.utils.contains('DISTRO_FEATURES', 'enable_rialto','rialto-client rialto-server rialto-servermanager rialto-gstreamer rialto-ocdm', '', d) } \
+   ${@bb.utils.contains('DISTRO_FEATURES', 'thunder_startup_services', 'thunderstartupservices', '', d)} \
    "
diff --git a/recipes-extended/aamp/aamp_git.bb b/recipes-extended/aamp/aamp_git.bb
index 50c9f6b..8748879 100644
--- a/recipes-extended/aamp/aamp_git.bb
+++ b/recipes-extended/aamp/aamp_git.bb
@@ -13,11 +13,9 @@
 
 NO_RECOMMENDATIONS = "1"
 
-AAMP_RELEASE_TAG_NAME ?= "5.7.1.0"
+AAMP_RELEASE_TAG_NAME ?= "5.11.1.0"
 
 SRC_URI = "${CMF_GIT_ROOT}/rdk/components/generic/aamp;protocol=${CMF_GIT_PROTOCOL};branch=${AAMP_RELEASE_TAG_NAME};nobranch=1;name=aamp"
-SRC_URI += "file://aamp-opencdm-cbcs.patch"
-SRC_URI += "file://WPEFramework_Protocols_changed_R4.2.patch"
 
 S = "${WORKDIR}/git/"
 
diff --git a/recipes-extended/aamp/aampabr_git.bb b/recipes-extended/aamp/aampabr_git.bb
index a506890..fda8eaf 100644
--- a/recipes-extended/aamp/aampabr_git.bb
+++ b/recipes-extended/aamp/aampabr_git.bb
@@ -4,7 +4,7 @@
 LIC_FILES_CHKSUM = "file://COPYING;md5=175792518e4ac015ab6696d16c4f607e"
 
 PV = "${RDK_RELEASE}"
-AAMP_ABR_RELEASE_TAG_NAME ?= "5.7.1.0"
+AAMP_ABR_RELEASE_TAG_NAME ?= "5.11.1.0"
 SRC_URI = "${CMF_GIT_ROOT}/rdk/components/generic/aampabr;protocol=${CMF_GIT_PROTOCOL};branch=${AAMP_ABR_RELEASE_TAG_NAME};nobranch=1;name=aamp-abr"
 
 SRCREV_aamp-abr = "${AUTOREV}"
diff --git a/recipes-extended/aamp/aampmetrics_git.bb b/recipes-extended/aamp/aampmetrics_git.bb
index e9381bf..827463e 100644
--- a/recipes-extended/aamp/aampmetrics_git.bb
+++ b/recipes-extended/aamp/aampmetrics_git.bb
@@ -4,7 +4,7 @@
 LIC_FILES_CHKSUM = "file://COPYING;md5=175792518e4ac015ab6696d16c4f607e"
 
 PV = "${RDK_RELEASE}+git${SRCPV}"
-AAMP_METRICS_RELEASE_TAG_NAME ?= "5.7.1.0"
+AAMP_METRICS_RELEASE_TAG_NAME ?= "5.11.1.0"
 SRC_URI = "${CMF_GIT_ROOT}/rdk/components/generic/aampmetrics;protocol=${CMF_GIT_PROTOCOL};branch=${AAMP_METRICS_RELEASE_TAG_NAME};nobranch=1"
 
 SRCREV = "${AUTOREV}"
diff --git a/recipes-extended/aamp/files/WPEFramework_Protocols_changed_R4.2.patch b/recipes-extended/aamp/files/WPEFramework_Protocols_changed_R4.2.patch
deleted file mode 100644
index f646751..0000000
--- a/recipes-extended/aamp/files/WPEFramework_Protocols_changed_R4.2.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 77b5aafd40..821c818751 100755
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -59,10 +59,14 @@ find_package(WPEFramework REQUIRED)
- if (WPEFRAMEWORK_FOUND)
-     message("WPEFRAMEWORK_FOUND = ${WPEFRAMEWORK_FOUND}")
-     include_directories(${CMAKE_CURRENT_SOURCE_DIR} PRIVATE ${WPEFRAMEWORK_INCLUDE_DIRS})
-+else()
-+if (USE_THUNDER_R4)
-+       message(FATAL_ERROR "WPEFrameworkCOM not found")
- else()
-     message(FATAL_ERROR "WPEFrameworkProtocols not found")
- endif()
- endif()
-+endif()
-
- if(CMAKE_QT5WEBKIT_JSBINDINGS)
-        message("CMAKE_QT5WEBKIT_JSBINDINGS set, require Qt5WebKit")
-diff --git a/cmake/FindWPEFramework.cmake b/cmake/FindWPEFramework.cmake
-index e39ba8469d..84902d3f5d 100644
---- a/cmake/FindWPEFramework.cmake
-+++ b/cmake/FindWPEFramework.cmake
-@@ -46,7 +46,11 @@ if(PC_WPEFRAMEWORK_FOUND)
-         NAMES plugins/plugins.h
-         HINTS ${PC_WPEFRAMEWORK_INCLUDEDIR} ${PC_WPEFRAMEWORK_INCLUDE_DIRS})
-
-+if (USE_THUNDER_R4)
-+       set(WPEFRAMEWORK_LIBS WPEFrameworkPlugins WPEFrameworkCore WPEFrameworkCOM WPEFrameworkSecurityUtil WPEFrameworkWebSocket)
-+else()
-     set(WPEFRAMEWORK_LIBS WPEFrameworkPlugins WPEFrameworkCore WPEFrameworkTracing WPEFrameworkProtocols WPEFrameworkSecurityUtil)
-+endif()
-     set(WPEFRAMEWORK_LIBRARY )
-     foreach(LIB ${WPEFRAMEWORK_LIBS})
-         find_library(WPEFRAMEWORK_LIBRARY_${LIB} NAMES ${LIB}
-
diff --git a/recipes-extended/aamp/files/aamp-opencdm-cbcs.patch b/recipes-extended/aamp/files/aamp-opencdm-cbcs.patch
deleted file mode 100644
index f2349a5..0000000
--- a/recipes-extended/aamp/files/aamp-opencdm-cbcs.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From d0ed9f0a169c0a61a01583dd9af0ee4531ee113a Mon Sep 17 00:00:00 2001
-From: kkanag314 <krishnapriya_kanagaraj@comcast.com>
-Date: Wed, 21 Dec 2022 04:19:24 +0000
-Subject: [PATCH] aampchange
-
----
- drm/AampOcdmBasicSessionAdapter.cpp | 4 ++++
- drm/AampOcdmGstSessionAdapter.cpp   | 4 +++-
- 2 files changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/drm/AampOcdmBasicSessionAdapter.cpp b/drm/AampOcdmBasicSessionAdapter.cpp
-index bd30d53d86..730d908fb7 100755
---- a/drm/AampOcdmBasicSessionAdapter.cpp
-+++ b/drm/AampOcdmBasicSessionAdapter.cpp
-@@ -31,9 +31,13 @@ int AAMPOCDMBasicSessionAdapter::decrypt(const uint8_t *f_pbIV, uint32_t f_cbIV,
- 		dataToSend = vdata.data();
- 	}
- 
-+	EncryptionScheme encScheme = AesCtr_Cenc;
-+	EncryptionPattern pattern = {0};
-+
- 	int retvalue = opencdm_session_decrypt(m_pOpenCDMSession,
- 										   dataToSend,
- 										   sizeToSend,
-+										   encScheme, pattern,
- 										   f_pbIV, f_cbIV,
- 										   m_keyId.data(), m_keyId.size());
- 	if (retvalue != 0)
-diff --git a/drm/AampOcdmGstSessionAdapter.cpp b/drm/AampOcdmGstSessionAdapter.cpp
-index 0baa73cf97..7dda228e74 100755
---- a/drm/AampOcdmGstSessionAdapter.cpp
-+++ b/drm/AampOcdmGstSessionAdapter.cpp
-@@ -368,7 +368,9 @@ int AAMPOCDMGSTSessionAdapter::decrypt(const uint8_t *f_pbIV, uint32_t f_cbIV, c
- 
- 		pthread_mutex_lock(&decryptMutex);
- 		start_decrypt_time = GetCurrentTimeStampInMSec();
--		retValue = opencdm_session_decrypt(m_pOpenCDMSession, (uint8_t *)payloadData, payloadDataSize, f_pbIV, f_cbIV, NULL, 0, 0);
-+		EncryptionScheme encScheme = AesCtr_Cenc;
-+		EncryptionPattern pattern = {0};
-+		retValue = opencdm_session_decrypt(m_pOpenCDMSession, (uint8_t *)payloadData, payloadDataSize, encScheme, pattern, f_pbIV, f_cbIV, NULL, 0, 0);
- 		end_decrypt_time = GetCurrentTimeStampInMSec();
- 		if (retValue != 0)
- 		{
--- 
-2.17.1
-
-
diff --git a/recipes-extended/aamp/gst-plugins-rdk-aamp_git.bb b/recipes-extended/aamp/gst-plugins-rdk-aamp_git.bb
index 5a1a556..f1839e0 100644
--- a/recipes-extended/aamp/gst-plugins-rdk-aamp_git.bb
+++ b/recipes-extended/aamp/gst-plugins-rdk-aamp_git.bb
@@ -11,7 +11,7 @@
 DEPENDS +=  "${@bb.utils.contains('DISTRO_FEATURES', 'rdk_svp', 'gst-svp-ext', '', d)}"
 NO_RECOMMENDATIONS = "1"
 
-AAMP_GST_PLUG_IN_RELEASE_TAG_NAME ?= "5.7.1.0"
+AAMP_GST_PLUG_IN_RELEASE_TAG_NAME ?= "5.11.1.0"
 
 SRC_URI = "${CMF_GIT_ROOT}/rdk/components/generic/gst-plugins-rdk-aamp;protocol=${CMF_GIT_PROTOCOL};branch=${AAMP_GST_PLUG_IN_RELEASE_TAG_NAME};nobranch=1;name=gstplug-rdk-aamp"
 
diff --git a/recipes-extended/cobalt/cobalt-evergreen-pbt_22.lts.stable.bb b/recipes-extended/cobalt/cobalt-evergreen-pbt_22.lts.stable.bb
deleted file mode 100644
index d730a91..0000000
--- a/recipes-extended/cobalt/cobalt-evergreen-pbt_22.lts.stable.bb
+++ /dev/null
@@ -1,87 +0,0 @@
-SUMMARY = "Evergreen Cobalt Core library."
-HOMEPAGE = "https://cobalt.googlesource.com/"
-
-LICENSE = "BSD-3-Clause"
-# See https://github.com/youtube/cobalt/blob/master/LICENSE for governing license.
-# This license has been stored locally as COBALT_LICENSE
-LIC_FILES_CHKSUM = "file://../COBALT_LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d"
-
-FILESEXTRAPATHS_prepend := "${THISDIR}/evergreen:"
-DEPENDS += "unzip-native breakpad-native"
-OVERRIDES_append = ":${TARGET_FPU}"
-
-CRX_FILE_arm_hard = "cobalt_evergreen_2.5.5_arm-hardfp_sbversion-13_release_20220715235857.crx"
-DBG_FILE_arm_hard = "libcobalt_2.5.5_unstripped_arm-hardfp_sbversion-13_release_7f8fc3e6a2ce12ab.tar.gz"
-CRX_FILE_SHA256SUM_arm_hard = "910860cddf42c15601efe630756238eb022d4fd5486e86d651cc34c9569c3a0a"
-DBG_FILE_SHA256SUM_arm_hard = "e4d72e472266a0bd87ce25f0b805ece33a7ee265e8659872ac35f457d3e82add"
-
-CRX_FILE_aarch64 = "cobalt_evergreen_2.5.5_arm64_sbversion-13_release_20220715235857.crx"
-DBG_FILE_aarch64 = "libcobalt_2.5.5_unstripped_arm64_sbversion-13_release_68023fb0e666d3b2.tar.gz"
-CRX_FILE_SHA256SUM_aarch64 = "a39a7b722c2d1da782a4d458f523dd208f74c53bb3c7478b31611a6fd354bb98"
-DBG_FILE_SHA256SUM_aarch64 = "13f3c59fb804edc2ff25c95a1182fc335baf7283c56d1a08e61a05606799b8b9"
-
-PV = "2.5.5"
-YT_BASE_URI = "https://github.com/youtube/cobalt/releases/download/22.lts.5"
-SRC_URI  = "${YT_BASE_URI}/${CRX_FILE};name=cobalt"
-SRC_URI += "${YT_BASE_URI}/${DBG_FILE};name=cobalt_debug;subdir=debug_syms"
-SRC_URI += "file://COBALT_LICENSE"
-SRC_URI[cobalt.sha256sum] = "${CRX_FILE_SHA256SUM}"
-SRC_URI[cobalt_debug.sha256sum] = "${DBG_FILE_SHA256SUM}"
-
-COBALT_APP_DIR = "/content/data/app/cobalt"
-
-do_patch[noexec] = "1"
-do_configure[noexec] = "1"
-do_compile[noexec] = "1"
-
-do_preunpack_cleanup() {
-    bbnote "cleanup debug syms"
-    rm -rf ${WORKDIR}/debug_syms
-}
-addtask preunpack_cleanup after do_fetch before do_unpack
-
-do_install() {
-    install -d "${D}${datadir}${COBALT_APP_DIR}"
-
-    err_code=0
-
-    set +e
-    unzip -q -o -d "${D}${datadir}${COBALT_APP_DIR}" "${WORKDIR}/${CRX_FILE}" || err_code=$?
-    set -e
-
-    case $err_code in
-     0) bbnote "All good";;
-     1) bbwarn "Ignore unzip warnings";;
-     *) bbfatal "Unzip failed, exit code: $err_code"
-    esac
-
-    # use system provided certs
-    rm -rf ${D}${datadir}${COBALT_APP_DIR}/content/ssl/certs
-    mkdir -p ${D}${datadir}${COBALT_APP_DIR}/content/ssl/
-    ln -s /etc/ssl/certs ${D}${datadir}${COBALT_APP_DIR}/content/ssl/certs
-
-    install -d "${D}${datadir}${COBALT_APP_DIR}/lib/.debug/"
-    install -m 0755 ${WORKDIR}/debug_syms/tmp/cobalt-evergreen-snapshot/*/symbols/libcobalt.so ${D}${datadir}${COBALT_APP_DIR}/lib/.debug/
-}
-
-PACKAGE_PREPROCESS_FUNCS += "dump_debug_symbols"
-dump_debug_symbols () {
-    machine_dir="${@d.getVar('MACHINE', True)}"
-    mkdir -p ${TMPDIR}/deploy/breakpad_symbols/$machine_dir
-
-    binary="${D}${datadir}${COBALT_APP_DIR}/lib/.debug/libcobalt.so"
-    bbnote "Dumping symbols from $binary"
-    dump_syms "${binary}" > "${TMPDIR}/deploy/breakpad_symbols/$machine_dir/$(basename "$binary").sym" || echo "dump_syms finished with errorlevel $?"
-}
-
-FILES_${PN}  = "${datadir}${COBALT_APP_DIR}/content/*"
-FILES_${PN} += "${datadir}${COBALT_APP_DIR}/manifest.json"
-FILES_${PN} += "${datadir}${COBALT_APP_DIR}/lib/libcobalt.so"
-FILES_${PN}-dbg += "${datadir}${COBALT_APP_DIR}/lib/.debug/libcobalt.so"
-FILES_SOLIBSDEV = ""
-
-INSANE_SKIP_${PN} += "dev-so libdir"
-INSANE_SKIP_${PN}-dbg += "dev-so libdir"
-
-PROVIDES = "virtual/cobalt-evergreen"
-RPROVIDES_${PN} = "virtual/cobalt-evergreen"
diff --git a/recipes-extended/cobalt/cobalt-evergreen-pbt_23.lts.stable.bb b/recipes-extended/cobalt/cobalt-evergreen-pbt_23.lts.stable.bb
index 2efce01..5314dfb 100644
--- a/recipes-extended/cobalt/cobalt-evergreen-pbt_23.lts.stable.bb
+++ b/recipes-extended/cobalt/cobalt-evergreen-pbt_23.lts.stable.bb
@@ -1,5 +1,5 @@
 SUMMARY = "Evergreen Cobalt Core library."
-HOMEPAGE = "https://cobalt.googlesource.com/"
+HOMEPAGE = "https://cobalt.dev"
 
 LICENSE = "BSD-3-Clause"
 # See https://github.com/youtube/cobalt/blob/master/LICENSE for governing license.
@@ -10,18 +10,18 @@
 DEPENDS += "unzip-native breakpad-native"
 OVERRIDES_append = ":${TARGET_FPU}"
 
-CRX_FILE_arm_hard = "cobalt_evergreen_3.4.6_arm-hardfp_sbversion-14_release_20230331190226.crx"
-DBG_FILE_arm_hard = "libcobalt_3.4.6_unstripped_arm-hardfp_sbversion-14_release_781362e856d72930.tar.gz"
-CRX_FILE_SHA256SUM_arm_hard = "9269ef359333ed5151749fd8d3949697f40c1c06b91cf1c7d881701966a89a1f"
-DBG_FILE_SHA256SUM_arm_hard = "64f43b94cdc109824c2114d12a83e45b3e6f5228d5fb6a00f9f62ac3fa28c3f7"
+CRX_FILE_arm_hard = "cobalt_evergreen_3.5.6_arm-hardfp_sbversion-14_release_20230620182739.crx"
+DBG_FILE_arm_hard = "libcobalt_3.5.6_unstripped_arm-hardfp_sbversion-14_release_9a0d51d29db3c470.tar.gz"
+CRX_FILE_SHA256SUM_arm_hard = "f1ddd415b397918e817d8376956df0fb4dceb4c4ae2281be0557e4a2ab771d63"
+DBG_FILE_SHA256SUM_arm_hard = "76efefc7b1a01c6538c608d75ab5537689c1c91d5d28e4ff332afa08fc7c2e5d"
 
-CRX_FILE_aarch64 = "cobalt_evergreen_3.4.6_arm64_sbversion-14_release_20230331190226.crx"
-DBG_FILE_aarch64 = "libcobalt_3.4.6_unstripped_arm64_sbversion-14_release_c2d5647959769efb.tar.gz"
-CRX_FILE_SHA256SUM_aarch64 = "37afea57fd1e727c877aa3448f83a21a93c5e079cd5b70d684ed7c8296b8039f"
-DBG_FILE_SHA256SUM_aarch64 = "f1cdf74926def995a823d7d17560a3a8ea09488d790eced812b0669da1d66add"
+CRX_FILE_aarch64 = "cobalt_evergreen_3.5.6_arm64_sbversion-14_release_20230620182739.crx"
+DBG_FILE_aarch64 = "libcobalt_3.5.6_unstripped_arm64_sbversion-14_release_1796dfabb05c50aa.tar.gz"
+CRX_FILE_SHA256SUM_aarch64 = "b285d9c6ac5a1f9bea2b7ac62884b0bdbdb84d940630f3584c489f08aad98da8"
+DBG_FILE_SHA256SUM_aarch64 = "7e54c42c64d023f38bb906773e194a5980b48f38a9aa6065855176713b992f21"
 
-PV = "3.4.6"
-YT_BASE_URI = "https://github.com/youtube/cobalt/releases/download/23.lts.4"
+PV = "3.5.6"
+YT_BASE_URI = "https://github.com/youtube/cobalt/releases/download/23.lts.5"
 SRC_URI  = "${YT_BASE_URI}/${CRX_FILE};name=cobalt"
 SRC_URI += "${YT_BASE_URI}/${DBG_FILE};name=cobalt_debug;subdir=debug_syms"
 SRC_URI += "file://COBALT_LICENSE"
diff --git a/recipes-extended/cobalt/cobalt-evergreen-pbt_24.lts.stable.bb b/recipes-extended/cobalt/cobalt-evergreen-pbt_24.lts.stable.bb
new file mode 100644
index 0000000..9f69a26
--- /dev/null
+++ b/recipes-extended/cobalt/cobalt-evergreen-pbt_24.lts.stable.bb
@@ -0,0 +1,86 @@
+SUMMARY = "Evergreen Cobalt Core library."
+HOMEPAGE = "https://cobalt.dev"
+
+LICENSE = "BSD-3-Clause"
+# See https://github.com/youtube/cobalt/blob/master/LICENSE for governing license.
+# This license has been stored locally as COBALT_LICENSE
+LIC_FILES_CHKSUM = "file://../COBALT_LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d"
+
+inherit features_check
+REQUIRED_DISTRO_FEATURES = "cobalt-24"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/evergreen:"
+DEPENDS += "unzip-native breakpad-native"
+OVERRIDES_append = ":${TARGET_FPU}"
+
+CRX_FILE_arm_hard = "cobalt_evergreen_4.10.2_arm-hardfp_sbversion-15_release_20230907212907.crx"
+DBG_FILE_arm_hard = "libcobalt_4.10.2_unstripped_arm-hardfp_sbversion-15_release_9f7f94d3914cade7.tar.gz"
+CRX_FILE_SHA256SUM_arm_hard = "8e937eba7f46b7454a4434903ed2a3e23a4d5fa171628039dfa9f73b167afdf9"
+DBG_FILE_SHA256SUM_arm_hard = "69d4bcde4b2112556719e590e90de6a05e997017ddf9eb02950d82ef126f0824"
+
+CRX_FILE_aarch64 = "cobalt_evergreen_4.10.2_arm64_sbversion-15_release_20230907212907.crx"
+DBG_FILE_aarch64 = "libcobalt_4.10.2_unstripped_arm64_sbversion-15_release_7f479a97e78fe19c.tar.gz"
+CRX_FILE_SHA256SUM_aarch64 = "4a6f7651eb298bdf3eba3457a5409c7de218318015cb13edca48e54dc14fca14"
+DBG_FILE_SHA256SUM_aarch64 = "1ed748b181623218a7e3da4dde14972a9cdc69451df6e029fde32f1c8d44f062"
+
+PV = "4.10.2"
+YT_BASE_URI = "https://github.com/youtube/cobalt/releases/download/24.lts.10"
+SRC_URI  = "${YT_BASE_URI}/${CRX_FILE};name=cobalt"
+SRC_URI += "${YT_BASE_URI}/${DBG_FILE};name=cobalt_debug;subdir=debug_syms"
+SRC_URI += "file://COBALT_LICENSE"
+SRC_URI[cobalt.sha256sum] = "${CRX_FILE_SHA256SUM}"
+SRC_URI[cobalt_debug.sha256sum] = "${DBG_FILE_SHA256SUM}"
+
+PACKAGECONFIG ?= "use_system_certs"
+PACKAGECONFIG[use_system_certs] = ""
+
+COBALT_APP_DIR = "/content/data/app/cobalt"
+
+do_patch[noexec] = "1"
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+
+do_preunpack_cleanup() {
+    bbnote "cleanup debug syms"
+    rm -rf ${WORKDIR}/debug_syms
+}
+addtask preunpack_cleanup after do_fetch before do_unpack
+
+do_install() {
+    install -d "${D}${datadir}${COBALT_APP_DIR}"
+
+    err_code=0
+
+    set +e
+    unzip -q -o -d "${D}${datadir}${COBALT_APP_DIR}" "${WORKDIR}/${CRX_FILE}" || err_code=$?
+    set -e
+
+    case $err_code in
+     0) bbnote "All good";;
+     1) bbwarn "Ignore unzip warnings";;
+     *) bbfatal "Unzip failed, exit code: $err_code"
+    esac
+
+    if ${@bb.utils.contains('PACKAGECONFIG', 'use_system_certs', 'true', 'false', d)}; then
+      # use system provided certs
+      rm -rf ${D}${datadir}${COBALT_APP_DIR}/content/ssl/certs
+      mkdir -p ${D}${datadir}${COBALT_APP_DIR}/content/ssl/
+      ln -s /etc/ssl/certs ${D}${datadir}${COBALT_APP_DIR}/content/ssl/certs
+    fi
+
+    # intentionally install unstripped libcobalt.so, so symbol generation step will make use of debug libcobalt.so
+    install -d "${D}${datadir}${COBALT_APP_DIR}/lib/"
+    install -m 0755 ${WORKDIR}/debug_syms/libcobalt.so ${D}${datadir}${COBALT_APP_DIR}/lib/
+}
+
+
+FILES_${PN}  = "${datadir}${COBALT_APP_DIR}/content/*"
+FILES_${PN} += "${datadir}${COBALT_APP_DIR}/manifest.json"
+FILES_${PN} += "${datadir}${COBALT_APP_DIR}/lib/libcobalt.so"
+FILES_SOLIBSDEV = ""
+
+INSANE_SKIP_${PN} += "dev-so "
+INSANE_SKIP_${PN}-dbg += "dev-so "
+
+PROVIDES = "virtual/cobalt-evergreen"
+RPROVIDES_${PN} = "virtual/cobalt-evergreen"
diff --git a/recipes-extended/cobalt/cobalt-evergreen-src_22.lts.stable.bb b/recipes-extended/cobalt/cobalt-evergreen-src_22.lts.stable.bb
deleted file mode 100644
index 743a631..0000000
--- a/recipes-extended/cobalt/cobalt-evergreen-src_22.lts.stable.bb
+++ /dev/null
@@ -1,87 +0,0 @@
-SUMMARY = "Build Evergreen Cobalt Core library from source code. Use for debug and development puroposes."
-HOMEPAGE = "https://cobalt.googlesource.com/"
-
-LICENSE = "BSD-3-Clause & Apache-2.0"
-LIC_FILES_CHKSUM = " \
-    file://src/LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \
-    file://../depot_tools/LICENSE;md5=c2c05f9bdd5fc0b458037c2d1fb8d95e \
-"
-
-TOOLCHAINS_DIR = "starboard-toolchains"
-CLANG_BUILD_REVISION = "365097-f7e52fbd-8"
-CLANG_BUILD_SUBDIR = "${TOOLCHAINS_DIR}/x86_64-linux-gnu-clang-chromium-${CLANG_BUILD_REVISION}"
-
-SRC_URI  = "git://cobalt.googlesource.com/cobalt.git;protocol=https;name=cobalt;branch=22.lts.stable"
-SRC_URI += "git://cobalt.googlesource.com/depot_tools.git;protocol=https;destsuffix=depot_tools;name=depottools"
-SRC_URI += "https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-${CLANG_BUILD_REVISION}.tgz;subdir=${CLANG_BUILD_SUBDIR};name=clang"
-
-PV = "2.5.5"
-SRCREV_cobalt = "22.lts.5"
-SRCREV_depottools = "913305037df7027dc118253b7c2d3655d181c612"
-SRCREV_FORMAT = "cobalt_depottools"
-do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt SRCREV_depottools"
-
-SRC_URI[clang.sha256sum] = "3adf7a2338e86c202527f6bfaa945697eb2189b8965f7598d9d1159a195dbd51"
-
-DEPENDS = "python-native ninja-native bison-native openssl-native"
-
-# By default we want to use Yocto to download toolchain. So, below is commented out
-# to trigger download failure if Cobalt build script decides to refresh toolchain
-# DEPENDS += " python-requests-native"
-
-S = "${WORKDIR}/git"
-
-inherit pythonnative pkgconfig breakpad-wrapper
-
-BREAKPAD_BIN = "lib*.so*"
-
-SB_VERSION = "13"
-COBALT_ARCH_arm = "arm-${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}"
-COBALT_ARCH_aarch64 = "arm64"
-COBALT_PLATFORM ?= "evergreen-${COBALT_ARCH}-sbversion-${SB_VERSION}"
-COBALT_BUILD_TYPE ?= "${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}"
-COBALT_APP_DIR = "/content/data/app/cobalt"
-
-libdir = "${datadir}${COBALT_APP_DIR}/lib"
-
-PATH_prepend = "${WORKDIR}/depot_tools:"
-
-export STARBOARD_TOOLCHAINS_DIR = "${WORKDIR}/${TOOLCHAINS_DIR}"
-export NINJA_STATUS='%p '
-
-do_unpack_extra() {
-    bbnote "Update toolchain build revision"
-    echo -n ${CLANG_BUILD_REVISION} > ${WORKDIR}/${CLANG_BUILD_SUBDIR}/cr_build_revision
-}
-addtask unpack_extra after do_unpack before do_patch
-
-do_configure() {
-    ${S}/src/cobalt/build/gyp_cobalt -C ${COBALT_BUILD_TYPE} ${COBALT_PLATFORM}
-}
-
-do_compile[progress] = "percent"
-do_compile() {
-    ninja -C ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE} cobalt
-}
-
-do_install() {
-    install -d ${D}${datadir}${COBALT_APP_DIR}
-    cp -arv --no-preserve=ownership ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/content ${D}${datadir}${COBALT_APP_DIR}/
-    cp -arv --no-preserve=ownership ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/lib ${D}${datadir}${COBALT_APP_DIR}/
-
-    # use system provided certs
-    rm -rf ${D}${datadir}${COBALT_APP_DIR}/content/ssl/certs
-    mkdir -p ${D}${datadir}${COBALT_APP_DIR}/content/ssl/
-    ln -s /etc/ssl/certs ${D}${datadir}${COBALT_APP_DIR}/content/ssl/certs
-}
-
-FILES_${PN}  = "${datadir}${COBALT_APP_DIR}/content/*"
-FILES_${PN} += "${datadir}${COBALT_APP_DIR}/lib/libcobalt.so"
-FILES_${PN}-dbg += "${datadir}${COBALT_APP_DIR}/lib/.debug/libcobalt.so"
-FILES_SOLIBSDEV = ""
-
-INSANE_SKIP_${PN} += "dev-so"
-INSANE_SKIP_${PN}-dbg += "dev-so"
-
-PROVIDES = "virtual/cobalt-evergreen"
-RPROVIDES_${PN} = "virtual/cobalt-evergreen"
diff --git a/recipes-extended/cobalt/cobalt-evergreen-src_23.lts.stable.bb b/recipes-extended/cobalt/cobalt-evergreen-src_23.lts.stable.bb
index ffaf0e4..28a633b 100644
--- a/recipes-extended/cobalt/cobalt-evergreen-src_23.lts.stable.bb
+++ b/recipes-extended/cobalt/cobalt-evergreen-src_23.lts.stable.bb
@@ -1,5 +1,5 @@
 SUMMARY = "Build Evergreen Cobalt Core library from source code. Use for debug and development puroposes."
-HOMEPAGE = "https://cobalt.googlesource.com/"
+HOMEPAGE = "https://cobalt.dev"
 
 LICENSE = "BSD-3-Clause & Apache-2.0-with-LLVM-exception"
 LIC_FILES_CHKSUM = " \
@@ -10,11 +10,11 @@
 CLANG_BUILD_REVISION = "365097-f7e52fbd-8"
 CLANG_BUILD_SUBDIR = "${TOOLCHAINS_DIR}/x86_64-linux-gnu-clang-chromium-${CLANG_BUILD_REVISION}"
 
-SRC_URI  = "git://cobalt.googlesource.com/cobalt.git;protocol=https;name=cobalt;branch=23.lts.stable"
+SRC_URI  = "git://github.com/youtube/cobalt.git;protocol=https;name=cobalt;branch=23.lts.stable"
 SRC_URI += "https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-${CLANG_BUILD_REVISION}.tgz;subdir=${CLANG_BUILD_SUBDIR};name=clang"
 
-PV = "3.4.6"
-SRCREV_cobalt = "23.lts.4"
+PV = "3.5.6"
+SRCREV_cobalt = "23.lts.5"
 do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt"
 
 SRC_URI[clang.sha256sum] = "3adf7a2338e86c202527f6bfaa945697eb2189b8965f7598d9d1159a195dbd51"
diff --git a/recipes-extended/cobalt/cobalt-evergreen-src_24.lts.stable.bb b/recipes-extended/cobalt/cobalt-evergreen-src_24.lts.stable.bb
new file mode 100644
index 0000000..d2830e0
--- /dev/null
+++ b/recipes-extended/cobalt/cobalt-evergreen-src_24.lts.stable.bb
@@ -0,0 +1,101 @@
+SUMMARY = "Build Evergreen Cobalt Core library from source code. Use for debug and development puroposes."
+HOMEPAGE = "https://cobalt.dev"
+
+LICENSE = "BSD-3-Clause & Apache-2.0-with-LLVM-exception"
+LIC_FILES_CHKSUM = " \
+    file://LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \
+"
+
+inherit features_check
+REQUIRED_DISTRO_FEATURES = "cobalt-24"
+
+TOOLCHAINS_DIR = "starboard-toolchains"
+CLANG_BUILD_REVISION = "16-init-17653-g39da55e8-2"
+CLANG_BUILD_SUBDIR = "${TOOLCHAINS_DIR}/x86_64-linux-gnu-clang-chromium-${CLANG_BUILD_REVISION}"
+
+SRC_URI  = "git://github.com/youtube/cobalt.git;protocol=https;name=cobalt;branch=24.lts.stable"
+SRC_URI += "https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-llvmorg-${CLANG_BUILD_REVISION}.tgz;subdir=${CLANG_BUILD_SUBDIR};name=clang"
+
+SRC_URI[clang.sha256sum] = "b4afdf625aa4b72c5d188ed28a13dd352a881a2a4149542f0c903698d0498017"
+
+PV = "4.10.2"
+SRCREV_cobalt = "24.lts.10"
+do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt"
+
+DEPENDS  = "ninja-native bison-native openssl-native gn-native ccache-native"
+DEPENDS += " python3-six-native python3-urllib3-native"
+
+S = "${WORKDIR}/git"
+
+inherit python3native pkgconfig breakpad-wrapper
+
+BREAKPAD_BIN = "lib*.so*"
+
+SB_VERSION = "15"
+COBALT_ARCH_arm = "arm-${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}"
+COBALT_ARCH_aarch64 = "arm64"
+COBALT_PLATFORM ?= "evergreen-${COBALT_ARCH}"
+COBALT_BUILD_TYPE ?= "${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}"
+COBALT_APP_DIR = "/content/data/app/cobalt"
+
+PACKAGECONFIG ?= "use_system_certs ${COBALT_BUILD_TYPE}"
+PACKAGECONFIG[use_system_certs] = ""
+PACKAGECONFIG[qa]               = ",,nodejs-native,"
+PACKAGECONFIG[gold]             = ""
+
+GN_ARGS_EXTRA ?= ""
+GN_ARGS_EXTRA_append = " sb_api_version=${SB_VERSION}"
+
+libdir = "${datadir}${COBALT_APP_DIR}/lib"
+
+export _STARBOARD_TOOLCHAINS_DIR_KEY = "${WORKDIR}/${TOOLCHAINS_DIR}"
+export NINJA_STATUS='%p '
+export PYTHONPATH="${S}"
+
+do_unpack_extra() {
+    bbnote "Update toolchain build revision"
+    echo -n ${CLANG_BUILD_REVISION} > ${WORKDIR}/${CLANG_BUILD_SUBDIR}/cr_build_revision
+}
+addtask unpack_extra after do_unpack before do_patch
+
+# Cobalt GN requires '/usr/bin/env python' to work
+do_configure[prefuncs] += "setup_python_link"
+setup_python_link() {
+    if [ ! -e ${STAGING_BINDIR_NATIVE}/python3-native/python ]; then
+      (cd ${STAGING_BINDIR_NATIVE}/python3-native && ln -s python3 python)
+    fi
+}
+
+do_configure() {
+    ${PYTHON} cobalt/build/gn.py -c ${COBALT_BUILD_TYPE} -p ${COBALT_PLATFORM} --overwrite_args
+    echo "${GN_ARGS_EXTRA}" | tr ' ' '\n' >> out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/args.gn
+}
+
+do_compile[progress] = "percent"
+do_compile() {
+    ninja -C out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE} cobalt
+}
+
+do_install() {
+    install -d ${D}${datadir}${COBALT_APP_DIR}/lib/
+    cp -arv --no-preserve=ownership out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/content ${D}${datadir}${COBALT_APP_DIR}/
+    cp -arv --no-preserve=ownership out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/libcobalt.so ${D}${datadir}${COBALT_APP_DIR}/lib/
+
+    if ${@bb.utils.contains('PACKAGECONFIG', 'use_system_certs', 'true', 'false', d)}; then
+        # use system provided certs
+        rm -rf ${D}${datadir}${COBALT_APP_DIR}/content/ssl/certs
+        mkdir -p ${D}${datadir}${COBALT_APP_DIR}/content/ssl/
+        ln -s /etc/ssl/certs ${D}${datadir}${COBALT_APP_DIR}/content/ssl/certs
+    fi
+}
+
+FILES_${PN}  = "${datadir}${COBALT_APP_DIR}/content/*"
+FILES_${PN} += "${datadir}${COBALT_APP_DIR}/lib/libcobalt.so"
+FILES_${PN}-dbg += "${datadir}${COBALT_APP_DIR}/lib/.debug/libcobalt.so"
+FILES_SOLIBSDEV = ""
+
+INSANE_SKIP_${PN} += "dev-so"
+INSANE_SKIP_${PN}-dbg += "dev-so"
+
+PROVIDES = "virtual/cobalt-evergreen"
+RPROVIDES_${PN} = "virtual/cobalt-evergreen"
diff --git a/recipes-extended/cobalt/cobalt-plugin_git.bb b/recipes-extended/cobalt/cobalt-plugin_git.bb
index 4f0d3e8..11e4ed1 100644
--- a/recipes-extended/cobalt/cobalt-plugin_git.bb
+++ b/recipes-extended/cobalt/cobalt-plugin_git.bb
@@ -6,7 +6,7 @@
 
 TOOLCHAIN = "gcc"
 
-SRC_URI = "${STARBOARD_SRC_URI};protocol=${CMF_GIT_PROTOCOL};branch=master"
+SRC_URI = "${STARBOARD_SRC_URI};protocol=${CMF_GIT_PROTOCOL};nobranch=1"
 
 SRCREV = "${STARBOARD_SRCREV}"
 
@@ -28,13 +28,11 @@
 PACKAGECONFIG[libcobalt]  = "-DPLUGIN_COBALT_EVEGREEN_LITE=OFF,,libcobalt"
 
 def get_cobalt_config(d):
-    if bb.utils.contains('DISTRO_FEATURES', 'libcobalt-rdm morty', True, False, d):
+    if bb.utils.contains_any('DISTRO_FEATURES', ['libcobalt-rdm', 'libcobalt', 'morty'], True, False, d):
        return 'libcobalt'
     if bb.utils.contains('DISTRO_FEATURES', 'cobalt-evergreen-full', True, False, d):
        return 'evegreencompatible'
-    if bb.utils.contains('DISTRO_FEATURES', 'cobalt_enable_evergreen_lite', True, False, d):
-       return 'evegreencompatible evegreenlite'
-    return 'libcobalt'
+    return 'evegreencompatible evegreenlite'
 
 PACKAGECONFIG_append = " ${@get_cobalt_config(d)}"
 
@@ -45,5 +43,18 @@
     -DPLUGIN_COBALT_PERSISTENTPATHPOSTFIX="${COBALT_PERSISTENTPATHPOSTFIX}" \
 "
 
+def define_cobalt_properties(d, proplist):
+    result = ''
+    for prop_name in proplist.split():
+        prop_name = 'PLUGIN_COBALT_PROP_' + prop_name
+        prop_val = d.getVar(prop_name, True)
+        if prop_val and prop_val != '':
+           result += ''.join(['-D',prop_name,'=',prop_val]) + ' '
+    return result
+
+EXTRA_OECMAKE += " \
+    ${@define_cobalt_properties(d,'MODELNAME MODELYEAR INTEGRATORNAME BRANDNAME FIRMWAREVERSION CHIPSETMODELNUMBER DEVICETYPE')} \
+"
+
 FILES_SOLIBSDEV = ""
 FILES_${PN} += "${libdir}/wpeframework/plugins/*.so"
diff --git a/recipes-extended/cobalt/files/0001-build-fix.patch b/recipes-extended/cobalt/files/0001-build-fix.patch
deleted file mode 100644
index 9c8291d..0000000
--- a/recipes-extended/cobalt/files/0001-build-fix.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-Date: Wed, 1 Jun 2022 12:23:59 +0000
-Subject: [PATCH] build fix
-From: 080186426c2c272edecc05bb8dc8f237bd0783da Mon Sep 17 00:00:00 2001
-Source: COMCAST
-Upstream-Status: N/A
-Signed-off-by: Ievgen Mutavchi <Ievgen_Mutavchi@comcast.com>
-
----
- .../nplb_evergreen_compat_tests.gyp                            | 3 +++
- src/third_party/crashpad/handler/handler.gyp                   | 1 +
- 2 files changed, 4 insertions(+)
-
-diff --git a/src/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp b/src/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp
-index 1f2b9a735d..5f742b3d74 100644
---- a/src/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp
-+++ b/src/starboard/nplb/nplb_evergreen_compat_tests/nplb_evergreen_compat_tests.gyp
-@@ -39,6 +39,9 @@
-         '<(DEPTH)/testing/gmock.gyp:gmock',
-         '<(DEPTH)/testing/gtest.gyp:gtest',
-       ],
-+      'ldflags': [
-+        '-Wl,--unresolved-symbols=ignore-in-shared-libs',
-+      ],
-     },
-     {
-       'target_name': 'nplb_evergreen_compat_tests_deploy',
-diff --git a/src/third_party/crashpad/handler/handler.gyp b/src/third_party/crashpad/handler/handler.gyp
-index d862d70bd7..1d25651af5 100644
---- a/src/third_party/crashpad/handler/handler.gyp
-+++ b/src/third_party/crashpad/handler/handler.gyp
-@@ -103,6 +103,7 @@
-             '-Wl,--as-needed',
-             '-Wl,-gc-sections',
-             '-Wl,-z,noexecstack',
-+            '-Wl,--unresolved-symbols=ignore-in-shared-libs',
-           ],
-         }],
-         ['OS=="win"',  {
--- 
-2.25.1
-
diff --git a/recipes-extended/cobalt/files/23/0001-Include-RDK-platforms.patch b/recipes-extended/cobalt/files/23/0001-Include-RDK-platforms.patch
index 72764ca..acc8a4a 100644
--- a/recipes-extended/cobalt/files/23/0001-Include-RDK-platforms.patch
+++ b/recipes-extended/cobalt/files/23/0001-Include-RDK-platforms.patch
@@ -11,12 +11,13 @@
 index 2c0e93c698..702f1f89ca 100644
 --- a/starboard/build/platforms.py
 +++ b/starboard/build/platforms.py
-@@ -24,6 +24,8 @@ except ImportError:
+@@ -24,6 +24,9 @@ except ImportError:
    INTERNAL_PLATFORMS = {}
  
  PLATFORMS = {
 +    'rdk-arm': 'third_party/starboard/rdk/arm',
 +    'rdk-rpi': 'third_party/starboard/rdk/rpi',
++    'rdk-arm64': 'third_party/starboard/rdk/arm64',
      'stub': 'starboard/stub',
      'linux-x64x11': 'starboard/linux/x64x11',
      'linux-x64x11-egl': 'starboard/linux/x64x11/egl',
diff --git a/recipes-extended/cobalt/files/23/0004-Build-fix-for-ARM64.patch b/recipes-extended/cobalt/files/23/0004-Build-fix-for-ARM64.patch
new file mode 100644
index 0000000..e016a20
--- /dev/null
+++ b/recipes-extended/cobalt/files/23/0004-Build-fix-for-ARM64.patch
@@ -0,0 +1,32 @@
+From d35fd19b4c7280e53efe21d71563a9989e3631ed Mon Sep 17 00:00:00 2001
+From: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
+Date: Wed, 29 Mar 2023 21:23:44 +0000
+Subject: [PATCH] Build fix for ARM64
+
+---
+ starboard/shared/linux/cpu_features_get.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/starboard/shared/linux/cpu_features_get.cc b/starboard/shared/linux/cpu_features_get.cc
+index d7466ccc9b..7168898946 100644
+--- a/starboard/shared/linux/cpu_features_get.cc
++++ b/starboard/shared/linux/cpu_features_get.cc
+@@ -367,6 +367,7 @@ bool HasItemInList(const char* list, const char* flag) {
+   return false;
+ }
+ 
++#if SB_IS(32_BIT)
+ // Construct hwcap bitmask by the feature flags in /proc/cpuinfo
+ uint32_t ConstructHwcapFromCPUInfo(ProcCpuInfo* cpu_info,
+                                    int16_t architecture_generation,
+@@ -411,6 +412,7 @@ uint32_t ConstructHwcapFromCPUInfo(ProcCpuInfo* cpu_info,
+   }
+   return hwcap_value;
+ }
++#endif
+ 
+ bool SbCPUFeaturesGet_ARM(SbCPUFeatures* features) {
+   memset(features, 0, sizeof(*features));
+-- 
+2.25.1
+
diff --git a/recipes-extended/cobalt/files/24/0001-Include-RDK-platforms.patch b/recipes-extended/cobalt/files/24/0001-Include-RDK-platforms.patch
new file mode 100644
index 0000000..acc8a4a
--- /dev/null
+++ b/recipes-extended/cobalt/files/24/0001-Include-RDK-platforms.patch
@@ -0,0 +1,26 @@
+From 0213fb9429fc53eee165bc2d54a6a9e54ac505a7 Mon Sep 17 00:00:00 2001
+From: Ievgen Mutavchi <Ievgen_Mutavchi@comcast.com>
+Date: Wed, 23 Nov 2022 12:54:37 -0500
+Subject: [PATCH] Include RDK platforms
+
+---
+ starboard/build/platforms.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/starboard/build/platforms.py b/starboard/build/platforms.py
+index 2c0e93c698..702f1f89ca 100644
+--- a/starboard/build/platforms.py
++++ b/starboard/build/platforms.py
+@@ -24,6 +24,9 @@ except ImportError:
+   INTERNAL_PLATFORMS = {}
+ 
+ PLATFORMS = {
++    'rdk-arm': 'third_party/starboard/rdk/arm',
++    'rdk-rpi': 'third_party/starboard/rdk/rpi',
++    'rdk-arm64': 'third_party/starboard/rdk/arm64',
+     'stub': 'starboard/stub',
+     'linux-x64x11': 'starboard/linux/x64x11',
+     'linux-x64x11-egl': 'starboard/linux/x64x11/egl',
+-- 
+2.25.1
+
diff --git a/recipes-extended/cobalt/files/24/0002-Fix-crashpad-build.patch b/recipes-extended/cobalt/files/24/0002-Fix-crashpad-build.patch
new file mode 100644
index 0000000..cf9bb88
--- /dev/null
+++ b/recipes-extended/cobalt/files/24/0002-Fix-crashpad-build.patch
@@ -0,0 +1,25 @@
+From 22c163bbd91a32272b5b75bf99a01bd497a8571c Mon Sep 17 00:00:00 2001
+From: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
+Date: Mon, 21 Nov 2022 21:04:28 +0000
+Subject: [PATCH 2/2] Fix crashpad build
+
+---
+ third_party/crashpad/handler/main.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/third_party/crashpad/handler/main.cc b/third_party/crashpad/handler/main.cc
+index 3ae73ecddf..d3e5e9f54c 100644
+--- a/third_party/crashpad/handler/main.cc
++++ b/third_party/crashpad/handler/main.cc
+@@ -22,7 +22,7 @@
+ #endif
+ 
+ #if defined(OS_POSIX)
+-
++#undef main
+ int main(int argc, char* argv[]) {
+   return crashpad::HandlerMain(argc, argv, nullptr);
+ }
+-- 
+2.25.1
+
diff --git a/recipes-extended/cobalt/files/24/0003-breakpad-add-mapping-info.patch b/recipes-extended/cobalt/files/24/0003-breakpad-add-mapping-info.patch
new file mode 100644
index 0000000..6f68860
--- /dev/null
+++ b/recipes-extended/cobalt/files/24/0003-breakpad-add-mapping-info.patch
@@ -0,0 +1,31 @@
+
+Date: Tue Jan 17 22:13:38 UTC 2023
+From: Sunil Ramulu <sunil_ramulu@comcast.com>
+Subject: [PATCH] Update libcobalt library info to breakpad.
+Signed-off-by: Sunil Ramulu <sunil_ramulu@comcast.com>
+
+diff --git a/third_party/crashpad/client/crashpad_client_linux.cc b/third_party/crashpad/client/crashpad_client_linux.cc
+index 1b579bf9e5..c350bb4f48 100644
+--- a/third_party/crashpad/client/crashpad_client_linux.cc
++++ b/third_party/crashpad/client/crashpad_client_linux.cc
+@@ -38,6 +38,7 @@
+ #include "util/misc/from_pointer_cast.h"
+ #include "util/posix/double_fork_and_exec.h"
+ #include "util/posix/signals.h"
++#include <dlfcn.h>
+ // TODO(b/201538792): resolve conflict between mini_chromium and base functions.
+ #ifdef LogMessage
+ #define LOG_MESSAGE_DEFINED
+@@ -188,6 +189,12 @@ class SignalHandler {
+   }
+   bool SendEvergreenInfo(EvergreenInfo evergreen_info) {
+     evergreen_info_ = evergreen_info;
++    void (*breakpad_AddMappingInfoFptr)(char *, char *, size_t, uintptr_t, size_t, size_t);
++
++    *(void **)(&breakpad_AddMappingInfoFptr) = dlsym(RTLD_LOCAL , "breakpad_AddMappingInfo");
++    if(*breakpad_AddMappingInfoFptr)
++        (*breakpad_AddMappingInfoFptr)(evergreen_info.file_path_buf, evergreen_info.build_id, evergreen_info.build_id_length,
++                                       evergreen_info.base_address, evergreen_info.load_size, 0);
+     return SendEvergreenInfoImpl();
+   }
+ 
diff --git a/recipes-extended/cobalt/files/24/0004-Build-fix-for-ARM64.patch b/recipes-extended/cobalt/files/24/0004-Build-fix-for-ARM64.patch
new file mode 100644
index 0000000..e016a20
--- /dev/null
+++ b/recipes-extended/cobalt/files/24/0004-Build-fix-for-ARM64.patch
@@ -0,0 +1,32 @@
+From d35fd19b4c7280e53efe21d71563a9989e3631ed Mon Sep 17 00:00:00 2001
+From: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
+Date: Wed, 29 Mar 2023 21:23:44 +0000
+Subject: [PATCH] Build fix for ARM64
+
+---
+ starboard/shared/linux/cpu_features_get.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/starboard/shared/linux/cpu_features_get.cc b/starboard/shared/linux/cpu_features_get.cc
+index d7466ccc9b..7168898946 100644
+--- a/starboard/shared/linux/cpu_features_get.cc
++++ b/starboard/shared/linux/cpu_features_get.cc
+@@ -367,6 +367,7 @@ bool HasItemInList(const char* list, const char* flag) {
+   return false;
+ }
+ 
++#if SB_IS(32_BIT)
+ // Construct hwcap bitmask by the feature flags in /proc/cpuinfo
+ uint32_t ConstructHwcapFromCPUInfo(ProcCpuInfo* cpu_info,
+                                    int16_t architecture_generation,
+@@ -411,6 +412,7 @@ uint32_t ConstructHwcapFromCPUInfo(ProcCpuInfo* cpu_info,
+   }
+   return hwcap_value;
+ }
++#endif
+ 
+ bool SbCPUFeaturesGet_ARM(SbCPUFeatures* features) {
+   memset(features, 0, sizeof(*features));
+-- 
+2.25.1
+
diff --git a/recipes-extended/cobalt/files/24/0005-Use-Yocto-host-toolchain.patch b/recipes-extended/cobalt/files/24/0005-Use-Yocto-host-toolchain.patch
new file mode 100644
index 0000000..dfc4629
--- /dev/null
+++ b/recipes-extended/cobalt/files/24/0005-Use-Yocto-host-toolchain.patch
@@ -0,0 +1,25 @@
+From 1332666963aa2fce751a7d99358faadf65fa49f9 Mon Sep 17 00:00:00 2001
+From: Eugene Mutavchi <Ievgen_Mutavchi@comcast.com>
+Date: Fri, 29 Sep 2023 14:44:20 +0000
+Subject: [PATCH] Use Yocto host toolchain
+
+---
+ starboard/build/config/BUILDCONFIG.gn | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/starboard/build/config/BUILDCONFIG.gn b/starboard/build/config/BUILDCONFIG.gn
+index 4075ed3033..a3feca3b30 100644
+--- a/starboard/build/config/BUILDCONFIG.gn
++++ b/starboard/build/config/BUILDCONFIG.gn
+@@ -96,7 +96,7 @@ if (target_cpu == "x86" || target_cpu == "arm") {
+ } else {
+   _host_toolchain_cpu = host_cpu
+ }
+-host_toolchain = "//starboard/build/toolchain/$host_os:$_host_toolchain_cpu"
++host_toolchain = "//third_party/starboard/rdk/shared/build/$host_os:$_host_toolchain_cpu"
+ 
+ if (build_with_separate_cobalt_toolchain) {
+   cobalt_toolchain = "//starboard/build/toolchain:clang"
+-- 
+2.25.1
+
diff --git a/recipes-extended/cobalt/libcobalt_21.lts.stable.bb b/recipes-extended/cobalt/libcobalt_21.lts.stable.bb
deleted file mode 100644
index 358ae0b..0000000
--- a/recipes-extended/cobalt/libcobalt_21.lts.stable.bb
+++ /dev/null
@@ -1,100 +0,0 @@
-SUMMARY = "A high-performance, small-footprint platform that implements a subset of HTML5/CSS/JS to run applications, including the YouTube TV app"
-HOMEPAGE = "https://cobalt.googlesource.com/"
-
-LICENSE = "BSD-3-Clause & Apache-2.0"
-LIC_FILES_CHKSUM = " \
-    file://src/LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \
-    file://../depot_tools/LICENSE;md5=c2c05f9bdd5fc0b458037c2d1fb8d95e \
-    file://../starboard/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57 \
-"
-
-TOOLCHAIN = "gcc"
-
-SRC_URI  = "git://cobalt.googlesource.com/cobalt.git;protocol=https;name=cobalt;branch=21.lts.stable"
-SRC_URI += "git://cobalt.googlesource.com/depot_tools.git;protocol=https;destsuffix=depot_tools;name=depottools"
-SRC_URI += "${CMF_GIT_ROOT}/rdk/components/generic/cobalt;protocol=${CMF_GIT_PROTOCOL};destsuffix=starboard;name=starboard;branch=21.lts.stable"
-
-PR = "7"
-SRCREV_cobalt = "21.lts.${PR}"
-SRCREV_depottools = "913305037df7027dc118253b7c2d3655d181c612"
-# May 3, 2022
-SRCREV_starboard = "4c7fadd6a8bb011b31eaa0a39ec29b5f85a9306e"
-SRCREV_FORMAT = "cobalt_depottools_starboard"
-
-do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt SRCREV_depottools SRCREV_starboard"
-S = "${WORKDIR}/git"
-
-DEPENDS += "virtual/egl essos wpeframework-clientlibraries gstreamer1.0 gstreamer1.0-plugins-base python-native ninja-native bison-native openssl-native"
-RDEPENDS_${PN} += "gstreamer1.0-plugins-base-app gstreamer1.0-plugins-base-playback"
-
-TUNE_CCARGS_remove = "-fno-omit-frame-pointer -fno-optimize-sibling-calls"
-
-PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opencdm', 'opencdm', '', d)}"
-PACKAGECONFIG[opencdm] = ""
-PACKAGECONFIG[nplb] = ""
-
-inherit pythonnative pkgconfig
-
-COBALT_PLATFORM ?= ""
-COBALT_PLATFORM_brcmarm ?= "rdk-brcm-arm"
-COBALT_PLATFORM_rpi ?= "rdk-rpi"
-COBALT_PLATFORM_arm ?= "rdk-arm"
-COBALT_BUILD_TYPE ?= ""${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}""
-
-PATH_prepend = "${WORKDIR}/depot_tools:"
-
-do_unpack_extra() {
-    bbnote "copy starboard"
-    cp -ar "${WORKDIR}/starboard/src/third_party/starboard" "${S}/src/third_party/"
-}
-addtask unpack_extra after do_unpack before do_patch
-
-do_configure() {
-    export COBALT_HAS_OCDM="${@bb.utils.contains('PACKAGECONFIG', 'opencdm', '1', '0', d)}"
-    export COBALT_ARM_CALLCONVENTION="${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}"
-    ${S}/src/cobalt/build/gyp_cobalt -C qa -C gold -C devel ${COBALT_PLATFORM}
-}
-
-do_compile[progress] = "percent"
-do_compile() {
-    export NINJA_STATUS='%p '
-    ninja -C ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE} cobalt cobalt_bin
-}
-
-do_install() {
-    install -d ${D}${bindir}
-    install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/cobalt_bin ${D}${bindir}
-
-    install -d ${D}${libdir}
-    install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/lib/libcobalt.so ${D}${libdir}
-
-    install -d ${D}${datadir}/content
-    cp -arv --no-preserve=ownership ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/content ${D}${datadir}/
-
-    # use system provided certs
-    rm -rf ${D}${datadir}/content/data/ssl/certs
-    mkdir -p ${D}${datadir}/content/data/ssl/
-    ln -s /etc/ssl/certs ${D}${datadir}/content/data/ssl/certs
-}
-
-# NPLB
-do_compile_append() {
-    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
-        export PYTHONHTTPSVERIFY=0
-        ninja -C ${S}/src/out/${COBALT_PLATFORM}_devel nplb
-    fi
-}
-do_install_append() {
-    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
-        install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_devel/nplb ${D}${bindir}
-        cp -arv --no-preserve=ownership ${S}/src/out/${COBALT_PLATFORM}_devel/content ${D}${datadir}/
-    fi
-}
-
-FILES_${PN}  = "${bindir}/*"
-FILES_${PN} += "${libdir}/libcobalt.so"
-FILES_${PN} += "${datadir}/content/*"
-
-FILES_SOLIBSDEV = ""
-INSANE_SKIP_${PN} += "dev-so"
-INSANE_SKIP_${PN}-dbg += "dev-so"
diff --git a/recipes-extended/cobalt/libcobalt_22.lts.stable.bb b/recipes-extended/cobalt/libcobalt_22.lts.stable.bb
deleted file mode 100644
index 28fba53..0000000
--- a/recipes-extended/cobalt/libcobalt_22.lts.stable.bb
+++ /dev/null
@@ -1,101 +0,0 @@
-SUMMARY = "A high-performance, small-footprint platform that implements a subset of HTML5/CSS/JS to run applications, including the YouTube TV app"
-HOMEPAGE = "https://cobalt.googlesource.com/"
-
-LICENSE = "BSD-3-Clause & Apache-2.0"
-LIC_FILES_CHKSUM = " \
-    file://src/LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \
-    file://../depot_tools/LICENSE;md5=c2c05f9bdd5fc0b458037c2d1fb8d95e \
-    file://../starboard/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57 \
-"
-
-# Disable by default for morty
-DEFAULT_PREFERENCE_morty = "-1"
-TOOLCHAIN = "gcc"
-
-SRC_URI  = "git://cobalt.googlesource.com/cobalt.git;protocol=https;name=cobalt;branch=22.lts.stable"
-SRC_URI += "git://cobalt.googlesource.com/depot_tools.git;protocol=https;destsuffix=depot_tools;name=depottools"
-SRC_URI += "${CMF_GIT_ROOT}/rdk/components/generic/cobalt;protocol=${CMF_GIT_PROTOCOL};destsuffix=starboard;name=starboard;branch=22.lts.stable"
-
-PR = "5"
-SRCREV_cobalt = "22.lts.${PR}"
-SRCREV_depottools = "913305037df7027dc118253b7c2d3655d181c612"
-SRCREV_starboard = "d23e2da63e840f04a1bfa5cf1f2a1e7b0c261102"
-
-SRCREV_FORMAT = "cobalt_depottools_starboard"
-
-do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt SRCREV_depottools SRCREV_starboard"
-S = "${WORKDIR}/git"
-
-DEPENDS += "virtual/egl essos wpeframework-clientlibraries gstreamer1.0 gstreamer1.0-plugins-base python-native ninja-native bison-native openssl-native"
-RDEPENDS_${PN} += "gstreamer1.0-plugins-base-app gstreamer1.0-plugins-base-playback"
-
-TUNE_CCARGS_remove = "-fno-omit-frame-pointer -fno-optimize-sibling-calls"
-
-PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opencdm', 'opencdm', '', d)}"
-PACKAGECONFIG[opencdm] = ""
-PACKAGECONFIG[nplb] = ""
-
-inherit pythonnative pkgconfig
-
-COBALT_PLATFORM ?= ""
-COBALT_PLATFORM_rpi ?= "rdk-rpi"
-COBALT_PLATFORM_arm ?= "rdk-arm"
-COBALT_BUILD_TYPE ?= ""${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}""
-
-PATH_prepend = "${WORKDIR}/depot_tools:"
-
-do_unpack_extra() {
-    bbnote "copy starboard"
-    cp -ar "${WORKDIR}/starboard/src/third_party/starboard" "${S}/src/third_party/"
-}
-addtask unpack_extra after do_unpack before do_patch
-
-do_configure() {
-    export COBALT_HAS_OCDM="${@bb.utils.contains('PACKAGECONFIG', 'opencdm', '1', '0', d)}"
-    export COBALT_ARM_CALLCONVENTION="${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}"
-    ${S}/src/cobalt/build/gyp_cobalt -C qa -C gold -C devel ${COBALT_PLATFORM}
-}
-
-do_compile[progress] = "percent"
-do_compile() {
-    export NINJA_STATUS='%p '
-    ninja -C ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE} cobalt cobalt_bin
-}
-
-do_install() {
-    install -d ${D}${bindir}
-    install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/cobalt_bin ${D}${bindir}
-
-    install -d ${D}${libdir}
-    install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/lib/libcobalt.so ${D}${libdir}
-
-    install -d ${D}${datadir}/content
-    cp -arv --no-preserve=ownership ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/content ${D}${datadir}/
-
-    # use system provided certs
-    rm -rf ${D}${datadir}/content/data/ssl/certs
-    mkdir -p ${D}${datadir}/content/data/ssl/
-    ln -s /etc/ssl/certs ${D}${datadir}/content/data/ssl/certs
-}
-
-# NPLB
-do_compile_append() {
-    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
-        export PYTHONHTTPSVERIFY=0
-        ninja -C ${S}/src/out/${COBALT_PLATFORM}_devel nplb
-    fi
-}
-do_install_append() {
-    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
-        install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_devel/nplb ${D}${bindir}
-        cp -arv --no-preserve=ownership ${S}/src/out/${COBALT_PLATFORM}_devel/content ${D}${datadir}/
-    fi
-}
-
-FILES_${PN}  = "${bindir}/*"
-FILES_${PN} += "${libdir}/libcobalt.so"
-FILES_${PN} += "${datadir}/content/*"
-
-FILES_SOLIBSDEV = ""
-INSANE_SKIP_${PN} += "dev-so"
-INSANE_SKIP_${PN}-dbg += "dev-so"
diff --git a/recipes-extended/cobalt/libcobalt_23.lts.stable.bb b/recipes-extended/cobalt/libcobalt_23.lts.stable.bb
index 538cb47..d03b709 100644
--- a/recipes-extended/cobalt/libcobalt_23.lts.stable.bb
+++ b/recipes-extended/cobalt/libcobalt_23.lts.stable.bb
@@ -1,5 +1,5 @@
 SUMMARY = "A high-performance, small-footprint platform that implements a subset of HTML5/CSS/JS to run applications, including the YouTube TV app"
-HOMEPAGE = "https://cobalt.googlesource.com/"
+HOMEPAGE = "https://cobalt.dev"
 
 LICENSE = "BSD-3-Clause & Apache-2.0-with-LLVM-exception"
 LIC_FILES_CHKSUM = " \
@@ -14,11 +14,12 @@
 
 TOOLCHAIN = "gcc"
 
-SRC_URI  = "git://cobalt.googlesource.com/cobalt.git;protocol=https;name=cobalt;branch=23.lts.stable"
+SRC_URI  = "git://github.com/youtube/cobalt.git;protocol=https;name=cobalt;branch=23.lts.stable"
 SRC_URI += "${STARBOARD_SRC_URI};protocol=${CMF_GIT_PROTOCOL};destsuffix=starboard;name=starboard;branch=master"
 SRC_URI += "file://23/0001-Include-RDK-platforms.patch"
+SRC_URI += "file://23/0004-Build-fix-for-ARM64.patch"
 
-PR = "4"
+PR = "5"
 SRCREV_cobalt = "23.lts.${PR}"
 SRCREV_starboard = "${STARBOARD_SRCREV}"
 
@@ -27,7 +28,8 @@
 do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt SRCREV_starboard"
 S = "${WORKDIR}/git"
 
-DEPENDS += "virtual/egl essos wpeframework-clientlibraries gstreamer1.0 gstreamer1.0-plugins-base"
+DEPENDS += "virtual/egl essos gstreamer1.0 gstreamer1.0-plugins-base"
+DEPENDS += " wpeframework wpeframework-interfaces wpeframework-clientlibraries"
 DEPENDS += " ninja-native bison-native openssl-native gn-native ccache-native"
 DEPENDS += " python3-six-native python3-urllib3-native"
 
@@ -35,9 +37,18 @@
 
 TUNE_CCARGS_remove = "-fno-omit-frame-pointer -fno-optimize-sibling-calls"
 
-COBALT_PLATFORM ?= ""
-COBALT_PLATFORM_arm ?= "rdk-arm"
-COBALT_PLATFORM_rpi ?= "rdk-rpi"
+def get_cobalt_platform(d):
+    target_arch = d.getVar('TARGET_ARCH', True)
+    if target_arch == 'aarch64':
+        return 'rdk-arm64'
+    elif "rpi" in d.getVar('MACHINEOVERRIDES', True):
+        return 'rdk-rpi'
+    elif target_arch == 'arm':
+        return 'rdk-arm'
+    else:
+        bb.fatal("Unsupported target architecture: {}".format(target_arch))
+
+COBALT_PLATFORM ?= "${@get_cobalt_platform(d)}"
 COBALT_BUILD_TYPE ?= "${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}"
 
 PACKAGECONFIG ?= "cryptography ${COBALT_BUILD_TYPE}"
@@ -52,7 +63,7 @@
 PACKAGECONFIG[nplb]          = ""
 
 GN_ARGS_EXTRA ?= ""
-GN_ARGS_EXTRA_append = " rdk_arm_call_convention=\"${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}\""
+GN_ARGS_EXTRA_append_arm = " rdk_arm_call_convention=\"${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}\""
 GN_ARGS_EXTRA_append = " ${PACKAGECONFIG_CONFARGS}"
 
 inherit python3native pkgconfig breakpad-wrapper
diff --git a/recipes-extended/cobalt/libcobalt_24.lts.stable.bb b/recipes-extended/cobalt/libcobalt_24.lts.stable.bb
new file mode 100644
index 0000000..b7c56e6
--- /dev/null
+++ b/recipes-extended/cobalt/libcobalt_24.lts.stable.bb
@@ -0,0 +1,145 @@
+SUMMARY = "A high-performance, small-footprint platform that implements a subset of HTML5/CSS/JS to run applications, including the YouTube TV app"
+HOMEPAGE = "https://cobalt.dev"
+
+LICENSE = "BSD-3-Clause & Apache-2.0-with-LLVM-exception"
+LIC_FILES_CHKSUM = " \
+    file://LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \
+    file://../starboard/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57 \
+"
+
+inherit features_check
+REQUIRED_DISTRO_FEATURES = "cobalt-24"
+
+require starboard_revision.inc
+
+TOOLCHAIN = "gcc"
+
+SRC_URI  = "git://github.com/youtube/cobalt.git;protocol=https;name=cobalt;branch=24.lts.stable"
+SRC_URI += "${STARBOARD_SRC_URI};protocol=${CMF_GIT_PROTOCOL};destsuffix=starboard;name=starboard;branch=24.lts.dev"
+SRC_URI += "file://24/0001-Include-RDK-platforms.patch"
+SRC_URI += "file://24/0004-Build-fix-for-ARM64.patch"
+SRC_URI += "file://24/0005-Use-Yocto-host-toolchain.patch"
+
+PR = "10"
+SRCREV_cobalt = "24.lts.${PR}"
+SRCREV_starboard = "${STARBOARD_SRCREV}"
+
+SRCREV_FORMAT = "cobalt_starboard"
+
+do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt SRCREV_starboard"
+S = "${WORKDIR}/git"
+
+DEPENDS += "virtual/egl essos gstreamer1.0 gstreamer1.0-plugins-base"
+DEPENDS += " wpeframework wpeframework-interfaces wpeframework-clientlibraries"
+DEPENDS += " ninja-native bison-native openssl-native gn-native ccache-native"
+DEPENDS += " python3-six-native python3-urllib3-native"
+
+RDEPENDS_${PN} += "gstreamer1.0-plugins-base-app gstreamer1.0-plugins-base-playback"
+
+TUNE_CCARGS_remove = "-fno-omit-frame-pointer -fno-optimize-sibling-calls"
+
+def get_cobalt_platform(d):
+    target_arch = d.getVar('TARGET_ARCH', True)
+    if target_arch == 'aarch64':
+        return 'rdk-arm64'
+    elif "rpi" in d.getVar('MACHINEOVERRIDES', True):
+        return 'rdk-rpi'
+    elif target_arch == 'arm':
+        return 'rdk-arm'
+    else:
+        bb.fatal("Unsupported target architecture: {}".format(target_arch))
+
+COBALT_PLATFORM ?= "${@get_cobalt_platform(d)}"
+COBALT_BUILD_TYPE ?= "${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}"
+
+PACKAGECONFIG ?= "use_system_certs cbcs cryptography ${COBALT_BUILD_TYPE}"
+PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'opencdm', 'opencdm', '', d)}"
+PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'thunder_security_disable', '', 'securityagent', d)}"
+
+PACKAGECONFIG[opencdm]          = "rdk_enable_ocdm=true,rdk_enable_ocdm=false,,"
+PACKAGECONFIG[cbcs]             = "rdk_enable_cbcs=true,rdk_enable_cbcs=false,,"
+PACKAGECONFIG[securityagent]    = "rdk_enable_securityagent=true,rdk_enable_securityagent=false,,"
+PACKAGECONFIG[cryptography]     = "rdk_enable_cryptography=true,rdk_enable_cryptography=false,,"
+PACKAGECONFIG[use_system_certs] = ""
+PACKAGECONFIG[qa]               = ",,nodejs-native,"
+PACKAGECONFIG[gold]             = ""
+PACKAGECONFIG[nplb]             = ""
+
+GN_ARGS_EXTRA ?= ""
+GN_ARGS_EXTRA_append_arm = " rdk_arm_call_convention=\"${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}\""
+GN_ARGS_EXTRA_append = " ${PACKAGECONFIG_CONFARGS}"
+
+inherit python3native pkgconfig breakpad-wrapper
+
+BREAKPAD_BIN = "lib*.so*"
+
+export PYTHONPATH="${S}"
+
+do_unpack_extra() {
+    bbnote "copy starboard"
+    cp -ar "${WORKDIR}/starboard/src/third_party/starboard" "${S}/third_party/"
+}
+addtask unpack_extra after do_patch before do_configure
+
+do_configure() {
+    ${PYTHON} cobalt/build/gn.py -c ${COBALT_BUILD_TYPE} -p ${COBALT_PLATFORM} --overwrite_args
+    echo "${GN_ARGS_EXTRA}" | tr ' ' '\n' >> out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/args.gn
+}
+
+do_compile[progress] = "percent"
+do_compile() {
+    export NINJA_STATUS='%p '
+    ninja -C out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE} cobalt
+}
+
+do_install() {
+    install -d ${D}${libdir}
+    install -m 0755 out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/libcobalt.so ${D}${libdir}
+
+    install -d ${D}${datadir}/content
+    cp -arv --no-preserve=ownership out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/content ${D}${datadir}/
+
+    if ${@bb.utils.contains('PACKAGECONFIG', 'use_system_certs', 'true', 'false', d)}; then
+      # use system provided certs
+      rm -rf ${D}${datadir}/content/data/ssl/certs
+      mkdir -p ${D}${datadir}/content/data/ssl/
+      ln -s /etc/ssl/certs ${D}${datadir}/content/data/ssl/certs
+    fi
+}
+
+# NPLB
+do_configure_append() {
+    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
+        ${PYTHON} cobalt/build/gn.py -c devel  -p ${COBALT_PLATFORM} --overwrite_args
+        echo "${GN_ARGS_EXTRA}" | tr ' ' '\n' >> out/${COBALT_PLATFORM}_devel/args.gn
+    fi
+}
+do_compile_append() {
+    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
+        export PYTHONHTTPSVERIFY=0
+        ninja -C out/${COBALT_PLATFORM}_devel nplb
+    fi
+}
+do_install_append() {
+    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
+        install -m 0755 out/${COBALT_PLATFORM}_devel/nplb ${D}${bindir}
+        install -d ${D}${datadir}/content/data/test
+        cp -arv --no-preserve=ownership out/${COBALT_PLATFORM}_devel/content/data/test ${D}${datadir}/content/data/
+    fi
+}
+
+FILES_${PN}  = "${bindir}/*"
+FILES_${PN} += "${libdir}/libcobalt.so"
+FILES_${PN} += "${datadir}/content/*"
+
+FILES_SOLIBSDEV = ""
+INSANE_SKIP_${PN} += "dev-so"
+INSANE_SKIP_${PN}-dbg += "dev-so"
+
+PACKAGES =+ "${PN}-nplb"
+PROVIDES += "${PN}-nplb"
+FILES_${PN}-nplb  = "${bindir}/nplb*"
+
+PACKAGES =+ "${PN}-nplb-test-data"
+PROVIDES += "${PN}-nplb-test-data"
+FILES_${PN}-nplb-test-data = "${datadir}/content/data/test/*"
diff --git a/recipes-extended/cobalt/libloader-app_22.lts.stable.bb b/recipes-extended/cobalt/libloader-app_22.lts.stable.bb
deleted file mode 100644
index 3eeb335..0000000
--- a/recipes-extended/cobalt/libloader-app_22.lts.stable.bb
+++ /dev/null
@@ -1,98 +0,0 @@
-SUMMARY = "Evergreen Cobalt loader_app library."
-HOMEPAGE = "https://cobalt.googlesource.com/"
-
-LICENSE = "BSD-3-Clause & Apache-2.0"
-LIC_FILES_CHKSUM = " \
-    file://src/LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \
-    file://../depot_tools/LICENSE;md5=c2c05f9bdd5fc0b458037c2d1fb8d95e \
-    file://../starboard/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57 \
-"
-
-TOOLCHAIN = "gcc"
-
-SRC_URI  = "git://cobalt.googlesource.com/cobalt.git;protocol=https;name=cobalt;branch=22.lts.stable"
-SRC_URI += "git://cobalt.googlesource.com/depot_tools.git;protocol=https;destsuffix=depot_tools;name=depottools"
-SRC_URI += "${CMF_GIT_ROOT}/rdk/components/generic/cobalt;protocol=${CMF_GIT_PROTOCOL};destsuffix=starboard;name=starboard;branch=22.lts.stable"
-SRC_URI += "file://0001-build-fix.patch"
-
-PR = "5"
-SRCREV_cobalt = "22.lts.${PR}"
-SRCREV_depottools = "913305037df7027dc118253b7c2d3655d181c612"
-SRCREV_starboard = "d23e2da63e840f04a1bfa5cf1f2a1e7b0c261102"
-
-SRCREV_FORMAT = "cobalt_depottools_starboard"
-
-do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt SRCREV_depottools SRCREV_starboard"
-S = "${WORKDIR}/git"
-
-DEPENDS += "virtual/egl essos wpeframework-clientlibraries gstreamer1.0 gstreamer1.0-plugins-base python-native ninja-native bison-native openssl-native"
-RDEPENDS_${PN} += "gstreamer1.0-plugins-base-app gstreamer1.0-plugins-base-playback"
-
-TUNE_CCARGS_remove = "-fno-omit-frame-pointer -fno-optimize-sibling-calls"
-
-PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opencdm', 'opencdm', '', d)}"
-PACKAGECONFIG[opencdm] = ""
-PACKAGECONFIG[nplb] = ""
-
-inherit pythonnative pkgconfig breakpad-wrapper
-
-BREAKPAD_BIN = "lib*.so*"
-
-COBALT_PLATFORM ?= ""
-COBALT_PLATFORM_arm ?= "rdk-arm"
-COBALT_BUILD_TYPE ?= ""${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}""
-
-PATH_prepend = "${WORKDIR}/depot_tools:"
-
-do_unpack_extra() {
-    bbnote "copy starboard"
-    cp -ar "${WORKDIR}/starboard/src/third_party/starboard" "${S}/src/third_party/"
-}
-addtask unpack_extra after do_unpack before do_patch
-
-do_configure() {
-    export COBALT_HAS_OCDM="${@bb.utils.contains('PACKAGECONFIG', 'opencdm', '1', '0', d)}"
-    export COBALT_ARM_CALLCONVENTION="${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}"
-    export COBALT_EVERGREEN_LITE="1"
-    ${S}/src/cobalt/build/gyp_cobalt -C ${COBALT_BUILD_TYPE} -C devel ${COBALT_PLATFORM}
-}
-
-do_compile[progress] = "percent"
-do_compile() {
-    export NINJA_STATUS='%p '
-    ninja -C ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE} loader_app crashpad_handler
-}
-
-do_install() {
-    install -d ${D}${bindir}
-    install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/crashpad_handler ${D}${bindir}
-
-    install -d ${D}${libdir}
-    install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/lib/libloader_app.so ${D}${libdir}
-
-    install -d ${D}${datadir}/content
-    cp -arv --no-preserve=ownership ${S}/src/out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/content ${D}${datadir}/
-}
-
-# NPLB
-do_compile_append() {
-    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
-        export PYTHONHTTPSVERIFY=0
-        ninja -C ${S}/src/out/${COBALT_PLATFORM}_devel nplb nplb_evergreen_compat_tests
-    fi
-}
-do_install_append() {
-    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
-        install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_devel/nplb ${D}${bindir}
-        install -m 0755 ${S}/src/out/${COBALT_PLATFORM}_devel/nplb_evergreen_compat_tests ${D}${bindir}
-        cp -arv --no-preserve=ownership ${S}/src/out/${COBALT_PLATFORM}_devel/content ${D}${datadir}/
-    fi
-}
-
-FILES_${PN}  = "${bindir}/*"
-FILES_${PN} += "${libdir}/libloader_app.so"
-FILES_${PN} += "${datadir}/content/*"
-
-FILES_SOLIBSDEV = ""
-INSANE_SKIP_${PN} += "dev-so"
-INSANE_SKIP_${PN}-dbg += "dev-so"
diff --git a/recipes-extended/cobalt/libloader-app_23.lts.stable.bb b/recipes-extended/cobalt/libloader-app_23.lts.stable.bb
index 5412629..f41b794 100644
--- a/recipes-extended/cobalt/libloader-app_23.lts.stable.bb
+++ b/recipes-extended/cobalt/libloader-app_23.lts.stable.bb
@@ -1,5 +1,5 @@
 SUMMARY = "Evergreen Cobalt loader_app library."
-HOMEPAGE = "https://cobalt.googlesource.com/"
+HOMEPAGE = "https://cobalt.dev"
 
 LICENSE = "BSD-3-Clause & Apache-2.0-with-LLVM-exception"
 LIC_FILES_CHKSUM = " \
@@ -11,13 +11,14 @@
 
 TOOLCHAIN = "gcc"
 
-SRC_URI  = "git://cobalt.googlesource.com/cobalt.git;protocol=https;name=cobalt;branch=23.lts.stable"
+SRC_URI  = "git://github.com/youtube/cobalt.git;protocol=https;name=cobalt;branch=23.lts.stable"
 SRC_URI += "${STARBOARD_SRC_URI};protocol=${CMF_GIT_PROTOCOL};destsuffix=starboard;name=starboard;branch=master"
 SRC_URI += "file://23/0001-Include-RDK-platforms.patch"
 SRC_URI += "file://23/0002-Fix-crashpad-build.patch"
 SRC_URI += "file://23/0003-breakpad-add-mapping-info.patch"
+SRC_URI += "file://23/0004-Build-fix-for-ARM64.patch"
 
-PR = "4"
+PR = "5"
 SRCREV_cobalt = "23.lts.${PR}"
 SRCREV_starboard = "${STARBOARD_SRCREV}"
 
@@ -26,7 +27,8 @@
 do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt SRCREV_starboard"
 S = "${WORKDIR}/git"
 
-DEPENDS += "virtual/egl essos wpeframework-clientlibraries gstreamer1.0 gstreamer1.0-plugins-base"
+DEPENDS += "virtual/egl essos gstreamer1.0 gstreamer1.0-plugins-base"
+DEPENDS += " wpeframework wpeframework-interfaces wpeframework-clientlibraries"
 DEPENDS += " ninja-native bison-native openssl-native gn-native ccache-native"
 DEPENDS += " python3-six-native python3-urllib3-native"
 
@@ -34,27 +36,34 @@
 
 TUNE_CCARGS_remove = "-fno-omit-frame-pointer -fno-optimize-sibling-calls"
 
-COBALT_PLATFORM ?= ""
-COBALT_PLATFORM_arm ?= "rdk-arm"
-COBALT_PLATFORM_rpi ?= "rdk-rpi"
+def get_cobalt_platform(d):
+    target_arch = d.getVar('TARGET_ARCH', True)
+    if target_arch == 'aarch64':
+        return 'rdk-arm64'
+    elif "rpi" in d.getVar('MACHINEOVERRIDES', True):
+        return 'rdk-rpi'
+    elif target_arch == 'arm':
+        return 'rdk-arm'
+    else:
+        bb.fatal("Unsupported target architecture: {}".format(target_arch))
+
+COBALT_PLATFORM ?= "${@get_cobalt_platform(d)}"
 COBALT_BUILD_TYPE ?= "${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}"
 
 PACKAGECONFIG ?= "cryptography ${COBALT_BUILD_TYPE}"
 PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'opencdm', 'opencdm', '', d)}"
 PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'thunder_security_disable', '', 'securityagent', d)}"
-PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-evergreen-full', '', 'lite', d)}"
 
 PACKAGECONFIG[opencdm]       = "rdk_enable_ocdm=true,rdk_enable_ocdm=false,,"
 PACKAGECONFIG[securityagent] = "rdk_enable_securityagent=true,rdk_enable_securityagent=false,,"
 PACKAGECONFIG[cryptography]  = "rdk_enable_cryptography=true,rdk_enable_cryptography=false,,"
-PACKAGECONFIG[lite]          = "sb_evergreen_compatible_enable_lite=true,sb_evergreen_compatible_enable_lite=false,,"
 PACKAGECONFIG[qa]            = ",,nodejs-native,"
 PACKAGECONFIG[gold]          = ""
 PACKAGECONFIG[nplb]          = ""
 
 GN_ARGS_EXTRA ?= ""
 GN_ARGS_EXTRA_append = " sb_is_evergreen_compatible=true"
-GN_ARGS_EXTRA_append = " rdk_arm_call_convention=\"${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}\""
+GN_ARGS_EXTRA_append_arm = " rdk_arm_call_convention=\"${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}\""
 GN_ARGS_EXTRA_append = " ${PACKAGECONFIG_CONFARGS}"
 
 inherit python3native pkgconfig breakpad-wrapper
diff --git a/recipes-extended/cobalt/libloader-app_24.lts.stable.bb b/recipes-extended/cobalt/libloader-app_24.lts.stable.bb
new file mode 100644
index 0000000..651dd13
--- /dev/null
+++ b/recipes-extended/cobalt/libloader-app_24.lts.stable.bb
@@ -0,0 +1,144 @@
+SUMMARY = "Evergreen Cobalt loader_app library."
+HOMEPAGE = "https://cobalt.dev"
+
+LICENSE = "BSD-3-Clause & Apache-2.0-with-LLVM-exception"
+LIC_FILES_CHKSUM = " \
+    file://LICENSE;md5=0fca02217a5d49a14dfe2d11837bb34d \
+    file://../starboard/LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57 \
+"
+
+inherit features_check
+REQUIRED_DISTRO_FEATURES = "cobalt-24"
+
+require starboard_revision.inc
+
+TOOLCHAIN = "gcc"
+
+SRC_URI  = "git://github.com/youtube/cobalt.git;protocol=https;name=cobalt;branch=24.lts.stable"
+SRC_URI += "${STARBOARD_SRC_URI};protocol=${CMF_GIT_PROTOCOL};destsuffix=starboard;name=starboard;branch=24.lts.dev"
+SRC_URI += "file://24/0001-Include-RDK-platforms.patch"
+SRC_URI += "file://24/0002-Fix-crashpad-build.patch"
+SRC_URI += "file://24/0003-breakpad-add-mapping-info.patch"
+SRC_URI += "file://24/0004-Build-fix-for-ARM64.patch"
+SRC_URI += "file://24/0005-Use-Yocto-host-toolchain.patch"
+
+PR = "10"
+SRCREV_cobalt = "24.lts.${PR}"
+SRCREV_starboard = "${STARBOARD_SRCREV}"
+
+SRCREV_FORMAT = "cobalt_starboard"
+
+do_fetch[vardeps] += " SRCREV_FORMAT SRCREV_cobalt SRCREV_starboard"
+S = "${WORKDIR}/git"
+
+DEPENDS += "virtual/egl essos gstreamer1.0 gstreamer1.0-plugins-base"
+DEPENDS += " wpeframework wpeframework-interfaces wpeframework-clientlibraries"
+DEPENDS += " ninja-native bison-native openssl-native gn-native ccache-native"
+DEPENDS += " python3-six-native python3-urllib3-native"
+
+RDEPENDS_${PN} += "gstreamer1.0-plugins-base-app gstreamer1.0-plugins-base-playback"
+
+TUNE_CCARGS_remove = "-fno-omit-frame-pointer -fno-optimize-sibling-calls"
+
+def get_cobalt_platform(d):
+    target_arch = d.getVar('TARGET_ARCH', True)
+    if target_arch == 'aarch64':
+        return 'rdk-arm64'
+    elif "rpi" in d.getVar('MACHINEOVERRIDES', True):
+        return 'rdk-rpi'
+    elif target_arch == 'arm':
+        return 'rdk-arm'
+    else:
+        bb.fatal("Unsupported target architecture: {}".format(target_arch))
+
+COBALT_PLATFORM ?= "${@get_cobalt_platform(d)}"
+COBALT_BUILD_TYPE ?= "${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-qa', 'qa', 'gold', d)}"
+
+PACKAGECONFIG ?= "cbcs cryptography ${COBALT_BUILD_TYPE}"
+PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'opencdm', 'opencdm', '', d)}"
+PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'thunder_security_disable', '', 'securityagent', d)}"
+
+PACKAGECONFIG[opencdm]       = "rdk_enable_ocdm=true,rdk_enable_ocdm=false,,"
+PACKAGECONFIG[cbcs]          = "rdk_enable_cbcs=true,rdk_enable_cbcs=false,,"
+PACKAGECONFIG[securityagent] = "rdk_enable_securityagent=true,rdk_enable_securityagent=false,,"
+PACKAGECONFIG[cryptography]  = "rdk_enable_cryptography=true,rdk_enable_cryptography=false,,"
+PACKAGECONFIG[qa]            = ",,nodejs-native,"
+PACKAGECONFIG[gold]          = ""
+PACKAGECONFIG[nplb]          = ""
+
+GN_ARGS_EXTRA ?= ""
+GN_ARGS_EXTRA_append = " sb_is_evergreen_compatible=true"
+GN_ARGS_EXTRA_append_arm = " rdk_arm_call_convention=\"${@bb.utils.contains('TUNE_FEATURES', 'callconvention-hard', 'hardfp', 'softfp', d)}\""
+GN_ARGS_EXTRA_append = " ${PACKAGECONFIG_CONFARGS}"
+
+inherit python3native pkgconfig breakpad-wrapper
+
+BREAKPAD_BIN = "lib*.so*"
+
+export PYTHONPATH="${S}"
+
+do_unpack_extra() {
+    bbnote "copy starboard"
+    cp -ar "${WORKDIR}/starboard/src/third_party/starboard" "${S}/third_party/"
+}
+addtask unpack_extra after do_patch before do_configure
+
+do_configure() {
+    ${PYTHON} cobalt/build/gn.py -c ${COBALT_BUILD_TYPE} -p ${COBALT_PLATFORM} --overwrite_args
+    echo "${GN_ARGS_EXTRA}" | tr ' ' '\n' >> out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/args.gn
+}
+
+do_compile[progress] = "percent"
+do_compile() {
+    export NINJA_STATUS='%p '
+    ninja -C out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE} loader_app native_target/crashpad_handler
+}
+
+do_install() {
+    install -d ${D}${bindir}
+    install -m 0755 out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/native_target/crashpad_handler ${D}${bindir}
+
+    install -d ${D}${libdir}
+    install -m 0755 out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/libloader_app.so ${D}${libdir}
+
+    install -d ${D}${datadir}/content
+    cp -arv --no-preserve=ownership out/${COBALT_PLATFORM}_${COBALT_BUILD_TYPE}/content ${D}${datadir}/
+}
+
+# NPLB
+do_configure_append() {
+    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
+        ${PYTHON} cobalt/build/gn.py -c devel  -p ${COBALT_PLATFORM} --overwrite_args
+        echo "${GN_ARGS_EXTRA}" | tr ' ' '\n' >> out/${COBALT_PLATFORM}_devel/args.gn
+    fi
+}
+do_compile_append() {
+    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
+        export PYTHONHTTPSVERIFY=0
+        ninja -C out/${COBALT_PLATFORM}_devel nplb nplb_evergreen_compat_tests
+    fi
+}
+do_install_append() {
+    if ${@bb.utils.contains('PACKAGECONFIG', 'nplb', 'true', 'false', d)}; then
+        install -m 0755 out/${COBALT_PLATFORM}_devel/nplb ${D}${bindir}
+        install -m 0755 out/${COBALT_PLATFORM}_devel/nplb_evergreen_compat_tests ${D}${bindir}
+        install -d ${D}${datadir}/content/data/test
+        cp -arv --no-preserve=ownership out/${COBALT_PLATFORM}_devel/content/data/test ${D}${datadir}/content/data/
+    fi
+}
+
+FILES_${PN}  = "${bindir}/*"
+FILES_${PN} += "${libdir}/libloader_app.so"
+FILES_${PN} += "${datadir}/content/*"
+
+FILES_SOLIBSDEV = ""
+INSANE_SKIP_${PN} += "dev-so"
+INSANE_SKIP_${PN}-dbg += "dev-so"
+
+PACKAGES =+ "${PN}-nplb"
+PROVIDES += "${PN}-nplb"
+FILES_${PN}-nplb  = "${bindir}/nplb*"
+
+PACKAGES =+ "${PN}-nplb-test-data"
+PROVIDES += "${PN}-nplb-test-data"
+FILES_${PN}-nplb-test-data = "${datadir}/content/data/test/*"
diff --git a/recipes-extended/cobalt/starboard_revision.inc b/recipes-extended/cobalt/starboard_revision.inc
index 2233c26..f12b621 100644
--- a/recipes-extended/cobalt/starboard_revision.inc
+++ b/recipes-extended/cobalt/starboard_revision.inc
@@ -1,4 +1,4 @@
 STARBOARD_SRC_URI = "${CMF_GIT_ROOT}/rdk/components/generic/cobalt"
 
-# May 23, 2023
-STARBOARD_SRCREV = "04f642fd026fb90bfd5c47b851beb551824aac9c"
+# Nov 6, 2023
+STARBOARD_SRCREV = "${@bb.utils.contains('DISTRO_FEATURES', 'cobalt-24', '293b1f15c324aa40d029f2f167660916be9037bd', '19e5a0df9979519ae6b75de5b400b1b48dc58ec8', d)}"
diff --git a/recipes-extended/ctrlm/ctrlm-factory.bb b/recipes-extended/ctrlm/ctrlm-factory.bb
index 1d61d6b..7a03d5b 100644
--- a/recipes-extended/ctrlm/ctrlm-factory.bb
+++ b/recipes-extended/ctrlm/ctrlm-factory.bb
@@ -50,7 +50,8 @@
 
 THUNDER            ?= "false"
 CXXFLAGS_append     = "${@bb.utils.contains('THUNDER', 'true', ' -I=${includedir}/WPEFramework/ -I=${includedir}/WPEFramework/core/', '', d)}"
-LDFLAGS_append      = "${@bb.utils.contains('THUNDER', 'true', ' -lWPEFrameworkCore -lWPEFrameworkProtocols -lWPEFrameworkPlugins -lWPEFrameworkTracing', '', d)}"
+LDFLAGS_append      = "${@bb.utils.contains('THUNDER', 'true', ' -lWPEFrameworkCore -lWPEFrameworkPlugins', '', d)}"
+LDFLAGS_append      = "${@bb.utils.contains('THUNDER', 'true', bb.utils.contains('DISTRO_FEATURES', 'wpe_r4', " -lWPEFrameworkCOM ", " -lWPEFrameworkProtocols -lWPEFrameworkTracing", d), " ", d)}"
 DEPENDS_append      = "${@bb.utils.contains('THUNDER', 'true', ' wpeframework', '', d)}"
 EXTRA_OECONF_append = "${@bb.utils.contains('THUNDER', 'true', ' --enable-thunder', '', d)}"
 
diff --git a/recipes-extended/ctrlm/ctrlm-headers.bb b/recipes-extended/ctrlm/ctrlm-headers.bb
index acb71cb..f4bafac 100644
--- a/recipes-extended/ctrlm/ctrlm-headers.bb
+++ b/recipes-extended/ctrlm/ctrlm-headers.bb
@@ -44,6 +44,7 @@
     install -d ${D}${includedir}/ctrlm_private
     install -m 644 ${S}/src/ctrlm_vendor_network_factory.h ${D}${includedir}/ctrlm_private
     install -m 644 ${S}/src/ctrlm_voice_packet_analysis.h ${D}${includedir}/ctrlm_private
+    install -m 644 ${S}/src/ctrlm_log.h ${D}${includedir}/ctrlm_private
 
     # Authorization Support
     install -m 644 ${S}/src/auth/ctrlm_auth.h ${D}${includedir}/ctrlm_private
@@ -53,7 +54,7 @@
     install -m 644 ${S}/src/irdb/ctrlm_irdb_factory.h ${D}${includedir}/ctrlm_private
     install -m 644 ${S}/src/irdb/ctrlm_irdb.h ${D}${includedir}
     install -m 644 ${S}/src/irdb/ctrlm_irdb_stub.h ${D}${includedir}/ctrlm_private
-    install -m 644 ${S}/src/irdb/ipc/ctrlm_irdb_ipc.h ${D}${includedir}
+    install -m 644 ${S}/src/ipc/ctrlm_ipc_iarm.h ${D}${includedir}
     install -m 644 ${S}/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.h ${D}${includedir}/ctrlm_private
 
     # Network Support
@@ -83,6 +84,7 @@
     install -m 644 ${S}/src/telemetry/ctrlm_telemetry_markers.h ${D}${includedir}/ctrlm_private
     install -m 644 ${S}/src/thunder/ctrlm_thunder_plugin.h ${D}${includedir}/ctrlm_private
     install -m 644 ${S}/src/thunder/ctrlm_thunder_controller.h ${D}${includedir}/ctrlm_private
+    install -m 644 ${S}/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h ${D}${includedir}/ctrlm_private
 }
 
 ALLOW_EMPTY_${PN} = "1"
diff --git a/recipes-extended/devicesettings/devicesettings_git.bb b/recipes-extended/devicesettings/devicesettings_git.bb
index f0012e1..2dfacba 100644
--- a/recipes-extended/devicesettings/devicesettings_git.bb
+++ b/recipes-extended/devicesettings/devicesettings_git.bb
@@ -16,8 +16,8 @@
 # hal, Note: we make this package machine specific since it uses a
 # machine HAL
 PACKAGE_ARCH = "${MACHINE_ARCH}"
-DEPENDS="directfb iarmbus rdk-logger virtual/devicesettings-hal devicesettings-hal-headers safec-common-wrapper"
-RDEPENDS_${PN} += "directfb"
+DEPENDS="directfb iarmbus rdk-logger rfc virtual/devicesettings-hal devicesettings-hal-headers safec-common-wrapper"
+RDEPENDS_${PN} += "directfb rfc"
 DEPENDS_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'safec', ' safec ', " ", d)}"
 
 S = "${WORKDIR}/git"
@@ -56,6 +56,10 @@
 CFLAGS += " -DYOCTO_BUILD"
 CFLAGS += " -DDS_AUDIO_SETTINGS_PERSISTENCE"
 
+# added support for rfc
+CFLAGS += "-I${STAGING_INCDIR}/wdmp-c"
+CXXFLAGS += "-I${STAGING_INCDIR}/wdmp-c"
+LDFLAGS +="-lrfcapi"
 
 # Shared libs created by the RDK build aren't versioned, so we need
 # to force the .so files into the runtime package (and keep them
diff --git a/recipes-extended/rdkservices/files/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework-rdkservice.patch b/recipes-extended/rdkservices/files/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework-rdkservice.patch
new file mode 100644
index 0000000..9b00b26
--- /dev/null
+++ b/recipes-extended/rdkservices/files/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework-rdkservice.patch
@@ -0,0 +1,58 @@
+From d7c772a41d323b0c5c60b5ed988c1026aebb41fa Mon Sep 17 00:00:00 2001
+From: kkanag314 <krishnapriya_kanagaraj@comcast.com>
+Date: Wed, 13 Sep 2023 10:59:38 +0000
+Subject: [PATCH] Add a new metrics punch through on the OCDM framework
+
+---
+ OpenCDMi/FrameworkRPC.cpp | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+diff --git a/OpenCDMi/FrameworkRPC.cpp b/OpenCDMi/FrameworkRPC.cpp
+index 2e64995e..2448e697 100644
+--- a/OpenCDMi/FrameworkRPC.cpp
++++ b/OpenCDMi/FrameworkRPC.cpp
+@@ -637,6 +637,18 @@ namespace Plugin {
+                     return (_cencData.Status());
+                 }
+ 
++                Exchange::OCDM_RESULT Metricdata(uint32_t& bufferSize, uint8_t buffer[]) const override {
++                    Exchange::OCDM_RESULT result = Exchange::OCDM_INTERFACE_NOT_IMPLEMENTED;
++
++                    CDMi::IMediaSessionMetrics* extension = dynamic_cast<CDMi::IMediaSessionMetrics*>(_mediaKeySession);
++
++                    if (extension != nullptr) {
++                        result = static_cast<Exchange::OCDM_RESULT>(extension->Metrics(bufferSize, buffer));
++                    }
++
++                    return(result);
++                }
++
+                 Exchange::ISession::KeyStatus Status(const uint8_t keyId[], const uint8_t length) const override
+                 {
+                     return (_cencData.Status(CommonEncryptionData::KeyId(static_cast<CommonEncryptionData::systemType>(0), keyId, length)));
+@@ -837,6 +849,23 @@ namespace Plugin {
+                 return result;
+             }
+ 
++            Exchange::OCDM_RESULT Metricdata(const string& keySystem, uint32_t& bufferSize, uint8_t buffer[]) const override {
++                Exchange::OCDM_RESULT result = Exchange::OCDM_KEYSYSTEM_NOT_SUPPORTED;
++
++                CDMi::IMediaKeys* system = _parent.KeySystem(keySystem);
++                if (system != nullptr) {
++                    CDMi::IMediaSystemMetrics* extension = dynamic_cast<CDMi::IMediaSystemMetrics*>(system);
++                    if (extension != nullptr) {
++                        result = static_cast<Exchange::OCDM_RESULT>(extension->Metrics(bufferSize, buffer));
++                    }
++                    else {
++                        result = Exchange::OCDM_INTERFACE_NOT_IMPLEMENTED;
++                    }
++                }
++
++                return(result);
++            }
++
+             uint32_t DefaultSize() const {
+                 return _defaultSize;
+             }
+-- 
+2.17.1
diff --git a/recipes-extended/rdkservices/files/0001-Added-Support-for-querying-and-publishing-the-Secure.patch b/recipes-extended/rdkservices/files/0001-Added-Support-for-querying-and-publishing-the-Secure.patch
index bac620c..f2690e2 100644
--- a/recipes-extended/rdkservices/files/0001-Added-Support-for-querying-and-publishing-the-Secure.patch
+++ b/recipes-extended/rdkservices/files/0001-Added-Support-for-querying-and-publishing-the-Secure.patch
@@ -13,11 +13,11 @@
  4 files changed, 82 insertions(+)
 
 diff --git a/SystemServices/SystemServices.cpp b/SystemServices/SystemServices.cpp
-index b920b05..ecfc5bc 100644
+index 719619e6..837d9623 100644
 --- a/SystemServices/SystemServices.cpp
 +++ b/SystemServices/SystemServices.cpp
-@@ -45,6 +45,10 @@
- #include "libIARM.h"
+@@ -41,6 +41,10 @@
+ #include "UtilsIarm.h"
  #endif /* USE_IARMBUS || USE_IARM_BUS */
  
 +#ifdef ENABLE_SYSTIMEMGR_SUPPORT
@@ -27,7 +27,7 @@
  #ifdef ENABLE_THERMAL_PROTECTION
  #include "thermonitor.h"
  #endif /* ENABLE_THERMAL_PROTECTION */
-@@ -231,6 +235,10 @@ namespace WPEFramework {
+@@ -329,6 +333,10 @@ namespace WPEFramework {
          void _thermMgrEventsHandler(const char *owner, IARM_EventId_t eventId,
                  void *data, size_t len);
  #endif /* ENABLE_THERMAL_PROTECTION */
@@ -38,7 +38,7 @@
  
  #if defined(USE_IARMBUS) || defined(USE_IARM_BUS)
          static IARM_Result_t _SysModeChange(void *arg);
-@@ -298,6 +306,9 @@ namespace WPEFramework {
+@@ -394,6 +402,9 @@ namespace WPEFramework {
              registerMethod("setPowerState", &SystemServices::setDevicePowerState,
                      this);
  #endif /* HAS_API_SYSTEM && HAS_API_POWERSTATE */
@@ -47,8 +47,8 @@
 +#endif// ENABLE_SYSTIMEMGR_SUPPORT
              registerMethod("setGzEnabled", &SystemServices::setGZEnabled, this);
              registerMethod("isGzEnabled", &SystemServices::isGZEnabled, this);
-             registerMethod("hasRebootBeenRequested",
-@@ -401,6 +412,9 @@ namespace WPEFramework {
+             registerMethod("getMode", &SystemServices::getMode, this);
+@@ -579,6 +590,9 @@ namespace WPEFramework {
  #ifdef ENABLE_THERMAL_PROTECTION
                  IARM_CHECK( IARM_Bus_RegisterEventHandler(IARM_BUS_PWRMGR_NAME, IARM_BUS_PWRMGR_EVENT_THERMAL_MODECHANGED, _thermMgrEventsHandler));
  #endif //ENABLE_THERMAL_PROTECTION
@@ -56,11 +56,11 @@
 +                IARM_CHECK( IARM_Bus_RegisterEventHandler(IARM_BUS_SYSTIME_MGR_NAME, cTIMER_STATUS_UPDATE, _timerStatusEventHandler));
 +#endif// ENABLE_SYSTIMEMGR_SUPPORT
              }
-         }
+ 	    
+             RFC_ParamData_t param = {0};
+@@ -1899,6 +1913,18 @@ namespace WPEFramework {
  
-@@ -1734,6 +1748,18 @@ namespace WPEFramework {
-             sendNotify(EVT_ONTEMPERATURETHRESHOLDCHANGED, params);
-         }
+ #endif
  
 +#ifdef ENABLE_SYSTIMEMGR_SUPPORT
 +        void SystemServices::onTimeStatusChanged(string timequality,string timesource, string utctime)
@@ -75,9 +75,9 @@
 +#endif// ENABLE_SYSTIMEMGR_SUPPORT
 +
          /***
-          * @brief : To set the Time to TZ_FILE.
-          * @param1[in]	: {"params":{"timeZone":"<string>"}}
-@@ -2513,6 +2539,24 @@ namespace WPEFramework {
+          * @brief Returns an array of strings containing the supported standby modes.
+          * Possible values are "LIGHT_SLEEP" and/or "DEEP_SLEEP".
+@@ -3599,6 +3625,24 @@ namespace WPEFramework {
              returnResponse(( E_OK == retVal)? true: false);
          }//end of getStateInfo
  
@@ -92,7 +92,7 @@
 +              LOGWARN ("Query to get Timer Status Failed..\n");
 +              returnResponse(false);
 +           }
-+           
++
 +           response["TimeQuality"] = std::string(param.message,cTIMER_STATUS_MESSAGE_LENGTH);
 +           response["TimeSrc"] = std::string(param.timerSrc,cTIMER_STATUS_MESSAGE_LENGTH);
 +           response["Time"] = std::string(param.currentTime,cTIMER_STATUS_MESSAGE_LENGTH);
@@ -102,9 +102,9 @@
  #if defined(HAS_API_SYSTEM) && defined(HAS_API_POWERSTATE)
          /***
           * @brief : To retrieve Device Power State.
-@@ -2953,6 +2997,25 @@ namespace WPEFramework {
-             }
+@@ -4315,6 +4359,25 @@ namespace WPEFramework {
          }
+ 
  #endif /* defined(USE_IARMBUS) || defined(USE_IARM_BUS) */
 +#ifdef ENABLE_SYSTIMEMGR_SUPPORT
 +        void _timerStatusEventHandler(const char *owner, IARM_EventId_t eventId,
@@ -129,12 +129,12 @@
          /***
           * @brief : To handle the event of Thermal Level change. THe event is registered
 diff --git a/SystemServices/SystemServices.h b/SystemServices/SystemServices.h
-index 380f2cc..5690262 100644
+index 50a49e0e..2c14838c 100644
 --- a/SystemServices/SystemServices.h
 +++ b/SystemServices/SystemServices.h
-@@ -52,6 +52,10 @@
- #define EVT_ONMACADDRESSRETRIEVED         "onMacAddressesRetreived"
- #define EVT_ONREBOOTREQUEST               "onRebootRequest"
+@@ -71,6 +71,10 @@ using std::ofstream;
+ #define TERRITORYFILE                     "/opt/secure/persistent/System/Territory.txt"
+ 
  
 +#ifdef ENABLE_SYSTIMEMGR_SUPPORT
 +#define EVT_ONTIMESTATUSCHANGED           "onTimeStatusChanged"
@@ -143,32 +143,47 @@
  namespace WPEFramework {
      namespace Plugin {
  
-@@ -138,6 +142,9 @@ namespace WPEFramework {
-                 void onFirmwareUpdateStateChange(int state);
+@@ -198,6 +202,9 @@ namespace WPEFramework {
+                 void onLogUpload(int newState);
                  void onTemperatureThresholdChanged(string thresholdType,
                          bool exceed, float temperature);
 +#ifdef ENABLE_SYSTIMEMGR_SUPPORT
 +                void onTimeStatusChanged(string timequality,string timesource, string utctime);
 +#endif// ENABLE_SYSTIMEMGR_SUPPORT
                  void onRebootRequest(string reason);
-                 /* Events : End */
- 
-@@ -211,6 +218,10 @@ namespace WPEFramework {
+                 void onFirmwarePendingReboot(int seconds); /* Event handler for Pending Reboot */
+ 		void onTerritoryChanged(string oldTerritory, string newTerritory, string oldRegion="", string newRegion="");
+@@ -218,6 +225,9 @@ namespace WPEFramework {
+                 uint32_t getDevicePowerState(const JsonObject& parameters,JsonObject& response);
                  uint32_t setDevicePowerState(const JsonObject& parameters,JsonObject& response);
  #endif /* HAS_API_SYSTEM && HAS_API_POWERSTATE */
- 
 +#ifdef ENABLE_SYSTIMEMGR_SUPPORT
 +                uint32_t getSystemTimeStatus(const JsonObject& parameters,JsonObject& response);
 +#endif// ENABLE_SYSTIMEMGR_SUPPORT
-+
-                 uint32_t isRebootRequested(const JsonObject& parameters,JsonObject& response);
                  uint32_t setGZEnabled(const JsonObject& parameters,JsonObject& response);
                  uint32_t isGZEnabled(const JsonObject& parameters,JsonObject& response);
+                 uint32_t getSystemVersions(const JsonObject& parameters, JsonObject& response);
+diff --git a/amlogic.cmake b/amlogic.cmake
+index 6d682a74..cb284c90 100644
+--- a/amlogic.cmake
++++ b/amlogic.cmake
+@@ -83,6 +83,11 @@ if (BUILD_ENABLE_THERMAL_PROTECTION)
+ add_definitions (-DBUILD_ENABLE_THERMAL_PROTECTION)
+    add_definitions (-DENABLE_THERMAL_PROTECTION)
+ endif()
++if (BUILD_ENABLE_SYSTIMEMGR_SUPPORT)
++    message("Building with SYSTIMEMGR_SUPPORT enabled")
++   add_definitions (-DENABLE_SYSTIMEMGR_SUPPORT)
++endif()
++
+ 
+ if (BUILD_ENABLE_DEVICE_MANUFACTURER_INFO)
+     message("Building with device manufacturer info")
 diff --git a/broadcom.cmake b/broadcom.cmake
-index 4722d3e..b62e848 100644
+index 80feae9f..c98dc5a0 100644
 --- a/broadcom.cmake
 +++ b/broadcom.cmake
-@@ -89,6 +89,10 @@ add_definitions (-DBUILD_ENABLE_THERMAL_PROTECTION)
+@@ -94,6 +94,10 @@ add_definitions (-DBUILD_ENABLE_THERMAL_PROTECTION)
     add_definitions (-DENABLE_THERMAL_PROTECTION)
  endif()
  
@@ -180,10 +195,10 @@
      message("Building with SCREENCAP_SVP_ENABLED")
      add_definitions (-DSCREENCAP_SVP_ENABLED)
 diff --git a/realtek.cmake b/realtek.cmake
-index 41d5978..016fc1c 100644
+index 0de092f1..db825da1 100644
 --- a/realtek.cmake
 +++ b/realtek.cmake
-@@ -76,6 +76,10 @@ if (BUILD_ENABLE_THERMAL_PROTECTION)
+@@ -83,6 +83,10 @@ if (BUILD_ENABLE_THERMAL_PROTECTION)
  add_definitions (-DBUILD_ENABLE_THERMAL_PROTECTION)
     add_definitions (-DENABLE_THERMAL_PROTECTION)
  endif()
@@ -194,22 +209,3 @@
  
  if (BUILD_ENABLE_DEVICE_MANUFACTURER_INFO)
      message("Building with device manufacturer info")
-diff --git a/amlogic.cmake b/amlogic.cmake
-index 813bddb..db84fb3 100644
---- a/amlogic.cmake
-+++ b/amlogic.cmake
-@@ -76,6 +76,11 @@ if (BUILD_ENABLE_THERMAL_PROTECTION)
- add_definitions (-DBUILD_ENABLE_THERMAL_PROTECTION)
-    add_definitions (-DENABLE_THERMAL_PROTECTION)
- endif()
-+if (BUILD_ENABLE_SYSTIMEMGR_SUPPORT)
-+    message("Building with SYSTIMEMGR_SUPPORT enabled")
-+   add_definitions (-DENABLE_SYSTIMEMGR_SUPPORT)
-+endif()
-+
- 
- if (BUILD_ENABLE_DEVICE_MANUFACTURER_INFO)
-     message("Building with device manufacturer info")
--- 
-2.24.0
-
diff --git a/recipes-extended/rdkservices/files/0001-RDK-39924-Launch-Airplay-App-from-Airplay-icon-sel.patch b/recipes-extended/rdkservices/files/0001-RDK-39924-Launch-Airplay-App-from-Airplay-icon-sel.patch
index b93d883..8d97797 100644
--- a/recipes-extended/rdkservices/files/0001-RDK-39924-Launch-Airplay-App-from-Airplay-icon-sel.patch
+++ b/recipes-extended/rdkservices/files/0001-RDK-39924-Launch-Airplay-App-from-Airplay-icon-sel.patch
@@ -9,6 +9,7 @@
 
 Signed-off-by: rgangi643 <ramakrishna_gangisetty@comcast.com>
 ---
+ AirplayService/AirplayService.conf.in    |   4 +
  AirplayService/AirplayService.config     |   7 +
  AirplayService/AirplayService.cpp        | 228 +++++++++++++++++++++++
  AirplayService/AirplayService.h          |  69 +++++++
@@ -32,6 +33,16 @@
  create mode 100644 AirplayService/Module.h
  create mode 100644 AirplayService/README.md
 
+diff --git a/AirplayService/AirplayService.conf.in b/AirplayService/AirplayService.conf.in
+new file mode 100644
+index 00000000..a4891270
+--- /dev/null
++++ b/AirplayService/AirplayService.conf.in
+@@ -0,0 +1,4 @@
++precondition = ["Platform"]
++callsign = "org.rdk.AirplayService"
++autostart = "false"
++startuporder = "@PLUGIN_AIRPLAYSERVICE_STARTUPORDER@"
 diff --git a/AirplayService/AirplayService.config b/AirplayService/AirplayService.config
 new file mode 100644
 index 00000000..034cb7b7
diff --git a/recipes-extended/rdkservices/files/0001-SERXIONE-600-LocationSync-Network-check-timer.patch b/recipes-extended/rdkservices/files/0001-SERXIONE-600-LocationSync-Network-check-timer.patch
deleted file mode 100644
index 35e8552..0000000
--- a/recipes-extended/rdkservices/files/0001-SERXIONE-600-LocationSync-Network-check-timer.patch
+++ /dev/null
@@ -1,385 +0,0 @@
-From 5e20cd883cbea2c3111b624f18ef743c5fdec42a Mon Sep 17 00:00:00 2001
-From: Sergiy Gladkyy <sgladkyy@productengine.com>
-Date: Tue, 30 Aug 2022 20:38:30 +0200
-Subject: [PATCH] SERXIONE-600: LocationSync Network check (timer)
-
-Source: COMCAST
-Upstream-Status: Pending
-Reason for change: LocationSync depends on Network but it might not be available early on boot-up
-Implements:  network availability check
-Test Procedure: discussed in the ticket
-Signed-off-by: Sergiy Gladkyy <sgladkyy@productengine.com>
-Risks: None
-
-Change-Id: Ia4b66e10f2f2a8f191eca2df59e39ea31bdc67dd
-(cherry picked from commit b65de319b32b25af989eb1ea6c9ca2f982817f09)
----
- LocationSync/CMakeLists.txt   |  12 ++-
- LocationSync/LocationSync.cpp | 189 +++++++++++++++++++++++++++++++++-
- LocationSync/LocationSync.h   |  52 +++++++++-
- 3 files changed, 246 insertions(+), 7 deletions(-)
-
-diff --git a/LocationSync/CMakeLists.txt b/LocationSync/CMakeLists.txt
-index a5909c24..a20b39a4 100644
---- a/LocationSync/CMakeLists.txt
-+++ b/LocationSync/CMakeLists.txt
-@@ -30,6 +30,8 @@ set(PLUGIN_LOCATIONSYNC_URI "location.webplatformforembedded.org" CACHE STRING "
- find_package(${NAMESPACE}Plugins REQUIRED)
- find_package(CompileSettingsDebug CONFIG REQUIRED)
- 
-+find_package(IARMBus)
-+
- add_library(${MODULE_NAME} SHARED 
-     Module.cpp
-     LocationSync.cpp
-@@ -37,6 +39,8 @@ add_library(${MODULE_NAME} SHARED
-     LocationSyncJsonRpc.cpp
- )
- 
-+target_compile_definitions(${MODULE_NAME} PRIVATE MODULE_NAME=Plugin_${PLUGIN_NAME})
-+
- set_target_properties(${MODULE_NAME} PROPERTIES
-         CXX_STANDARD 11
-         CXX_STANDARD_REQUIRED YES)
-@@ -44,9 +48,11 @@ set_target_properties(${MODULE_NAME} PROPERTIES
- target_link_libraries(${MODULE_NAME} 
-     PRIVATE
-         CompileSettingsDebug::CompileSettingsDebug
--        ${NAMESPACE}Plugins::${NAMESPACE}Plugins)
--
--install(TARGETS ${MODULE_NAME} 
-+        ${NAMESPACE}Plugins::${NAMESPACE}Plugins
-+        ${IARMBUS_LIBRARIES}
-+)
-+target_include_directories(${MODULE_NAME} PRIVATE ${IARMBUS_INCLUDE_DIRS})
-+install(TARGETS ${MODULE_NAME}
-     DESTINATION lib/${STORAGE_DIRECTORY}/plugins)
- 
- write_config(${PLUGIN_NAME})
-diff --git a/LocationSync/LocationSync.cpp b/LocationSync/LocationSync.cpp
-index 7acedc6e..57783033 100644
---- a/LocationSync/LocationSync.cpp
-+++ b/LocationSync/LocationSync.cpp
-@@ -18,12 +18,56 @@
-  */
-  
- #include "LocationSync.h"
-+#include <memory>
-+#include "libIBus.h"
- 
- #define API_VERSION_NUMBER_MAJOR 1
- #define API_VERSION_NUMBER_MINOR 0
- #define API_VERSION_NUMBER_PATCH 0
- 
-+#define IARM_BUS_NM_SRV_MGR_NAME "NET_SRV_MGR"
-+#define IARM_BUS_NETSRVMGR_API_isConnectedToInternet "isConnectedToInternet"
-+
- namespace WPEFramework {
-+namespace Utils {
-+    struct IARM {
-+        static bool init() {
-+            IARM_Result_t res;
-+            bool result = false;
-+            if (isConnected()) {
-+                TRACE_GLOBAL(Trace::Information, (_T("IARM already connected")));
-+                result = true;
-+            } else {
-+                res = IARM_Bus_Init(NAME);
-+                TRACE_GLOBAL(Trace::Information, (_T("IARM_Bus_Init: %d"), res));
-+                if (res == IARM_RESULT_SUCCESS || res == IARM_RESULT_INVALID_STATE /* already inited or connected */) {
-+                    res = IARM_Bus_Connect();
-+                    TRACE_GLOBAL(Trace::Information, (_T("IARM_Bus_Connect: %d"), res));
-+                    if (res == IARM_RESULT_SUCCESS ||
-+                        res == IARM_RESULT_INVALID_STATE /* already connected or not inited */) {
-+                        result = isConnected();
-+                    } else {
-+                        TRACE_GLOBAL(Trace::Fatal, (_T("IARM_Bus_Connect failure: %d"), res));
-+                    }
-+                } else {
-+                    TRACE_GLOBAL(Trace::Fatal, (_T("IARM_Bus_Init failure: %d"), res));
-+                }
-+            }
-+            return result;
-+        }
-+
-+        static bool isConnected()
-+        {
-+            IARM_Result_t res;
-+            int isRegistered = 0;
-+            res = IARM_Bus_IsConnected(NAME, &isRegistered);
-+            TRACE_GLOBAL(Trace::Fatal, (_T("IARM_Bus_IsConnected: %d (%d)"), res, isRegistered));
-+            return (isRegistered == 1);
-+        }
-+        static constexpr const char* NAME = "Thunder_Plugins";
-+    };
-+}
-+
- namespace Plugin {
- 
-     SERVICE_REGISTRATION(LocationSync, API_VERSION_NUMBER_MAJOR, API_VERSION_NUMBER_MINOR, API_VERSION_NUMBER_PATCH);
-@@ -37,10 +81,15 @@ namespace Plugin {
-     LocationSync::LocationSync()
-         : _skipURL(0)
-         , _source()
-+                , _interval(0)
-+                , _retries(0)
-         , _sink(this)
-         , _service(nullptr)
-+                , _networkReady(false)
-+        , _iarmConnected(false)
-     {
-         RegisterAll();
-+            _netControlTimer.connect(std::bind(&LocationSync::onNetControlTimer, this));
-     }
- #ifdef __WINDOWS__
- #pragma warning(default : 4355)
-@@ -58,12 +107,31 @@ namespace Plugin {
-         config.FromString(service->ConfigLine());
-         string version = service->Version();
- 
-+        _iarmConnected = Utils::IARM::init();
-+        if (!_iarmConnected)
-+        {
-+            TRACE(Trace::Fatal, (_T("IARM bus is not available. Preliminary reachability check will not be performed\n")));
-+        }
-+
-         if (LocationService::IsSupported(config.Source.Value()) == Core::ERROR_NONE) {
-             _skipURL = static_cast<uint16_t>(service->WebPrefix().length());
-             _source = config.Source.Value();
-+                _interval = config.Interval.Value();
-+                _retries = config.Retries.Value();
-+            ASSERT(service != nullptr);
-+            ASSERT(_service == nullptr);
-             _service = service;
--
--            _sink.Initialize(config.Source.Value(), config.Interval.Value(), config.Retries.Value());
-+            _service->AddRef();
-+            TRACE(Trace::Information, (_T("Starting netcontrol timer. Source: %s, interval: %d, retries: %d, network check every %d ms")
-+                    , _source.c_str()
-+                    , _interval
-+                    , _retries
-+                    , _interval * 1000
-+            ));
-+            if(_netControlTimer.isActive()) {
-+                _netControlTimer.stop();
-+            }
-+            _netControlTimer.start(_interval * 1000);
-         } else {
-             result = _T("URL for retrieving location is incorrect !!!");
-         }
-@@ -75,7 +143,12 @@ namespace Plugin {
-     void LocationSync::Deinitialize(PluginHost::IShell* service VARIABLE_IS_NOT_USED) /* override */
-     {
-         ASSERT(_service == service);
-+        _service->Release();
-+        _service = nullptr;
- 
-+            if(_netControlTimer.isActive()) {
-+                _netControlTimer.stop();
-+            }
-         _sink.Deinitialize();
-     }
- 
-@@ -164,5 +237,117 @@ namespace Plugin {
-         }
-     }
- 
-+        void LocationSync::onNetControlTimer()
-+        {
-+            static uint8_t remainingAttempts = _retries;
-+            bool networkReachable = getConnectivity();
-+            remainingAttempts--;
-+            TRACE(Trace::Information, (_T("Network is %s"), networkReachable ? "REACHABLE" : "UNREACHABLE"));
-+            if (!_iarmConnected || networkReachable || remainingAttempts <= 0)
-+            {
-+                _netControlTimer.stop();
-+                TRACE(Trace::Information, (_T("Network reachability monitoring stopped.")));
-+                TRACE(Trace::Information, (_T("Proceeding with LocationService init.")));
-+                _sink.Initialize(_source, _interval, _retries);
-+            } else {
-+                TRACE(Trace::Information, (_T("Doing one more reachability check in %d sec, remaining attempts: %d"), _interval, remainingAttempts));
-+            }
-+        }
-+        bool LocationSync::getConnectivity()
-+        {
-+            bool result = false;
-+            IARM_Result_t retVal = IARM_RESULT_SUCCESS;
-+            /* check if plugin active */
-+            auto network = _service->QueryInterfaceByCallsign<PluginHost::IDispatcher>("org.rdk.Network");
-+            if (network == nullptr) {
-+                TRACE(Trace::Fatal, _T(("Network plugin is not activated \n")));
-+                result = false;
-+            } else {
-+                network->Release();
-+                retVal = IARM_Bus_Call(IARM_BUS_NM_SRV_MGR_NAME, IARM_BUS_NETSRVMGR_API_isConnectedToInternet, (void*) &result, sizeof(result));
-+                TRACE(Trace::Information, (_T("%s :: isConnected = %d \n"), __FUNCTION__, result));
-+                if (IARM_RESULT_SUCCESS != retVal)
-+                {
-+                    TRACE(Trace::Fatal, (_T("Call to %s for %s failed\n"), IARM_BUS_NM_SRV_MGR_NAME, IARM_BUS_NETSRVMGR_API_isConnectedToInternet));
-+                }
-+            }
-+            return result;
-+        }
-+
-+        // TIMER
-+        Timer::Timer() :
-+                baseTimer(64 * 1024, "ThunderPluginBaseTimer")
-+                , m_timerJob(this)
-+                , m_isActive(false)
-+                , m_isSingleShot(false)
-+                , m_intervalInMs(-1)
-+        {}
-+
-+        Timer::~Timer()
-+        {
-+            stop();
-+        }
-+
-+        bool Timer::isActive()
-+        {
-+            return m_isActive;
-+        }
-+
-+        void Timer::stop()
-+        {
-+            baseTimer.Revoke(m_timerJob);
-+            m_isActive = false;
-+        }
-+
-+        void Timer::start()
-+        {
-+            baseTimer.Revoke(m_timerJob);
-+            baseTimer.Schedule(Core::Time::Now().Add(m_intervalInMs), m_timerJob);
-+            m_isActive = true;
-+        }
-+
-+        void Timer::start(int msec)
-+        {
-+            setInterval(msec);
-+            start();
-+        }
-+
-+        void Timer::setSingleShot(bool val)
-+        {
-+            m_isSingleShot = val;
-+        }
-+
-+        void Timer::setInterval(int msec)
-+        {
-+            m_intervalInMs = msec;
-+        }
-+
-+        void Timer::connect(std::function< void() > callback)
-+        {
-+            onTimeoutCallback = callback;
-+        }
-+
-+        void Timer::Timed()
-+        {
-+            if(onTimeoutCallback != nullptr) {
-+                onTimeoutCallback();
-+            }
-+            // stop in case of a single shot call; start again if it has not been stopped
-+            if (m_isActive) {
-+                if(m_isSingleShot) {
-+                    stop();
-+                } else{
-+                    start();
-+                }
-+            }
-+        }
-+
-+        uint64_t TimerJob::Timed(const uint64_t scheduledTime)
-+        {
-+            if(m_timer) {
-+                m_timer->Timed();
-+            }
-+            return 0;
-+        }
- } // namespace Plugin
- } // namespace WPEFramework
-diff --git a/LocationSync/LocationSync.h b/LocationSync/LocationSync.h
-index 4bfcf64f..10d3e711 100644
---- a/LocationSync/LocationSync.h
-+++ b/LocationSync/LocationSync.h
-@@ -16,7 +16,7 @@
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-  */
-- 
-+ //
- #ifndef LOCATIONSYNC_LOCATIONSYNC_H
- #define LOCATIONSYNC_LOCATIONSYNC_H
- 
-@@ -26,6 +26,48 @@
- 
- namespace WPEFramework {
- namespace Plugin {
-+        class Timer;
-+        class TimerJob
-+        {
-+        private:
-+            TimerJob() = delete;
-+            TimerJob& operator=(const TimerJob& RHS) = delete;
-+        public:
-+            TimerJob(WPEFramework::Plugin::Timer* tpt) : m_timer(tpt) { }
-+            TimerJob(const TimerJob& copy) : m_timer(copy.m_timer) { }
-+            ~TimerJob() {}
-+            inline bool operator==(const TimerJob& RHS) const
-+            {
-+                return(m_timer == RHS.m_timer);
-+            }
-+        public:
-+            uint64_t Timed(const uint64_t scheduledTime);
-+        private:
-+            WPEFramework::Plugin::Timer* m_timer;
-+        };
-+
-+        class Timer
-+        {
-+        public:
-+            Timer();
-+            ~Timer();
-+            bool isActive();
-+            void stop();
-+            void start();
-+            void start(int msec);
-+            void setSingleShot(bool val);
-+            void setInterval(int msec);
-+            void connect(std::function< void() > callback);
-+        private:
-+            void Timed();
-+            WPEFramework::Core::TimerType<TimerJob> baseTimer;
-+            TimerJob m_timerJob;
-+            bool m_isActive;
-+            bool m_isSingleShot;
-+            int m_intervalInMs;
-+            std::function< void() > onTimeoutCallback;
-+            friend class TimerJob;
-+        };
- 
-     class LocationSync : public PluginHost::IPlugin, public PluginHost::IWeb, public PluginHost::JSONRPC {
-     public:
-@@ -201,12 +243,18 @@ namespace Plugin {
-         void event_locationchange();
- 
-         void SyncedLocation();
--
-+        bool getConnectivity();
-+        void onNetControlTimer();
-     private:
-         uint16_t _skipURL;
-         string _source;
-+        uint16_t _interval;
-+        uint8_t _retries;
-         Core::Sink<Notification> _sink;
-         PluginHost::IShell* _service;
-+        bool _networkReady;
-+        Timer _netControlTimer;
-+        bool _iarmConnected;
-     };
- 
- } // namespace Plugin
--- 
-2.32.1 (Apple Git-133)
-
diff --git a/recipes-extended/rdkservices/include/texttospeech.inc b/recipes-extended/rdkservices/include/texttospeech.inc
index a94c839..43e7088 100644
--- a/recipes-extended/rdkservices/include/texttospeech.inc
+++ b/recipes-extended/rdkservices/include/texttospeech.inc
@@ -2,6 +2,7 @@
 
 TEXTTOSPEECH_ENDPOINT ?= " "
 TEXTTOSPEECH_SECURE_ENDPOINT ?= " "
+TEXTTOSPEECH_LOCAL_ENDPOINT ?= " "
 TEXTTOSPEECH_LANGUAGE ?= "en-US"
 TEXTTOSPEECH_VOLUME ?= "100"
 TEXTTOSPEECH_RATE ?= "50"
@@ -14,6 +15,12 @@
 TEXTTOSPEECH_VOICE_FOR_GB ?= " "
 TEXTTOSPEECH_VOICE_FOR_DE ?= " "
 TEXTTOSPEECH_VOICE_FOR_IT ?= " "
+TEXTTOSPEECH_LOCALVOICE_FOR_EN ?= " "
+TEXTTOSPEECH_LOCALVOICE_FOR_ES ?= " "
+TEXTTOSPEECH_LOCALVOICE_FOR_FR ?= " "
+TEXTTOSPEECH_LOCALVOICE_FOR_GB ?= " "
+TEXTTOSPEECH_LOCALVOICE_FOR_DE ?= " "
+TEXTTOSPEECH_LOCALVOICE_FOR_IT ?= " "
 
 # ----------------------------------------------------------------------------
 
@@ -21,6 +28,7 @@
                                -DPLUGIN_MONITOR_TEXTTOSPEECH=ON \
                                -DPLUGIN_TEXTTOSPEECH_ENDPOINT="${TEXTTOSPEECH_ENDPOINT}" \
                                -DPLUGIN_TEXTTOSPEECH_SECURE_ENDPOINT="${TEXTTOSPEECH_SECURE_ENDPOINT}" \
+                               -DPLUGIN_TEXTTOSPEECH_LOCAL_ENDPOINT="${TEXTTOSPEECH_LOCAL_ENDPOINT}" \
                                -DPLUGIN_TEXTTOSPEECH_LANGUAGE="${TEXTTOSPEECH_LANGUAGE}" \
                                -DPLUGIN_TEXTTOSPEECH_VOLUME="${TEXTTOSPEECH_VOLUME}" \
                                -DPLUGIN_TEXTTOSPEECH_RATE="${TEXTTOSPEECH_RATE}" \
@@ -33,6 +41,12 @@
                                -DPLUGIN_TEXTTOSPEECH_VOICE_FOR_GB="${TEXTTOSPEECH_VOICE_FOR_GB}" \
                                -DPLUGIN_TEXTTOSPEECH_VOICE_FOR_DE="${TEXTTOSPEECH_VOICE_FOR_DE}" \
                                -DPLUGIN_TEXTTOSPEECH_VOICE_FOR_IT="${TEXTTOSPEECH_VOICE_FOR_IT}" \
+                               -DPLUGIN_TEXTTOSPEECH_LOCALVOICE_FOR_EN="${TEXTTOSPEECH_LOCALVOICE_FOR_EN}" \
+                               -DPLUGIN_TEXTTOSPEECH_LOCALVOICE_FOR_ES="${TEXTTOSPEECH_LOCALVOICE_FOR_ES}" \
+                               -DPLUGIN_TEXTTOSPEECH_LOCALVOICE_FOR_FR="${TEXTTOSPEECH_LOCALVOICE_FOR_FR}" \
+                               -DPLUGIN_TEXTTOSPEECH_LOCALVOICE_FOR_GB="${TEXTTOSPEECH_LOCALVOICE_FOR_GB}" \
+                               -DPLUGIN_TEXTTOSPEECH_LOCALVOICE_FOR_DE="${TEXTTOSPEECH_LOCALVOICE_FOR_DE}" \
+                               -DPLUGIN_TEXTTOSPEECH_LOCALVOICE_FOR_IT="${TEXTTOSPEECH_LOCALVOICE_FOR_IT}" \
                                , -DPLUGIN_TEXTTOSPEECH=OFF,"
 
 # ----------------------------------------------------------------------------
diff --git a/recipes-extended/rdkservices/rdkservices_git.bb b/recipes-extended/rdkservices/rdkservices_git.bb
index 4b9304a..6896a32 100644
--- a/recipes-extended/rdkservices/rdkservices_git.bb
+++ b/recipes-extended/rdkservices/rdkservices_git.bb
@@ -21,16 +21,16 @@
            file://0001-Add-monitoring-of-cloned-callsigns.patch \
            file://rdkservices.ini \
            file://0001-RDKTV-11792-increase-retry-count.patch \
-           file://0001-SERXIONE-600-LocationSync-Network-check-timer.patch \
            file://0001-RDKTV-20749-Revert-Merge-pull-request-3336-from-npol.patch \
            file://0001-RDK-39924-Launch-Airplay-App-from-Airplay-icon-sel.patch \
            file://0001-rdkservices_cbcs_changes.patch \
            file://0001-RDK-41681-PR4013.patch \
            file://0002-Adding-Support-For-R4.patch \
+           file://0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework-rdkservice.patch \
           "
 
-# Aug 02 2023
-SRCREV = "bd88c1be00b60ed1a515195b3619bd80b908906b"
+# Nov 28 2023
+SRCREV = "cc8b8a5d52f66f76e5d14a3d86613ca46f1419ca"
 
 TOOLCHAIN = "gcc"
 EXTRA_OECMAKE += "${@bb.utils.contains('DISTRO_FEATURES', 'wpe_r4', ' -DUSE_THUNDER_R4=ON', '', d)}"
@@ -67,7 +67,7 @@
     activitymonitor avinput continuewatching datacapture devicediagnostics \
     displaysettings framerate hdcpprofile hdmicec hdmiinput loggingpreferences \
     screencapture securityagent stateobserver \
-    systemservices timer userpreferences warehouse monitor locationsync texttospeech persistent_store airplayservice \
+    systemservices timer userpreferences warehouse monitor locationsync texttospeech persistent_store airplayservice messenger \
     ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluetoothcontrol', '', d)} \
     ${@bb.utils.contains('DISTRO_FEATURES', 'opencdm',              'opencdmi', '', d)} \
     ${@bb.utils.contains('DISTRO_FEATURES', 'playready_nexus_svp',  'opencdmi_prnx_svp', '', d)} \
@@ -81,7 +81,7 @@
     ${@bb.utils.contains('DISTRO_FEATURES', 'fireboltmediaplayer', 'fireboltmediaplayer', '', d)} \
     ${@bb.utils.contains('DISTRO_FEATURES', 'dlnasupport', ' dlna', '', d)} \
     ${@bb.utils.contains('DISTRO_FEATURES', 'flex2_rdk', ' hdmicecsource', ' ', d)} \
-    ${@bb.utils.contains('DISTRO_FEATURES', 'wpe_r4', ' messagecontrol ', ' tracecontrol messenger ', d)} \
+    ${@bb.utils.contains('DISTRO_FEATURES', 'wpe_r4', ' messagecontrol ', ' tracecontrol ', d)} \
     ${@bb.utils.contains('DISTRO_FEATURES', 'systimemgr', 'systimemgrsupport', '', d)} \
     ${@bb.utils.contains('DISTRO_FEATURES', 'ctrlm', 'controlservice voicecontrol remotecontrol remoteactionmapping', '', d)} \
 "
@@ -183,6 +183,7 @@
 "
 
 EXTRA_OECMAKE += " \
+    -DPYTHON_EXECUTABLE=${STAGING_BINDIR_NATIVE}/python3-native/python3 \
     -DBUILD_REFERENCE=${SRCREV} \
     -DBUILD_SHARED_LIBS=ON \
     -DSECAPI_LIB=sec_api \
diff --git a/recipes-extended/rialto/rialto-gstreamer_git.bb b/recipes-extended/rialto/rialto-gstreamer_git.bb
new file mode 100644
index 0000000..4b79e35
--- /dev/null
+++ b/recipes-extended/rialto/rialto-gstreamer_git.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Rialto-gstreamer"
+LICENSE = "LGPLv2.1"
+LIC_FILES_CHKSUM = "file://COPYING.LGPL;md5=23c2a5e0106b99d75238986559bb5fc6"
+
+require rialto_revision.inc
+
+SRC_URI = "${CMF_GITHUB_ROOT}/rialto-gstreamer;protocol=${CMF_GIT_PROTOCOL};branch=${CMF_GITHUB_MASTER_BRANCH}"
+SRCREV = "${@bb.utils.contains('DISTRO_FEATURES', 'rialto_head', '${AUTOREV}', '${RIALTO_VERSION}', d)}"
+
+DEPENDS = "openssl jsoncpp glib-2.0 gstreamer1.0 gstreamer1.0-plugins-base wpeframework-clientlibraries protobuf protobuf-native rialto rialto-ocdm"
+
+S = "${WORKDIR}/git"
+inherit cmake coverity features_check
+
+FILES_${PN} += "${libdir}/gstreamer-1.0/libgstrialtosinks.so"
+ 
+REQUIRED_DISTRO_FEATURES = "enable_rialto"
diff --git a/recipes-extended/rialto/rialto-ocdm_git.bb b/recipes-extended/rialto/rialto-ocdm_git.bb
new file mode 100644
index 0000000..f81aa82
--- /dev/null
+++ b/recipes-extended/rialto/rialto-ocdm_git.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Rialto-ocdm"
+LICENSE  = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=1fa88b316b1ce25ab7d95ae4d854ec8f"
+
+require rialto_revision.inc
+
+SRC_URI = "${CMF_GITHUB_ROOT}/rialto-ocdm;protocol=${CMF_GIT_PROTOCOL};branch=${CMF_GITHUB_MASTER_BRANCH}"
+SRCREV = "${@bb.utils.contains('DISTRO_FEATURES', 'rialto_head', '${AUTOREV}', '${RIALTO_VERSION}', d)}"
+
+DEPENDS = "openssl jsoncpp glib-2.0 gstreamer1.0 gstreamer1.0-plugins-base wpeframework-tools-native wpeframework-clientlibraries protobuf protobuf-native rialto"
+
+S = "${WORKDIR}/git"
+
+inherit cmake coverity features_check
+
+REQUIRED_DISTRO_FEATURES = "enable_rialto"
diff --git a/recipes-extended/rialto/rialto_git.bb b/recipes-extended/rialto/rialto_git.bb
new file mode 100644
index 0000000..71a8fe6
--- /dev/null
+++ b/recipes-extended/rialto/rialto_git.bb
@@ -0,0 +1,40 @@
+SUMMARY = "Rialto"
+LICENSE  = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=327e572d11c37963726ba0b02d30cf2c"
+
+require rialto_revision.inc
+
+SRC_URI = "${CMF_GITHUB_ROOT}/rialto;protocol=${CMF_GIT_PROTOCOL};branch=${CMF_GITHUB_MASTER_BRANCH}"
+SRCREV = "${@bb.utils.contains('DISTRO_FEATURES', 'rialto_head', '${AUTOREV}', '${RIALTO_VERSION}', d)}"
+
+DEPENDS = "openssl jsoncpp protobuf protobuf-native"
+
+S = "${WORKDIR}/git"
+inherit cmake coverity features_check
+
+PACKAGES =+ "${PN}-client ${PN}-server ${PN}-servermanager-lib ${PN}-servermanager"
+
+PACKAGECONFIG[server] = "-DENABLE_SERVER=ON,-DENABLE_SERVER=OFF,wpeframework-clientlibraries gstreamer1.0 gstreamer1.0-plugins-base glib-2.0 rdk-gstreamer-utils"
+PACKAGECONFIG[servermanager] = "-DENABLE_SERVER_MANAGER=ON,-DENABLE_SERVER_MANAGER=OFF,mongoose,"
+
+# The 'servermanager' package config has a runtime
+# dependency on the 'RialtoServer' executable and as such
+# requires the 'server' package config to be enabled as well.
+PACKAGECONFIG ??= "server servermanager"
+
+FILES_${PN}-client += "${libdir}/libRialtoClient.so.*"
+
+FILES_${PN}-server += "${bindir}/RialtoServer"
+
+FILES_${PN}-servermanager += "${bindir}/RialtoServerManagerSim"
+RDEPENDS_${PN}-servermanager += "${PN}-server"
+
+FILES_${PN}-servermanager-lib += "${libdir}/libRialtoServerManager.so.*"
+
+RDEPENDS_rialto-server += " rdk-gstreamer-utils"
+
+REQUIRED_DISTRO_FEATURES = "enable_rialto"
+
+RDEPENDS_${PN} += "protobuf mongoose"
+
+IMAGE_INSTALL_append = " rialto"
diff --git a/recipes-extended/rialto/rialto_revision.inc b/recipes-extended/rialto/rialto_revision.inc
new file mode 100644
index 0000000..fd9e61b
--- /dev/null
+++ b/recipes-extended/rialto/rialto_revision.inc
@@ -0,0 +1 @@
+RIALTO_VERSION ?= "v0.2.0"
diff --git a/recipes-extended/snmp/snmp_git.bbappend b/recipes-extended/snmp/snmp_git.bbappend
new file mode 100644
index 0000000..b648783
--- /dev/null
+++ b/recipes-extended/snmp/snmp_git.bbappend
@@ -0,0 +1,6 @@
+inherit syslog-ng-config-gen
+
+SYSLOG-NG_FILTER += "snmpd"
+SYSLOG-NG_SERVICE_snmpd = "snmpd.service"
+SYSLOG-NG_DESTINATION_snmpd = "snmpd.log"
+SYSLOG-NG_LOGRATE_snmpd = "medium"
diff --git a/recipes-extended/thunderstartupservices/files/0001-add-dependencies.patch b/recipes-extended/thunderstartupservices/files/0001-add-dependencies.patch
new file mode 100644
index 0000000..fb78d95
--- /dev/null
+++ b/recipes-extended/thunderstartupservices/files/0001-add-dependencies.patch
@@ -0,0 +1,340 @@
+From 34c42740270e0d6cb519a28724a3e6e8b89101ad Mon Sep 17 00:00:00 2001
+From: Sergey Borushevsky <Sergey_Borushevsky2@cable.comcast.com>
+Date: Sat, 19 Jun 2021 17:45:04 +0000
+Subject: RDK-39525 - Updated deps for Thunder plugins.
+Source: COMCAST
+Upstream-Status: N/A
+Signed-off-by: Sergey Borushevsky <Sergey_Borushevsky2@cable.comcast.com>
+
+diff -upr a/systemd/system/wpeframework-authservice.service b/systemd/system/wpeframework-authservice.service
+--- a/systemd/system/wpeframework-authservice.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-authservice.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework AuthService Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service wpeframework-network.service
++Requires=wpeframework.service wpeframework-network.service iarmbusd.service
++After=wpeframework.service wpeframework-network.service iarmbusd.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-avcast.service b/systemd/system/wpeframework-avcast.service
+--- a/systemd/system/wpeframework-avcast.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-avcast.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework AVCast Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service wpeframework-authservice.service avahi-daemon.service
++After==wpeframework.service wpeframework-authservice.service avahi-daemon.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-controlsettings.service b/systemd/system/wpeframework-controlsettings.service
+--- a/systemd/system/wpeframework-controlsettings.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-controlsettings.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework ControlSettings Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service pqserver.service
++After=wpeframework.service iarmbusd.service dsmgr.service pqserver.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-deviceappmanager.service b/systemd/system/wpeframework-deviceappmanager.service
+--- a/systemd/system/wpeframework-deviceappmanager.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-deviceappmanager.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,6 +1,6 @@
+ [Unit]
+ Description=WPEFramework DeviceAppManager Initialiser
+-Requires=wpeframework.service
++Requires=wpeframework.service wpeframework-devicebridge.service
+ After=wpeframework.service wpeframework-devicebridge.service
+ [Service]
+ Type=oneshot
+diff -upr a/systemd/system/wpeframework-deviceinfo.service b/systemd/system/wpeframework-deviceinfo.service
+--- a/systemd/system/wpeframework-deviceinfo.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-deviceinfo.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework DeviceInfo Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service
++After=wpeframework.service iarmbusd.service dsmgr.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-deviceprovisioning.service b/systemd/system/wpeframework-deviceprovisioning.service
+--- a/systemd/system/wpeframework-deviceprovisioning.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-deviceprovisioning.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework DeviceProvisioning Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service wpeframework.service iarmbusd.service pwrmgr.service lighttpd.service
++After=wpeframework.service wpeframework-authservice.service iarmbusd.service pwrmgr.service lighttpd.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-displayinfo.service b/systemd/system/wpeframework-displayinfo.service
+--- a/systemd/system/wpeframework-displayinfo.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-displayinfo.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework DisplayInfo Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service
++After=wpeframework.service iarmbusd.service dsmgr.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-displaysettings.service b/systemd/system/wpeframework-displaysettings.service
+--- a/systemd/system/wpeframework-displaysettings.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-displaysettings.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework DisplaySettings Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service wpeframework-hdmicecsink.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service pwrmgr.service pqserver.service thunder-hdmicecsink.service
++After=wpeframework.service iarmbusd.service dsmgr.service pwrmgr.service pqserver.service thunder-hdmicecsink.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-frontpanel.service b/systemd/system/wpeframework-frontpanel.service
+--- a/systemd/system/wpeframework-frontpanel.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-frontpanel.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework FrontPanel Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service pwrmgr.service
++After=wpeframework.service iarmbusd.service dsmgr.service pwrmgr.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-hdcpprofile.service b/systemd/system/wpeframework-hdcpprofile.service
+--- a/systemd/system/wpeframework-hdcpprofile.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-hdcpprofile.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework HdcpProfile Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service
++After=wpeframework.service iarmbusd.service dsmgr.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-hdmicec_2.service b/systemd/system/wpeframework-hdmicec_2.service
+--- a/systemd/system/wpeframework-hdmicec_2.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-hdmicec_2.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework HdmiCec_2 Initialiser
+ Requires=wpeframework.service
+-After=wpeframework.service
++After=wpeframework.service iarmbusd.service dsmgr.service cecdaemon.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-hdmicecsink.service b/systemd/system/wpeframework-hdmicecsink.service
+--- a/systemd/system/wpeframework-hdmicecsink.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-hdmicecsink.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework HdmiCecSink Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service pwrmgr.service cecdaemon.service
++After=wpeframework.service iarmbusd.service dsmgr.service pwrmgr.service cecdaemon.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-hdmiinput.service b/systemd/system/wpeframework-hdmiinput.service
+--- a/systemd/system/wpeframework-hdmiinput.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-hdmiinput.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework HdmiInput Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service
++After=wpeframework.service iarmbusd.service dsmgr.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-maintenancemanager.service b/systemd/system/wpeframework-maintenancemanager.service
+--- a/systemd/system/wpeframework-maintenancemanager.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-maintenancemanager.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework MaintenanceManager Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service wpeframework-authservice.service wpeframework-network.service
++Requires=wpeframework.service iarmbusd.service mfrmgr.service pwrmgr.service deepsleepmgr.service wpeframework-network.service wpeframework-authservice.service
++After=wpeframework.service iarmbusd.service mfrmgr.service pwrmgr.service deepsleepmgr.service wpeframework-network.service wpeframework-authservice.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-mediasystem.service b/systemd/system/wpeframework-mediasystem.service
+--- a/systemd/system/wpeframework-mediasystem.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-mediasystem.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework MediaSystem Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service wpeframework-authservice.service mediarite.service
++After=wpeframework.service wpeframework-authservice.service mediarite.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-network.service b/systemd/system/wpeframework-network.service
+--- a/systemd/system/wpeframework-network.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-network.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework Network Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service netsrvmgr.service
++After=wpeframework.service iarmbusd.service netsrvmgr.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-ocdm.service b/systemd/system/wpeframework-ocdm.service
+--- a/systemd/system/wpeframework-ocdm.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-ocdm.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,6 +1,6 @@
+ [Unit]
+ Description=WPEFramework OCDM Initialiser
+-Requires=wpeframework.service
++Requires=wpeframework.service wpeframework-deviceprovisioning.service
+ After=wpeframework.service wpeframework-deviceprovisioning.service
+ [Service]
+ Type=oneshot
+diff -upr a/systemd/system/wpeframework-ocicontainer.service b/systemd/system/wpeframework-ocicontainer.service
+--- a/systemd/system/wpeframework-ocicontainer.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-ocicontainer.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework OCIContainer Initialiser
+ Requires=wpeframework.service
+-After=wpeframework.service
++After=wpeframework.service dobby.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-playerinfo.service b/systemd/system/wpeframework-playerinfo.service
+--- a/systemd/system/wpeframework-playerinfo.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-playerinfo.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework PlayerInfo Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service dsmgr.service
++After=wpeframework.service iarmbusd.service dsmgr.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-remotecontrol.service b/systemd/system/wpeframework-remotecontrol.service
+--- a/systemd/system/wpeframework-remotecontrol.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-remotecontrol.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework RemoteControl Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service ctrlm-main.service
++After=wpeframework.service iarmbusd.service ctrlm-main.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-secmanager.service b/systemd/system/wpeframework-secmanager.service
+--- a/systemd/system/wpeframework-secmanager.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-secmanager.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework SecManager Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service
++After=wpeframework.service iarmbusd.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-system.service b/systemd/system/wpeframework-system.service
+--- a/systemd/system/wpeframework-system.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-system.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework System Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service sysmgr.service mfrmgr.service deepsleepmgr.service pwrmgr.service 
++After=wpeframework.service iarmbusd.service sysmgr.service mfrmgr.service deepsleepmgr.service pwrmgr.service 
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-telemetry.service b/systemd/system/wpeframework-telemetry.service
+--- a/systemd/system/wpeframework-telemetry.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-telemetry.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework Telemetry Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service
++After=wpeframework.service iarmbusd.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-voicecontrol.service b/systemd/system/wpeframework-voicecontrol.service
+--- a/systemd/system/wpeframework-voicecontrol.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-voicecontrol.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework VoiceControl Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service ctrlm-main.service
++After=wpeframework.service iarmbusd.service ctrlm-main.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-wifi.service b/systemd/system/wpeframework-wifi.service
+--- a/systemd/system/wpeframework-wifi.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-wifi.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework Wifi Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service netsrvmgr.service
++After=wpeframework.service iarmbusd.service netsrvmgr.service
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
+diff -upr a/systemd/system/wpeframework-xcast.service b/systemd/system/wpeframework-xcast.service
+--- a/systemd/system/wpeframework-xcast.service	2023-06-29 05:12:25.997616197 +0300
++++ b/systemd/system/wpeframework-xcast.service	2023-06-29 05:13:07.690525011 +0300
+@@ -1,7 +1,7 @@
+ [Unit]
+ Description=WPEFramework Xcast Initialiser
+-Requires=wpeframework.service
+-After=wpeframework.service
++Requires=wpeframework.service iarmbusd.service pwrmgr.service xdial.service 
++After=wpeframework.service iarmbusd.service pwrmgr.service xdial.service 
+ [Service]
+ Type=oneshot
+ RemainAfterExit=yes
diff --git a/recipes-extended/thunderstartupservices/thunderstartupservices.bb b/recipes-extended/thunderstartupservices/thunderstartupservices.bb
new file mode 100644
index 0000000..786c130
--- /dev/null
+++ b/recipes-extended/thunderstartupservices/thunderstartupservices.bb
@@ -0,0 +1,49 @@
+SUMMARY = "Thunder from systemd Initialiser Service"
+LICENSE = "CLOSED"
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+DEPENDS = "systemd"
+
+SRC_URI = "${RDK_COMPONENTS_ROOT_GIT}/generic/thunderstartupservices/generic;protocol=${RDK_GIT_PROTOCOL};branch=23Q2_sprint \
+    file://0001-add-dependencies.patch;patchdir=${WORKDIR}/git \
+"
+
+SRCREV = "${AUTOREV}"
+S = "${WORKDIR}/git/systemd/system"
+
+SERVICES_COMMON = "\
+    wpeframework-deviceinfo.service \
+    wpeframework-deviceprovisioning.service \
+    wpeframework-displayinfo.service \
+    wpeframework-eastereggs.service \
+    wpeframework-locationsync.service \
+    wpeframework-maintenancemanager.service \
+    wpeframework-monitor.service \
+    wpeframework-network.service \
+    wpeframework-ocdm.service \
+    wpeframework-ocicontainer.service \
+    wpeframework-packager.service \
+    wpeframework-persistentstore.service \
+    wpeframework-playerinfo.service \
+    wpeframework-secmanager.service \
+    wpeframework-firebolt.service \
+    wpeframework-systemaudioplayer.service \
+    wpeframework-texttospeech.service \
+    wpeframework-wifi.service \
+    "
+
+do_install() {
+    install -d ${D}${systemd_system_unitdir}
+
+    for x in ${SERVICES_COMMON}; do
+        install -m 0644 ${S}/${x} ${D}${systemd_system_unitdir}
+        install -d ${D}${sysconfdir}/systemd/system/${x}.requires
+        ln -sf ${systemd_system_unitdir}/wpeframework.service ${D}${sysconfdir}/systemd/system/${x}.requires/wpeframework.service
+
+        install -d ${D}${sysconfdir}/systemd/system/sky.service.wants
+        ln -sf ${systemd_system_unitdir}/${x} ${D}${sysconfdir}/systemd/system/sky.service.wants/${x}
+    done
+}
+
+FILES_${PN} += "${systemd_system_unitdir} ${sysconfdir}/systemd/system"
diff --git a/recipes-extended/tvsettings/tvsettings-plugins_git.bb b/recipes-extended/tvsettings/tvsettings-plugins_git.bb
index 5ee7237..4f07b2f 100644
--- a/recipes-extended/tvsettings/tvsettings-plugins_git.bb
+++ b/recipes-extended/tvsettings/tvsettings-plugins_git.bb
@@ -19,6 +19,8 @@
 S = "${WORKDIR}/git/tvmgr-plugins"
 CXXFLAGS_append = " -I${STAGING_INCDIR}/WPEFramework"
 
+EXTRA_OECMAKE += " -DPYTHON_EXECUTABLE=${STAGING_BINDIR_NATIVE}/python3-native/python3"
+
 INCLUDE_DIRS = " \
     -I${PKG_CONFIG_SYSROOT_DIR}/usr/include/WPEFramework/ \
     -I${PKG_CONFIG_SYSROOT_DIR}/usr/include/WPEFramework/websockets/ \
diff --git a/recipes-extended/wpe-framework/include/thunder.inc b/recipes-extended/wpe-framework/include/thunder.inc
index 03615f0..32c025f 100644
--- a/recipes-extended/wpe-framework/include/thunder.inc
+++ b/recipes-extended/wpe-framework/include/thunder.inc
@@ -2,7 +2,7 @@
 LICENSE = "Apache-2.0"
 HOMEPAGE = "https://github.com/rdkcentral/Thunder"
 
-THUNDER_RELEASE_TAG_NAME = "${@bb.utils.contains('DISTRO_FEATURES', 'wpe_r4', 'R4.2', 'R2-v1.12', d)}"
+THUNDER_RELEASE_TAG_NAME = "${@bb.utils.contains('DISTRO_FEATURES', 'wpe_r4', 'R4.2', 'R2.1.16', d)}"
 
 PACKAGECONFIG ??= ""
 PACKAGECONFIG[debug]            = "-DCMAKE_BUILD_TYPE=Debug,-DCMAKE_BUILD_TYPE=Release,"
diff --git a/recipes-extended/wpe-framework/wpeframework-clientlibraries/0001-fixing-netflix-ocdm-playback-failure.patch b/recipes-extended/wpe-framework/wpeframework-clientlibraries/0001-fixing-netflix-ocdm-playback-failure.patch
new file mode 100644
index 0000000..c7cf610
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-clientlibraries/0001-fixing-netflix-ocdm-playback-failure.patch
@@ -0,0 +1,62 @@
+From 9a8d65952b0df2105f48410435db50d274cc3030 Mon Sep 17 00:00:00 2001
+From: kkanag314 <krishnapriya_kanagaraj@comcast.com>
+Date: Fri, 28 Jul 2023 14:06:07 +0000
+Subject: [PATCH] fixing netflix ocdm playback failure
+
+---
+ Source/ocdm/adapter/rdk/open_cdm_adapter.cpp | 24 ++++++++++++++++++--
+ 1 file changed, 22 insertions(+), 2 deletions(-)
+
+diff --git a/Source/ocdm/adapter/rdk/open_cdm_adapter.cpp b/Source/ocdm/adapter/rdk/open_cdm_adapter.cpp
+index c975830..3b2d2b9 100644
+--- a/Source/ocdm/adapter/rdk/open_cdm_adapter.cpp
++++ b/Source/ocdm/adapter/rdk/open_cdm_adapter.cpp
+@@ -60,6 +60,18 @@ EXTERNAL OpenCDMError opencdm_gstreamer_transform_caps(GstCaps** caps)
+     return (result);
+ }
+ 
++bool swapIVBytes(uint8_t *mappedIV,uint32_t mappedIVSize)
++{
++    uint8_t buf;
++    for (uint32_t i = 0; i < mappedIVSize / 2; i++) {
++        uint8_t buf = mappedIV[i];
++        mappedIV[i] = mappedIV[mappedIVSize - i - 1];
++        mappedIV[mappedIVSize - i - 1] = buf;      
++    }
++
++    return true;
++}
++
+ OpenCDMError opencdm_gstreamer_session_decrypt(struct OpenCDMSession* session, GstBuffer* buffer, GstBuffer* subSample, const uint32_t subSampleCount,
+                                                 GstBuffer* IV, GstBuffer* keyID, uint32_t initWithLast15)
+ {
+@@ -274,9 +286,9 @@ OpenCDMError opencdm_gstreamer_session_decrypt_ex(struct OpenCDMSession* session
+ 
+        GstProtectionMeta* protectionMeta = reinterpret_cast<GstProtectionMeta*>(gst_buffer_get_protection_meta(buffer));
+        if (protectionMeta != nullptr) {
+-           gst_structure_set (protectionMeta->info, "subsample_count", G_TYPE_UINT, subSampleCount, "subsamples", GST_TYPE_BUFFER, subSampleBuffer, "iv", GST_TYPE_BUFFER, IV, "kid", GST_TYPE_BUFFER, keyID, NULL);
++           gst_structure_set (protectionMeta->info, "subsample_count", G_TYPE_UINT, subSampleCount, "subsamples", GST_TYPE_BUFFER, subSampleBuffer, "iv", GST_TYPE_BUFFER, IV, "kid", GST_TYPE_BUFFER, keyID, "initWithLast15", G_TYPE_UINT, initWithLast15, NULL);
+        } else {
+-           GstStructure *crypto_info = gst_structure_new ("protection_meta_info","subsample_count", G_TYPE_UINT, subSampleCount, "subsamples", GST_TYPE_BUFFER, subSampleBuffer, "iv", GST_TYPE_BUFFER, IV, "kid", GST_TYPE_BUFFER, keyID, NULL);
++           GstStructure *crypto_info = gst_structure_new ("protection_meta_info","subsample_count", G_TYPE_UINT, subSampleCount, "subsamples", GST_TYPE_BUFFER, subSampleBuffer, "iv", GST_TYPE_BUFFER, IV, "kid", GST_TYPE_BUFFER, keyID, "initWithLast15", G_TYPE_UINT, initWithLast15, NULL);
+            gst_buffer_add_protection_meta (buffer, crypto_info);
+        }
+  
+@@ -360,6 +372,14 @@ OpenCDMError opencdm_gstreamer_session_decrypt_buffer(struct OpenCDMSession* ses
+             uint8_t *mappedIV = reinterpret_cast<uint8_t* >(ivMap.data);
+             uint32_t mappedIVSize = static_cast<uint32_t >(ivMap.size);
+ 
++            unsigned InitWithLast15 = 0;
++            if (!gst_structure_get_uint(protectionMeta->info, "initWithLast15", &InitWithLast15)) {
++                printf("No InitWithLast15 value.\n");
++            }
++            if (InitWithLast15 == 1) {
++                swapIVBytes(mappedIV,mappedIVSize);
++            }
++
+             //Get Key ID
+             value = gst_structure_get_value(protectionMeta->info, "kid");
+             if (!value) {
+-- 
+2.17.1
+
diff --git a/recipes-extended/wpe-framework/wpeframework-clientlibraries/r2/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework_2.1.patch b/recipes-extended/wpe-framework/wpeframework-clientlibraries/r2/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework_2.1.patch
new file mode 100644
index 0000000..daf229c
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-clientlibraries/r2/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework_2.1.patch
@@ -0,0 +1,291 @@
+From 77438810c0af0398d12a7fc7e2441177a0c52dbb Mon Sep 17 00:00:00 2001
+From: kkanag314 <krishnapriya_kanagaraj@comcast.com>
+Date: Thu, 14 Sep 2023 10:56:33 +0000
+Subject: [PATCH] changes
+
+---
+ Source/ocdm/IOCDM.h         | 19 +++++++++++
+ Source/ocdm/open_cdm.cpp    | 65 ++++++++++++++++++++++++++++++++-----
+ Source/ocdm/open_cdm.h      | 39 +++++++++++++++++++++-
+ Source/ocdm/open_cdm_impl.h | 15 +++++++--
+ 4 files changed, 126 insertions(+), 12 deletions(-)
+
+diff --git a/Source/ocdm/IOCDM.h b/Source/ocdm/IOCDM.h
+index 2afecc4..cfcaa94 100644
+--- a/Source/ocdm/IOCDM.h
++++ b/Source/ocdm/IOCDM.h
+@@ -30,15 +30,21 @@ namespace Exchange {
+ enum OCDM_RESULT : uint32_t {
+     OCDM_SUCCESS = 0,
+     OCDM_S_FALSE = 1,
++    OCDM_MORE_DATA_AVAILABLE = 2,
++    OCDM_INTERFACE_NOT_IMPLEMENTED = 3,
++    OCDM_BUFFER_TOO_SMALL = 4,
++    OCDM_INVALID_ACCESSOR = 0x80000001,
+     OCDM_KEYSYSTEM_NOT_SUPPORTED = 0x80000002,
+     OCDM_INVALID_SESSION = 0x80000003,
+     OCDM_INVALID_DECRYPT_BUFFER = 0x80000004,
+     OCDM_OUT_OF_MEMORY = 0x80000005,
++	OCDM_METHOD_NOT_IMPLEMENTED = 0x80000006,
+     OCDM_FAIL = 0x80004005,
+     OCDM_INVALID_ARG = 0x80070057,
+     OCDM_SERVER_INTERNAL_ERROR = 0x8004C600,
+     OCDM_SERVER_INVALID_MESSAGE = 0x8004C601,
+     OCDM_SERVER_SERVICE_SPECIFIC = 0x8004C604,
++	OCDM_BUSY_CANNOT_INITIALIZE = 0x8004DD00
+ };
+ 
+ // ISession defines the interface towards a DRM context that can decrypt data
+@@ -98,6 +104,12 @@ struct ISession : virtual public Core::IUnknown {
+     // Provides keysystem-specific metadata of the session
+     virtual std::string Metadata() const = 0;
+ 
++ 	// Provides keysystem-specific metricdata of the session
++    virtual OCDM_RESULT Metricdata(
++        uint32_t& bufferSize /* @inout */,
++        uint8_t buffer[] /* @out @length:bufferSize */) const
++        = 0;
++
+     // Report the current status of the Session with respect to the KeyExchange.
+     virtual KeyStatus Status() const = 0;
+     virtual KeyStatus Status(const uint8_t keyID[] /* @length:keyIDLength */, const uint8_t keyIDLength) const = 0;
+@@ -182,6 +194,13 @@ struct IAccessorOCDM : virtual public Core::IUnknown {
+     // Provides keysystem-specific metadata
+     virtual OCDM_RESULT Metadata(const std::string& keySystem, std::string& metadata /* @out */) const = 0;
+ 
++    // Provides keysystem-specific metricdata
++    virtual OCDM_RESULT Metricdata(
++        const std::string& keySystem,
++        uint32_t& bufferSize /* @inout */,
++        uint8_t buffer[] /* @out @length:bufferSize */) const
++        = 0;
++
+     // Create a MediaKeySession using the supplied init data and CDM data.
+     virtual OCDM_RESULT
+     CreateSession(const string& keySystem, const int32_t licenseType,
+diff --git a/Source/ocdm/open_cdm.cpp b/Source/ocdm/open_cdm.cpp
+index a08024d..65a6691 100644
+--- a/Source/ocdm/open_cdm.cpp
++++ b/Source/ocdm/open_cdm.cpp
+@@ -44,12 +44,12 @@ OpenCDMError StringToAllocatedBuffer(const std::string& source, char* destinatio
+ 
+     if(destinationBuffer == nullptr) {
+         bufferSize = sizeneeded;
+-        result = ERROR_MORE_DATA_AVAILBALE;
++        result = ERROR_MORE_DATA_AVAILABLE;
+     } else if ( bufferSize < sizeneeded ) {
+         strncpy(destinationBuffer, source.c_str(), bufferSize-1);
+         destinationBuffer[bufferSize-1] = '\0';
+         bufferSize = sizeneeded;
+-        result = ERROR_MORE_DATA_AVAILBALE;      
++        result = ERROR_MORE_DATA_AVAILABLE;      
+     } else { // buffersize >= sizeneeded
+         strncpy(destinationBuffer, source.c_str(), sizeneeded-1);
+         destinationBuffer[sizeneeded-1] = '\0';
+@@ -135,11 +135,11 @@ OpenCDMError opencdm_is_type_supported(const char keySystem[],
+  * \param metadata, buffer to write metadata into, always 0 terminated (also when not large enough to hold all data) except when metadata is
+  *     Null of course. Null allowed to retrieve required size needed for this buffer in metadataSize to be able to allocate required buffer 
+  *     for subsequent call to opencdm_is_type_supported
+- * \param metadataSize, in: size of metadata buffer, out: required size to hold all data available when return value is ERROR_MORE_DATA_AVAILBALE,
++ * \param metadataSize, in: size of metadata buffer, out: required size to hold all data available when return value is ERROR_MORE_DATA_AVAILABLE,
+  *     , number of characters written into metadata (incl 0 terminator) otherwise. Note in case metadata could not hold all data but was not of zero
+- *     length it is filled up to the maximum size (still zero terminated) but also ERROR_MORE_DATA_AVAILBALE is returned with the required size needed
++ *     length it is filled up to the maximum size (still zero terminated) but also ERROR_MORE_DATA_AVAILABLE is returned with the required size needed
+  *     to hold all data
+- * \return Zero on success, non-zero on error. ERROR_MORE_DATA_AVAILBALE when the buffer was not large enough to hold all the data available. 
++ * \return Zero on success, non-zero on error. ERROR_MORE_DATA_AVAILABLE when the buffer was not large enough to hold all the data available. 
+  */
+ OpenCDMError opencdm_system_get_metadata(struct OpenCDMSystem* system, 
+     char metadata[], 
+@@ -153,6 +153,31 @@ OpenCDMError opencdm_system_get_metadata(struct OpenCDMSystem* system,
+     return result;
+ }
+ 
++/**
++ * \brief Get metrics associated with a DRM system.
++ *
++ * Some DRMs (e.g. WideVine) offer metric data that can be used for any
++ * analyses. This function retrieves the metric data of the passed in
++ * system. It is up to the callee to interpret the baniary data correctly.
++ * \param system Instance of \ref OpenCDMAccessor.
++ * \param bufferLength Actual buffer length of the buffer parameter, on return
++ *                     it holds the number of bytes actually written in it.
++ * \param buffer Buffer length of buffer that can hold the metric data.
++ * \return Zero on success, non-zero on error.
++ */
++
++EXTERNAL OpenCDMError opencdm_get_metric_system_data(struct OpenCDMSystem* system,
++    uint32_t* bufferLength,
++    uint8_t* buffer) {
++    OpenCDMError result(ERROR_INVALID_ACCESSOR);
++    OpenCDMAccessor* accessor = OpenCDMAccessor::Instance();
++
++    if (accessor != nullptr) {
++	result = static_cast<OpenCDMError>(accessor->Metricdata(system->keySystem(), *bufferLength, buffer));
++    }
++
++    return (result);
++}
+ 
+ /**
+  * \brief Maps key ID to \ref OpenCDMSession instance.
+@@ -266,11 +291,11 @@ OpenCDMError opencdm_session_load(struct OpenCDMSession* session)
+ * \param metadata, buffer to write metadata into, always 0 terminated (also when not large enough to hold all data) except when metadata is
+  *     Null of course. Null allowed to retrieve required size needed for this buffer in metadataSize to be able to allocate required buffer 
+  *     for subsequent call to opencdm_session_metadata
+- * \param metadataSize, in: size of metadata buffer, out: required size to hold all data available when return value is ERROR_MORE_DATA_AVAILBALE,
++ * \param metadataSize, in: size of metadata buffer, out: required size to hold all data available when return value is ERROR_MORE_DATA_AVAILABLE,
+  *     , number of characters written into metadata (incl 0 terminator) otherwise. Note in case metadata could not hold all data but was not of zero
+- *     length it is filled up to the maximum size (still zero terminated) but also ERROR_MORE_DATA_AVAILBALE is returned with the required size needed
++ *     length it is filled up to the maximum size (still zero terminated) but also ERROR_MORE_DATA_AVAILABLE is returned with the required size needed
+  *     to hold all data
+- * \return Zero on success, non-zero on error. ERROR_MORE_DATA_AVAILBALE when the buffer was not large enough to hold all the data available. 
++ * \return Zero on success, non-zero on error. ERROR_MORE_DATA_AVAILABLE when the buffer was not large enough to hold all the data available. 
+ 
+  */
+ OpenCDMError opencdm_session_metadata(const struct OpenCDMSession* session, 
+@@ -540,6 +565,30 @@ OpenCDMError opencdm_session_decrypt_v2(struct OpenCDMSession* session,
+     return (result);
+ }
+ 
++/**
++ * \brief Get metrics associated with a DRM session.
++ *
++ * Some DRMs (e.g. WideVine) offer metric data that can be used for any
++ * analyses. This function retrieves the metric data of the passed in
++ * system. It is up to the callee to interpret the baniary data correctly.
++ * \param session Instance of \ref OpenCDMSession.
++ * \param bufferLength Actual buffer length of the buffer parameter, on return
++ *                     it holds the number of bytes actually written in it.
++ * \param buffer Buffer length of buffer that can hold the metric data.
++ * \return Zero on success, non-zero on error.
++ */
++
++OpenCDMError opencdm_get_metric_session_data(struct OpenCDMSession* session,
++    uint32_t* bufferLength,
++    uint8_t* buffer) {
++    OpenCDMError result(ERROR_INVALID_SESSION);
++    if (session != nullptr) {
++        result = static_cast<OpenCDMError>(session->Metricdata(
++            *bufferLength, buffer));
++    }
++
++    return (result);
++}
+ 
+ void opencdm_dispose() {
+     Core::Singleton::Dispose();
+diff --git a/Source/ocdm/open_cdm.h b/Source/ocdm/open_cdm.h
+index d7ca92d..96ff9aa 100644
+--- a/Source/ocdm/open_cdm.h
++++ b/Source/ocdm/open_cdm.h
+@@ -178,17 +178,21 @@ typedef enum {
+ typedef enum {
+     ERROR_NONE = 0,
+     ERROR_UNKNOWN = 1,
+-    ERROR_MORE_DATA_AVAILBALE=2,
++    ERROR_MORE_DATA_AVAILABLE = 2,
++    ERROR_INTERFACE_NOT_IMPLEMENTED = 3,
++    ERROR_BUFFER_TOO_SMALL = 4,
+     ERROR_INVALID_ACCESSOR = 0x80000001,
+     ERROR_KEYSYSTEM_NOT_SUPPORTED = 0x80000002,
+     ERROR_INVALID_SESSION = 0x80000003,
+     ERROR_INVALID_DECRYPT_BUFFER = 0x80000004,
+     ERROR_OUT_OF_MEMORY = 0x80000005,
++    ERROR_METHOD_NOT_IMPLEMENTED = 0x80000006,
+     ERROR_FAIL = 0x80004005,
+     ERROR_INVALID_ARG = 0x80070057,
+     ERROR_SERVER_INTERNAL_ERROR = 0x8004C600,
+     ERROR_SERVER_INVALID_MESSAGE = 0x8004C601,
+     ERROR_SERVER_SERVICE_SPECIFIC = 0x8004C604,
++    ERROR_BUSY_CANNOT_INITIALIZE = 0x8004DD00
+ } OpenCDMError;
+ 
+ /**
+@@ -387,6 +391,23 @@ EXTERNAL OpenCDMError opencdm_system_set_server_certificate(
+     struct OpenCDMSystem* system,
+     const uint8_t serverCertificate[], const uint16_t serverCertificateLength);
+ 
++/**
++ * \brief Get metrics associated with a DRM system.
++ *
++ * Some DRMs (e.g. WideVine) offer metric data that can be used for any
++ * analyses. This function retrieves the metric data of the passed in
++ * system. It is up to the callee to interpret the baniary data correctly.
++ * \param system Instance of \ref OpenCDMAccessor.
++ * \param bufferLength Actual buffer length of the buffer parameter, on return
++ *                     it holds the number of bytes actually written in it.
++ * \param buffer Buffer length of buffer that can hold the metric data.
++ * \return Zero on success, non-zero on error.
++ */
++
++EXTERNAL OpenCDMError opencdm_get_metric_system_data(struct OpenCDMSystem* system,
++    uint32_t* bufferLength,
++    uint8_t* buffer);
++
+ /**
+  * \brief Create DRM session (for actual decrypting of data).
+  *
+@@ -579,6 +600,22 @@ EXTERNAL OpenCDMError opencdm_session_decrypt(struct OpenCDMSession* session,
+     uint32_t initWithLast15);
+ #endif // __cplusplus
+ 
++/**
++ * \brief Get metrics associated with a DRM session.
++ *
++ * Some DRMs (e.g. WideVine) offer metric data that can be used for any
++ * analyses. This function retrieves the metric data of the passed in
++ * system. It is up to the callee to interpret the baniary data correctly.
++ * \param session Instance of \ref OpenCDMSession.
++ * \param bufferLength Actual buffer length of the buffer parameter, on return
++ *                     it holds the number of bytes actually written in it.
++ * \param buffer Buffer length of buffer that can hold the metric data.
++ * \return Zero on success, non-zero on error.
++ */
++
++EXTERNAL OpenCDMError opencdm_get_metric_session_data(struct OpenCDMSession* session,
++    uint32_t* bufferLength,
++    uint8_t* buffer);
+ 
+ /**
+  * \brief Performs decryption.
+diff --git a/Source/ocdm/open_cdm_impl.h b/Source/ocdm/open_cdm_impl.h
+index d76f6e2..9cf93b0 100644
+--- a/Source/ocdm/open_cdm_impl.h
++++ b/Source/ocdm/open_cdm_impl.h
+@@ -164,13 +164,16 @@ public:
+         return result;
+     }
+ 
+-    virtual Exchange::OCDM_RESULT Metadata(const std::string& keySystem,
+-        std::string& metadata) const override
++	virtual Exchange::OCDM_RESULT Metadata(const string& keySystem, string& metadata) const override
+     {
+         return(_remote->Metadata(keySystem, metadata));
+     }
+ 
+-    // Create a MediaKeySession using the supplied init data and CDM data.
++    virtual Exchange::OCDM_RESULT Metricdata(const string& keySystem, uint32_t& length, uint8_t buffer[]) const override {
++        return(_remote->Metricdata(keySystem, length, buffer));
++    }
++
++	// Create a MediaKeySession using the supplied init data and CDM data.
+     virtual Exchange::OCDM_RESULT
+     CreateSession(const string& keySystem, const int32_t licenseType,
+         const std::string& initDataType, const uint8_t* initData,
+@@ -584,6 +587,12 @@ public:
+ 
+         return _session->Metadata();
+     }
++    inline uint32_t Metricdata(uint32_t& bufferSize, uint8_t buffer[])
++    {
++        ASSERT(_session != nullptr);
++
++        return _session->Metricdata(bufferSize, buffer);
++    }
+     inline const string& BufferId() const
+     {
+         static string EmptyString;
+-- 
+2.17.1
+
diff --git a/recipes-extended/wpe-framework/wpeframework-clientlibraries/r2/R2_compilation_error_Hash.patch b/recipes-extended/wpe-framework/wpeframework-clientlibraries/r2/R2_compilation_error_Hash.patch
new file mode 100644
index 0000000..3267b11
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-clientlibraries/r2/R2_compilation_error_Hash.patch
@@ -0,0 +1,13 @@
+diff --git a/Source/cryptography/implementation/OpenSSL/Hash.cpp b/Source/cryptography/implementation/OpenSSL/Hash.cpp
+index bfd81d6..6a4cd44 100644
+--- a/Source/cryptography/implementation/OpenSSL/Hash.cpp
++++ b/Source/cryptography/implementation/OpenSSL/Hash.cpp
+@@ -80,7 +80,7 @@ namespace Operation {
+             return (EVP_DigestUpdate(ctx, d, cnt));
+         }
+         static int Final(EVP_MD_CTX* ctx, unsigned char* sig, size_t* siglen) {
+-            uint32_t siglen32 = 0
++            uint32_t siglen32 = 0;
+             int rv = EVP_DigestFinal(ctx, sig, &siglen32);
+             (*siglen) = siglen32;
+             return (rv);
diff --git a/recipes-extended/wpe-framework/wpeframework-clientlibraries/r4/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework_4.2.patch b/recipes-extended/wpe-framework/wpeframework-clientlibraries/r4/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework_4.2.patch
new file mode 100644
index 0000000..dec7caf
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-clientlibraries/r4/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework_4.2.patch
@@ -0,0 +1,237 @@
+From d691afc8b72c6178fd78fb15ae2ef7ddb3075975 Mon Sep 17 00:00:00 2001
+From: kkanag314 <krishnapriya_kanagaraj@comcast.com>
+Date: Mon, 11 Sep 2023 11:15:57 +0000
+Subject: [PATCH] Add a new metrics punch through on the OCDM framework
+
+---
+ Source/ocdm/open_cdm.cpp    | 65 ++++++++++++++++++++++++++++++++-----
+ Source/ocdm/open_cdm.h      | 39 +++++++++++++++++++++-
+ Source/ocdm/open_cdm_impl.h | 15 +++++++--
+ 3 files changed, 107 insertions(+), 12 deletions(-)
+
+diff --git a/Source/ocdm/open_cdm.cpp b/Source/ocdm/open_cdm.cpp
+index 19982ba..d907097 100644
+--- a/Source/ocdm/open_cdm.cpp
++++ b/Source/ocdm/open_cdm.cpp
+@@ -43,12 +43,12 @@ OpenCDMError StringToAllocatedBuffer(const std::string& source, char* destinatio
+ 
+     if(destinationBuffer == nullptr) {
+         bufferSize = sizeneeded;
+-        result = ERROR_MORE_DATA_AVAILBALE;
++        result = ERROR_MORE_DATA_AVAILABLE;
+     } else if ( bufferSize < sizeneeded ) {
+         strncpy(destinationBuffer, source.c_str(), bufferSize-1);
+         destinationBuffer[bufferSize-1] = '\0';
+         bufferSize = sizeneeded;
+-        result = ERROR_MORE_DATA_AVAILBALE;      
++        result = ERROR_MORE_DATA_AVAILABLE;      
+     } else { // buffersize >= sizeneeded
+         strncpy(destinationBuffer, source.c_str(), sizeneeded-1);
+         destinationBuffer[sizeneeded-1] = '\0';
+@@ -165,11 +165,11 @@ OpenCDMError opencdm_is_type_supported(const char keySystem[],
+  * \param metadata, buffer to write metadata into, always 0 terminated (also when not large enough to hold all data) except when metadata is
+  *     Null of course. Null allowed to retrieve required size needed for this buffer in metadataSize to be able to allocate required buffer 
+  *     for subsequent call to opencdm_is_type_supported
+- * \param metadataSize, in: size of metadata buffer, out: required size to hold all data available when return value is ERROR_MORE_DATA_AVAILBALE,
++ * \param metadataSize, in: size of metadata buffer, out: required size to hold all data available when return value is ERROR_MORE_DATA_AVAILABLE,
+  *     , number of characters written into metadata (incl 0 terminator) otherwise. Note in case metadata could not hold all data but was not of zero
+- *     length it is filled up to the maximum size (still zero terminated) but also ERROR_MORE_DATA_AVAILBALE is returned with the required size needed
++ *     length it is filled up to the maximum size (still zero terminated) but also ERROR_MORE_DATA_AVAILABLE is returned with the required size needed
+  *     to hold all data
+- * \return Zero on success, non-zero on error. ERROR_MORE_DATA_AVAILBALE when the buffer was not large enough to hold all the data available. 
++ * \return Zero on success, non-zero on error. ERROR_MORE_DATA_AVAILABLE when the buffer was not large enough to hold all the data available. 
+  */
+ OpenCDMError opencdm_system_get_metadata(struct OpenCDMSystem* system, 
+     char metadata[], 
+@@ -183,6 +183,31 @@ OpenCDMError opencdm_system_get_metadata(struct OpenCDMSystem* system,
+     return result;
+ }
+ 
++/**
++ * \brief Get metrics associated with a DRM system.
++ *
++ * Some DRMs (e.g. WideVine) offer metric data that can be used for any
++ * analyses. This function retrieves the metric data of the passed in
++ * system. It is up to the callee to interpret the baniary data correctly.
++ * \param system Instance of \ref OpenCDMAccessor.
++ * \param bufferLength Actual buffer length of the buffer parameter, on return
++ *                     it holds the number of bytes actually written in it.
++ * \param buffer Buffer length of buffer that can hold the metric data.
++ * \return Zero on success, non-zero on error.
++ */
++
++EXTERNAL OpenCDMError opencdm_get_metric_system_data(struct OpenCDMSystem* system,
++    uint32_t* bufferLength,
++    uint8_t* buffer) {
++    OpenCDMError result(ERROR_INVALID_ACCESSOR);
++    OpenCDMAccessor* accessor = OpenCDMAccessor::Instance();
++
++    if (accessor != nullptr) {
++	result = static_cast<OpenCDMError>(accessor->Metricdata(system->keySystem(), *bufferLength, buffer));
++    }
++
++    return (result);
++}
+ 
+ /**
+  * \brief Maps key ID to \ref OpenCDMSession instance.
+@@ -296,11 +321,11 @@ OpenCDMError opencdm_session_load(struct OpenCDMSession* session)
+ * \param metadata, buffer to write metadata into, always 0 terminated (also when not large enough to hold all data) except when metadata is
+  *     Null of course. Null allowed to retrieve required size needed for this buffer in metadataSize to be able to allocate required buffer 
+  *     for subsequent call to opencdm_session_metadata
+- * \param metadataSize, in: size of metadata buffer, out: required size to hold all data available when return value is ERROR_MORE_DATA_AVAILBALE,
++ * \param metadataSize, in: size of metadata buffer, out: required size to hold all data available when return value is ERROR_MORE_DATA_AVAILABLE,
+  *     , number of characters written into metadata (incl 0 terminator) otherwise. Note in case metadata could not hold all data but was not of zero
+- *     length it is filled up to the maximum size (still zero terminated) but also ERROR_MORE_DATA_AVAILBALE is returned with the required size needed
++ *     length it is filled up to the maximum size (still zero terminated) but also ERROR_MORE_DATA_AVAILABLE is returned with the required size needed
+  *     to hold all data
+- * \return Zero on success, non-zero on error. ERROR_MORE_DATA_AVAILBALE when the buffer was not large enough to hold all the data available. 
++ * \return Zero on success, non-zero on error. ERROR_MORE_DATA_AVAILABLE when the buffer was not large enough to hold all the data available. 
+ 
+  */
+ OpenCDMError opencdm_session_metadata(const struct OpenCDMSession* session, 
+@@ -570,6 +595,30 @@ OpenCDMError opencdm_session_decrypt_v2(struct OpenCDMSession* session,
+     return (result);
+ }
+ 
++/**
++ * \brief Get metrics associated with a DRM session.
++ *
++ * Some DRMs (e.g. WideVine) offer metric data that can be used for any
++ * analyses. This function retrieves the metric data of the passed in
++ * system. It is up to the callee to interpret the baniary data correctly.
++ * \param session Instance of \ref OpenCDMSession.
++ * \param bufferLength Actual buffer length of the buffer parameter, on return
++ *                     it holds the number of bytes actually written in it.
++ * \param buffer Buffer length of buffer that can hold the metric data.
++ * \return Zero on success, non-zero on error.
++ */
++
++OpenCDMError opencdm_get_metric_session_data(struct OpenCDMSession* session,
++    uint32_t* bufferLength,
++    uint8_t* buffer) {
++    OpenCDMError result(ERROR_INVALID_SESSION);
++    if (session != nullptr) {
++        result = static_cast<OpenCDMError>(session->Metricdata(
++            *bufferLength, buffer));
++    }
++
++    return (result);
++}
+ 
+ void opencdm_dispose() {
+     Core::Singleton::Dispose();
+diff --git a/Source/ocdm/open_cdm.h b/Source/ocdm/open_cdm.h
+index 878239f..6f4ae98 100644
+--- a/Source/ocdm/open_cdm.h
++++ b/Source/ocdm/open_cdm.h
+@@ -178,17 +178,21 @@ typedef enum {
+ typedef enum {
+     ERROR_NONE = 0,
+     ERROR_UNKNOWN = 1,
+-    ERROR_MORE_DATA_AVAILBALE=2,
++    ERROR_MORE_DATA_AVAILABLE = 2,
++    ERROR_INTERFACE_NOT_IMPLEMENTED = 3,
++    ERROR_BUFFER_TOO_SMALL = 4,
+     ERROR_INVALID_ACCESSOR = 0x80000001,
+     ERROR_KEYSYSTEM_NOT_SUPPORTED = 0x80000002,
+     ERROR_INVALID_SESSION = 0x80000003,
+     ERROR_INVALID_DECRYPT_BUFFER = 0x80000004,
+     ERROR_OUT_OF_MEMORY = 0x80000005,
++    ERROR_METHOD_NOT_IMPLEMENTED = 0x80000006,
+     ERROR_FAIL = 0x80004005,
+     ERROR_INVALID_ARG = 0x80070057,
+     ERROR_SERVER_INTERNAL_ERROR = 0x8004C600,
+     ERROR_SERVER_INVALID_MESSAGE = 0x8004C601,
+     ERROR_SERVER_SERVICE_SPECIFIC = 0x8004C604,
++    ERROR_BUSY_CANNOT_INITIALIZE = 0x8004DD00
+ } OpenCDMError;
+ 
+ /**
+@@ -383,6 +387,23 @@ EXTERNAL OpenCDMError opencdm_system_set_server_certificate(
+     struct OpenCDMSystem* system,
+     const uint8_t serverCertificate[], const uint16_t serverCertificateLength);
+ 
++/**
++ * \brief Get metrics associated with a DRM system.
++ *
++ * Some DRMs (e.g. WideVine) offer metric data that can be used for any
++ * analyses. This function retrieves the metric data of the passed in
++ * system. It is up to the callee to interpret the baniary data correctly.
++ * \param system Instance of \ref OpenCDMAccessor.
++ * \param bufferLength Actual buffer length of the buffer parameter, on return
++ *                     it holds the number of bytes actually written in it.
++ * \param buffer Buffer length of buffer that can hold the metric data.
++ * \return Zero on success, non-zero on error.
++ */
++
++EXTERNAL OpenCDMError opencdm_get_metric_system_data(struct OpenCDMSystem* system,
++    uint32_t* bufferLength,
++    uint8_t* buffer);
++
+ /**
+  * \brief Create DRM session (for actual decrypting of data).
+  *
+@@ -575,6 +596,22 @@ EXTERNAL OpenCDMError opencdm_session_decrypt(struct OpenCDMSession* session,
+     uint32_t initWithLast15);
+ #endif // __cplusplus
+ 
++/**
++ * \brief Get metrics associated with a DRM session.
++ *
++ * Some DRMs (e.g. WideVine) offer metric data that can be used for any
++ * analyses. This function retrieves the metric data of the passed in
++ * system. It is up to the callee to interpret the baniary data correctly.
++ * \param session Instance of \ref OpenCDMSession.
++ * \param bufferLength Actual buffer length of the buffer parameter, on return
++ *                     it holds the number of bytes actually written in it.
++ * \param buffer Buffer length of buffer that can hold the metric data.
++ * \return Zero on success, non-zero on error.
++ */
++
++EXTERNAL OpenCDMError opencdm_get_metric_session_data(struct OpenCDMSession* session,
++    uint32_t* bufferLength,
++    uint8_t* buffer);
+ 
+ /**
+  * \brief Performs decryption.
+diff --git a/Source/ocdm/open_cdm_impl.h b/Source/ocdm/open_cdm_impl.h
+index 569ef45..9059261 100644
+--- a/Source/ocdm/open_cdm_impl.h
++++ b/Source/ocdm/open_cdm_impl.h
+@@ -153,13 +153,16 @@ public:
+         return result;
+     }
+ 
+-    virtual Exchange::OCDM_RESULT Metadata(const std::string& keySystem,
+-        std::string& metadata) const override
++	virtual Exchange::OCDM_RESULT Metadata(const string& keySystem, string& metadata) const override
+     {
+         return(_remote->Metadata(keySystem, metadata));
+     }
+ 
+-    // Create a MediaKeySession using the supplied init data and CDM data.
++    virtual Exchange::OCDM_RESULT Metricdata(const string& keySystem, uint32_t& length, uint8_t buffer[]) const override {
++        return(_remote->Metricdata(keySystem, length, buffer));
++    }
++
++	// Create a MediaKeySession using the supplied init data and CDM data.
+     virtual Exchange::OCDM_RESULT
+     CreateSession(const string& keySystem, const int32_t licenseType,
+         const std::string& initDataType, const uint8_t* initData,
+@@ -576,6 +579,12 @@ public:
+ 
+         return _session->Metadata();
+     }
++    inline uint32_t Metricdata(uint32_t& bufferSize, uint8_t buffer[])
++    {
++        ASSERT(_session != nullptr);
++
++        return _session->Metricdata(bufferSize, buffer);
++    }
+     inline const string& BufferId() const
+     {
+         static string EmptyString;
+-- 
+2.17.1
+
diff --git a/recipes-extended/wpe-framework/wpeframework-clientlibraries_2.1.bb b/recipes-extended/wpe-framework/wpeframework-clientlibraries_2.1.bb
index e3a2668..28dba6e 100644
--- a/recipes-extended/wpe-framework/wpeframework-clientlibraries_2.1.bb
+++ b/recipes-extended/wpe-framework/wpeframework-clientlibraries_2.1.bb
@@ -15,10 +15,13 @@
            file://r2/0001-SecurityUtilityApp-input-args-support.patch \
            file://r2/0001-OCDM-enhancement-for-BCOM-ocdm-adapter.patch \
            file://0001-OCDM-enhancement-for-rdk-ocdm-adapter.patch \
+           file://0001-fixing-netflix-ocdm-playback-failure.patch \
+           file://r2//R2_compilation_error_Hash.patch \
+           file://r2/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework_2.1.patch \
            "
 
-# Sep 29, 2022
-SRCREV_wpeframework-clientlibraries = "adf82a27efed27ab7bc4208b6f9579f2dcc86a71"
+# Sep 11, 2023
+SRCREV_wpeframework-clientlibraries = "${THUNDER_RELEASE_TAG_NAME}"
 
 # ----------------------------------------------------------------------------
 
diff --git a/recipes-extended/wpe-framework/wpeframework-clientlibraries_4.2.bb b/recipes-extended/wpe-framework/wpeframework-clientlibraries_4.2.bb
index 0ee046d..00f2de9 100644
--- a/recipes-extended/wpe-framework/wpeframework-clientlibraries_4.2.bb
+++ b/recipes-extended/wpe-framework/wpeframework-clientlibraries_4.2.bb
@@ -17,6 +17,8 @@
            file://r4/R4.1_Trace_enabled_error_wpeframework_clientlibraries.patch \
            file://r4/0001-OCDM-enhancement-for-ocdm-adapter.patch \
            file://r4/R4.2_compilation_error_assert.patch \
+           file://0001-fixing-netflix-ocdm-playback-failure.patch \
+           file://r4/0001-Add-a-new-metrics-punch-through-on-the-OCDM-framework_4.2.patch \
            "
 
 # Sep 29, 2022
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/0001-Extend-web-browser-interface-for-XRE-usecases.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/0001-Extend-web-browser-interface-for-XRE-usecases.patch
index 39981cf..1fd022b 100644
--- a/recipes-extended/wpe-framework/wpeframework-interfaces/0001-Extend-web-browser-interface-for-XRE-usecases.patch
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/0001-Extend-web-browser-interface-for-XRE-usecases.patch
@@ -59,11 +59,10 @@
 ===================================================================
 --- git.orig/interfaces/Ids.h
 +++ git/interfaces/Ids.h
-@@ -243,6 +243,10 @@ namespace Exchange {
-         
- 	ID_WATERMARK,
-         ID_WATERMARK_NOTIFICATION,
-+
+@@ -287,6 +287,9 @@ namespace Exchange {
+         ID_DTV_COMPONENT_TAG_ITERATOR,
+         ID_DTV_TRANSPORT,
+
 +        ID_BROWSER_SCRIPTING,
 +        ID_BROWSER_COOKIEJAR,
 +        ID_BROWSER_COOKIEJAR_NOTIFICATION,
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/0001-Revert-Merge-pull-request-137-from-mikolaj-staworzyn.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/0001-Revert-Merge-pull-request-137-from-mikolaj-staworzyn.patch
index 8d073a5..76380b0 100644
--- a/recipes-extended/wpe-framework/wpeframework-interfaces/0001-Revert-Merge-pull-request-137-from-mikolaj-staworzyn.patch
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/0001-Revert-Merge-pull-request-137-from-mikolaj-staworzyn.patch
@@ -41,13 +41,13 @@
 @@ -15,17 +15,14 @@
  # See the License for the specific language governing permissions and
  # limitations under the License.
- 
+
 +cmake_minimum_required(VERSION 3.7.2)
 +
  project(Definitions)
- 
+
  set(Target ${NAMESPACE}Definitions)
- 
+
 -separate_arguments(JSONRPC_PATTERNS)
 -list(TRANSFORM JSONRPC_PATTERNS PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/../jsonrpc/")
 -file(GLOB JSON_FILE ${JSONRPC_PATTERNS})
@@ -57,28 +57,23 @@
 -file(GLOB INTERFACE_FILE ${INTERFACES_PATTERNS})
 +file(GLOB JSON_FILE      "${CMAKE_CURRENT_SOURCE_DIR}/../jsonrpc/*.json")
 +file(GLOB INTERFACE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../interfaces/I*.h")
- 
+
  set(PUBLIC_HEADERS "definitions.h")
- 
+
 diff --git a/interfaces/CMakeLists.txt b/interfaces/CMakeLists.txt
-index ea3ad85..ec4e3e1 100644
+index 0cbef6b..85fdef5 100644
 --- a/interfaces/CMakeLists.txt
 +++ b/interfaces/CMakeLists.txt
-@@ -21,12 +21,10 @@ project(Interfaces)
- 
- set(TargetMarshalling ${NAMESPACE}Marshallings)
- 
+@@ -28,11 +28,9 @@ if(NOT GENERATOR_SEARCH_PATH)
+     set(GENERATOR_SEARCH_PATH ${CMAKE_SYSROOT}${CMAKE_INSTALL_PREFIX}/include/${NAMESPACE})
+ endif()
+
 -separate_arguments(INTERFACES_PATTERNS)
 -file(GLOB INTERFACES_HEADERS ${INTERFACES_PATTERNS})
 -
- set(GENERATOR_SEARCH_PATH ${CMAKE_SYSROOT}${CMAKE_INSTALL_PREFIX}/include/${NAMESPACE})
 -ProxyStubGenerator(INPUT "${INTERFACES_HEADERS}" OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/generated" INCLUDE_PATH ${GENERATOR_SEARCH_PATH})
 +ProxyStubGenerator(INPUT "${CMAKE_CURRENT_SOURCE_DIR}" OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/generated" INCLUDE_PATH ${GENERATOR_SEARCH_PATH})
- 
+
 +file(GLOB INTERFACES_HEADERS I*.h)
  file(GLOB JSON_HEADERS json/*.h)
  list(APPEND INTERFACES_HEADERS Module.h)
- 
--- 
-2.25.1
-
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0001-Add-TextToSpeech-Interface.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0001-Add-TextToSpeech-Interface.patch
index eddcfbe..73f60ba 100644
--- a/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0001-Add-TextToSpeech-Interface.patch
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0001-Add-TextToSpeech-Interface.patch
@@ -13,7 +13,7 @@
 ===================================================================
 --- /dev/null
 +++ git/interfaces/ITextToSpeech.h
-@@ -0,0 +1,123 @@
+@@ -0,0 +1,125 @@
 +
 +#ifndef __ITEXTTOSPEECH_H
 +#define __ITEXTTOSPEECH_H
@@ -31,6 +31,7 @@
 +            std::string ttsEndPointSecured;
 +            std::string language;
 +            std::string voice;
++            std::string speechRate;
 +            uint8_t volume;
 +            uint8_t rate;
 +        };
@@ -96,7 +97,7 @@
 +        virtual uint32_t SetFallbackText(const string scenario,const string value) = 0;
 +        virtual uint32_t SetAPIKey(const string apikey) = 0;
 +        virtual uint32_t SetPrimaryVolDuck(const uint8_t prim) = 0;
-+        virtual uint32_t SetSpeechRate(const string speechRate) = 0;
++        virtual uint32_t SetACL(const string method,const string apps) = 0;
 +
 +        // @brief Retrieve tts configuration attributes
 +        // @param config tts configuration
@@ -108,10 +109,11 @@
 +        virtual uint32_t ListVoices(const string language,RPC::IStringIterator*& voices/* @out */) const = 0;
 +
 +        // @brief Speaks text provided
-+        // @param text for conversion
++        // @param callsign for conversion
++        // @param text of the app
 +        // @param speechid returns id for the text
 +        // @param status return status
-+        virtual uint32_t Speak(const string text,uint32_t &speechid/* @out */,TTSErrorDetail &status/* @out */) = 0;
++        virtual uint32_t Speak(const string callsign,const string text,uint32_t &speechid/* @out */,TTSErrorDetail &status/* @out */) = 0;
 +
 +        // @brief Cancel the speech
 +        // @param speechid id of text to be cancelled
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0001-Add-a-new-metrics-punch-through-on-the-OCDM-interface_2.1.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0001-Add-a-new-metrics-punch-through-on-the-OCDM-interface_2.1.patch
new file mode 100644
index 0000000..c157f3c
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0001-Add-a-new-metrics-punch-through-on-the-OCDM-interface_2.1.patch
@@ -0,0 +1,46 @@
+From e5ec9199835d3a8eb813e6e5413703e0f39f714e Mon Sep 17 00:00:00 2001
+From: kkanag314 <krishnapriya_kanagaraj@comcast.com>
+Date: Thu, 14 Sep 2023 11:01:54 +0000
+Subject: [PATCH] Add a new metrics punch through on the OCDM framework
+
+---
+ interfaces/IDRM.h | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/interfaces/IDRM.h b/interfaces/IDRM.h
+index 62e3e59..5f8d1a1 100644
+--- a/interfaces/IDRM.h
++++ b/interfaces/IDRM.h
+@@ -198,6 +198,10 @@ namespace CDMi {
+ typedef enum {
+     CDMi_SUCCESS = 0,
+     CDMi_S_FALSE = 1,
++    CDMi_MORE_DATA_AVAILABLE = 2,
++    CDMi_INTERFACE_NOT_IMPLEMENTED = 3,
++    CDMi_BUFFER_TOO_SMALL = 4,
++    CDMi_INVALID_ACCESSOR = 0x80000001,
+     CDMi_KEYSYSTEM_NOT_SUPPORTED = 0x80000002,
+     CDMi_INVALID_SESSION = 0x80000003,
+     CDMi_INVALID_DECRYPT_BUFFER = 0x80000004,
+@@ -502,6 +506,18 @@ public:
+         = 0;
+ };
+ 
++struct IMediaSystemMetrics {
++    virtual ~IMediaSystemMetrics() = default;
++
++    virtual CDMi_RESULT Metrics (uint32_t& bufferLength, uint8_t buffer[]) const = 0;
++};
++
++struct IMediaSessionMetrics {
++    virtual ~IMediaSessionMetrics() = default;
++
++    virtual CDMi_RESULT Metrics (uint32_t& bufferLength, uint8_t buffer[]) const = 0;
++};
++
+ struct ISystemFactory {
+     virtual ~ISystemFactory() = default;
+     virtual IMediaKeys* Instance() = 0;
+-- 
+2.17.1
+
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content_new.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content_new.patch
new file mode 100644
index 0000000..51daef4
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/r2/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content_new.patch
@@ -0,0 +1,32 @@
+From 6d4b755295896f0075ceb1787a10866a406f0d9a Mon Sep 17 00:00:00 2001
+From: Piotr Marcinkowski <piotr.marcinkowski@redembedded.com>
+Date: Tue, 28 Feb 2023 11:51:16 +0000
+Subject: [PATCH] OMWAPPI-910 Increase subsamples limit for 4k content
+
+The existing size of the array that holds sub-sample info structures
+was too low. The number of sub-samples observed while playing 4k content
+was bigger than that with maximum value of 160 - that value was doubled
+and finally the array size grew from 100 to 320.
+
+This solution isn't perfect - specification allows the number of
+sub-samples to be bigger (16bit value)
+---
+ interfaces/IContentDecryption.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/interfaces/IContentDecryption.h b/interfaces/IContentDecryption.h
+index f1b4481..13ca11a 100644
+--- a/interfaces/IContentDecryption.h
++++ b/interfaces/IContentDecryption.h
+@@ -69,7 +69,7 @@ namespace Exchange {
+             uint32_t PatternClearBlocks;
+             uint8_t  IV[24];
+             uint8_t  KeyId[17];
+-            CDMi::SubSampleInfo SubSamples[100];
++            CDMi::SubSampleInfo SubSamples[320];
+             uint16_t StreamHeight;
+             uint16_t StreamWidth;
+             uint8_t  StreamType;
+-- 
+2.39.0
+
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/r2/hdrtypes_displayinfo_R2.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/r2/hdrtypes_displayinfo_R2.patch
new file mode 100644
index 0000000..445a4f4
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/r2/hdrtypes_displayinfo_R2.patch
@@ -0,0 +1,52 @@
+diff --git a/jsonrpc/DisplayInfo.json b/jsonrpc/DisplayInfo.json
+index bb1938c..acb1906 100644
+--- a/jsonrpc/DisplayInfo.json
++++ b/jsonrpc/DisplayInfo.json
+@@ -6,19 +6,6 @@
+     "class": "DisplayInfo",
+     "description": "DisplayInfo JSON-RPC interface"
+   },
+-  "definitions": {
+-    "hdrtypes": {
+-      "type": "string",
+-      "enum": [
+-        "HDROff",
+-        "HDR10",
+-        "HDR10Plus",
+-        "HDRHlg",
+-        "HDRDolbyVision",
+-        "HDRTechnicolor"
+-      ]
+-    }
+-  },
+   "properties": {
+     "displayinfo": {
+       "summary": "Display general information",
+@@ -68,15 +55,9 @@
+           },
+           "hdrtype": {
+             "description": "HDR Type used",
+-            "$ref": "#/definitions/hdrtypes",
++            "type": "string",
++            "enum": [ "HDROff", "HDR10", "HDR10Plus", "HDRDolbyVision", "HDRTechnicolor" ],
+             "example": "HDROff"
+-          },
+-          "tvhdrtypes": {
+-            "description": "TV supported HDR types",
+-            "type": "array",
+-            "items": {
+-              "$ref": "#/definitions/hdrtypes"
+-            }
+           }
+         },
+         "required": [
+@@ -87,8 +68,7 @@
+           "width",
+           "height",
+           "hdcpprotection",
+-          "hdrtype",
+-          "tvhdrtypes"
++          "hdrtype"
+         ]
+       }
+     }
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0001-Add-TextToSpeech-Interface.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0001-Add-TextToSpeech-Interface.patch
index 475ddfb..cc32dde 100644
--- a/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0001-Add-TextToSpeech-Interface.patch
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0001-Add-TextToSpeech-Interface.patch
@@ -14,7 +14,7 @@
 index 0000000..c0080e7
 --- /dev/null
 +++ b/interfaces/ITextToSpeech.h
-@@ -0,0 +1,123 @@
+@@ -0,0 +1,125 @@
 +
 +#ifndef __ITEXTTOSPEECH_H
 +#define __ITEXTTOSPEECH_H
@@ -32,6 +32,7 @@
 +            std::string ttsEndPointSecured;
 +            std::string language;
 +            std::string voice;
++            std::string speechRate;
 +            uint8_t volume;
 +            uint8_t rate;
 +        };
@@ -97,7 +98,7 @@
 +        virtual uint32_t SetFallbackText(const string scenario,const string value) = 0;
 +        virtual uint32_t SetAPIKey(const string apikey) = 0;
 +        virtual uint32_t SetPrimaryVolDuck(const uint8_t prim) = 0;
-+        virtual uint32_t SetSpeechRate(const string speechRate) = 0;
++        virtual uint32_t SetACL(const string method,const string apps) = 0;
 +
 +        // @brief Retrieve tts configuration attributes
 +        // @param config tts configuration
@@ -109,10 +110,11 @@
 +        virtual uint32_t ListVoices(const string language,RPC::IStringIterator*& voices/* @out */) const = 0;
 +
 +        // @brief Speaks text provided
-+        // @param text for conversion
++        // @param callsign for conversion
++        // @param text of the app
 +        // @param speechid returns id for the text
 +        // @param status return status
-+        virtual uint32_t Speak(const string text,uint32_t &speechid/* @out */,TTSErrorDetail &status/* @out */) = 0;
++        virtual uint32_t Speak(const string callsign,const string text,uint32_t &speechid/* @out */,TTSErrorDetail &status/* @out */) = 0;
 +
 +        // @brief Cancel the speech
 +        // @param speechid id of text to be cancelled
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0001-Add-a-new-metrics-punch-through-on-the-OCDM-interface_4.2.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0001-Add-a-new-metrics-punch-through-on-the-OCDM-interface_4.2.patch
new file mode 100644
index 0000000..36f65fd
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0001-Add-a-new-metrics-punch-through-on-the-OCDM-interface_4.2.patch
@@ -0,0 +1,100 @@
+From 44c49b20352bcdfe05dd93f2713475725c15df7b Mon Sep 17 00:00:00 2001
+From: kkanag314 <krishnapriya_kanagaraj@comcast.com>
+Date: Mon, 11 Sep 2023 12:19:33 +0000
+Subject: [PATCH] Add a new metrics punch through on the OCDM framework
+
+---
+ interfaces/IDRM.h  | 16 ++++++++++++++++
+ interfaces/IOCDM.h | 19 +++++++++++++++++++
+ 2 files changed, 35 insertions(+)
+
+diff --git a/interfaces/IDRM.h b/interfaces/IDRM.h
+index bb3a18d..a34454a 100644
+--- a/interfaces/IDRM.h
++++ b/interfaces/IDRM.h
+@@ -192,6 +192,10 @@ namespace CDMi {
+ typedef enum {
+     CDMi_SUCCESS = 0,
+     CDMi_S_FALSE = 1,
++    CDMi_MORE_DATA_AVAILABLE = 2,
++    CDMi_INTERFACE_NOT_IMPLEMENTED = 3,
++    CDMi_BUFFER_TOO_SMALL = 4,
++    CDMi_INVALID_ACCESSOR = 0x80000001,
+     CDMi_KEYSYSTEM_NOT_SUPPORTED = 0x80000002,
+     CDMi_INVALID_SESSION = 0x80000003,
+     CDMi_INVALID_DECRYPT_BUFFER = 0x80000004,
+@@ -497,6 +501,18 @@ public:
+         = 0;
+ };
+ 
++struct IMediaSystemMetrics {
++    virtual ~IMediaSystemMetrics() = default;
++
++    virtual CDMi_RESULT Metrics (uint32_t& bufferLength, uint8_t buffer[]) const = 0;
++};
++
++struct IMediaSessionMetrics {
++    virtual ~IMediaSessionMetrics() = default;
++
++    virtual CDMi_RESULT Metrics (uint32_t& bufferLength, uint8_t buffer[]) const = 0;
++};
++
+ struct ISystemFactory {
+     virtual ~ISystemFactory() = default;
+     virtual IMediaKeys* Instance() = 0;
+diff --git a/interfaces/IOCDM.h b/interfaces/IOCDM.h
+index 0d1ccd7..7d1398c 100644
+--- a/interfaces/IOCDM.h
++++ b/interfaces/IOCDM.h
+@@ -30,15 +30,21 @@ namespace Exchange {
+ enum OCDM_RESULT : uint32_t {
+     OCDM_SUCCESS = 0,
+     OCDM_S_FALSE = 1,
++    OCDM_MORE_DATA_AVAILABLE = 2,
++    OCDM_INTERFACE_NOT_IMPLEMENTED = 3,
++    OCDM_BUFFER_TOO_SMALL = 4,
++    OCDM_INVALID_ACCESSOR = 0x80000001,
+     OCDM_KEYSYSTEM_NOT_SUPPORTED = 0x80000002,
+     OCDM_INVALID_SESSION = 0x80000003,
+     OCDM_INVALID_DECRYPT_BUFFER = 0x80000004,
+     OCDM_OUT_OF_MEMORY = 0x80000005,
++    OCDM_METHOD_NOT_IMPLEMENTED = 0x80000006,
+     OCDM_FAIL = 0x80004005,
+     OCDM_INVALID_ARG = 0x80070057,
+     OCDM_SERVER_INTERNAL_ERROR = 0x8004C600,
+     OCDM_SERVER_INVALID_MESSAGE = 0x8004C601,
+     OCDM_SERVER_SERVICE_SPECIFIC = 0x8004C604,
++    OCDM_BUSY_CANNOT_INITIALIZE = 0x8004DD00
+ };
+ 
+ // ISession defines the interface towards a DRM context that can decrypt data
+@@ -98,6 +104,12 @@ struct ISession : virtual public Core::IUnknown {
+     // Provides keysystem-specific metadata of the session
+     virtual std::string Metadata() const = 0;
+ 
++   // Provides keysystem-specific metricdata of the session
++    virtual OCDM_RESULT Metricdata(
++        uint32_t& bufferSize /* @inout */,
++        uint8_t buffer[] /* @out @length:bufferSize */) const
++        = 0;
++
+     // Report the current status of the Session with respect to the KeyExchange.
+     virtual KeyStatus Status() const = 0;
+     virtual KeyStatus Status(const uint8_t keyID[] /* @in @length:keyIDLength */, const uint8_t keyIDLength) const = 0;
+@@ -182,6 +194,13 @@ struct IAccessorOCDM : virtual public Core::IUnknown {
+     // Provides keysystem-specific metadata
+     virtual OCDM_RESULT Metadata(const std::string& keySystem, std::string& metadata /* @out */) const = 0;
+ 
++    // Provides keysystem-specific metricdata
++    virtual OCDM_RESULT Metricdata(
++        const std::string& keySystem,
++        uint32_t& bufferSize /* @inout */,
++        uint8_t buffer[] /* @out @length:bufferSize */) const
++        = 0;
++
+     // Create a MediaKeySession using the supplied init data and CDM data.
+     virtual OCDM_RESULT
+     CreateSession(const string& keySystem, const int32_t licenseType,
+-- 
+2.17.1
+
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content_new.patch b/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content_new.patch
new file mode 100644
index 0000000..51daef4
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/r4/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content_new.patch
@@ -0,0 +1,32 @@
+From 6d4b755295896f0075ceb1787a10866a406f0d9a Mon Sep 17 00:00:00 2001
+From: Piotr Marcinkowski <piotr.marcinkowski@redembedded.com>
+Date: Tue, 28 Feb 2023 11:51:16 +0000
+Subject: [PATCH] OMWAPPI-910 Increase subsamples limit for 4k content
+
+The existing size of the array that holds sub-sample info structures
+was too low. The number of sub-samples observed while playing 4k content
+was bigger than that with maximum value of 160 - that value was doubled
+and finally the array size grew from 100 to 320.
+
+This solution isn't perfect - specification allows the number of
+sub-samples to be bigger (16bit value)
+---
+ interfaces/IContentDecryption.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/interfaces/IContentDecryption.h b/interfaces/IContentDecryption.h
+index f1b4481..13ca11a 100644
+--- a/interfaces/IContentDecryption.h
++++ b/interfaces/IContentDecryption.h
+@@ -69,7 +69,7 @@ namespace Exchange {
+             uint32_t PatternClearBlocks;
+             uint8_t  IV[24];
+             uint8_t  KeyId[17];
+-            CDMi::SubSampleInfo SubSamples[100];
++            CDMi::SubSampleInfo SubSamples[320];
+             uint16_t StreamHeight;
+             uint16_t StreamWidth;
+             uint8_t  StreamType;
+-- 
+2.39.0
+
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces/r4/JDolbyOutput.h b/recipes-extended/wpe-framework/wpeframework-interfaces/r4/JDolbyOutput.h
new file mode 100644
index 0000000..982cf1f
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces/r4/JDolbyOutput.h
@@ -0,0 +1,121 @@
+
+// Generated automatically from 'IDolby.h'. DO NOT EDIT.
+
+#pragma once
+
+#include "Module.h"
+#include "JsonData_DolbyOutput.h"
+#include <interfaces/IDolby.h>
+
+namespace WPEFramework {
+
+namespace Exchange {
+
+    namespace Dolby {
+
+        namespace JOutput {
+
+            namespace Version {
+
+                constexpr uint8_t Major = 1;
+                constexpr uint8_t Minor = 0;
+                constexpr uint8_t Patch = 0;
+
+            } // namespace Version
+
+            using namespace JsonData::Dolby::Output;
+
+            static void Register(PluginHost::JSONRPC& _module, IOutput* _destination)
+            {
+                ASSERT(_destination != nullptr);
+
+                _module.RegisterVersion(_T("JOutput"), Version::Major, Version::Minor, Version::Patch);
+
+                // Property: atmosmetadata - Atmos capabilities of Sink (r/o)
+                _module.Register<void, Core::JSON::Boolean>(_T("dolby_atmosmetadata"),
+                    [_destination](Core::JSON::Boolean& Result) -> uint32_t {
+                        uint32_t _errorCode;
+                        // read-only property get
+                        bool _result{};
+                        _errorCode = _destination->AtmosMetadata(_result);
+                        if (_errorCode == Core::ERROR_NONE) {
+                            Result = _result;
+                        }
+                        return (_errorCode);
+                    });
+
+                // Property: soundmode - Sound Mode - Mono/Stereo/Surround (r/o)
+                _module.Register<void, Core::JSON::EnumType<Exchange::Dolby::IOutput::SoundModes>>(_T("dolby_soundmode"),
+                    [_destination](Core::JSON::EnumType<Exchange::Dolby::IOutput::SoundModes>& Result) -> uint32_t {
+                        uint32_t _errorCode;
+                        // read-only property get
+                        Exchange::Dolby::IOutput::SoundModes _result{};
+                        _errorCode = _destination->SoundMode(_result);
+                        if (_errorCode == Core::ERROR_NONE) {
+                            Result = _result;
+                        }
+                        return (_errorCode);
+                    });
+
+                // Property: enableatmosoutput - Enable Atmos Audio Output (w/o)
+                _module.Register<Core::JSON::Boolean, void>(_T("dolby_enableatmosoutput"),
+                    [_destination](const Core::JSON::Boolean& Params) -> uint32_t {
+                        uint32_t _errorCode;
+                        // write-only property set
+                        const bool _params{Params};
+                        _errorCode = _destination->EnableAtmosOutput(_params);
+                        return (_errorCode);
+                    });
+
+                // Property: mode - Dolby Mode
+                _module.Register<Core::JSON::EnumType<Exchange::Dolby::IOutput::Type>, Core::JSON::EnumType<Exchange::Dolby::IOutput::Type>>(_T("dolby_mode"),
+                    [_destination](const Core::JSON::EnumType<Exchange::Dolby::IOutput::Type>& Params, Core::JSON::EnumType<Exchange::Dolby::IOutput::Type>& Result) -> uint32_t {
+                        uint32_t _errorCode;
+                        if (Params.IsSet() == false) {
+                            // property get
+                            Exchange::Dolby::IOutput::Type _result{};
+                            _errorCode = (static_cast<const IOutput*>(_destination))->Mode(_result);
+                            if (_errorCode == Core::ERROR_NONE) {
+                                Result = _result;
+                            }
+                        } else {
+                            // property set
+                            const Exchange::Dolby::IOutput::Type _params{Params};
+                            _errorCode = _destination->Mode(_params);
+                            Result.Null(true);
+                        }
+                        return (_errorCode);
+                    });
+
+            }
+
+            static void Unregister(PluginHost::JSONRPC& _module)
+            {
+                _module.Unregister(_T("dolby_atmosmetadata"));
+                _module.Unregister(_T("dolby_soundmode"));
+                _module.Unregister(_T("dolby_enableatmosoutput"));
+                _module.Unregister(_T("dolby_mode"));
+            }
+
+            namespace Event {
+
+                // Event: audiomodechanged
+                static void AudioModeChanged(const PluginHost::JSONRPC& _module, const Exchange::Dolby::IOutput::SoundModes& mode, const bool& enabled)
+                {
+                    AudioModeChangedParamsData _params;
+                    _params.Mode = static_cast<Exchange::Dolby::IOutput::SoundModes>(mode);
+                    _params.Enabled = enabled;
+
+                    _module.Notify(_T("dolby_audiomodechanged"), _params);
+                }
+
+            }; // namespace Event
+
+        }; // namespace JOutput
+
+    } // namespace Dolby
+
+} // namespace Exchange
+
+}
+
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces_2.1.bb b/recipes-extended/wpe-framework/wpeframework-interfaces_2.1.bb
index a40f96b..b57a737 100644
--- a/recipes-extended/wpe-framework/wpeframework-interfaces_2.1.bb
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces_2.1.bb
@@ -9,17 +9,17 @@
 SRC_URI = "git://github.com/rdkcentral/ThunderInterfaces.git;protocol=git;branch=R2;name=wpeframework-interfaces \
            file://0018-notifyclient-event-added.patch \
            file://0020-Adding-the-VoiceCommand-API-for-Netflix-plugin.patch \
-           file://0001-Add-IFocus-iface.patch \
            file://0001-Revert-Merge-pull-request-137-from-mikolaj-staworzyn.patch \
            file://0001-Extend-web-browser-interface-for-XRE-usecases.patch \
-           file://r2/0001-RDK-37042-Add-interfaces-for-Airplay-Plugin.patch \
            file://r2/0001-RDK-40478-Run-AirplayDaemon-as-thunder-plugin.patch \
-           file://r2/0001-Add-TextToSpeech-Interface.patch \
            file://0001-add-PersistLoadWatermark.patch \
+           file://r2/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content_new.patch \
+           file://r2/hdrtypes_displayinfo_R2.patch \
+           file://r2/0001-Add-a-new-metrics-punch-through-on-the-OCDM-interface_2.1.patch \
            "
 
-# Sep 29, 2022
-SRCREV_wpeframework-interfaces = "7547343f51e92ffd897e44f38d710336601135da"
+# Sep 11, 2023
+SRCREV_wpeframework-interfaces = "${THUNDER_RELEASE_TAG_NAME}"
 
 # ----------------------------------------------------------------------------
 
diff --git a/recipes-extended/wpe-framework/wpeframework-interfaces_4.2.bb b/recipes-extended/wpe-framework/wpeframework-interfaces_4.2.bb
index 35202c4..91e5b27 100644
--- a/recipes-extended/wpe-framework/wpeframework-interfaces_4.2.bb
+++ b/recipes-extended/wpe-framework/wpeframework-interfaces_4.2.bb
@@ -20,6 +20,9 @@
            file://r4/0101-IWatermark-Interface-In-R4.patch \
            file://0001-add-PersistLoadWatermark.patch \
            file://r4/0007-RDK-IDeviceInfo-Changes.patch \
+           file://r4/0110-OMWAPPI-910-Increase-subsamples-limit-for-4k-content_new.patch \
+           file://r4/JDolbyOutput.h \
+           file://r4/0001-Add-a-new-metrics-punch-through-on-the-OCDM-interface_4.2.patch \
            "
 
 #
@@ -47,6 +50,16 @@
     fi
 }
 
+
+#########
+# FIXME # Mitigation to Thunder 4.2; Must be removed when upgraded to R4.3 & above   #
+#########
+do_install_append() {
+    install -m 0644 ${WORKDIR}/r4/JDolbyOutput.h ${D}${includedir}/WPEFramework/interfaces/json/JDolbyOutput.h
+}
+#########
+
+
 # ----------------------------------------------------------------------------
 
 FILES_SOLIBSDEV = ""
diff --git a/recipes-extended/wpe-framework/wpeframework-tools-native_2.1.bb b/recipes-extended/wpe-framework/wpeframework-tools-native_2.1.bb
index c168a5f..f37302b 100644
--- a/recipes-extended/wpe-framework/wpeframework-tools-native_2.1.bb
+++ b/recipes-extended/wpe-framework/wpeframework-tools-native_2.1.bb
@@ -8,9 +8,6 @@
 # Sep 29, 2022, 82d4791478934292f7260fef233b9743fa34d88e
 SRCREV_thunder = "${THUNDER_RELEASE_TAG_NAME}"
 
-SRC_URI_append = " \
-                   file://0009-Generate-COM-RPC-ProxyStubs-that-support-large-strin.patch \
-                  "
 inherit cmake pkgconfig native python3native
 
 RDEPENDS_${PN} = "python3"
diff --git a/recipes-extended/wpe-framework/wpeframework-tools-native_4.2.bb b/recipes-extended/wpe-framework/wpeframework-tools-native_4.2.bb
index d49b484..d545358 100644
--- a/recipes-extended/wpe-framework/wpeframework-tools-native_4.2.bb
+++ b/recipes-extended/wpe-framework/wpeframework-tools-native_4.2.bb
@@ -5,6 +5,7 @@
 
 
 SRC_URI = "git://github.com/rdkcentral/Thunder.git;protocol=git;branch=R4"
+SRC_URI += "file://0001-startuporder-configure-config-generator.patch"
 
 SRCREV = "R4.2"
 #SRCREV = "${THUNDER_RELEASE_TAG_NAME}"
diff --git a/recipes-extended/wpe-framework/wpeframework-tools/0001-startuporder-configure-config-generator.patch b/recipes-extended/wpe-framework/wpeframework-tools/0001-startuporder-configure-config-generator.patch
new file mode 100644
index 0000000..e6e55ca
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework-tools/0001-startuporder-configure-config-generator.patch
@@ -0,0 +1,53 @@
+diff --git a/Tools/ConfigGenerator/params.config b/Tools/ConfigGenerator/params.config
+index 7b389016..996c9628 100644
+--- a/Tools/ConfigGenerator/params.config
++++ b/Tools/ConfigGenerator/params.config
+@@ -1,6 +1,7 @@
+ autostart
+ precondition
+ resumed
++startuporder
+ terminations
+ callsign
+ persistentpathpostfix
+
+diff --git a/Tools/JsonGenerator/JsonGenerator.py b/Tools/JsonGenerator/JsonGenerator.py
+index e2ca4f35..6954b6ff 100755
+--- a/Tools/JsonGenerator/JsonGenerator.py
++++ b/Tools/JsonGenerator/JsonGenerator.py
+@@ -3397,6 +3397,10 @@ def CreateDocument(schema, path):
+                         "type": "boolean",
+                         "description": "Determines if the plugin shall be started automatically along with the framework"
+                     }
++                    commonConfig["startuporder"] = {
++                        "type": "integer",
++                        "description": "The plugin shall be started automatically along with the framework based on startuporder"
++                    }
+
+                 required = []
+                 if "configuration" in schema:
+@@ -3409,7 +3413,7 @@ def CreateDocument(schema, path):
+                 totalConfig["type"] = "object"
+                 totalConfig["properties"] = commonConfig2
+                 if "configuration" not in schema or ("nodefault" not in schema["configuration"] or not schema["configuration"]["nodefault"]):
+-                    totalConfig["required"] = ["callsign", "classname", "locator", "autostart"] + required
++                    totalConfig["required"] = ["callsign", "classname", "locator", "autostart", "startuporder"] + required
+
+                 ParamTable("", totalConfig)
+
+diff --git a/Tools/cmake/FindConfigGenerator.cmake.in b/Tools/cmake/FindConfigGenerator.cmake.in
+index 00dc9141..72850de0 100644
+--- a/Tools/cmake/FindConfigGenerator.cmake.in
++++ b/Tools/cmake/FindConfigGenerator.cmake.in
+@@ -223,6 +223,10 @@ if(CMAKE_VERSION VERSION_LESS 3.20.0 AND LEGACY_CONFIG_GENERATOR)
+                     map_append(${plugin_config} resumed ${resumed})
+                 endif()
+
++               if (NOT ${startuporder} STREQUAL "")
++                    map_append(${plugin_config} startuporder ${startuporder})
++                endif()
++
+                 if (NOT ${persistentpathpostfix} STREQUAL "")
+                     map_append(${plugin_config} persistentpathpostfix ${persistentpathpostfix})
+                     unset(persistentpathpostfix)
+
diff --git a/recipes-extended/wpe-framework/wpeframework/0001-RDKTV-15347-Add-PluginActivator-utility-for-systemd-.patch b/recipes-extended/wpe-framework/wpeframework/0001-RDKTV-15347-Add-PluginActivator-utility-for-systemd-.patch
new file mode 100644
index 0000000..82aedf7
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework/0001-RDKTV-15347-Add-PluginActivator-utility-for-systemd-.patch
@@ -0,0 +1,681 @@
+From 108513fce9904acf6d7d291ab2b87fc8909a621a Mon Sep 17 00:00:00 2001
+From: Stephen Foulds <stephen.foulds@sky.uk>
+Date: Thu, 8 Sep 2022 12:06:21 +0100
+Subject: [PATCH] RDKTV-15347: Add PluginActivator utility for systemd
+ integration (#1059)
+
+* Add PluginActivator utility for systemd integration
+
+* Update copyright headers
+
+* Code style changes to match project style
+
+* Minor formatting fix
+
+* Address code review comments
+---
+ CMakeLists.txt                                |   7 +
+ Utils/PluginActivator/CMakeLists.txt          |  42 +++++
+ Utils/PluginActivator/README.md               |  18 ++
+ .../PluginActivator/source/COMRPCStarter.cpp  | 154 ++++++++++++++++++
+ Utils/PluginActivator/source/COMRPCStarter.h  |  47 ++++++
+ Utils/PluginActivator/source/IPluginStarter.h |  43 +++++
+ Utils/PluginActivator/source/Log.h            |  68 ++++++++
+ Utils/PluginActivator/source/Module.cpp       |  23 +++
+ Utils/PluginActivator/source/Module.h         |  31 ++++
+ Utils/PluginActivator/source/main.cpp         | 132 +++++++++++++++
+ 10 files changed, 565 insertions(+)
+ create mode 100644 Utils/PluginActivator/CMakeLists.txt
+ create mode 100644 Utils/PluginActivator/README.md
+ create mode 100644 Utils/PluginActivator/source/COMRPCStarter.cpp
+ create mode 100644 Utils/PluginActivator/source/COMRPCStarter.h
+ create mode 100755 Utils/PluginActivator/source/IPluginStarter.h
+ create mode 100644 Utils/PluginActivator/source/Log.h
+ create mode 100644 Utils/PluginActivator/source/Module.cpp
+ create mode 100644 Utils/PluginActivator/source/Module.h
+ create mode 100644 Utils/PluginActivator/source/main.cpp
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 4ba768b1..3e9004d2 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -27,6 +27,9 @@ set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
+ 
+ message(STATUS "Setting up ${PROJECT_NAME} v${VERSION}")
+ 
++option(BUILD_PLUGIN_ACTIVATOR
++     "Build the standalone plugin activator utility to activate plugins using systemd" OFF) 
++
+ if (BUILD_REFERENCE)
+     add_definitions (-DBUILD_REFERENCE=${BUILD_REFERENCE})
+ endif()
+@@ -96,3 +99,7 @@ endif()
+ 
+ add_subdirectory(Source)
+ add_subdirectory(Tests)
++
++if (BUILD_PLUGIN_ACTIVATOR)
++  add_subdirectory(Utils/PluginActivator)
++endif()
+diff --git a/Utils/PluginActivator/CMakeLists.txt b/Utils/PluginActivator/CMakeLists.txt
+new file mode 100644
+index 00000000..bd465e3a
+--- /dev/null
++++ b/Utils/PluginActivator/CMakeLists.txt
+@@ -0,0 +1,42 @@
++
++# If not stated otherwise in this file or this component's license file the
++# following copyright and licenses apply:
++#
++# Copyright 2020 Metrological
++#
++# 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.
++
++cmake_minimum_required(VERSION 3.10.3)
++
++project( PluginActivator )
++
++set( CMAKE_CXX_STANDARD 11 )
++
++add_executable(${PROJECT_NAME}
++    source/Module.cpp
++    source/main.cpp
++    source/COMRPCStarter.cpp
++)
++
++target_link_libraries(${PROJECT_NAME}
++    PRIVATE
++    CompileSettingsDebug::CompileSettingsDebug
++    ${NAMESPACE}Core::${NAMESPACE}Core
++    ${NAMESPACE}COM::${NAMESPACE}COM
++    ${NAMESPACE}Plugins::${NAMESPACE}Plugins
++)
++
++install(
++    TARGETS ${PROJECT_NAME}
++    RUNTIME DESTINATION bin
++)
+diff --git a/Utils/PluginActivator/README.md b/Utils/PluginActivator/README.md
+new file mode 100644
+index 00000000..0ab0cff6
+--- /dev/null
++++ b/Utils/PluginActivator/README.md
+@@ -0,0 +1,18 @@
++# Plugin Activator
++A command-line tool to activate a specified Thunder plugin.
++
++Will automatically retry activation mutliple times if the plugin does not successfully activate.
++
++Designed to be used with systemd where each plugin becomes a standalone systemd service, activated with this tool.
++
++## Usage
++```
++Usage: PluginActivator <option(s)> [callsign]
++    Utility that starts a given thunder plugin
++
++    -h, --help          Print this help and exit
++    -r, --retries       Maximum amount of retries to attempt to start the plugin before giving up
++    -d, --delay         Delay (in ms) between each attempt to start the plugin if it fails
++
++    [callsign]          Callsign of the plugin to activate (Required)
++```
+\ No newline at end of file
+diff --git a/Utils/PluginActivator/source/COMRPCStarter.cpp b/Utils/PluginActivator/source/COMRPCStarter.cpp
+new file mode 100644
+index 00000000..88f50558
+--- /dev/null
++++ b/Utils/PluginActivator/source/COMRPCStarter.cpp
+@@ -0,0 +1,154 @@
++/*
++ * If not stated otherwise in this file or this component's LICENSE file the
++ * following copyright and licenses apply:
++ *
++ * Copyright 2020 Metrological
++ *
++ * 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.
++ */
++
++#include "COMRPCStarter.h"
++
++#include "Log.h"
++
++#include <chrono>
++#include <thread>
++
++COMRPCStarter::COMRPCStarter(const string& pluginName)
++    : _pluginName(pluginName)
++    , _engine(Core::ProxyType<RPC::InvokeServerType<1, 0, 4>>::Create())
++    , _client(Core::ProxyType<RPC::CommunicatorClient>::Create(getConnectionEndpoint(),
++          Core::ProxyType<Core::IIPCServer>(_engine)))
++{
++    // Announce our arrival
++    _engine->Announcements(_client->Announcement());
++
++    if (!_client.IsValid()) {
++        LOG_ERROR(pluginName.c_str(), "Failed to create valid COM-RPC client");
++    }
++}
++
++COMRPCStarter::~COMRPCStarter()
++{
++    // Close the connection just in case something left it open
++    if (_client->IsOpen()) {
++        _client->Close(RPC::CommunicationTimeOut);
++    }
++
++    if (_client.IsValid()) {
++        _client.Release();
++    }
++}
++
++/**
++ * @brief Attempt to activate the plugin and automatically retry on failure
++ *
++ * @param[in]   maxRetries      Maximum amount of times to retry activation if it fails
++ * @param[in]   retryDelayMs    Delay in ms between retry attempts
++ *
++ * @return True if plugin successfully activated, false if failed to activate
++ */
++bool COMRPCStarter::activatePlugin(const uint8_t maxRetries, const uint16_t retryDelayMs)
++{
++    // Attempt to open the plugin shell
++    bool success = false;
++    int currentRetry = 1;
++
++    PluginHost::IShell* shell = nullptr;
++
++    while (!success && currentRetry <= maxRetries) {
++        LOG_INF(_pluginName.c_str(), "Attempting to activate plugin - attempt %d/%d", currentRetry, maxRetries);
++
++        auto start = Core::Time::Now();
++
++        if (!shell) {
++            shell = _client->Open<PluginHost::IShell>(_pluginName, ~0, RPC::CommunicationTimeOut);
++        }
++
++        // We could not open IShell for some reason - Thunder doesn't give an error about why this might have failed
++        // Normally this is because either:
++        //  a) Thunder isn't running or we can't connect to /tmp/communicator
++        //  b) A plugin with the specified callsign does not exist
++        if (!shell) {
++            LOG_ERROR(_pluginName.c_str(), "Failed to open IShell interface for %s", _pluginName.c_str());
++            currentRetry++;
++
++            // Must close the connection before we retry, since even if shell is null the underlying
++            // connection will still have been opened
++            _client->Close(RPC::CommunicationTimeOut);
++
++            // Sleep, then try again
++            std::this_thread::sleep_for(std::chrono::milliseconds(retryDelayMs));
++        } else {
++            // Connected to Thunder successfully and got the plugin shell
++            if (shell->State() == PluginHost::IShell::ACTIVATED) {
++                LOG_INF(_pluginName.c_str(), "Plugin is already activated - nothing to do");
++                success = true;
++            } else {
++                // Will block until plugin is activated
++                uint32_t result = shell->Activate(PluginHost::IShell::REQUESTED);
++
++                auto duration = Core::Time::Now().Sub(start.MilliSeconds());
++
++                if (result != Core::ERROR_NONE) {
++                    if (result == Core::ERROR_PENDING_CONDITIONS) {
++                        // Ideally we'd print out which preconditions are un-met for debugging, but that data is not exposed through the IShell interface
++                        LOG_ERROR(_pluginName.c_str(), "Failed to activate plugin due to unmet preconditions after %dms", duration.MilliSeconds());
++                    } else {
++                        LOG_ERROR(_pluginName.c_str(), "Failed to activate plugin with error %u (%s) after %dms", result, Core::ErrorToString(result), duration.MilliSeconds());
++                    }
++
++                    // Try activation again up until the max number of retries
++                    currentRetry++;
++                    std::this_thread::sleep_for(std::chrono::milliseconds(retryDelayMs));
++                } else {
++                    // Our work here is done!
++                    LOG_INF(_pluginName.c_str(), "Successfully activated plugin after %dms", duration.MilliSeconds());
++                    success = true;
++                }
++            }
++        }
++    }
++
++    if (!success) {
++        LOG_ERROR(_pluginName.c_str(), "Max retries hit - giving up activating the plugin");
++    }
++
++    if (shell) {
++        shell->Release();
++    }
++
++    // Be a good citizen and don't leave any open connections
++    if (_client->IsOpen()) {
++        _client->Close(RPC::CommunicationTimeOut);
++    }
++
++    return success;
++}
++
++/**
++ * Retrieves the socket we will communicate over for COM-RPC
++ */
++Core::NodeId COMRPCStarter::getConnectionEndpoint() const
++{
++    string communicatorPath;
++    Core::SystemInfo::GetEnvironment(_T("COMMUNICATOR_PATH"), communicatorPath);
++
++    // On linux, Thunder defaults to /tmp/communicator for the generic COM-RPC
++    // interface
++    if (communicatorPath.empty()) {
++        communicatorPath = _T("/tmp/communicator");
++    }
++
++    return Core::NodeId(communicatorPath.c_str());
++}
+\ No newline at end of file
+diff --git a/Utils/PluginActivator/source/COMRPCStarter.h b/Utils/PluginActivator/source/COMRPCStarter.h
+new file mode 100644
+index 00000000..dec8fa46
+--- /dev/null
++++ b/Utils/PluginActivator/source/COMRPCStarter.h
+@@ -0,0 +1,47 @@
++/*
++ * If not stated otherwise in this file or this component's LICENSE file the
++ * following copyright and licenses apply:
++ *
++ * Copyright 2020 Metrological
++ *
++ * 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.
++ */
++
++#pragma once
++#include "Module.h"
++
++#include "IPluginStarter.h"
++
++using namespace WPEFramework;
++
++/**
++ * @brief COM-RPC implementation of a plugin starter
++ *
++ * Connects to Thunder over COM-RPC and attempts to start a given plugin
++ */
++class COMRPCStarter : public IPluginStarter {
++public:
++    explicit COMRPCStarter(const string& pluginName);
++    ~COMRPCStarter() override;
++
++    bool activatePlugin(const uint8_t maxRetries, const uint16_t retryDelayMs) override;
++
++private:
++    Core::NodeId getConnectionEndpoint() const;
++
++private:
++    const string _pluginName;
++
++    Core::ProxyType<RPC::InvokeServerType<1, 0, 4>> _engine;
++    Core::ProxyType<RPC::CommunicatorClient> _client;
++};
+\ No newline at end of file
+diff --git a/Utils/PluginActivator/source/IPluginStarter.h b/Utils/PluginActivator/source/IPluginStarter.h
+new file mode 100755
+index 00000000..32128417
+--- /dev/null
++++ b/Utils/PluginActivator/source/IPluginStarter.h
+@@ -0,0 +1,43 @@
++/*
++ * If not stated otherwise in this file or this component's LICENSE file the
++ * following copyright and licenses apply:
++ *
++ * Copyright 2020 Metrological
++ *
++ * 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.
++ */
++
++#pragma once
++
++#include <string>
++
++/**
++ * Interface to start a specified plugin
++ *
++ * Could be implemented with JSON-RPC or COM-RPC
++ */
++class IPluginStarter {
++public:
++    virtual ~IPluginStarter() = default;
++
++    /**
++     * @brief Activate a Thunder plugin
++     *
++     * Will block until either the Thunder plugin has activated or until the maximum amount of retires has occurred
++     *
++     * @param[in]   maxRetries          Maximum amount of attempts to activate the plugin - if plugin is not activated within the amount of retries
++     *                                  this method will return false
++     * @param[in]   retryDelayMs        Amount of time to wait after a failed activation before retrying again
++     */
++    virtual bool activatePlugin(const uint8_t maxRetries, const uint16_t retryDelayMs) = 0;
++};
+\ No newline at end of file
+diff --git a/Utils/PluginActivator/source/Log.h b/Utils/PluginActivator/source/Log.h
+new file mode 100644
+index 00000000..87dff0b2
+--- /dev/null
++++ b/Utils/PluginActivator/source/Log.h
+@@ -0,0 +1,68 @@
++/*
++ * If not stated otherwise in this file or this component's LICENSE file the
++ * following copyright and licenses apply:
++ *
++ * Copyright 2020 Metrological
++ *
++ * 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.
++ */
++
++#pragma once
++
++#include <stdio.h>
++#include <string.h>
++
++#define LOG_LEVEL 3
++
++#ifndef __FILENAME__
++#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
++#endif
++
++#define LEVEL_DEBUG 3
++#define LEVEL_INFO 2
++#define LEVEL_WARN 1
++#define LEVEL_ERROR 0
++
++#define LOG_DBG(plugin, fmt, ...) \
++    __LOG(LEVEL_DEBUG, plugin, fmt, ##__VA_ARGS__)
++
++#define LOG_INF(plugin, fmt, ...) \
++    __LOG(LEVEL_INFO, plugin, fmt, ##__VA_ARGS__)
++
++#define LOG_WARN(plugin, fmt, ...) \
++    __LOG(LEVEL_WARN, plugin, fmt, ##__VA_ARGS__)
++
++#define LOG_ERROR(plugin, fmt, ...) \
++    __LOG(LEVEL_ERROR, plugin, fmt, ##__VA_ARGS__)
++
++#define __LOG(level, plugin, fmt, ...)                                                                                                        \
++    do {                                                                                                                                      \
++        if (__builtin_expect(((level) <= LOG_LEVEL), 0))                                                                                      \
++            fprintf(stderr, "%s[%s:%d][%s] (%s) " fmt "\n", getLogLevel(level), __FILENAME__, __LINE__, __FUNCTION__, plugin, ##__VA_ARGS__); \
++    } while (0)
++
++inline const char* getLogLevel(int level)
++{
++    switch (level) {
++    case LEVEL_DEBUG:
++        return "[DBG]";
++    case LEVEL_INFO:
++        return "[NFO]";
++    case LEVEL_WARN:
++        return "[WRN]";
++    case LEVEL_ERROR:
++        return "[ERR]";
++    default:
++        return "";
++    }
++}
+\ No newline at end of file
+diff --git a/Utils/PluginActivator/source/Module.cpp b/Utils/PluginActivator/source/Module.cpp
+new file mode 100644
+index 00000000..aa310602
+--- /dev/null
++++ b/Utils/PluginActivator/source/Module.cpp
+@@ -0,0 +1,23 @@
++/*
++ * If not stated otherwise in this file or this component's LICENSE file the
++ * following copyright and licenses apply:
++ *
++ * Copyright 2020 Metrological
++ *
++ * 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.
++ */
++
++#include "Module.h"
++
++// If not set in CMake flags, BUILD_REFERENCE defaults to "engineering_build_for_debug_purpose_only"
++MODULE_NAME_DECLARATION(BUILD_REFERENCE)
+\ No newline at end of file
+diff --git a/Utils/PluginActivator/source/Module.h b/Utils/PluginActivator/source/Module.h
+new file mode 100644
+index 00000000..b2500eec
+--- /dev/null
++++ b/Utils/PluginActivator/source/Module.h
+@@ -0,0 +1,31 @@
++/*
++ * If not stated otherwise in this file or this component's LICENSE file the
++ * following copyright and licenses apply:
++ *
++ * Copyright 2020 Metrological
++ *
++ * 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.
++ */
++
++#pragma once
++
++#ifndef MODULE_NAME
++#define MODULE_NAME PluginStarter
++#endif
++
++#include <com/com.h>
++#include <core/core.h>
++#include <plugins/plugins.h>
++
++#undef EXTERNAL
++#define EXTERNAL
+diff --git a/Utils/PluginActivator/source/main.cpp b/Utils/PluginActivator/source/main.cpp
+new file mode 100644
+index 00000000..fa1ac9dd
+--- /dev/null
++++ b/Utils/PluginActivator/source/main.cpp
+@@ -0,0 +1,132 @@
++/*
++ * If not stated otherwise in this file or this component's LICENSE file the
++ * following copyright and licenses apply:
++ *
++ * Copyright 2020 Metrological
++ *
++ * 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.
++ */
++
++#include "COMRPCStarter.h"
++#include "Module.h"
++
++#include <memory>
++
++static int gRetryCount = 100;
++static int gRetryDelayMs = 500;
++static string gPluginName;
++
++/**
++ * @brief Display a help message for the tool
++ */
++static void displayUsage()
++{
++    printf("Usage: PluginActivator <option(s)> [callsign]\n");
++    printf("    Utility that starts a given thunder plugin\n\n");
++    printf("    -h, --help          Print this help and exit\n");
++    printf("    -r, --retries       Maximum amount of retries to attempt to start the plugin before giving up\n");
++    printf("    -d, --delay         Delay (in ms) between each attempt to start the plugin if it fails\n");
++    printf("\n");
++    printf("    [callsign]          Callsign of the plugin to activate (Required)\n");
++}
++
++/**
++ * @brief Parse the provided command line arguments
++ *
++ * Must be given the name of the plugin to activate, everything else
++ * is optional and will fallback to sane defaults
++ */
++static void parseArgs(const int argc, char** argv)
++{
++    if (argc == 1) {
++        displayUsage();
++        exit(EXIT_SUCCESS);
++    }
++
++    struct option longopts[] = {
++        { "help", no_argument, nullptr, (int)'h' },
++        { "retries", required_argument, nullptr, (int)'r' },
++        { "delay", required_argument, nullptr, (int)'d' },
++        { nullptr, 0, nullptr, 0 }
++    };
++
++    opterr = 0;
++
++    int option;
++    int longindex;
++
++    while ((option = getopt_long(argc, argv, "hr:d:", longopts, &longindex)) != -1) {
++        switch (option) {
++        case 'h':
++            displayUsage();
++            exit(EXIT_SUCCESS);
++            break;
++        case 'r':
++            gRetryCount = std::atoi(optarg);
++            if (gRetryCount < 0) {
++                fprintf(stderr, "Error: Retry count must be > 0\n");
++                exit(EXIT_FAILURE);
++            }
++            break;
++        case 'd':
++            gRetryDelayMs = std::atoi(optarg);
++            if (gRetryDelayMs < 0) {
++                fprintf(stderr, "Error: Delay ms must be > 0\n");
++                exit(EXIT_FAILURE);
++            }
++            break;
++        case '?':
++            if (optopt == 'c')
++                fprintf(stderr, "Warning: Option -%c requires an argument.\n", optopt);
++            else if (isprint(optopt))
++                fprintf(stderr, "Warning: Unknown option `-%c'.\n", optopt);
++            else
++                fprintf(stderr, "Warning: Unknown option character `\\x%x'.\n", optopt);
++
++            exit(EXIT_FAILURE);
++            break;
++        default:
++            exit(EXIT_FAILURE);
++            break;
++        }
++    }
++
++    if (optind == argc) {
++        fprintf(stderr, "Error: Must provide plugin name to activate\n");
++        exit(EXIT_FAILURE);
++    }
++
++    gPluginName = argv[optind];
++
++    optind++;
++    for (int i = optind; i < argc; i++) {
++        printf("Warning: Non-option argument %s ignored\n", argv[i]);
++    }
++}
++
++int main(int argc, char* argv[])
++{
++    parseArgs(argc, argv);
++
++    // For now, we only implement the starter in COM-RPC but could do a JSON-RPC version
++    // in the future
++    bool success;
++    std::unique_ptr<IPluginStarter> starter(new COMRPCStarter(gPluginName));
++    success = starter->activatePlugin(gRetryCount, gRetryDelayMs);
++
++    // Destruct the COM-RPC starter so it cleans up after itself before we dispose WPEFramework singletons
++    starter.reset();
++    Core::Singleton::Dispose();
++
++    return success ? EXIT_SUCCESS : EXIT_FAILURE;
++}
+\ No newline at end of file
+-- 
+2.34.1
+
diff --git a/recipes-extended/wpe-framework/wpeframework/r2/0001-Support-negative-numbers-with-write_config.patch b/recipes-extended/wpe-framework/wpeframework/r2/0001-Support-negative-numbers-with-write_config.patch
index 58faae1..f9bc303 100644
--- a/recipes-extended/wpe-framework/wpeframework/r2/0001-Support-negative-numbers-with-write_config.patch
+++ b/recipes-extended/wpe-framework/wpeframework/r2/0001-Support-negative-numbers-with-write_config.patch
@@ -10,13 +10,13 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/cmake/config/formats/json/json_indented.cmake b/cmake/config/formats/json/json_indented.cmake
-index 776019d5..4392e63f 100644
+index 6e40a3e3..659b9f67 100644
 --- a/cmake/config/formats/json/json_indented.cmake
 +++ b/cmake/config/formats/json/json_indented.cmake
-@@ -75,7 +75,7 @@ function(json_indented)
-     if (NOT "${node}" STREQUAL "___array___")
-         if(NOT content_length)
-           map_append_string(${context} json "null")
+@@ -80,7 +80,7 @@ function(json_indented)
+           cmake_string_to_json("${node}")
+           ans(node)
+           map_append_string(${context} json "${node}")
 -        elseif("_${node}" MATCHES "^_(0|(([1-9][0-9]*)([.][0-9]+([eE][+-]?[0-9]+)?)?)|(true)|(false))$")
 +        elseif("_${node}" MATCHES "^_(0|(([-]?[1-9][0-9]*)([.][0-9]+([eE][+-]?[0-9]+)?)?)|(true)|(false))$")
            map_append_string(${context} json "${node}")
diff --git a/recipes-extended/wpe-framework/wpeframework/r4/Enable_Thunder_Logging_R4.patch b/recipes-extended/wpe-framework/wpeframework/r4/Enable_Thunder_Logging_R4.patch
new file mode 100644
index 0000000..403f333
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework/r4/Enable_Thunder_Logging_R4.patch
@@ -0,0 +1,78 @@
+Index: git/Source/WPEFramework/WPEFramework.conf.in
+===================================================================
+--- git.orig/Source/WPEFramework/WPEFramework.conf.in
++++ git/Source/WPEFramework/WPEFramework.conf.in
+@@ -75,25 +75,70 @@ if boolean('@MESSAGING@'):
+ 
+   __notification = {
+        "category" : "Notification",
+-       "enabled" : False
++       "enabled" : True
+       }
+-  
++
++  __startup = {
++       "category" : "Startup",
++       "enabled" : True
++      }
++
++  __shutdown = {
++       "category" : "Shutdown",
++       "enabled" : True
++      }
++
++  __error = {
++       "category" : "Error",
++       "enabled" : True
++      }
++
++  __parsingError = {
++       "category" : "ParsingError",
++       "enabled" : True
++      }
++
++  __crash = {
++       "category" : "Crash",
++       "enabled" : True
++      }
++
+   __fatal = {
+        "category" : "Fatal",
+        "enabled" : True
+       }
+-  
++
+   __logging_settings = []
+   __logging_settings.append(__notification)
++  __logging_settings.append(__startup)
++  __logging_settings.append(__shutdown)
++  __logging_settings.append(__error)
++  __logging_settings.append(__parsingError)
++  __logging_settings.append(__crash)
++  __logging_settings.append(__fatal)
+   
+   __logging = JSON()
+   __logging.add("abbreviated", True)
+   __logging.add("settings", __logging_settings)
+   
+   messaging.add("logging", __logging)
++
++  __info= {
++       "category" : "Information",
++       "module" : "Plugin_LocationSync",
++       "enabled" : True
++      }
+   
++  __warn= {
++       "category" : "Warning",
++       "enabled" : True
++      }
++
+   __tracing_settings = []
+   __tracing_settings.append(__fatal)
++  __tracing_settings.append(__error)
++  __tracing_settings.append(__warn)
++  __tracing_settings.append(__info)
+   
+   __tracing = JSON()
+   __tracing.add("settings", __tracing_settings)
diff --git a/recipes-extended/wpe-framework/wpeframework/r4/ONEM-31782_R4.patch b/recipes-extended/wpe-framework/wpeframework/r4/ONEM-31782_R4.patch
new file mode 100644
index 0000000..6d267df
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework/r4/ONEM-31782_R4.patch
@@ -0,0 +1,128 @@
+diff --git a/Source/core/Portability.h b/Source/core/Portability.h
+index 870be0b1..bb3d7bc3 100644
+--- a/Source/core/Portability.h
++++ b/Source/core/Portability.h
+@@ -575,6 +575,8 @@ uint64_t ntohll(const uint64_t& value);
+ #endif
+ }
+
++#define SLEEPSLOT_POLLING_TIME 100
++
+ // ---- Helper types and constants ----
+ #define _TXT(THETEXT) \
+     _T(THETEXT)       \
+diff --git a/Source/core/SerialPort.cpp b/Source/core/SerialPort.cpp
+index 7603fd77..ea8b5ae3 100644
+--- a/Source/core/SerialPort.cpp
++++ b/Source/core/SerialPort.cpp
+@@ -52,8 +52,6 @@
+ namespace WPEFramework {
+ namespace Core {
+
+-    static constexpr uint32_t SLEEPSLOT_TIME = 100;
+-
+ //////////////////////////////////////////////////////////////////////
+ // SerialPort::SerialMonitor
+ //////////////////////////////////////////////////////////////////////
+@@ -646,11 +644,11 @@ namespace Core {
+                 // Make sure we aren't in the monitor thread waiting for close completion.
+                 ASSERT(Core::Thread::ThreadId() != ResourceMonitor::Instance().Id());
+
+-                uint32_t sleepSlot = (waiting > SLEEPSLOT_TIME ? SLEEPSLOT_TIME : waiting);
++                uint32_t sleepSlot = (waiting > SLEEPSLOT_POLLING_TIME ? SLEEPSLOT_POLLING_TIME : waiting);
+
+                 _adminLock.Unlock();
+
+-                // Right, lets sleep in slices of <= SLEEPSLOT_TIME ms
++                // Right, lets sleep in slices of <= SLEEPSLOT_POLLING_TIME ms
+                 SleepMs(sleepSlot);
+
+                 _adminLock.Lock();
+diff --git a/Source/core/SocketPort.cpp b/Source/core/SocketPort.cpp
+index 3ef900db..e37ff449 100644
+--- a/Source/core/SocketPort.cpp
++++ b/Source/core/SocketPort.cpp
+index 3ef900db..e37ff449 100644
+--- a/Source/core/SocketPort.cpp
++++ b/Source/core/SocketPort.cpp
+@@ -262,7 +262,6 @@ namespace WPEFramework {
+         //////////////////////////////////////////////////////////////////////
+
+         static constexpr uint32_t MAX_LISTEN_QUEUE = 64;
+-        static constexpr uint32_t SLEEPSLOT_TIME = 100;
+
+         inline void DestroySocket(SOCKET& socket)
+         {
+@@ -881,7 +880,7 @@ namespace WPEFramework {
+                 // Make sure we aren't in the monitor thread waiting for close completion.
+                 ASSERT(Core::Thread::ThreadId() != ResourceMonitor::Instance().Id());
+
+-                uint32_t sleepSlot = (waiting > SLEEPSLOT_TIME ? SLEEPSLOT_TIME : waiting);
++                uint32_t sleepSlot = (waiting > SLEEPSLOT_POLLING_TIME ? SLEEPSLOT_POLLING_TIME : waiting);
+
+                 m_syncAdmin.Unlock();
+
+@@ -916,7 +915,7 @@ namespace WPEFramework {
+                 // Make sure we aren't in the monitor thread waiting for close completion.
+                 ASSERT(Core::Thread::ThreadId() != ResourceMonitor::Instance().Id());
+
+-                uint32_t sleepSlot = (waiting > SLEEPSLOT_TIME ? SLEEPSLOT_TIME : waiting);
++                uint32_t sleepSlot = (waiting > SLEEPSLOT_POLLING_TIME ? SLEEPSLOT_POLLING_TIME : waiting);
+
+                 // Right, lets sleep in slices of 100 ms
+                 SleepMs(sleepSlot);
+@@ -945,11 +944,11 @@ namespace WPEFramework {
+                 // Make sure we aren't in the monitor thread waiting for close completion.
+                 ASSERT(Core::Thread::ThreadId() != ResourceMonitor::Instance().Id());
+
+-                uint32_t sleepSlot = (waiting > SLEEPSLOT_TIME ? SLEEPSLOT_TIME : waiting);
++                uint32_t sleepSlot = (waiting > SLEEPSLOT_POLLING_TIME ? SLEEPSLOT_POLLING_TIME : waiting);
+
+                 m_syncAdmin.Unlock();
+
+-                // Right, lets sleep in slices of <= SLEEPSLOT_TIME ms
++                // Right, lets sleep in slices of <= SLEEPSLOT_POLLING_TIME ms
+                 SleepMs(sleepSlot);
+
+                 m_syncAdmin.Lock();
+diff --git a/Source/websocket/WebSocketLink.h b/Source/websocket/WebSocketLink.h
+index 581e822c..a6bd5bdf 100644
+--- a/Source/websocket/WebSocketLink.h
++++ b/Source/websocket/WebSocketLink.h
+@@ -1022,9 +1022,34 @@ POP_WARNING()
+         {
+             return (_channel.AbortUpgrade(status, reason));
+         }
++        uint32_t WaitForLink(const uint32_t time) const
++        {
++            // Make sure the state does not change in the mean time.
++            Lock();
++
++            uint32_t waiting = (time == Core::infinite ? Core::infinite : time); // Expect time in MS.
++
++            // Right, a wait till connection is closed is requested..
++            while ((waiting > 0) && (IsWebSocket() == false)) {
++                uint32_t sleepSlot = (waiting > SLEEPSLOT_POLLING_TIME ? SLEEPSLOT_POLLING_TIME : waiting);
++
++                Unlock();
++                // Right, lets sleep in slices of 100 ms
++                SleepMs(sleepSlot);
++                Lock();
++
++                waiting -= (waiting == Core::infinite ? 0 : sleepSlot);
++            }
++
++            uint32_t result = (((time == 0) || (IsWebSocket() == true)) ? Core::ERROR_NONE : Core::ERROR_TIMEDOUT);
++            Unlock();
++            return (result);
++        }
+         uint32_t Open(const uint32_t waitTime)
+         {
+-            return (_channel.Open(waitTime));
++            _channel.Open(0);
++
++            return WaitForLink(waitTime);
+         }
+         uint32_t Close(const uint32_t waitTime)
+         {
+
diff --git a/recipes-extended/wpe-framework/wpeframework/r4/R4.3.2_Wait_for_Open_in_Communication_Channel.patch b/recipes-extended/wpe-framework/wpeframework/r4/R4.3.2_Wait_for_Open_in_Communication_Channel.patch
index 1f8c431..a4a42d9 100644
--- a/recipes-extended/wpe-framework/wpeframework/r4/R4.3.2_Wait_for_Open_in_Communication_Channel.patch
+++ b/recipes-extended/wpe-framework/wpeframework/r4/R4.3.2_Wait_for_Open_in_Communication_Channel.patch
@@ -7,7 +7,7 @@
  				uint32_t Initialize()
  				{
 -					return (Open(0));
-+					return (Open(1000));
++					return (Open(2000));
  				}
  				void Deinitialize()
  				{
diff --git a/recipes-extended/wpe-framework/wpeframework/r4/RDKTV-24021.patch b/recipes-extended/wpe-framework/wpeframework/r4/RDKTV-24021.patch
new file mode 100644
index 0000000..e966d83
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework/r4/RDKTV-24021.patch
@@ -0,0 +1,138 @@
+diff --git a/Source/core/CyclicBuffer.h b/Source/core/CyclicBuffer.h
+index 746ef6a8..bd0a9ae4 100644
+--- a/Source/core/CyclicBuffer.h
++++ b/Source/core/CyclicBuffer.h
+@@ -140,6 +140,11 @@ namespace Core {
+         }
+ 
+     public:
++        inline void Destroy()
++        {
++            _administration = nullptr;
++            _buffer.Destroy();
++        }
+         inline void Flush()
+         {
+             std::atomic_store_explicit(&(_administration->_tail), (std::atomic_load(&(_administration->_head))), std::memory_order_relaxed);
+diff --git a/Source/core/DataElementFile.cpp b/Source/core/DataElementFile.cpp
+index f40332eb..93fe74e6 100644
+--- a/Source/core/DataElementFile.cpp
++++ b/Source/core/DataElementFile.cpp
+@@ -122,12 +122,12 @@ namespace Core {
+         }
+     }
+ 
+-    /* virtual */ DataElementFile::~DataElementFile()
++    void DataElementFile:Close()
+     {
+         if ((IsValid()) && (m_MemoryMappedFile != INVALID_HANDLE_VALUE)) {
+             DWORD flags = ((m_Flags & File::USER_READ) != 0 ? FILE_MAP_READ : 0) | ((m_Flags & File::USER_WRITE) != 0 ? FILE_MAP_WRITE : 0);
+             // Set the last size...
+-            ::MapViewOfFile(m_MemoryMappedFile, flags, 0, 0, static_cast<SIZE_T>(AllocatedSize()));
++            ::UnmapViewOfFile(Buffer());
+             ::CloseHandle(m_MemoryMappedFile);
+ 
+             m_MemoryMappedFile = INVALID_HANDLE_VALUE;
+@@ -220,7 +220,7 @@ namespace Core {
+         OpenMemoryMappedFile(m_File.Size());
+     }
+ 
+-    /* virtual */ DataElementFile::~DataElementFile()
++    void DataElementFile::Close()
+     {
+         if ((IsValid()) && (m_MemoryMappedFile != INVALID_HANDLE_VALUE)) {
+ 
+diff --git a/Source/core/DataElementFile.h b/Source/core/DataElementFile.h
+index 279ed5aa..003f256b 100644
+--- a/Source/core/DataElementFile.h
++++ b/Source/core/DataElementFile.h
+@@ -48,7 +48,9 @@ namespace Core {
+         DataElementFile(File& fileName, const uint32_t type);
+         DataElementFile(const string& fileName, const uint32_t mode, const uint32_t requiredSize = 0);
+         DataElementFile(const DataElementFile&);
+-        ~DataElementFile() override;
++        ~DataElementFile() override {
++            Close();
++        }
+ 
+     public:
+         inline const string& Name() const
+@@ -83,10 +85,21 @@ namespace Core {
+         {
+             return (m_File.Permission(mode));
+         }
++        bool Destroy()
++        {
++            bool closed = IsValid();
++
++            if (closed == true) {
++                Close();
++                closed = m_File.Destroy();
++            }
++            return (closed);
++        }
+         bool Load();
+         void Sync();
+ 
+     protected:
++        void Close();
+         virtual void Reallocation(const uint64_t size);
+ 
+         void ReopenMemoryMappedFile();
+diff --git a/Source/messaging/MessageDispatcher.h b/Source/messaging/MessageDispatcher.h
+index 19ff0523..5969a0e0 100644
+--- a/Source/messaging/MessageDispatcher.h
++++ b/Source/messaging/MessageDispatcher.h
+@@ -144,6 +144,9 @@ namespace Messaging {
+         }
+         ~MessageDataBufferType() {
+             _dataBuffer.Relinquish();
++            _dataLock.Lock();
++            _dataBuffer.Destroy();
++            _dataLock.Unlock();
+         }
+ 
+         /**
+@@ -165,17 +168,19 @@ namespace Messaging {
+ 
+             _dataLock.Lock();
+ 
+-            const uint16_t reservedLength = _dataBuffer.Reserve(fullLength);
++            if (_dataBuffer.IsValid() == true) {
++                const uint16_t reservedLength = _dataBuffer.Reserve(fullLength);
+ 
+-            if (reservedLength >= fullLength) {
+-                //no need to serialize because we can write to CyclicBuffer step by step
+-                _dataBuffer.Write(reinterpret_cast<const uint8_t*>(&fullLength), sizeof(fullLength)); //fullLength
+-                _dataBuffer.Write(value, length); //value
+-                _dataBuffer.Ring();
+-                result = Core::ERROR_NONE;
+-            } else {
+-                TRACE_L1("Buffer to small to fit message!");
+-            }
++                if (reservedLength >= fullLength) {
++                    //no need to serialize because we can write to CyclicBuffer step by step
++                    _dataBuffer.Write(reinterpret_cast<const uint8_t*>(&fullLength), sizeof(fullLength)); //fullLength
++                    _dataBuffer.Write(value, length); //value
++                    _dataBuffer.Ring();
++                    result = Core::ERROR_NONE;
++                } else {
++                    TRACE_L1("Buffer to small to fit message!");
++                }
++             }
+ 
+             _dataLock.Unlock();
+ 
+@@ -230,7 +235,11 @@ namespace Messaging {
+         }
+         void FlushDataBuffer()
+         {
+-            _dataBuffer.Flush();
++            _dataLock.Lock();
++            if (_dataBuffer.IsValid() == true) {
++                _dataBuffer.Flush();
++            }
++            _dataLock.Unlock();
+         }
+         bool IsValid() const
+         {
diff --git a/recipes-extended/wpe-framework/wpeframework/r4/linking_messaging_library.patch b/recipes-extended/wpe-framework/wpeframework/r4/linking_messaging_library.patch
new file mode 100644
index 0000000..6903f41
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework/r4/linking_messaging_library.patch
@@ -0,0 +1,40 @@
+Index: git/Source/CMakeLists.txt
+===================================================================
+--- git.orig/Source/CMakeLists.txt
++++ git/Source/CMakeLists.txt
+@@ -100,10 +100,6 @@ if(CRYPTALGO)
+     add_subdirectory(cryptalgo)
+ endif()
+ 
+-if(PROCESSCONTAINERS)
+-    add_subdirectory(processcontainers)
+-endif()
+-
+ if(WEBSOCKET)
+     add_subdirectory(websocket)
+ endif()
+@@ -120,6 +116,10 @@ if(WARNING_REPORTING)
+     add_subdirectory(warningreporting)
+ endif()
+ 
++if(PROCESSCONTAINERS)
++    add_subdirectory(processcontainers)
++endif()
++
+ if(PROFILER)
+     message(FATAL_ERROR "PROFILER option does not exist?")
+     set(PROFILER_INCLUDE_DIR "${ROOT}/Source/profiler")
+Index: git/Source/processcontainers/CMakeLists.txt
+===================================================================
+--- git.orig/Source/processcontainers/CMakeLists.txt
++++ git/Source/processcontainers/CMakeLists.txt
+@@ -61,6 +61,9 @@ set(PUBLIC_HEADERS
+ target_link_libraries(${TARGET}
+         PUBLIC
+         ${NAMESPACE}Core::${NAMESPACE}Core
++        ${NAMESPACE}Messaging::${NAMESPACE}Messaging
++        PRIVATE
++        CompileSettingsDebug::CompileSettingsDebug
+         )
+ 
+ set_target_properties(${TARGET} PROPERTIES
\ No newline at end of file
diff --git a/recipes-extended/wpe-framework/wpeframework/wpeframework-sd_notify.patch b/recipes-extended/wpe-framework/wpeframework/wpeframework-sd_notify.patch
new file mode 100644
index 0000000..3760b14
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework/wpeframework-sd_notify.patch
@@ -0,0 +1,42 @@
+diff --git a/Source/WPEFramework/CMakeLists.txt b/Source/WPEFramework/CMakeLists.txt
+index 431e617f..5b34b720 100644
+--- a/Source/WPEFramework/CMakeLists.txt
++++ b/Source/WPEFramework/CMakeLists.txt
+@@ -84,6 +84,15 @@ else()
+             )
+ endif ()
+ 
++find_package(Systemd)
++if (SYSTEMD_FOUND)
++    target_link_libraries( ${TARGET}
++            PRIVATE
++            Systemd::Systemd
++            )
++    SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -DSYSTEMD_FOUND")
++endif()
++
+ set_target_properties(${TARGET} PROPERTIES
+         CXX_STANDARD 11
+         CXX_STANDARD_REQUIRED YES
+diff --git a/Source/WPEFramework/Controller.cpp b/Source/WPEFramework/Controller.cpp
+index f36ae065..b16f4ff3 100644
+--- a/Source/WPEFramework/Controller.cpp
++++ b/Source/WPEFramework/Controller.cpp
+@@ -20,6 +20,8 @@
+ #include "Controller.h"
+ #include "SystemInfo.h"
+ 
++#include <systemd/sd-daemon.h>
++
+ namespace WPEFramework {
+ 
+     namespace {
+@@ -113,6 +115,8 @@ namespace Plugin {
+ 
+         _service->EnableWebServer(_T("UI"), EMPTY_STRING);
+ 
++        sd_notify(0, "READY=1");
++
+         // On succes return a name as a Callsign to be used in the URL, after the "service"prefix
+         return (_T(""));
+     }
diff --git a/recipes-extended/wpe-framework/wpeframework/wpeframework.service.in b/recipes-extended/wpe-framework/wpeframework/wpeframework.service.in
index f917e79..20bcaa1 100644
--- a/recipes-extended/wpe-framework/wpeframework/wpeframework.service.in
+++ b/recipes-extended/wpe-framework/wpeframework/wpeframework.service.in
@@ -1,7 +1,7 @@
 [Unit]
 Description=wpeframework
 Before=xre-receiver.service
-After=lighttpd.service iarmbusd.service pwrmgr.service pwrmgr2.service irmgr.service dsmgr.service sysmgr.service authservice.service @EXTRA_AFTER@
+After=local-fs.target @EXTRA_AFTER@
 
 [Service]
 PIDFile=/var/run/WPEFramework.pid
diff --git a/recipes-extended/wpe-framework/wpeframework_%.bbappend b/recipes-extended/wpe-framework/wpeframework_%.bbappend
new file mode 100644
index 0000000..c1c3630
--- /dev/null
+++ b/recipes-extended/wpe-framework/wpeframework_%.bbappend
@@ -0,0 +1,6 @@
+inherit syslog-ng-config-gen
+
+SYSLOG-NG_FILTER = "wpeframework"
+SYSLOG-NG_SERVICE_wpeframework = "wpeframework.service"
+SYSLOG-NG_DESTINATION_wpeframework = "wpeframework.log"
+SYSLOG-NG_LOGRATE_wpeframework = "high"
diff --git a/recipes-extended/wpe-framework/wpeframework_2.1.bb b/recipes-extended/wpe-framework/wpeframework_2.1.bb
index 67b35e1..8715690 100644
--- a/recipes-extended/wpe-framework/wpeframework_2.1.bb
+++ b/recipes-extended/wpe-framework/wpeframework_2.1.bb
@@ -12,7 +12,7 @@
 
 SRC_URI = "git://github.com/rdkcentral/Thunder.git;protocol=git;branch=R2;name=thunder"
 
-# Sep 29, 2022, 82d4791478934292f7260fef233b9743fa34d88e
+# Jun 30, 2023
 SRCREV_thunder = "${THUNDER_RELEASE_TAG_NAME}"
 
 SRC_URI += "file://r2/0003-OCDM-increase-RPC-comm-timeout.patch \
@@ -27,13 +27,9 @@
            file://r2/0001-Support-negative-numbers-with-write_config.patch \
            file://r2/LLAMA-2254_fix_netlink_buffer_size_error.patch \
            file://r2/0001-RDKTV-15393-clock_gettime.patch \
-           file://r2/0005-DELIA-58939-Webprocess-crash.patch \
-           file://r2/0001-Thunder_json_quoted_string_parsing_fix.patch \
-           file://r2/0001-SERVICES-Starting-multiples-services-concurrently-mi.patch \
            file://r2/0001-DEADLOCK-Deadlock-prevention-by-locking-the-ServiceA.patch \
            file://r2/0001-DEADLOCK-Next-to-closing-the-deadlock-on-the-open-of.patch \
            file://r2/to_add_protocols_pkgconfig_sdk.patch \
-           file://r2/0001-Merge-pull-request-705-from-Karthick-Somasundaresan-.patch \
            file://r2/0006-Increase-buffer-size-of-COMRPC-messages.patch \
            file://r2/0007-Make-size-type-of-Core-Frame-Text-configurable.patch \
            file://r2/0008-Fix-calculation-of-handled-size.patch \
@@ -57,6 +53,9 @@
 
 PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'DOBBY_CONTAINERS','processcontainers processcontainers_dobby', '',d)}"
 
+PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'thunder_startup_services', 'com pluginactivator', '', d)}"
+PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'wpeframework_systemd_notify', 'sdnotify', '', d)}"
+
 # Buildtype
 # Maybe we need to couple this to a Yocto feature
 PACKAGECONFIG[debug]          = "-DBUILD_TYPE=Debug,,"
@@ -81,6 +80,13 @@
 PACKAGECONFIG[webkitbrowser]   = "-DPLUGIN_WEBKITBROWSER=ON,,"
 PACKAGECONFIG[websocket]       = "-DWEBSOCKET=ON,,"
 
+PACKAGECONFIG[com] = "-DCOM=ON,,,"
+PACKAGECONFIG[pluginactivator] = "-DBUILD_PLUGIN_ACTIVATOR=ON,,,"
+PACKAGECONFIG[sdnotify] = ",,systemd,"
+
+SRC_URI += "${@bb.utils.contains('PACKAGECONFIG', 'pluginactivator', 'file://0001-RDKTV-15347-Add-PluginActivator-utility-for-systemd-.patch', '', d)}"
+SRC_URI += "${@bb.utils.contains('PACKAGECONFIG', 'sdnotify', 'file://wpeframework-sd_notify.patch ', '', d)}"
+
 # FIXME, determine this a little smarter
 # Provision event is required for libprovision and provision plugin
 # Location event is required for locationsync plugin
@@ -138,6 +144,12 @@
     install -m 0644 ${WORKDIR}/WPEFramework.env ${D}${sysconfdir}/wpeframework
 }
 
+do_install_append() {
+    if [ "${@bb.utils.contains('PACKAGECONFIG', 'sdnotify', 'true', 'false', d)}" = "true" ]; then
+        sed -i -e 's/\[Service\]/\[Service\]\nType=notify/' ${D}${systemd_system_unitdir}/wpeframework.service
+    fi
+}
+
 SYSTEMD_SERVICE_${PN} = "wpeframework.service"
 
 # ----------------------------------------------------------------------------
diff --git a/recipes-extended/wpe-framework/wpeframework_4.2.bb b/recipes-extended/wpe-framework/wpeframework_4.2.bb
index 30d20ee..8ad42f8 100644
--- a/recipes-extended/wpe-framework/wpeframework_4.2.bb
+++ b/recipes-extended/wpe-framework/wpeframework_4.2.bb
@@ -35,6 +35,10 @@
             file://r4/wpeframework_added_optimization_flag_improvement.patch \
             file://r4/DELIA-56519_wpeframework_fix_R4.patch \
             file://r4/R4.3.2_Wait_for_Open_in_Communication_Channel.patch \
+            file://r4/RDKTV-24021.patch \
+            file://r4/ONEM-31782_R4.patch \
+            file://r4/linking_messaging_library.patch \
+            file://r4/Enable_Thunder_Logging_R4.patch \
             "
 
 inherit systemd update-rc.d pythonnative
@@ -55,6 +59,9 @@
 
 PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'DOBBY_CONTAINERS','processcontainers processcontainers_dobby', '',d)}"
 
+PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'thunder_startup_services', 'com pluginactivator', '', d)}"
+PACKAGECONFIG_append = " ${@bb.utils.contains('DISTRO_FEATURES', 'wpeframework_systemd_notify', 'sdnotify', '', d)}"
+
 # Buildtype
 # Maybe we need to couple this to a Yocto feature
 PACKAGECONFIG[debug]          = "-DCMAKE_BUILD_TYPE=Debug,,"
@@ -79,6 +86,12 @@
 PACKAGECONFIG[webkitbrowser]   = "-DPLUGIN_WEBKITBROWSER=ON,,"
 PACKAGECONFIG[websocket]       = "-DWEBSOCKET=ON,,"
 
+PACKAGECONFIG[com] = "-DCOM=ON,,,"
+PACKAGECONFIG[pluginactivator] = "-DBUILD_PLUGIN_ACTIVATOR=ON,,,"
+PACKAGECONFIG[sdnotify] = ",,systemd,"
+
+SRC_URI += "${@bb.utils.contains('PACKAGECONFIG', 'sdnotify', 'file://wpeframework-sd_notify.patch ', '', d)}"
+
 # FIXME, determine this a little smarter
 # Provision event is required for libprovision and provision plugin
 # Location event is required for locationsync plugin
@@ -110,14 +123,14 @@
     -DPYTHON_EXECUTABLE=${STAGING_BINDIR_NATIVE}/python3-native/python3 \
     -DIDLE_TIME=${WPEFRAMEWORK_IDLE_TIME} \
     -DTHREADPOOL_COUNT=${WPEFRAMEWORK_THREADPOOL_COUNT} \
-    -DEXCEPTION_CATCHING=ON \
-    -DWARNING_REPORTING=ON \
     -DHIDE_NON_EXTERNAL_SYMBOLS=OFF \
     -DEXIT_REASONS=${WPEFRAMEWORK_EXIT_REASONS} \
     -DMESSAGING=ON \
     -DUMASK=001 \
 "
 
+EXTRA_OECMAKE += " -DLEGACY_CONFIG_GENERATOR=OFF"
+
 do_install_append() {
     if ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "true", "false", d)}
     then
@@ -140,6 +153,12 @@
     install -m 0644 ${WORKDIR}/WPEFramework.env ${D}${sysconfdir}/wpeframework
 }
 
+do_install_append() {
+    if [ "${@bb.utils.contains('PACKAGECONFIG', 'sdnotify', 'true', 'false', d)}" = "true" ]; then
+        sed -i -e 's/\[Service\]/\[Service\]\nType=notify/' ${D}${systemd_system_unitdir}/wpeframework.service
+    fi
+}
+
 SYSTEMD_SERVICE_${PN} = "wpeframework.service"
 
 # ----------------------------------------------------------------------------