diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java
index 03d1873..4aa983c 100644
--- a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java
+++ b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java
@@ -27,7 +27,11 @@
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
 
-    initJni();
+    boolean ret = initJni();
+    if (!ret) {
+      Log.e(TAG, "Failed to initialize Matter TV casting library");
+      return;
+    }
 
     Fragment fragment = CommissionerDiscoveryFragment.newInstance(tvCastingApp);
     getSupportFragmentManager()
@@ -71,7 +75,7 @@
    * AndroidChipPlatform to prepare platform, then start ChipAppServer, then call init on
    * TvCastingApp
    */
-  private void initJni() {
+  private boolean initJni() {
     tvCastingApp = new TvCastingApp();
 
     Context applicationContext = this.getApplicationContext();
@@ -84,7 +88,7 @@
     appParameters.setDacProvider(new DACProviderStub());
     appParameters.setSetupPasscode(GlobalCastingConstants.SetupPasscode);
     appParameters.setDiscriminator(GlobalCastingConstants.Discriminator);
-    tvCastingApp.initApp(applicationContext, appParameters);
+    return tvCastingApp.initApp(applicationContext, appParameters);
   }
 
   private void showFragment(Fragment fragment, boolean showOnBack) {
diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/TvCastingApp.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/TvCastingApp.java
index c34bb12..68b98fc 100644
--- a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/TvCastingApp.java
+++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/TvCastingApp.java
@@ -65,15 +65,32 @@
             new ChipMdnsCallbackImpl(),
             new DiagnosticDataProviderImpl(applicationContext));
 
-    chipPlatform.updateCommissionableDataProviderData(
-        appParameters.getSpake2pVerifierBase64(),
-        appParameters.getSpake2pSaltBase64(),
-        appParameters.getSpake2pIterationCount(),
-        appParameters.getSetupPasscode(),
-        appParameters.getDiscriminator());
+    boolean ret =
+        chipPlatform.updateCommissionableDataProviderData(
+            appParameters.getSpake2pVerifierBase64(),
+            appParameters.getSpake2pSaltBase64(),
+            appParameters.getSpake2pIterationCount(),
+            appParameters.getSetupPasscode(),
+            appParameters.getDiscriminator());
+    if (!ret) {
+      Log.e(
+          TAG,
+          "TvCastingApp.initApp failed to updateCommissionableDataProviderData on chipPlatform");
+      return ret;
+    }
+
+    ret = preInitJni(appParameters);
+    if (!ret) {
+      Log.e(TAG, "TvCastingApp.initApp failed in preInitJni");
+      return ret;
+    }
 
     chipAppServer = new ChipAppServer();
-    chipAppServer.startApp();
+    ret = chipAppServer.startApp();
+    if (!ret) {
+      Log.e(TAG, "TvCastingApp.initApp failed in start chipAppServer");
+      return ret;
+    }
 
     setDACProvider(appParameters.getDacProvider());
     return initJni(appParameters);
@@ -81,6 +98,8 @@
 
   private native void setDACProvider(DACProvider provider);
 
+  private native boolean preInitJni(AppParameters appParameters);
+
   private native boolean initJni(AppParameters appParameters);
 
   public void discoverVideoPlayerCommissioners(
diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp
index d702764..bb50207 100644
--- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp
+++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/TvCastingApp-JNI.cpp
@@ -52,6 +52,32 @@
     return AndroidAppServerJNI_OnUnload(jvm, reserved);
 }
 
+JNI_METHOD(jboolean, preInitJni)(JNIEnv *, jobject, jobject jAppParameters)
+{
+    chip::DeviceLayer::StackLock lock;
+    ChipLogProgress(AppServer, "JNI_METHOD preInitJni called");
+
+    CHIP_ERROR err = CHIP_NO_ERROR;
+    if (jAppParameters == nullptr)
+    {
+        err = CastingServer::GetInstance()->PreInit();
+    }
+    else
+    {
+        AppParams appParams;
+        err = convertJAppParametersToCppAppParams(jAppParameters, appParams);
+        VerifyOrExit(err == CHIP_NO_ERROR,
+                     ChipLogError(AppServer, "Conversion of AppParameters from jobject to Cpp type failed: %" CHIP_ERROR_FORMAT,
+                                  err.Format()));
+        err = CastingServer::GetInstance()->PreInit(&appParams);
+    }
+    VerifyOrExit(
+        err == CHIP_NO_ERROR,
+        ChipLogError(AppServer, "Call to CastingServer::GetInstance()->PreInit() failed: %" CHIP_ERROR_FORMAT, err.Format()));
+exit:
+    return (err == CHIP_NO_ERROR);
+}
+
 JNI_METHOD(jboolean, initJni)(JNIEnv *, jobject, jobject jAppParameters)
 {
     chip::DeviceLayer::StackLock lock;
@@ -74,12 +100,7 @@
     VerifyOrExit(err == CHIP_NO_ERROR,
                  ChipLogError(AppServer, "Call to CastingServer::GetInstance()->Init() failed: %" CHIP_ERROR_FORMAT, err.Format()));
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(void, setDACProvider)(JNIEnv *, jobject, jobject provider)
@@ -123,12 +144,7 @@
                  ChipLogError(AppServer, "CastingServer::OpenBasicCommissioningWindow failed: %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jobject, readCachedVideoPlayers)(JNIEnv * env, jobject)
@@ -196,12 +212,7 @@
                  ChipLogError(AppServer, "CastingServer::OpenBasicCommissioningWindow failed: %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(void, shutdownAllSubscriptions)(JNIEnv * env, jobject)
@@ -321,12 +332,7 @@
     env->ReleaseStringUTFChars(contentDisplayStr, nativeContentDisplayStr);
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 CHIP_ERROR CreateParameter(JNIEnv * env, jobject jParameter,
@@ -429,12 +435,7 @@
     env->ReleaseStringUTFChars(jData, nativeData);
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, contentLauncher_1subscribeToSupportedStreamingProtocols)
@@ -486,12 +487,7 @@
                               err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, levelControl_1step)
@@ -520,12 +516,7 @@
                  ChipLogError(AppServer, "CastingServer.LevelControl_Step failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, levelControl_1moveToLevel)
@@ -554,12 +545,7 @@
                  ChipLogError(AppServer, "CastingServer.LevelControl_MoveToLevel failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, levelControl_1subscribeToCurrentLevel)
@@ -605,12 +591,7 @@
         ChipLogError(AppServer, "CastingServer.LevelControl_SubscribeToCurrentLevel failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, levelControl_1subscribeToMinLevel)
@@ -654,12 +635,7 @@
         ChipLogError(AppServer, "CastingServer.LevelControl_SubscribeToMinLevel failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, levelControl_1subscribeToMaxLevel)
@@ -703,12 +679,7 @@
         ChipLogError(AppServer, "CastingServer.LevelControl_SubscribeToMaxLevel failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, onOff_1on)
@@ -733,12 +704,7 @@
     VerifyOrExit(CHIP_NO_ERROR == err, ChipLogError(AppServer, "CastingServer.OnOff_On failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, onOff_1off)
@@ -763,12 +729,7 @@
     VerifyOrExit(CHIP_NO_ERROR == err, ChipLogError(AppServer, "CastingServer.OnOff_Off failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, onOff_1toggle)
@@ -794,12 +755,7 @@
                  ChipLogError(AppServer, "CastingServer.OnOff_Toggle failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1play)
@@ -825,12 +781,7 @@
                  ChipLogError(AppServer, "CastingServer.MediaPlayback_Play failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1pause)
@@ -856,12 +807,7 @@
                  ChipLogError(AppServer, "CastingServer.MediaPlayback_Pause failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1stopPlayback)
@@ -888,12 +834,7 @@
                  ChipLogError(AppServer, "CastingServer.MediaPlayback_StopPlayback failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1next)
@@ -919,12 +860,7 @@
                  ChipLogError(AppServer, "CastingServer.MediaPlayback_Next failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1seek)
@@ -951,12 +887,7 @@
                  ChipLogError(AppServer, "CastingServer.MediaPlayback_Seek failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1skipForward)
@@ -983,12 +914,7 @@
                  ChipLogError(AppServer, "CastingServer.MediaPlayback_SkipForward failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1skipBackward)
@@ -1015,12 +941,7 @@
                  ChipLogError(AppServer, "CastingServer.MediaPlayback_SkipBackward failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1subscribeToCurrentState)
@@ -1066,12 +987,7 @@
         ChipLogError(AppServer, "CastingServer.MediaPlayback_SubscribeToCurrentState failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1subscribeToDuration)
@@ -1116,12 +1032,7 @@
         ChipLogError(AppServer, "CastingServer.mediaPlayback_subscribeToDuration failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1subscribeToSampledPosition)
@@ -1168,12 +1079,7 @@
         ChipLogError(AppServer, "CastingServer.mediaPlayback_subscribeToSampledPosition failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1subscribeToPlaybackSpeed)
@@ -1219,12 +1125,7 @@
         ChipLogError(AppServer, "CastingServer.mediaPlayback_subscribeToPlaybackSpeed failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1subscribeToSeekRangeEnd)
@@ -1270,12 +1171,7 @@
         ChipLogError(AppServer, "CastingServer.mediaPlayback_subscribeToSeekRangeEnd failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, mediaPlayback_1subscribeToSeekRangeStart)
@@ -1322,12 +1218,7 @@
         ChipLogError(AppServer, "CastingServer.mediaPlayback_subscribeToSeekRangeStart failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationLauncher_1launchApp)
@@ -1362,12 +1253,7 @@
 
     env->ReleaseStringUTFChars(applicationId, nativeApplicationId);
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationLauncher_1stopApp)
@@ -1400,12 +1286,7 @@
 
     env->ReleaseStringUTFChars(applicationId, nativeApplicationId);
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationLauncher_1hideApp)
@@ -1438,12 +1319,7 @@
 
     env->ReleaseStringUTFChars(applicationId, nativeApplicationId);
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, targetNavigator_1navigateTarget)
@@ -1477,12 +1353,7 @@
         env->ReleaseStringUTFChars(data, nativeData);
     }
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, targetNavigator_1subscribeToCurrentTarget)
@@ -1529,12 +1400,7 @@
         ChipLogError(AppServer, "CastingServer.targetNavigator_subscribeToCurrentTarget failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, targetNavigator_1subscribeToTargetList)
@@ -1580,12 +1446,7 @@
         ChipLogError(AppServer, "CastingServer.targetNavigator_subscribeToTargetList failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, keypadInput_1sendKey)
@@ -1612,12 +1473,7 @@
                  ChipLogError(AppServer, "CastingServer.KeypadInput_SendKey failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 // APPLICATION BASIC
@@ -1664,12 +1520,7 @@
         ChipLogError(AppServer, "CastingServer.applicationBasic_subscribeToVendorName failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1subscribeToVendorID)
@@ -1715,12 +1566,7 @@
         ChipLogError(AppServer, "CastingServer.applicationBasic_subscribeToVendorID failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1subscribeToApplicationName)
@@ -1767,12 +1613,7 @@
                               err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1subscribeToProductID)
@@ -1818,12 +1659,7 @@
         ChipLogError(AppServer, "CastingServer.applicationBasic_subscribeToProductID failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1subscribeToApplicationVersion)
@@ -1873,12 +1709,7 @@
                               err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1readVendorName)
@@ -1915,12 +1746,7 @@
         ChipLogError(AppServer, "CastingServer.applicationBasic_1readVendorName failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1readVendorID)
@@ -1954,12 +1780,7 @@
                  ChipLogError(AppServer, "CastingServer.applicationBasic_ReadVendorID failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1readApplicationName)
@@ -1997,12 +1818,7 @@
         ChipLogError(AppServer, "CastingServer.applicationBasic_ReadApplicationName failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1readProductID)
@@ -2036,12 +1852,7 @@
                  ChipLogError(AppServer, "CastingServer.applicationBasic_ReadProductID failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
 
 JNI_METHOD(jboolean, applicationBasic_1readApplicationVersion)
@@ -2079,10 +1890,5 @@
         ChipLogError(AppServer, "CastingServer.applicationBasic_ReadApplicationVersion failed %" CHIP_ERROR_FORMAT, err.Format()));
 
 exit:
-    if (err != CHIP_NO_ERROR)
-    {
-        return false;
-    }
-
-    return true;
+    return (err == CHIP_NO_ERROR);
 }
diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h
index 2e1b980..1dc7e34 100644
--- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h
+++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.h
@@ -33,9 +33,9 @@
 
 + (CastingServerBridge * _Nullable)getSharedInstance;
 
-- (void)initApp:(AppParameters * _Nullable)appParameters
-             clientQueue:(dispatch_queue_t _Nonnull)clientQueue
-    initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler;
+- (MatterError * _Nonnull)initializeApp:(AppParameters * _Nullable)appParameters
+                            clientQueue:(dispatch_queue_t _Nonnull)clientQueue
+                   initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler;
 
 /*!
  @brief Browse for on-network commissioner TVs
diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm
index 6e64a99..c8cfd5f 100644
--- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm
+++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/CastingServerBridge.mm
@@ -108,9 +108,9 @@
     return self;
 }
 
-- (void)initApp:(AppParameters * _Nullable)appParameters
-             clientQueue:(dispatch_queue_t _Nonnull)clientQueue
-    initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler
+- (MatterError *)initializeApp:(AppParameters * _Nullable)appParameters
+                   clientQueue:(dispatch_queue_t _Nonnull)clientQueue
+          initAppStatusHandler:(nullable void (^)(bool))initAppStatusHandler
 {
     ChipLogProgress(AppServer, "CastingServerBridge().initApp() called");
 
@@ -128,7 +128,7 @@
         err = [ConversionUtils convertToCppAppParamsInfoFrom:_appParameters outAppParams:cppAppParams];
         if (err != CHIP_NO_ERROR) {
             ChipLogError(AppServer, "AppParameters conversion failed: %s", ErrorStr(err));
-            return;
+            return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
         }
 
         // set fields in commissionableDataProvider
@@ -156,7 +156,7 @@
             setupDiscriminator);
         if (err != CHIP_NO_ERROR) {
             ChipLogError(AppServer, "Failed to initialize CommissionableDataProvider: %s", ErrorStr(err));
-            return;
+            return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
         }
 
         if (_appParameters.deviceAttestationCredentials != nil) {
@@ -219,13 +219,24 @@
     err = _serverInitParams->InitializeStaticResourcesBeforeServerInit();
     if (err != CHIP_NO_ERROR) {
         ChipLogError(AppServer, "InitializeStaticResourcesBeforeServerInit failed: %s", ErrorStr(err));
-        return;
+        return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
+    }
+
+    AppParams appParam;
+    if (appParameters == nil) {
+        err = CastingServer::GetInstance()->PreInit();
+    } else if ((err = [ConversionUtils convertToCppAppParamsInfoFrom:appParameters outAppParams:appParam]) == CHIP_NO_ERROR) {
+        err = CastingServer::GetInstance()->PreInit(&appParam);
+    }
+    if (err != CHIP_NO_ERROR) {
+        ChipLogError(AppServer, "CastingServer PreInit failed: %s", ErrorStr(err));
+        return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
     }
 
     err = chip::Server::GetInstance().Init(*_serverInitParams);
     if (err != CHIP_NO_ERROR) {
         ChipLogError(AppServer, "chip::Server init failed: %s", ErrorStr(err));
-        return;
+        return [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]];
     }
 
     _chipWorkQueue = chip::DeviceLayer::PlatformMgrImpl().GetWorkQueue();
@@ -251,6 +262,9 @@
             initAppStatusHandler(initAppStatus);
         });
     });
+
+    return [[MatterError alloc] initWithCode:CHIP_NO_ERROR.AsInteger()
+                                     message:[NSString stringWithUTF8String:CHIP_NO_ERROR.AsString()]];
 }
 
 - (void)discoverCommissioners:(dispatch_queue_t _Nonnull)clientQueue
@@ -527,6 +541,17 @@
             return;
         }
 
+        // Initialize binding handlers
+        err = CastingServer::GetInstance()->InitBindingHandlers();
+        if (err != CHIP_NO_ERROR) {
+            ChipLogError(AppServer, "Binding init failed: %s", ErrorStr(err));
+            dispatch_async(clientQueue, ^{
+                startMatterServerCompletionCallback(
+                    [[MatterError alloc] initWithCode:err.AsInteger() message:[NSString stringWithUTF8String:err.AsString()]]);
+            });
+            return;
+        }
+
         // Now reconnect to the VideoPlayer the casting app was previously connected to (if any)
         if (self->_previouslyConnectedVideoPlayer != nil) {
             ChipLogProgress(
diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/TvCastingApp.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/TvCastingApp.swift
index 73c4eb1..f0d67ca 100644
--- a/examples/tv-casting-app/darwin/TvCasting/TvCasting/TvCastingApp.swift
+++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/TvCastingApp.swift
@@ -46,9 +46,10 @@
                         
                         appParameters.onboardingPayload = onboardingParameters
                         
-                        castingServerBridge.initApp(appParameters, clientQueue: DispatchQueue.main, initAppStatusHandler: { (result: Bool) -> () in
-                            self.Log.info("initApp result \(result)")
+                        let err = castingServerBridge.initializeApp(appParameters, clientQueue: DispatchQueue.main, initAppStatusHandler: { (result: Bool) -> () in
+                            self.Log.info("initializeApp result \(result)")
                         })
+                        self.Log.info("initializeApp return value \(err)")
                     }
                 })
                 .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { _ in
diff --git a/examples/tv-casting-app/linux/main.cpp b/examples/tv-casting-app/linux/main.cpp
index d6d674e..7558425 100644
--- a/examples/tv-casting-app/linux/main.cpp
+++ b/examples/tv-casting-app/linux/main.cpp
@@ -134,6 +134,8 @@
         SetDeviceAttestationVerifier(GetDefaultDACVerifier(testingRootStore));
     }
 
+    SuccessOrExit(err = CastingServer::GetInstance()->PreInit());
+
     // Enter commissioning mode, open commissioning window
     static chip::CommonCaseDeviceServerInitParams initParams;
     VerifyOrDie(CHIP_NO_ERROR == initParams.InitializeStaticResourcesBeforeServerInit());
diff --git a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h
index fc0c495..ad12467 100644
--- a/examples/tv-casting-app/tv-casting-common/include/CastingServer.h
+++ b/examples/tv-casting-app/tv-casting-common/include/CastingServer.h
@@ -53,7 +53,9 @@
     void operator=(const CastingServer &) = delete;
     static CastingServer * GetInstance();
 
+    CHIP_ERROR PreInit(AppParams * AppParams = nullptr);
     CHIP_ERROR Init(AppParams * AppParams = nullptr);
+    CHIP_ERROR InitBindingHandlers();
 
     CHIP_ERROR DiscoverCommissioners();
     const chip::Dnssd::DiscoveredNodeData *
@@ -418,7 +420,8 @@
     static CastingServer * castingServer_;
     CastingServer();
 
-    CHIP_ERROR InitBindingHandlers();
+    CHIP_ERROR SetRotatingDeviceIdUniqueId(chip::Optional<chip::ByteSpan> rotatingDeviceIdUniqueId);
+
     static void DeviceEventCallback(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
     void ReadServerClusters(chip::EndpointId endpointId);
 
diff --git a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp
index 786a62b..adba7ff 100644
--- a/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp
+++ b/examples/tv-casting-app/tv-casting-common/src/CastingServer.cpp
@@ -36,6 +36,15 @@
     return castingServer_;
 }
 
+CHIP_ERROR CastingServer::PreInit(AppParams * appParams)
+{
+#if CHIP_ENABLE_ROTATING_DEVICE_ID
+    return SetRotatingDeviceIdUniqueId(appParams != nullptr ? appParams->GetRotatingDeviceIdUniqueId() : chip::NullOptional);
+#else
+    return CHIP_ERROR_NOT_IMPLEMENTED;
+#endif // CHIP_ENABLE_ROTATING_DEVICE_ID
+}
+
 CHIP_ERROR CastingServer::Init(AppParams * AppParams)
 {
     if (mInited)
@@ -43,29 +52,6 @@
         return CHIP_NO_ERROR;
     }
 
-#if CHIP_ENABLE_ROTATING_DEVICE_ID
-    // if this class's client provided a RotatingDeviceIdUniqueId, use that
-    if (AppParams != nullptr && AppParams->GetRotatingDeviceIdUniqueId().HasValue())
-    {
-        ByteSpan rotatingDeviceIdUniqueId(AppParams->GetRotatingDeviceIdUniqueId().Value());
-        chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(rotatingDeviceIdUniqueId);
-    }
-#ifdef CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID
-    else
-    {
-        // otherwise, generate and set a random uniqueId for generating rotatingId
-        uint8_t rotatingDeviceIdUniqueId[chip::DeviceLayer::ConfigurationManager::kRotatingDeviceIDUniqueIDLength];
-        for (size_t i = 0; i < sizeof(rotatingDeviceIdUniqueId); i++)
-        {
-            rotatingDeviceIdUniqueId[i] = chip::Crypto::GetRandU8();
-        }
-
-        // ByteSpan rotatingDeviceIdUniqueIdSpan(rotatingDeviceIdUniqueId);
-        chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(ByteSpan(rotatingDeviceIdUniqueId));
-    }
-#endif // CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID
-#endif // CHIP_ENABLE_ROTATING_DEVICE_ID
-
     // Initialize binding handlers
     ReturnErrorOnFailure(InitBindingHandlers());
 
@@ -76,6 +62,33 @@
     return CHIP_NO_ERROR;
 }
 
+CHIP_ERROR CastingServer::SetRotatingDeviceIdUniqueId(chip::Optional<chip::ByteSpan> rotatingDeviceIdUniqueIdOptional)
+{
+#if CHIP_ENABLE_ROTATING_DEVICE_ID
+    // if this class's client provided a RotatingDeviceIdUniqueId, use that
+    if (rotatingDeviceIdUniqueIdOptional.HasValue())
+    {
+        ChipLogProgress(AppServer, "Setting rotatingDeviceIdUniqueId received from client app");
+        return chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(rotatingDeviceIdUniqueIdOptional.Value());
+    }
+#ifdef CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID
+    else
+    {
+        // otherwise, generate and set a random uniqueId for generating rotatingId
+        ChipLogProgress(AppServer, "Setting random rotatingDeviceIdUniqueId");
+        uint8_t rotatingDeviceIdUniqueId[chip::DeviceLayer::ConfigurationManager::kRotatingDeviceIDUniqueIDLength];
+        for (size_t i = 0; i < sizeof(rotatingDeviceIdUniqueId); i++)
+        {
+            rotatingDeviceIdUniqueId[i] = chip::Crypto::GetRandU8();
+        }
+
+        return chip::DeviceLayer::ConfigurationMgr().SetRotatingDeviceIdUniqueId(ByteSpan(rotatingDeviceIdUniqueId));
+    }
+#endif // CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID
+#endif // CHIP_ENABLE_ROTATING_DEVICE_ID
+    return CHIP_NO_ERROR;
+}
+
 CHIP_ERROR CastingServer::InitBindingHandlers()
 {
     auto & server = chip::Server::GetInstance();
@@ -289,16 +302,17 @@
     mOnConnectionFailureClientCallback = onConnectionFailure;
     mOnNewOrUpdatedEndpoint            = onNewOrUpdatedEndpoint;
 
+    chip::OperationalDeviceProxy * prevDeviceProxy =
+        CastingServer::GetInstance()->mActiveTargetVideoPlayerInfo.GetOperationalDeviceProxy();
+    if (prevDeviceProxy != nullptr)
+    {
+        ChipLogProgress(AppServer, "CastingServer::VerifyOrEstablishConnection Disconnecting previous deviceProxy");
+        prevDeviceProxy->Disconnect();
+    }
+
     return targetVideoPlayerInfo.FindOrEstablishCASESession(
         [](TargetVideoPlayerInfo * videoPlayer) {
             ChipLogProgress(AppServer, "CastingServer::OnConnectionSuccess lambda called");
-            chip::OperationalDeviceProxy * prevDeviceProxy =
-                CastingServer::GetInstance()->mActiveTargetVideoPlayerInfo.GetOperationalDeviceProxy();
-            if (prevDeviceProxy != nullptr)
-            {
-                ChipLogProgress(AppServer, "CastingServer::OnConnectionSuccess lambda Disconnecting deviceProxy");
-                prevDeviceProxy->Disconnect();
-            }
             CastingServer::GetInstance()->mActiveTargetVideoPlayerInfo = *videoPlayer;
             CastingServer::GetInstance()->mOnConnectionSuccessClientCallback(videoPlayer);
         },
