diff --git a/src/log/logd/lgs_config.cc b/src/log/logd/lgs_config.cc
index 60804e835..81fa46b27 100644
--- a/src/log/logd/lgs_config.cc
+++ b/src/log/logd/lgs_config.cc
@@ -1810,18 +1810,20 @@ void conf_runtime_obj_handler(SaImmOiHandleT immOiHandle,
     } else {
       TRACE("%s: unknown attribute %s", __FUNCTION__, attributeName);
     }
+    // [Canh] I see that you remove lgsOiCreateBackground() here in case that BAD_HANDLE .
+    // So it means that in case BAD_HANDLE lgs is restarted. And lgsOiCreateBackground()
+    // is called in in update_runtime_attrValues() is not meaningful
+    // is there any confusion when you said in the email that the lgsOiCreateBackground()
+    // is removed from update_runtime_attrValues(), not in conf_runtime_obj_handler()
 
-    if (ais_rc == SA_AIS_ERR_BAD_HANDLE) {
-      LOG_WA("%s: immutil_update_one_rattr (%s) failed: %s", __FUNCTION__,
-             attributeName, saf_error(ais_rc));
-      lgsOiCreateBackground();
-      break;
-    } else if (ais_rc != SA_AIS_OK) {
+
+  if (ais_rc != SA_AIS_OK) {
       LOG_ER("%s: immutil_update_one_rattr (%s) failed: %s", __FUNCTION__,
              attributeName, saf_error(ais_rc));
       osaf_abort(0);
     }
   }
+
   TRACE_LEAVE();
 }
 
diff --git a/src/log/logd/lgs_imm.cc b/src/log/logd/lgs_imm.cc
index d23862172..40e5a6442 100644
--- a/src/log/logd/lgs_imm.cc
+++ b/src/log/logd/lgs_imm.cc
@@ -109,7 +109,10 @@ static void report_oi_error(SaImmOiHandleT immOiHandle, SaImmOiCcbIdT ccbId,
   va_end(ap);
 
   TRACE("%s", err_str);
-  (void)saImmOiCcbSetErrorString(immOiHandle, ccbId, err_str);
+  if (saImmOiCcbSetErrorString(immOiHandle, ccbId, err_str) ==
+      SA_AIS_ERR_BAD_HANDLE) {
+    lgsOiCreateBackground();
+  }
 }
 
 static void report_om_error(SaImmOiHandleT immOiHandle,
@@ -128,8 +131,11 @@ static void report_om_error(SaImmOiHandleT immOiHandle,
   va_end(ap);
 
   TRACE("%s", ao_err_string);
-  (void)saImmOiAdminOperationResult_o2(immOiHandle, invocation,
-                                       SA_AIS_ERR_INVALID_PARAM, ao_err_params);
+  if (saImmOiAdminOperationResult_o2(immOiHandle, invocation,
+                                     SA_AIS_ERR_INVALID_PARAM,
+                                     ao_err_params) == SA_AIS_ERR_BAD_HANDLE) {
+    lgsOiCreateBackground();
+  }
 }
 
 /**
@@ -400,6 +406,7 @@ static void adminOperationCallback(
     if (stream->isRtStream != SA_TRUE) {
       ais_rc = immutil_saImmOiAdminOperationResult(immOiHandle, invocation,
                                                    SA_AIS_ERR_NOT_SUPPORTED);
+      // TODO(Lennart) May be relevant to recover OI if BAD HANDLE
       if (ais_rc != SA_AIS_OK) {
         LOG_ER("immutil_saImmOiAdminOperationResult failed %s",
                saf_error(ais_rc));
@@ -439,6 +446,7 @@ static void adminOperationCallback(
     if (severityFilter == stream->severityFilter) {
       ais_rc = immutil_saImmOiAdminOperationResult(immOiHandle, invocation,
                                                    SA_AIS_ERR_NO_OP);
+      // TODO(Lennart) May be relevant to recover OI if BAD HANDLE
       if (ais_rc != SA_AIS_OK) {
         LOG_ER("immutil_saImmOiAdminOperationResult failed %s",
                saf_error(ais_rc));
@@ -456,13 +464,21 @@ static void adminOperationCallback(
         immOiHandle, objName,
         const_cast<SaImmAttrNameT>("saLogStreamSeverityFilter"),
         SA_IMM_ATTR_SAUINT32T, &stream->severityFilter);
+    // [Canh] Should also recover OI if BAD_HANDLE here?
+    // Should we create new function that does what immutil_update_one_rattr() does
+    // and does also recover OI if BAD_HANDLE ?
+    // and the below check add more if (ais_rc != SA_AIS_OK && ais_rc != BAD_HANDLE) ??
+
+    // immutil_update_one_rattr is called a lot and make new function to avoid repeating code
     if (ais_rc != SA_AIS_OK) {
-      LOG_ER("immutil_update_one_rattr failed %s", saf_error(ais_rc));
+      LOG_ER("%s: immutil_update_one_rattr failed %s", __FUNCTION__,
+             saf_error(ais_rc));
       osaf_abort(0);
     }
 
     ais_rc =
         immutil_saImmOiAdminOperationResult(immOiHandle, invocation, SA_AIS_OK);
+    // TODO(Lennart) May be relevant to recover OI if BAD HANDLE
     if (ais_rc != SA_AIS_OK) {
       LOG_ER("immutil_saImmOiAdminOperationResult failed %s",
              saf_error(ais_rc));
@@ -2369,8 +2385,10 @@ static SaAisErrorT stream_create_and_configure1(
       lgsGetOiHandle(), objectName.c_str(),
       const_cast<SaImmAttrNameT>("saLogStreamCreationTimestamp"),
       SA_IMM_ATTR_SATIMET, &(*stream)->creationTimeStamp);
+  // [Canh] Should also recover OI if BAD_HANDLE here?
   if (rc != SA_AIS_OK) {
-    LOG_ER("immutil_update_one_rattr failed %s", saf_error(rc));
+    LOG_ER("%s: immutil_update_one_rattr failed %s", __FUNCTION__,
+           saf_error(rc));
     osaf_abort(0);
   }
 
@@ -2710,6 +2728,7 @@ static SaAisErrorT rtAttrUpdateCallback(SaImmOiHandleT immOiHandle,
         rc = immutil_update_one_rattr(immOiHandle, objName, attributeName,
                                       SA_IMM_ATTR_SAUINT32T,
                                       &stream->numOpeners);
+        // [Canh] Should also recover OI if BAD_HANDLE here?
       } else if (!strcmp(attributeName, "logStreamDiscardedCounter")) {
         rc = immutil_update_one_rattr(immOiHandle, objName, attributeName,
                                       SA_IMM_ATTR_SAUINT64T, &stream->filtered);
@@ -3005,6 +3024,7 @@ SaAisErrorT lgs_imm_init_configStreams(lgs_cb_t *cb) {
         lgsGetOiHandle(), stream->name.c_str(),
         const_cast<SaImmAttrNameT>("saLogStreamCreationTimestamp"),
         SA_IMM_ATTR_SATIMET, &stream->creationTimeStamp);
+    // [Canh] Should also recover OI if BAD_HANDLE here?
     if (ais_rc != SA_AIS_OK) {
       LOG_ER("immutil_update_one_rattr failed %s", saf_error(ais_rc));
       osaf_abort(0);
diff --git a/src/log/logd/lgs_oi_admin.cc b/src/log/logd/lgs_oi_admin.cc
index ce1fc0ad3..3fe23b89b 100644
--- a/src/log/logd/lgs_oi_admin.cc
+++ b/src/log/logd/lgs_oi_admin.cc
@@ -351,6 +351,13 @@ static void createLogServerOi() {
     lgs_exit("createLogServerOi() failed", SA_AMF_COMPONENT_RESTART);
   }
 
+  // [Canh] from my previous comment in here, it may be incorrect
+  // We should not check if ais_rc == SA_AIS_OK here because in case "stop_oi_create"
+  // we also need updated om_handle and select_obj with new value. And in lgsOIStop(),
+  // it use this new value to call finalizeOi()
+
+  // With old om_handle_, it had already been finalized in lgsOiCreateBackground() before createing
+  // new thread
   if (ais_rc == SA_AIS_OK) {
     // Save OI handle and selection object
     // Note: In case of stop_oi_create this is handled in the stop function
