diff --git a/agent/src/indications.cc b/agent/src/indications.cc
index f24dca9..681ed99 100644
--- a/agent/src/indications.cc
+++ b/agent/src/indications.cc
@@ -340,6 +340,77 @@
     bcmolt_msg_free(msg);
 }
 
+static void OnuDisableIndication(bcmolt_devid olt, bcmolt_msg *msg) {
+    openolt::Indication ind;
+    openolt::OnuDisabledIndication* onu_disable_ind = new openolt::OnuDisabledIndication;
+    openolt::SerialNumber* serial_number = new openolt::SerialNumber;
+
+    switch (msg->obj_type) {
+        case BCMOLT_OBJ_ID_ONU:
+            switch (msg->subgroup) {
+                case BCMOLT_ONU_AUTO_SUBGROUP_ONU_DISABLE_COMPLETED:
+                {
+                    bcmolt_onu_onu_disable_completed* onu = (bcmolt_onu_onu_disable_completed *)msg;
+                    bcmolt_onu_key *key = &((bcmolt_onu_onu_disable_completed *)msg)->key;
+
+                    int port_no = interface_key_to_port_no(key->pon_ni, BCMOLT_INTERFACE_TYPE_PON);
+
+                    bcmolt_serial_number *in_serial_number = &(onu->data.serial_number);
+
+
+                    OPENOLT_LOG(INFO, openolt_log_id, "onu disable indication, pon_ni %d, onu_id %d, port_no %d, status %s, serial_number %s\n",
+                        key->pon_ni, key->onu_id, port_no, bcmolt_result_to_string(onu->data.status).c_str(),serial_number_to_str(in_serial_number).c_str());
+
+                    onu_disable_ind->set_intf_id(key->pon_ni);
+                    onu_disable_ind->set_onu_id(key->onu_id);
+                    serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id.arr), 4);
+                    serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific.arr), 8);
+                    onu_disable_ind->set_allocated_serial_number(serial_number);
+                    ind.set_allocated_onu_disabled_ind(onu_disable_ind);
+                    break;
+                }
+            }
+    }
+
+    oltIndQ.push(ind);
+    bcmolt_msg_free(msg);
+}
+
+static void OnuEnableIndication(bcmolt_devid olt, bcmolt_msg *msg) {
+    openolt::Indication ind;
+    openolt::OnuEnabledIndication* onu_enable_ind = new openolt::OnuEnabledIndication;
+    openolt::SerialNumber* serial_number = new openolt::SerialNumber;
+
+    switch (msg->obj_type) {
+        case BCMOLT_OBJ_ID_ONU:
+            switch (msg->subgroup) {
+                case BCMOLT_ONU_AUTO_SUBGROUP_ONU_ENABLE_COMPLETED:
+                {
+                    bcmolt_onu_onu_enable_completed* onu = (bcmolt_onu_onu_enable_completed *)msg;
+                    bcmolt_onu_key *key = &((bcmolt_onu_onu_enable_completed *)msg)->key;
+
+                    int port_no = interface_key_to_port_no(key->pon_ni, BCMOLT_INTERFACE_TYPE_PON);
+                    bcmolt_serial_number *in_serial_number = &(onu->data.serial_number);
+
+                    OPENOLT_LOG(INFO, openolt_log_id, "onu enable indication, pon_ni %d, onu_id %d, port_no %d, serial_number %s\n",
+                        key->pon_ni, key->onu_id, port_no,serial_number_to_str(in_serial_number).c_str());
+
+                    onu_enable_ind->set_intf_id(key->pon_ni);
+                    onu_enable_ind->set_onu_id(key->onu_id);
+                    serial_number->set_vendor_id(reinterpret_cast<const char *>(in_serial_number->vendor_id.arr), 4);
+                    serial_number->set_vendor_specific(reinterpret_cast<const char *>(in_serial_number->vendor_specific.arr), 8);
+                    onu_enable_ind->set_allocated_serial_number(serial_number);
+
+                    ind.set_allocated_onu_enabled_ind(onu_enable_ind);
+                    break;
+                }
+            }
+    }
+
+    oltIndQ.push(ind);
+    bcmolt_msg_free(msg);
+}
+
 static void OnuAlarmIndication(bcmolt_devid olt, bcmolt_msg *msg) {
     openolt::Indication ind;
     openolt::AlarmIndication* alarm_ind = new openolt::AlarmIndication;
@@ -1340,6 +1411,22 @@
     if(rc != BCM_ERR_OK)
         return Status(grpc::StatusCode::INTERNAL, "onu dying-gasp indication subscribe failed");
 
+    rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
+    rx_cfg.rx_cb = OnuDisableIndication;
+    rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
+    rx_cfg.subgroup = bcmolt_onu_auto_subgroup_onu_disable_completed;
+    rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
+    if(rc != BCM_ERR_OK)
+        return Status(grpc::StatusCode::INTERNAL, "onu disable indication subscribe failed");
+
+    rx_cfg.obj_type = BCMOLT_OBJ_ID_ONU;
+    rx_cfg.rx_cb = OnuEnableIndication;
+    rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
+    rx_cfg.subgroup = bcmolt_onu_auto_subgroup_onu_enable_completed;
+    rc = bcmolt_ind_subscribe(current_device, &rx_cfg);
+    if(rc != BCM_ERR_OK)
+        return Status(grpc::StatusCode::INTERNAL, "onu enable indication subscribe failed"); 
+
     rx_cfg.obj_type = BCMOLT_OBJ_ID_PON_INTERFACE;
     rx_cfg.rx_cb = OnuDiscoveryIndication;
     rx_cfg.flags = BCMOLT_AUTO_FLAGS_NONE;
