diff --git a/VERSION b/VERSION
index 9575d51..b727628 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.6.1
+3.6.2
diff --git a/agent/src/core_api_handler.cc b/agent/src/core_api_handler.cc
index e3821c4..6fb6ba2 100644
--- a/agent/src/core_api_handler.cc
+++ b/agent/src/core_api_handler.cc
@@ -2524,32 +2524,34 @@
         BCMOLT_MSG_FIELD_SET(&cfg, sla.priority, 0);
         BCMOLT_MSG_FIELD_SET(&cfg, onu_id, onu_id);
 
+        bcmolt_onu_state onu_state;
+        bool wait_for_alloc_cfg_cmplt = false;
+        err = get_onu_state((bcmolt_interface)intf_id, (bcmolt_onu_id)onu_id, &onu_state);
+        if (err) {
+            OPENOLT_LOG(ERROR, openolt_log_id, "Failed to fetch onu status, intf_id = %d, onu_id = %d, err = %s\n",
+                intf_id, onu_id, bcmos_strerror(err));
+            return err;
+        } else if (onu_state == BCMOLT_ONU_STATE_ACTIVE) {
+            wait_for_alloc_cfg_cmplt = true;
+        }
+
         err = bcmolt_cfg_set(dev_id, &cfg.hdr);
         if (err) {
             OPENOLT_LOG(ERROR, openolt_log_id, "Failed to create upstream bandwidth allocation, intf_id %d, onu_id %d, uni_id %d,\
 port_no %u, alloc_id %d, err = %s (%d)\n", intf_id, onu_id,uni_id,port_no,alloc_id, cfg.hdr.hdr.err_text, err);
             return err;
-        }
-        bcmolt_onu_state onu_state;
-        err = get_onu_state((bcmolt_interface)intf_id, (bcmolt_onu_id)onu_id, &onu_state);
-        if (err == BCM_ERR_OK) {
-            if (onu_state == BCMOLT_ONU_STATE_ACTIVE) {
-                err = wait_for_alloc_action(intf_id, alloc_id, ALLOC_OBJECT_CREATE);
-                if (err) {
-                    OPENOLT_LOG(ERROR, openolt_log_id, "Failed to create upstream bandwidth allocation, intf_id %d, onu_id %d, uni_id %d,\
+        } else if (wait_for_alloc_cfg_cmplt) {
+            err = wait_for_alloc_action(intf_id, alloc_id, ALLOC_OBJECT_CREATE);
+            if (err) {
+                OPENOLT_LOG(ERROR, openolt_log_id, "Failed to create upstream bandwidth allocation, intf_id %d, onu_id %d, uni_id %d,\
 port_no %u, alloc_id %d, err = %s\n", intf_id, onu_id,uni_id,port_no,alloc_id, bcmos_strerror(err));
-                    return err;
-                }
-            }
-            else {
-                OPENOLT_LOG(INFO, openolt_log_id, "onu not active, not waiting for alloc cfg complete, onu_state = %d, intf = %d, onu=%d\n",
-                    onu_state, intf_id, onu_id);
+                return err;
             }
         } else {
-            OPENOLT_LOG(ERROR, openolt_log_id, "Failed to fetch onu status, intf_id = %d, onu_id = %d, err = %s\n",
-                intf_id, onu_id, bcmos_strerror(err));
-            return err;
+            OPENOLT_LOG(INFO, openolt_log_id, "onu not active, not waiting for alloc cfg complete, onu_state = %d, intf = %d, onu=%d\n",
+                onu_state, intf_id, onu_id);
         }
+
         OPENOLT_LOG(INFO, openolt_log_id, "create upstream bandwidth allocation success, intf_id %d, onu_id %d, uni_id %d,\
 port_no %u, alloc_id %d\n", intf_id, onu_id,uni_id,port_no,alloc_id);
 
@@ -2612,35 +2614,33 @@
         key.alloc_id = alloc_id;
         sched_id = alloc_id;
 
+        bcmolt_onu_state onu_state;
+        bool wait_for_alloc_cfg_cmplt = false;
+        err = get_onu_state((bcmolt_interface)intf_id, (bcmolt_onu_id)onu_id, &onu_state);
+        if (err) {
+            OPENOLT_LOG(ERROR, openolt_log_id, "Failed to fetch onu status, intf_id = %d, onu_id = %d, err = %s\n",
+                intf_id, onu_id, bcmos_strerror(err));
+            return err;
+        } else if (onu_state == BCMOLT_ONU_STATE_ACTIVE) {
+            wait_for_alloc_cfg_cmplt = true;
+        }
+
         BCMOLT_CFG_INIT(&cfg, itupon_alloc, key);
         err = bcmolt_cfg_clear(dev_id, &cfg.hdr);
         if (err) {
             OPENOLT_LOG(ERROR, openolt_log_id, "Failed to remove scheduler, direction = %s, intf_id %d, alloc_id %d, err = %s (%d)\n",
                 direction.c_str(), intf_id, alloc_id, cfg.hdr.hdr.err_text, err);
             return err;
-        }
-
-        err = get_onu_state((bcmolt_interface)intf_id, (bcmolt_onu_id)onu_id, &onu_state);
-        if (err == BCM_ERR_OK) {
-            if (onu_state == BCMOLT_ONU_STATE_ACTIVE) {
-                // Wait for gem cfg complete indication only if ONU state is ACTIVE
-                OPENOLT_LOG(INFO, openolt_log_id, "onu state is active waiting for alloc cfg complete indication intf = %d onu = %d\n",
-                    intf_id, onu_id);
-                err = wait_for_alloc_action(intf_id, alloc_id, ALLOC_OBJECT_DELETE);
-                if (err) {
-                    OPENOLT_LOG(ERROR, openolt_log_id, "Failed to remove scheduler, direction = %s, intf_id %d, alloc_id %d, err = %s\n",
-                        direction.c_str(), intf_id, alloc_id, bcmos_strerror(err));
-                    return err;
-                }
-            }
-            else {
-                OPENOLT_LOG(INFO, openolt_log_id, "onu not active, not waiting for alloc cfg complete, onu_state = %d, intf = %d, onu=%d\n",
-                    onu_state, intf_id, onu_id);
-            }
+        } else if (wait_for_alloc_cfg_cmplt) {
+            err = wait_for_alloc_action(intf_id, alloc_id, ALLOC_OBJECT_DELETE);
+            if (err) {
+                OPENOLT_LOG(ERROR, openolt_log_id, "Failed to remove upstream bandwidth allocation, intf_id %d, onu_id %d, uni_id %d,\
+pon_intf %u, alloc_id %d, err = %s\n", intf_id, onu_id,uni_id,intf_id,alloc_id, bcmos_strerror(err));
+                return err;
+            } 
         } else {
-            OPENOLT_LOG(ERROR, openolt_log_id, "Failed to fetch onu status, intf_id = %d, onu_id = %d, err = %s\n",
-                intf_id, onu_id, bcmos_strerror(err));
-            return err;
+            OPENOLT_LOG(INFO, openolt_log_id, "onu not active, not waiting for alloc cfg complete, onu_state = %d, intf = %d, onu=%d\n",
+                        onu_state, intf_id, onu_id);
         }
     } else if (direction == downstream) {
         bcmolt_tm_sched_cfg cfg;
diff --git a/agent/src/core_utils.cc b/agent/src/core_utils.cc
index f50980a..fd81974 100644
--- a/agent/src/core_utils.cc
+++ b/agent/src/core_utils.cc
@@ -581,17 +581,31 @@
     // Try to pop the result from BAL with a timeout of ALLOC_CFG_COMPLETE_WAIT_TIMEOUT ms
     std::pair<alloc_cfg_complete_result, bool> result = cfg_result.pop(ALLOC_CFG_COMPLETE_WAIT_TIMEOUT);
     if (result.second == false) {
-        OPENOLT_LOG(ERROR, openolt_log_id, "timeout waiting for alloc cfg complete indication intf_id %d, alloc_id %d\n",
-                    intf_id, alloc_id);
+        OPENOLT_LOG(ERROR, openolt_log_id, "timeout waiting for alloc cfg complete indication intf_id %d, alloc_id %d, action = %d\n",
+                    intf_id, alloc_id, action);
         // Invalidate the queue pointer.
         bcmos_fastlock_lock(&alloc_cfg_wait_lock);
         alloc_cfg_compltd_map[k] = NULL;
         bcmos_fastlock_unlock(&alloc_cfg_wait_lock, 0);
         err = BCM_ERR_INTERNAL;
+        // If the Alloc object is already in the right state after the performed operation, return OK.
+        bcmolt_activation_state state;
+        err = get_alloc_obj_state(intf_id, alloc_id, &state);
+        if (err) {
+            OPENOLT_LOG(ERROR, openolt_log_id, "error fetching alloc obj state intf_id = %d, alloc_id %d, action = %d, err = %d\n",
+                        intf_id, alloc_id, action, err);
+            return err;
+        }
+        if ((state == BCMOLT_ACTIVATION_STATE_NOT_CONFIGURED && action == ALLOC_OBJECT_DELETE) ||
+            (state == BCMOLT_ACTIVATION_STATE_ACTIVE && action == ALLOC_OBJECT_CREATE)) {
+            OPENOLT_LOG(WARNING, openolt_log_id, "operation timed out, but the alloc object is the right state intf_id = %d, gem_port_id %d, action = %d\n",
+                        intf_id, alloc_id, action);
+            return BCM_ERR_OK;
+        }
     }
     else if (result.first.status == ALLOC_CFG_STATUS_FAIL) {
-        OPENOLT_LOG(ERROR, openolt_log_id, "error processing alloc cfg request intf_id %d, alloc_id %d\n",
-                    intf_id, alloc_id);
+        OPENOLT_LOG(ERROR, openolt_log_id, "error processing alloc cfg request intf_id %d, alloc_id %d, action = %d\n",
+                    intf_id, alloc_id, action);
         err = BCM_ERR_INTERNAL;
     }
 
@@ -637,17 +651,31 @@
     // Try to pop the result from BAL with a timeout of GEM_CFG_COMPLETE_WAIT_TIMEOUT ms
     std::pair<gem_cfg_complete_result, bool> result = cfg_result.pop(GEM_CFG_COMPLETE_WAIT_TIMEOUT);
     if (result.second == false) {
-        OPENOLT_LOG(ERROR, openolt_log_id, "timeout waiting for gem cfg complete indication intf_id %d, gem_port_id %d\n",
-                    intf_id, gem_port_id);
+        OPENOLT_LOG(ERROR, openolt_log_id, "timeout waiting for gem cfg complete indication intf_id %d, gem_port_id %d, action = %d\n",
+                    intf_id, gem_port_id, action);
         // Invalidate the queue pointer.
         bcmos_fastlock_lock(&gem_cfg_wait_lock);
         gem_cfg_compltd_map[k] = NULL;
         bcmos_fastlock_unlock(&gem_cfg_wait_lock, 0);
         err = BCM_ERR_INTERNAL;
+        // If the GEM object is already in the right state after the performed operation, return OK.
+        bcmolt_activation_state state;
+        err = get_gem_obj_state(intf_id, gem_port_id, &state);
+        if (err) {
+            OPENOLT_LOG(ERROR, openolt_log_id, "error fetching gem obj state intf_id = %d, gem_port_id %d, action = %d, err = %d\n",
+                        intf_id, gem_port_id, action, err);
+            return err;
+        }
+        if ((state == BCMOLT_ACTIVATION_STATE_NOT_CONFIGURED && action == GEM_OBJECT_DELETE) ||
+            (state == BCMOLT_ACTIVATION_STATE_ACTIVE && action == GEM_OBJECT_CREATE)) {
+            OPENOLT_LOG(WARNING, openolt_log_id, "operation timed out, but the gem object is the right state intf_id = %d, gem_port_id %d, action = %d\n",
+                        intf_id, gem_port_id, action);
+            return BCM_ERR_OK;
+        }
     }
     else if (result.first.status == GEM_CFG_STATUS_FAIL) {
-        OPENOLT_LOG(ERROR, openolt_log_id, "error processing gem cfg request intf_id %d, gem_port_id %d\n",
-                    intf_id, gem_port_id);
+        OPENOLT_LOG(ERROR, openolt_log_id, "error processing gem cfg request intf_id %d, gem_port_id %d, action = %d\n",
+                    intf_id, gem_port_id, action);
         err = BCM_ERR_INTERNAL;
     }
 
@@ -862,6 +890,34 @@
     return err;
 }
 
+bcmos_errno get_gem_obj_state(bcmolt_interface pon_ni, bcmolt_gem_port_id id, bcmolt_activation_state *state) {
+    bcmos_errno err;
+    bcmolt_itupon_gem_cfg cfg;
+    bcmolt_itupon_gem_key key;
+    key.pon_ni = pon_ni;
+    key.gem_port_id = id;
+
+    BCMOLT_CFG_INIT(&cfg, itupon_gem, key);
+    BCMOLT_MSG_FIELD_GET(&cfg, state);
+    err = bcmolt_cfg_get(dev_id, &cfg.hdr);
+    *state = cfg.data.state;
+    return err;
+}
+
+bcmos_errno get_alloc_obj_state(bcmolt_interface pon_ni, bcmolt_alloc_id id, bcmolt_activation_state *state) {
+    bcmos_errno err;
+    bcmolt_itupon_alloc_cfg cfg;
+    bcmolt_itupon_alloc_key key;
+    key.pon_ni = pon_ni;
+    key.alloc_id = id;
+
+    BCMOLT_CFG_INIT(&cfg, itupon_alloc, key);
+    BCMOLT_MSG_FIELD_GET(&cfg, state);
+    err = bcmolt_cfg_get(dev_id, &cfg.hdr);
+    *state = cfg.data.state;
+    return err;
+}
+
 bcmos_errno get_pon_interface_status(bcmolt_interface pon_ni, bcmolt_interface_state *state, bcmolt_status *los_status) {
     bcmos_errno err;
     bcmolt_pon_interface_key pon_key;
@@ -991,24 +1047,33 @@
     control = BCMOLT_CONTROL_STATE_ENABLE;
     BCMOLT_FIELD_SET(&cfg.data, itupon_gem_cfg_data, control, control);
 
+    bool wait_for_gem_cfg_complt = false;
+    if (board_technology == "GPON") {
+        // Wait for gem cfg complete indication only if ONU state is ACTIVE
+        err = get_onu_state((bcmolt_interface)intf_id, (bcmolt_onu_id)onu_id, &onu_state);
+        if (err) {
+            OPENOLT_LOG(ERROR, openolt_log_id, "failed to get onu status onu_id = %d, gem_port = %d err = %s\n", onu_id, gemport_id, bcmos_strerror(err));
+            return bcm_to_grpc_err(err, "failed to get onu status");
+        } else if (onu_state == BCMOLT_ONU_STATE_ACTIVE) {
+            wait_for_gem_cfg_complt = true;
+        }
+    }
+
     err = bcmolt_cfg_set(dev_id, &cfg.hdr);
     if(err != BCM_ERR_OK) {
         OPENOLT_LOG(ERROR, openolt_log_id, "failed to install gem_port = %d err = %s (%d)\n", gemport_id, cfg.hdr.hdr.err_text, err);
         return bcm_to_grpc_err(err, "Access_Control set ITU PON Gem port failed");
     }
 
-    if (board_technology == "GPON") {
-        // Wait for gem cfg complete indication only if ONU state is ACTIVE
-        err = get_onu_state((bcmolt_interface)intf_id, (bcmolt_onu_id)onu_id, &onu_state);
-        if (err == BCM_ERR_OK) {
-            if (onu_state == BCMOLT_ONU_STATE_ACTIVE) {
-                err = wait_for_gem_action(intf_id, gemport_id, GEM_OBJECT_CREATE);
-                if (err) {
-                    OPENOLT_LOG(ERROR, openolt_log_id, "failed to install gem_port = %d err = %s\n", gemport_id, bcmos_strerror(err));
-                    return bcm_to_grpc_err(err, "Access_Control set ITU PON Gem port failed");
-                }
-            }
+    // Wait for gem cfg complete indication only if ONU state is ACTIVE
+    if (wait_for_gem_cfg_complt) {
+        err = wait_for_gem_action(intf_id, gemport_id, GEM_OBJECT_CREATE);
+        if (err) {
+            OPENOLT_LOG(ERROR, openolt_log_id, "failed to install gem_port = %d err = %s\n", gemport_id, bcmos_strerror(err));
+            return bcm_to_grpc_err(err, "Access_Control set ITU PON Gem port failed");
         }
+    } else {
+        OPENOLT_LOG(DEBUG, openolt_log_id, "not waiting for gem config complete indication = %d\n", gemport_id);
     }
 
     OPENOLT_LOG(INFO, openolt_log_id, "gem port installed successfully = %d\n", gemport_id);
@@ -1040,6 +1105,18 @@
     };
     bcmos_errno err;
 
+    bool wait_for_gem_cfg_complt = false;
+    if (board_technology == "GPON") {
+        // Wait for gem cfg complete indication only if ONU state is ACTIVE
+        err = get_onu_state((bcmolt_interface)intf_id, (bcmolt_onu_id)onu_id, &onu_state);
+        if (err) {
+            OPENOLT_LOG(ERROR, openolt_log_id, "failed to get onu status onu_id = %d, gem_port = %d err = %s\n", onu_id, gemport_id, bcmos_strerror(err));
+            return bcm_to_grpc_err(err, "failed to get onu status");
+        } else if (onu_state == BCMOLT_ONU_STATE_ACTIVE) {
+            wait_for_gem_cfg_complt = true;
+        }
+    }
+
     BCMOLT_CFG_INIT(&gem_cfg, itupon_gem, key);
     err = bcmolt_cfg_clear(dev_id, &gem_cfg.hdr);
     if (err != BCM_ERR_OK)
@@ -1048,30 +1125,18 @@
         return bcm_to_grpc_err(err, "Access_Control clear ITU PON Gem port failed");
     }
 
-    if (board_technology == "GPON") {
-        err = get_onu_state((bcmolt_interface)intf_id, (bcmolt_onu_id)onu_id, &onu_state);
-        if (err == BCM_ERR_OK) {
-            if (onu_state == BCMOLT_ONU_STATE_ACTIVE) {
-#ifndef SCALE_AND_PERF
-                OPENOLT_LOG(INFO, openolt_log_id, "onu state is active waiting for gem cfg complete indication intf = %d onu = %d\n",
+    if (wait_for_gem_cfg_complt) {
+        OPENOLT_LOG(INFO, openolt_log_id, "onu state is active waiting for gem cfg complete indication intf = %d onu = %d\n",
                     intf_id, onu_id);
-                err = wait_for_gem_action(intf_id, gemport_id, GEM_OBJECT_DELETE);
-                if (err) {
-                    OPENOLT_LOG(ERROR, openolt_log_id, "Failed to remove gem, intf_id %d, gemport_id %d, err = %s\n",
+        err = wait_for_gem_action(intf_id, gemport_id, GEM_OBJECT_DELETE);
+        if (err) {
+            OPENOLT_LOG(ERROR, openolt_log_id, "Failed to remove gem, intf_id %d, gemport_id %d, err = %s\n",
                         intf_id, gemport_id, bcmos_strerror(err));
-                    return bcm_to_grpc_err(err, "failed to remove gem");
-                }
-#endif
-            }
-            else {
-                OPENOLT_LOG(INFO, openolt_log_id, "onu not active, not waiting for gem cfg complete, onu_state = %d, intf = %d, gemport_id = %d, onu=%d\n",
-                    onu_state, intf_id, gemport_id, onu_id);
-            }
-        } else {
-            OPENOLT_LOG(ERROR, openolt_log_id, "Failed to fetch onu status, intf_id = %d, onu_id = %d, err = %s\n",
-                intf_id, onu_id, bcmos_strerror(err));
-            return bcm_to_grpc_err(err, "failed to get onu state");
+            return bcm_to_grpc_err(err, "failed to remove gem");
         }
+    } else {
+        OPENOLT_LOG(DEBUG, openolt_log_id, "onu not active or/and not gpon tech, not waiting for gem cfg complete, onu_state = %d, intf = %d, gemport_id = %d, onu=%d\n",
+                    onu_state, intf_id, gemport_id, onu_id);
     }
 
     OPENOLT_LOG(INFO, openolt_log_id, "gem port removed successfully = %d\n", gemport_id);
diff --git a/agent/src/core_utils.h b/agent/src/core_utils.h
index 7ff318e..72ae3bb 100644
--- a/agent/src/core_utils.h
+++ b/agent/src/core_utils.h
@@ -124,4 +124,6 @@
 bool is_grpc_secure();
 std::pair<std::string, bool> read_from_txt_file(const std::string& file_name);
 bool save_to_txt_file(const std::string& file_name, const std::string& content);
+bcmos_errno get_gem_obj_state(bcmolt_interface pon_ni, bcmolt_gem_port_id id, bcmolt_activation_state *state);
+bcmos_errno get_alloc_obj_state(bcmolt_interface pon_ni, bcmolt_alloc_id id, bcmolt_activation_state *state);
 #endif // OPENOLT_CORE_UTILS_H_
diff --git a/agent/test/src/test_core.cc b/agent/test/src/test_core.cc
index 393c315..250bb21 100644
--- a/agent/test/src/test_core.cc
+++ b/agent/test/src/test_core.cc
@@ -2108,12 +2108,28 @@
     onu_key.pon_ni = 0;
     onu_key.onu_id = 1;
     BCMOLT_CFG_INIT(&onu_cfg_out, onu, onu_key);
-    EXPECT_CALL(balMock, bcmolt_cfg_get(_, _)).WillOnce(Invoke([onu_cfg_get_res, &onu_cfg_out] (bcmolt_oltid olt, bcmolt_cfg *cfg) {
+
+    bcmos_errno alloc_cfg_get_res = BCM_ERR_OK;
+    bcmolt_itupon_alloc_cfg alloc_cfg;
+    bcmolt_itupon_alloc_key alloc_key;
+    alloc_key.pon_ni = 0;
+    alloc_key.alloc_id = 1024;
+    BCMOLT_CFG_INIT(&alloc_cfg, itupon_alloc, alloc_key);
+
+    EXPECT_CALL(balMock, bcmolt_cfg_get(_, _)).Times(2)
+    .WillOnce(Invoke([onu_cfg_get_res, &onu_cfg_out] (bcmolt_oltid olt, bcmolt_cfg *cfg) {
                                                                    bcmolt_onu_cfg* o_cfg = (bcmolt_onu_cfg*)cfg;
                                                                    o_cfg->data.onu_state = BCMOLT_ONU_STATE_ACTIVE;
                                                                    memcpy(&onu_cfg_out, o_cfg, sizeof(bcmolt_onu_cfg));
                                                                    return onu_cfg_get_res;
                                                                }
+    ))
+    .WillOnce(Invoke([alloc_cfg_get_res, &alloc_cfg] (bcmolt_oltid olt, bcmolt_cfg *cfg) {
+                                                                   bcmolt_itupon_alloc_cfg* o_cfg = (bcmolt_itupon_alloc_cfg*)cfg;
+                                                                   o_cfg->data.state = BCMOLT_ACTIVATION_STATE_PROCESSING;
+                                                                   memcpy(&alloc_cfg, o_cfg, sizeof(bcmolt_itupon_alloc_cfg));
+                                                                   return alloc_cfg_get_res;
+                                                               }
     ));
 
     Status status = CreateTrafficSchedulers_(traffic_scheds);
@@ -2170,6 +2186,54 @@
     ASSERT_TRUE( status.error_message() != Status::OK.error_message() );
 }
 
+// Test 2C - CreateTrafficSchedulers-Upstream Succes case(timeout waiting for alloc cfg indication, but itupon-alloc object is ACTIVE)
+TEST_F(TestCreateTrafficSchedulers, UpstreamAllocCfgTimeoutSuccess) {
+    scheduler->set_direction(tech_profile::Direction::UPSTREAM);
+    scheduler->set_additional_bw(tech_profile::AdditionalBW::AdditionalBW_BestEffort);
+    traffic_sched->set_direction(tech_profile::Direction::UPSTREAM);
+    traffic_sched->set_allocated_scheduler(scheduler);
+    traffic_shaping_info->set_cir(64000);
+    traffic_shaping_info->set_pir(128000);
+    traffic_sched->set_allocated_traffic_shaping_info(traffic_shaping_info);
+
+    bcmos_errno olt_cfg_set_res = BCM_ERR_OK;
+    ON_CALL(balMock, bcmolt_cfg_set(_, _)).WillByDefault(Return(olt_cfg_set_res));
+
+    bcmos_errno onu_cfg_get_res = BCM_ERR_OK;
+    bcmolt_onu_cfg onu_cfg_out;
+    bcmolt_onu_key onu_key;
+    onu_key.pon_ni = 0;
+    onu_key.onu_id = 1;
+    BCMOLT_CFG_INIT(&onu_cfg_out, onu, onu_key);
+
+    bcmos_errno alloc_cfg_get_res = BCM_ERR_OK;
+    bcmolt_itupon_alloc_cfg alloc_cfg;
+    bcmolt_itupon_alloc_key alloc_key;
+    alloc_key.pon_ni = 0;
+    alloc_key.alloc_id = 1024;
+    BCMOLT_CFG_INIT(&alloc_cfg, itupon_alloc, alloc_key);
+
+    EXPECT_CALL(balMock, bcmolt_cfg_get(_, _)).Times(2)
+    .WillOnce(Invoke([onu_cfg_get_res, &onu_cfg_out] (bcmolt_oltid olt, bcmolt_cfg *cfg) {
+                                                                   bcmolt_onu_cfg* o_cfg = (bcmolt_onu_cfg*)cfg;
+                                                                   o_cfg->data.onu_state = BCMOLT_ONU_STATE_ACTIVE;
+                                                                   memcpy(&onu_cfg_out, o_cfg, sizeof(bcmolt_onu_cfg));
+                                                                   return onu_cfg_get_res;
+                                                               }
+    ))
+    .WillOnce(Invoke([alloc_cfg_get_res, &alloc_cfg] (bcmolt_oltid olt, bcmolt_cfg *cfg) {
+                                                                   bcmolt_itupon_alloc_cfg* o_cfg = (bcmolt_itupon_alloc_cfg*)cfg;
+                                                                   o_cfg->data.state = BCMOLT_ACTIVATION_STATE_ACTIVE;
+                                                                   memcpy(&alloc_cfg, o_cfg, sizeof(bcmolt_itupon_alloc_cfg));
+                                                                   return alloc_cfg_get_res;
+                                                               }
+    ));
+
+    Status status = CreateTrafficSchedulers_(traffic_scheds);
+    ASSERT_TRUE( status.error_message() == Status::OK.error_message() );
+}
+
+
 // Test 3 - CreateTrafficSchedulers-Upstream failure case(error processing alloc cfg request)
 TEST_F(TestCreateTrafficSchedulers, UpstreamErrorProcessingAllocCfg) {
     scheduler->set_direction(tech_profile::Direction::UPSTREAM);
