]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_northbound.c
bgpd: [7.1] add addpath ID to adj_out tree sort (#5691)
[mirror_frr.git] / isisd / isis_northbound.c
index f76d85cc36221eb64c052bf919af70ce770034ff..d5cdec154b4d3c5817a8fc776016ea881f378abb 100644 (file)
@@ -25,7 +25,6 @@
 #include "libfrr.h"
 #include "linklist.h"
 #include "log.h"
-#include "isisd/dict.h"
 #include "isisd/isis_constants.h"
 #include "isisd/isis_common.h"
 #include "isisd/isis_flags.h"
@@ -67,21 +66,21 @@ static int isis_instance_create(enum nb_event event,
 
        area = isis_area_create(area_tag);
        /* save area in dnode to avoid looking it up all the time */
-       yang_dnode_set_entry(dnode, area);
+       nb_running_set_entry(dnode, area);
 
        return NB_OK;
 }
 
-static int isis_instance_delete(enum nb_event event,
+static int isis_instance_destroy(enum nb_event event,
                                const struct lyd_node *dnode)
 {
-       const char *area_tag;
+       struct isis_area *area;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area_tag = yang_dnode_get_string(dnode, "./area-tag");
-       isis_area_destroy(area_tag);
+       area = nb_running_unset_entry(dnode);
+       isis_area_destroy(area->area_tag);
 
        return NB_OK;
 }
@@ -99,7 +98,7 @@ static int isis_instance_is_type_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        type = yang_dnode_get_enum(dnode, NULL);
        isis_area_is_type_set(area, type);
 
@@ -150,7 +149,7 @@ static int isis_instance_area_address_create(enum nb_event event,
                XFREE(MTYPE_ISIS_AREA_ADDR, resource->ptr);
                break;
        case NB_EV_APPLY:
-               area = yang_dnode_get_entry(dnode, true);
+               area = nb_running_get_entry(dnode, NULL, true);
                addrr = resource->ptr;
 
                if (isis->sysid_set == 0) {
@@ -193,7 +192,7 @@ static int isis_instance_area_address_create(enum nb_event event,
        return NB_OK;
 }
 
-static int isis_instance_area_address_delete(enum nb_event event,
+static int isis_instance_area_address_destroy(enum nb_event event,
                                             const struct lyd_node *dnode)
 {
        struct area_addr addr, *addrp = NULL;
@@ -208,7 +207,7 @@ static int isis_instance_area_address_delete(enum nb_event event,
        net_title = yang_dnode_get_string(dnode, NULL);
        addr.addr_len = dotformat2buff(buff, net_title);
        memcpy(addr.area_addr, buff, (int)addr.addr_len);
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        for (ALL_LIST_ELEMENTS_RO(area->area_addrs, node, addrp)) {
                if ((addrp->addr_len + ISIS_SYS_ID_LEN + 1) == addr.addr_len
                    && !memcmp(addrp->area_addr, addr.area_addr, addr.addr_len))
@@ -244,7 +243,7 @@ static int isis_instance_dynamic_hostname_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        isis_area_dynhostname_set(area, yang_dnode_get_bool(dnode, NULL));
 
        return NB_OK;
@@ -253,31 +252,19 @@ static int isis_instance_dynamic_hostname_modify(enum nb_event event,
 /*
  * XPath: /frr-isisd:isis/instance/attached
  */
-static int isis_instance_attached_create(enum nb_event event,
+static int isis_instance_attached_modify(enum nb_event event,
                                         const struct lyd_node *dnode,
                                         union nb_resource *resource)
 {
        struct isis_area *area;
+       bool attached;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
-       isis_area_attached_bit_set(area, true);
-
-       return NB_OK;
-}
-
-static int isis_instance_attached_delete(enum nb_event event,
-                                        const struct lyd_node *dnode)
-{
-       struct isis_area *area;
-
-       if (event != NB_EV_APPLY)
-               return NB_OK;
-
-       area = yang_dnode_get_entry(dnode, true);
-       isis_area_attached_bit_set(area, false);
+       area = nb_running_get_entry(dnode, NULL, true);
+       attached = yang_dnode_get_bool(dnode, NULL);
+       isis_area_attached_bit_set(area, attached);
 
        return NB_OK;
 }
@@ -285,31 +272,19 @@ static int isis_instance_attached_delete(enum nb_event event,
 /*
  * XPath: /frr-isisd:isis/instance/overload
  */
-static int isis_instance_overload_create(enum nb_event event,
+static int isis_instance_overload_modify(enum nb_event event,
                                         const struct lyd_node *dnode,
                                         union nb_resource *resource)
 {
        struct isis_area *area;
+       bool overload;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
-       isis_area_overload_bit_set(area, true);
-
-       return NB_OK;
-}
-
-static int isis_instance_overload_delete(enum nb_event event,
-                                        const struct lyd_node *dnode)
-{
-       struct isis_area *area;
-
-       if (event != NB_EV_APPLY)
-               return NB_OK;
-
-       area = yang_dnode_get_entry(dnode, true);
-       isis_area_overload_bit_set(area, false);
+       area = nb_running_get_entry(dnode, NULL, true);
+       overload = yang_dnode_get_bool(dnode, NULL);
+       isis_area_overload_bit_set(area, overload);
 
        return NB_OK;
 }
@@ -328,7 +303,7 @@ static int isis_instance_metric_style_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        old_metric = (metric_style == ISIS_WIDE_METRIC) ? false : true;
        new_metric = (metric_style == ISIS_NARROW_METRIC) ? false : true;
        isis_area_metricstyle_set(area, old_metric, new_metric);
@@ -339,7 +314,7 @@ static int isis_instance_metric_style_modify(enum nb_event event,
 /*
  * XPath: /frr-isisd:isis/instance/purge-originator
  */
-static int isis_instance_purge_originator_create(enum nb_event event,
+static int isis_instance_purge_originator_modify(enum nb_event event,
                                                 const struct lyd_node *dnode,
                                                 union nb_resource *resource)
 {
@@ -348,22 +323,8 @@ static int isis_instance_purge_originator_create(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
-       area->purge_originator = true;
-
-       return NB_OK;
-}
-
-static int isis_instance_purge_originator_delete(enum nb_event event,
-                                                const struct lyd_node *dnode)
-{
-       struct isis_area *area;
-
-       if (event != NB_EV_APPLY)
-               return NB_OK;
-
-       area = yang_dnode_get_entry(dnode, true);
-       area->purge_originator = false;
+       area = nb_running_get_entry(dnode, NULL, true);
+       area->purge_originator = yang_dnode_get_bool(dnode, NULL);
 
        return NB_OK;
 }
@@ -382,7 +343,7 @@ static int isis_instance_lsp_mtu_modify(enum nb_event event,
 
        switch (event) {
        case NB_EV_VALIDATE:
-               area = yang_dnode_get_entry(dnode, false);
+               area = nb_running_get_entry(dnode, NULL, false);
                if (!area)
                        break;
                for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
@@ -403,7 +364,7 @@ static int isis_instance_lsp_mtu_modify(enum nb_event event,
        case NB_EV_ABORT:
                break;
        case NB_EV_APPLY:
-               area = yang_dnode_get_entry(dnode, true);
+               area = nb_running_get_entry(dnode, NULL, true);
                isis_area_lsp_mtu_set(area, lsp_mtu);
                break;
        }
@@ -426,7 +387,7 @@ isis_instance_lsp_refresh_interval_level_1_modify(enum nb_event event,
                return NB_OK;
 
        refr_int = yang_dnode_get_uint16(dnode, NULL);
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        isis_area_lsp_refresh_set(area, IS_LEVEL_1, refr_int);
 
        return NB_OK;
@@ -447,7 +408,7 @@ isis_instance_lsp_refresh_interval_level_2_modify(enum nb_event event,
                return NB_OK;
 
        refr_int = yang_dnode_get_uint16(dnode, NULL);
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        isis_area_lsp_refresh_set(area, IS_LEVEL_2, refr_int);
 
        return NB_OK;
@@ -468,7 +429,7 @@ isis_instance_lsp_maximum_lifetime_level_1_modify(enum nb_event event,
                return NB_OK;
 
        max_lt = yang_dnode_get_uint16(dnode, NULL);
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        isis_area_max_lsp_lifetime_set(area, IS_LEVEL_1, max_lt);
 
        return NB_OK;
@@ -489,7 +450,7 @@ isis_instance_lsp_maximum_lifetime_level_2_modify(enum nb_event event,
                return NB_OK;
 
        max_lt = yang_dnode_get_uint16(dnode, NULL);
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        isis_area_max_lsp_lifetime_set(area, IS_LEVEL_2, max_lt);
 
        return NB_OK;
@@ -509,7 +470,7 @@ static int isis_instance_lsp_generation_interval_level_1_modify(
                return NB_OK;
 
        gen_int = yang_dnode_get_uint16(dnode, NULL);
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        area->lsp_gen_interval[0] = gen_int;
 
        return NB_OK;
@@ -529,7 +490,7 @@ static int isis_instance_lsp_generation_interval_level_2_modify(
                return NB_OK;
 
        gen_int = yang_dnode_get_uint16(dnode, NULL);
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        area->lsp_gen_interval[1] = gen_int;
 
        return NB_OK;
@@ -545,7 +506,7 @@ static void ietf_backoff_delay_apply_finish(const struct lyd_node *dnode)
        long long_delay = yang_dnode_get_uint16(dnode, "./long-delay");
        long holddown = yang_dnode_get_uint16(dnode, "./hold-down");
        long timetolearn = yang_dnode_get_uint16(dnode, "./time-to-learn");
-       struct isis_area *area = yang_dnode_get_entry(dnode, true);
+       struct isis_area *area = nb_running_get_entry(dnode, NULL, true);
        size_t bufsiz = strlen(area->area_tag) + sizeof("IS-IS  Lx");
        char *buf = XCALLOC(MTYPE_TMP, bufsiz);
 
@@ -574,7 +535,7 @@ isis_instance_spf_ietf_backoff_delay_create(enum nb_event event,
 }
 
 static int
-isis_instance_spf_ietf_backoff_delay_delete(enum nb_event event,
+isis_instance_spf_ietf_backoff_delay_destroy(enum nb_event event,
                                            const struct lyd_node *dnode)
 {
        struct isis_area *area;
@@ -582,7 +543,7 @@ isis_instance_spf_ietf_backoff_delay_delete(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        spf_backoff_free(area->spf_delay_ietf[0]);
        spf_backoff_free(area->spf_delay_ietf[1]);
        area->spf_delay_ietf[0] = NULL;
@@ -659,7 +620,7 @@ isis_instance_spf_minimum_interval_level_1_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        area->min_spf_interval[0] = yang_dnode_get_uint16(dnode, NULL);
 
        return NB_OK;
@@ -678,7 +639,7 @@ isis_instance_spf_minimum_interval_level_2_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        area->min_spf_interval[1] = yang_dnode_get_uint16(dnode, NULL);
 
        return NB_OK;
@@ -690,7 +651,7 @@ isis_instance_spf_minimum_interval_level_2_modify(enum nb_event event,
 static void area_password_apply_finish(const struct lyd_node *dnode)
 {
        const char *password = yang_dnode_get_string(dnode, "./password");
-       struct isis_area *area = yang_dnode_get_entry(dnode, true);
+       struct isis_area *area = nb_running_get_entry(dnode, NULL, true);
        int pass_type = yang_dnode_get_enum(dnode, "./password-type");
        uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
 
@@ -714,7 +675,7 @@ static int isis_instance_area_password_create(enum nb_event event,
        return NB_OK;
 }
 
-static int isis_instance_area_password_delete(enum nb_event event,
+static int isis_instance_area_password_destroy(enum nb_event event,
                                              const struct lyd_node *dnode)
 {
        struct isis_area *area;
@@ -722,7 +683,7 @@ static int isis_instance_area_password_delete(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        isis_area_passwd_unset(area, IS_LEVEL_1);
 
        return NB_OK;
@@ -769,7 +730,7 @@ static int isis_instance_area_password_authenticate_snp_modify(
 static void domain_password_apply_finish(const struct lyd_node *dnode)
 {
        const char *password = yang_dnode_get_string(dnode, "./password");
-       struct isis_area *area = yang_dnode_get_entry(dnode, true);
+       struct isis_area *area = nb_running_get_entry(dnode, NULL, true);
        int pass_type = yang_dnode_get_enum(dnode, "./password-type");
        uint8_t snp_auth = yang_dnode_get_enum(dnode, "./authenticate-snp");
 
@@ -793,7 +754,7 @@ static int isis_instance_domain_password_create(enum nb_event event,
        return NB_OK;
 }
 
-static int isis_instance_domain_password_delete(enum nb_event event,
+static int isis_instance_domain_password_destroy(enum nb_event event,
                                                const struct lyd_node *dnode)
 {
        struct isis_area *area;
@@ -801,7 +762,7 @@ static int isis_instance_domain_password_delete(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        isis_area_passwd_unset(area, IS_LEVEL_2);
 
        return NB_OK;
@@ -851,10 +812,10 @@ static void default_info_origin_apply_finish(const struct lyd_node *dnode,
        int originate_type = DEFAULT_ORIGINATE;
        unsigned long metric = 0;
        const char *routemap = NULL;
-       struct isis_area *area = yang_dnode_get_entry(dnode, true);
+       struct isis_area *area = nb_running_get_entry(dnode, NULL, true);
        int level = yang_dnode_get_enum(dnode, "./level");
 
-       if (yang_dnode_exists(dnode, "./always")) {
+       if (yang_dnode_get_bool(dnode, "./always")) {
                originate_type = DEFAULT_ORIGINATE_ALWAYS;
        } else if (family == AF_INET6) {
                zlog_warn(
@@ -864,7 +825,7 @@ static void default_info_origin_apply_finish(const struct lyd_node *dnode,
 
        if (yang_dnode_exists(dnode, "./metric"))
                metric = yang_dnode_get_uint32(dnode, "./metric");
-       else if (yang_dnode_exists(dnode, "./route-map"))
+       if (yang_dnode_exists(dnode, "./route-map"))
                routemap = yang_dnode_get_string(dnode, "./route-map");
 
        isis_redist_set(area, level, family, DEFAULT_ROUTE, metric, routemap,
@@ -889,7 +850,7 @@ static int isis_instance_default_information_originate_ipv4_create(
        return NB_OK;
 }
 
-static int isis_instance_default_information_originate_ipv4_delete(
+static int isis_instance_default_information_originate_ipv4_destroy(
        enum nb_event event, const struct lyd_node *dnode)
 {
        struct isis_area *area;
@@ -898,7 +859,7 @@ static int isis_instance_default_information_originate_ipv4_delete(
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        level = yang_dnode_get_enum(dnode, "./level");
        isis_redist_unset(area, level, AF_INET, DEFAULT_ROUTE);
 
@@ -908,7 +869,7 @@ static int isis_instance_default_information_originate_ipv4_delete(
 /*
  * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/always
  */
-static int isis_instance_default_information_originate_ipv4_always_create(
+static int isis_instance_default_information_originate_ipv4_always_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
@@ -916,13 +877,6 @@ static int isis_instance_default_information_originate_ipv4_always_create(
        return NB_OK;
 }
 
-static int isis_instance_default_information_originate_ipv4_always_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       /* It's all done by default_info_origin_apply_finish */
-       return NB_OK;
-}
-
 /*
  * XPath: /frr-isisd:isis/instance/default-information-originate/ipv4/route-map
  */
@@ -934,7 +888,7 @@ static int isis_instance_default_information_originate_ipv4_route_map_modify(
        return NB_OK;
 }
 
-static int isis_instance_default_information_originate_ipv4_route_map_delete(
+static int isis_instance_default_information_originate_ipv4_route_map_destroy(
        enum nb_event event, const struct lyd_node *dnode)
 {
        /* It's all done by default_info_origin_apply_finish */
@@ -952,13 +906,6 @@ static int isis_instance_default_information_originate_ipv4_metric_modify(
        return NB_OK;
 }
 
-static int isis_instance_default_information_originate_ipv4_metric_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       /* It's all done by default_info_origin_apply_finish */
-       return NB_OK;
-}
-
 /*
  * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6
  */
@@ -970,7 +917,7 @@ static int isis_instance_default_information_originate_ipv6_create(
        return NB_OK;
 }
 
-static int isis_instance_default_information_originate_ipv6_delete(
+static int isis_instance_default_information_originate_ipv6_destroy(
        enum nb_event event, const struct lyd_node *dnode)
 {
        struct isis_area *area;
@@ -979,7 +926,7 @@ static int isis_instance_default_information_originate_ipv6_delete(
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        level = yang_dnode_get_enum(dnode, "./level");
        isis_redist_unset(area, level, AF_INET6, DEFAULT_ROUTE);
 
@@ -989,7 +936,7 @@ static int isis_instance_default_information_originate_ipv6_delete(
 /*
  * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/always
  */
-static int isis_instance_default_information_originate_ipv6_always_create(
+static int isis_instance_default_information_originate_ipv6_always_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
@@ -997,13 +944,6 @@ static int isis_instance_default_information_originate_ipv6_always_create(
        return NB_OK;
 }
 
-static int isis_instance_default_information_originate_ipv6_always_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       /* It's all done by default_info_origin_apply_finish */
-       return NB_OK;
-}
-
 /*
  * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6/route-map
  */
@@ -1015,7 +955,7 @@ static int isis_instance_default_information_originate_ipv6_route_map_modify(
        return NB_OK;
 }
 
-static int isis_instance_default_information_originate_ipv6_route_map_delete(
+static int isis_instance_default_information_originate_ipv6_route_map_destroy(
        enum nb_event event, const struct lyd_node *dnode)
 {
        /* It's all done by default_info_origin_apply_finish */
@@ -1033,13 +973,6 @@ static int isis_instance_default_information_originate_ipv6_metric_modify(
        return NB_OK;
 }
 
-static int isis_instance_default_information_originate_ipv6_metric_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       /* It's all done by default_info_origin_apply_finish */
-       return NB_OK;
-}
-
 /*
  * XPath: /frr-isisd:isis/instance/redistribute/ipv4
  */
@@ -1053,11 +986,11 @@ static void redistribute_apply_finish(const struct lyd_node *dnode, int family)
 
        type = yang_dnode_get_enum(dnode, "./protocol");
        level = yang_dnode_get_enum(dnode, "./level");
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
 
        if (yang_dnode_exists(dnode, "./metric"))
                metric = yang_dnode_get_uint32(dnode, "./metric");
-       else if (yang_dnode_exists(dnode, "./route-map"))
+       if (yang_dnode_exists(dnode, "./route-map"))
                routemap = yang_dnode_get_string(dnode, "./route-map");
 
        isis_redist_set(area, level, family, type, metric, routemap, 0);
@@ -1081,7 +1014,7 @@ static int isis_instance_redistribute_ipv4_create(enum nb_event event,
        return NB_OK;
 }
 
-static int isis_instance_redistribute_ipv4_delete(enum nb_event event,
+static int isis_instance_redistribute_ipv4_destroy(enum nb_event event,
                                                  const struct lyd_node *dnode)
 {
        struct isis_area *area;
@@ -1090,7 +1023,7 @@ static int isis_instance_redistribute_ipv4_delete(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        level = yang_dnode_get_enum(dnode, "./level");
        type = yang_dnode_get_enum(dnode, "./protocol");
        isis_redist_unset(area, level, AF_INET, type);
@@ -1111,7 +1044,7 @@ isis_instance_redistribute_ipv4_route_map_modify(enum nb_event event,
 }
 
 static int
-isis_instance_redistribute_ipv4_route_map_delete(enum nb_event event,
+isis_instance_redistribute_ipv4_route_map_destroy(enum nb_event event,
                                                 const struct lyd_node *dnode)
 {
        /* It's all done by redistribute_apply_finish */
@@ -1130,14 +1063,6 @@ isis_instance_redistribute_ipv4_metric_modify(enum nb_event event,
        return NB_OK;
 }
 
-static int
-isis_instance_redistribute_ipv4_metric_delete(enum nb_event event,
-                                             const struct lyd_node *dnode)
-{
-       /* It's all done by redistribute_apply_finish */
-       return NB_OK;
-}
-
 /*
  * XPath: /frr-isisd:isis/instance/redistribute/ipv6
  */
@@ -1149,7 +1074,7 @@ static int isis_instance_redistribute_ipv6_create(enum nb_event event,
        return NB_OK;
 }
 
-static int isis_instance_redistribute_ipv6_delete(enum nb_event event,
+static int isis_instance_redistribute_ipv6_destroy(enum nb_event event,
                                                  const struct lyd_node *dnode)
 {
        struct isis_area *area;
@@ -1158,7 +1083,7 @@ static int isis_instance_redistribute_ipv6_delete(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        level = yang_dnode_get_enum(dnode, "./level");
        type = yang_dnode_get_enum(dnode, "./protocol");
        isis_redist_unset(area, level, AF_INET6, type);
@@ -1179,7 +1104,7 @@ isis_instance_redistribute_ipv6_route_map_modify(enum nb_event event,
 }
 
 static int
-isis_instance_redistribute_ipv6_route_map_delete(enum nb_event event,
+isis_instance_redistribute_ipv6_route_map_destroy(enum nb_event event,
                                                 const struct lyd_node *dnode)
 {
        /* It's all done by redistribute_apply_finish */
@@ -1198,14 +1123,6 @@ isis_instance_redistribute_ipv6_metric_modify(enum nb_event event,
        return NB_OK;
 }
 
-static int
-isis_instance_redistribute_ipv6_metric_delete(enum nb_event event,
-                                             const struct lyd_node *dnode)
-{
-       /* It's all done by redistribute_apply_finish */
-       return NB_OK;
-}
-
 /*
  * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast
  */
@@ -1229,7 +1146,7 @@ static int isis_multi_topology_common(enum nb_event event,
        case NB_EV_ABORT:
                break;
        case NB_EV_APPLY:
-               area = yang_dnode_get_entry(dnode, true);
+               area = nb_running_get_entry(dnode, NULL, true);
                setting = area_get_mt_setting(area, mtid);
                setting->enabled = create;
                lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
@@ -1241,8 +1158,7 @@ static int isis_multi_topology_common(enum nb_event event,
 
 static int isis_multi_topology_overload_common(enum nb_event event,
                                               const struct lyd_node *dnode,
-                                              const char *topology,
-                                              bool create)
+                                              const char *topology)
 {
        struct isis_area *area;
        struct isis_area_mt_setting *setting;
@@ -1252,9 +1168,9 @@ static int isis_multi_topology_overload_common(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
+       area = nb_running_get_entry(dnode, NULL, true);
        setting = area_get_mt_setting(area, mtid);
-       setting->overload = create;
+       setting->overload = yang_dnode_get_bool(dnode, NULL);
        if (setting->enabled)
                lsp_regenerate_schedule(area, IS_LEVEL_1 | IS_LEVEL_2, 0);
 
@@ -1270,7 +1186,7 @@ isis_instance_multi_topology_ipv4_multicast_create(enum nb_event event,
 }
 
 static int
-isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event,
+isis_instance_multi_topology_ipv4_multicast_destroy(enum nb_event event,
                                                   const struct lyd_node *dnode)
 {
        return isis_multi_topology_common(event, dnode, "ipv4-multicast",
@@ -1280,19 +1196,12 @@ isis_instance_multi_topology_ipv4_multicast_delete(enum nb_event event,
 /*
  * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload
  */
-static int isis_instance_multi_topology_ipv4_multicast_overload_create(
+static int isis_instance_multi_topology_ipv4_multicast_overload_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
        return isis_multi_topology_overload_common(event, dnode,
-                                                  "ipv4-multicast", true);
-}
-
-static int isis_instance_multi_topology_ipv4_multicast_overload_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       return isis_multi_topology_overload_common(event, dnode,
-                                                  "ipv4-multicast", false);
+                                                  "ipv4-multicast");
 }
 
 /*
@@ -1305,7 +1214,7 @@ static int isis_instance_multi_topology_ipv4_management_create(
        return isis_multi_topology_common(event, dnode, "ipv4-mgmt", true);
 }
 
-static int isis_instance_multi_topology_ipv4_management_delete(
+static int isis_instance_multi_topology_ipv4_management_destroy(
        enum nb_event event, const struct lyd_node *dnode)
 {
        return isis_multi_topology_common(event, dnode, "ipv4-mgmt", false);
@@ -1314,19 +1223,11 @@ static int isis_instance_multi_topology_ipv4_management_delete(
 /*
  * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-management/overload
  */
-static int isis_instance_multi_topology_ipv4_management_overload_create(
+static int isis_instance_multi_topology_ipv4_management_overload_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
-       return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt",
-                                                  true);
-}
-
-static int isis_instance_multi_topology_ipv4_management_overload_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt",
-                                                  false);
+       return isis_multi_topology_overload_common(event, dnode, "ipv4-mgmt");
 }
 
 /*
@@ -1341,7 +1242,7 @@ isis_instance_multi_topology_ipv6_unicast_create(enum nb_event event,
 }
 
 static int
-isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event,
+isis_instance_multi_topology_ipv6_unicast_destroy(enum nb_event event,
                                                 const struct lyd_node *dnode)
 {
        return isis_multi_topology_common(event, dnode, "ipv6-unicast", false);
@@ -1350,19 +1251,12 @@ isis_instance_multi_topology_ipv6_unicast_delete(enum nb_event event,
 /*
  * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload
  */
-static int isis_instance_multi_topology_ipv6_unicast_overload_create(
+static int isis_instance_multi_topology_ipv6_unicast_overload_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
-       return isis_multi_topology_overload_common(event, dnode, "ipv6-unicast",
-                                                  true);
-}
-
-static int isis_instance_multi_topology_ipv6_unicast_overload_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       return isis_multi_topology_overload_common(event, dnode, "ipv6-unicast",
-                                                  false);
+       return isis_multi_topology_overload_common(event, dnode,
+                                                  "ipv6-unicast");
 }
 
 /*
@@ -1377,7 +1271,7 @@ isis_instance_multi_topology_ipv6_multicast_create(enum nb_event event,
 }
 
 static int
-isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event,
+isis_instance_multi_topology_ipv6_multicast_destroy(enum nb_event event,
                                                   const struct lyd_node *dnode)
 {
        return isis_multi_topology_common(event, dnode, "ipv6-multicast",
@@ -1387,19 +1281,12 @@ isis_instance_multi_topology_ipv6_multicast_delete(enum nb_event event,
 /*
  * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload
  */
-static int isis_instance_multi_topology_ipv6_multicast_overload_create(
+static int isis_instance_multi_topology_ipv6_multicast_overload_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
        return isis_multi_topology_overload_common(event, dnode,
-                                                  "ipv6-multicast", true);
-}
-
-static int isis_instance_multi_topology_ipv6_multicast_overload_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       return isis_multi_topology_overload_common(event, dnode,
-                                                  "ipv6-multicast", false);
+                                                  "ipv6-multicast");
 }
 
 /*
@@ -1412,7 +1299,7 @@ static int isis_instance_multi_topology_ipv6_management_create(
        return isis_multi_topology_common(event, dnode, "ipv6-mgmt", true);
 }
 
-static int isis_instance_multi_topology_ipv6_management_delete(
+static int isis_instance_multi_topology_ipv6_management_destroy(
        enum nb_event event, const struct lyd_node *dnode)
 {
        return isis_multi_topology_common(event, dnode, "ipv6-mgmt", false);
@@ -1421,19 +1308,11 @@ static int isis_instance_multi_topology_ipv6_management_delete(
 /*
  * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-management/overload
  */
-static int isis_instance_multi_topology_ipv6_management_overload_create(
+static int isis_instance_multi_topology_ipv6_management_overload_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
-       return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt",
-                                                  true);
-}
-
-static int isis_instance_multi_topology_ipv6_management_overload_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt",
-                                                  false);
+       return isis_multi_topology_overload_common(event, dnode, "ipv6-mgmt");
 }
 
 /*
@@ -1448,7 +1327,7 @@ isis_instance_multi_topology_ipv6_dstsrc_create(enum nb_event event,
 }
 
 static int
-isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event,
+isis_instance_multi_topology_ipv6_dstsrc_destroy(enum nb_event event,
                                                const struct lyd_node *dnode)
 {
        return isis_multi_topology_common(event, dnode, "ipv6-dstsrc", false);
@@ -1457,69 +1336,68 @@ isis_instance_multi_topology_ipv6_dstsrc_delete(enum nb_event event,
 /*
  * XPath: /frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload
  */
-static int isis_instance_multi_topology_ipv6_dstsrc_overload_create(
+static int isis_instance_multi_topology_ipv6_dstsrc_overload_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
-       return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc",
-                                                  true);
-}
-
-static int isis_instance_multi_topology_ipv6_dstsrc_overload_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc",
-                                                  false);
+       return isis_multi_topology_overload_common(event, dnode, "ipv6-dstsrc");
 }
 
 /*
  * XPath: /frr-isisd:isis/instance/log-adjacency-changes
  */
 static int
-isis_instance_log_adjacency_changes_create(enum nb_event event,
+isis_instance_log_adjacency_changes_modify(enum nb_event event,
                                           const struct lyd_node *dnode,
                                           union nb_resource *resource)
 {
        struct isis_area *area;
+       bool log = yang_dnode_get_bool(dnode, NULL);
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       area = yang_dnode_get_entry(dnode, true);
-       area->log_adj_changes = 1;
-
-       return NB_OK;
-}
-
-static int
-isis_instance_log_adjacency_changes_delete(enum nb_event event,
-                                          const struct lyd_node *dnode)
-{
-       struct isis_area *area;
-
-       if (event != NB_EV_APPLY)
-               return NB_OK;
-
-       area = yang_dnode_get_entry(dnode, true);
-       area->log_adj_changes = 0;
+       area = nb_running_get_entry(dnode, NULL, true);
+       area->log_adj_changes = log ? 1 : 0;
 
        return NB_OK;
 }
 
 /*
- * XPath: /frr-isisd:isis/mpls-te
+ * XPath: /frr-isisd:isis/instance/mpls-te
  */
-static int isis_mpls_te_create(enum nb_event event,
+static int isis_instance_mpls_te_create(enum nb_event event,
                               const struct lyd_node *dnode,
                               union nb_resource *resource)
 {
        struct listnode *node;
+       struct isis_area *area;
        struct isis_circuit *circuit;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       isisMplsTE.status = enable;
+       area = nb_running_get_entry(dnode, NULL, true);
+       if (area->mta == NULL) {
+
+               struct mpls_te_area *new;
+
+               zlog_debug("ISIS MPLS-TE: Initialize area %s",
+                       area->area_tag);
+
+               new = XCALLOC(MTYPE_ISIS_MPLS_TE, sizeof(struct mpls_te_area));
+
+               /* Initialize MPLS_TE structure */
+               new->status = enable;
+               new->level = 0;
+               new->inter_as = off;
+               new->interas_areaid.s_addr = 0;
+               new->router_id.s_addr = 0;
+
+               area->mta = new;
+       } else {
+               area->mta->status = enable;
+       }
 
        /*
         * Following code is intended to handle two cases;
@@ -1529,11 +1407,11 @@ static int isis_mpls_te_create(enum nb_event event,
         * MPLS_TE flag
         * 2) MPLS-TE was once enabled then disabled, and now enabled again.
         */
-       for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
+       for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
                if (circuit->mtc == NULL || IS_FLOOD_AS(circuit->mtc->type))
                        continue;
 
-               if ((circuit->mtc->status == disable)
+               if (!IS_MPLS_TE(circuit->mtc)
                    && HAS_LINK_PARAMS(circuit->interface))
                        circuit->mtc->status = enable;
                else
@@ -1548,19 +1426,24 @@ static int isis_mpls_te_create(enum nb_event event,
        return NB_OK;
 }
 
-static int isis_mpls_te_delete(enum nb_event event,
+static int isis_instance_mpls_te_destroy(enum nb_event event,
                               const struct lyd_node *dnode)
 {
        struct listnode *node;
+       struct isis_area *area;
        struct isis_circuit *circuit;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       isisMplsTE.status = disable;
+       area = nb_running_get_entry(dnode, NULL, true);
+       if (IS_MPLS_TE(area->mta))
+               area->mta->status = disable;
+       else
+               return NB_OK;
 
        /* Flush LSP if circuit engage */
-       for (ALL_LIST_ELEMENTS_RO(isisMplsTE.cir_list, node, circuit)) {
+       for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
                if (circuit->mtc == NULL || (circuit->mtc->status == disable))
                        continue;
 
@@ -1577,55 +1460,53 @@ static int isis_mpls_te_delete(enum nb_event event,
 }
 
 /*
- * XPath: /frr-isisd:isis/mpls-te/router-address
+ * XPath: /frr-isisd:isis/instance/mpls-te/router-address
  */
-static int isis_mpls_te_router_address_modify(enum nb_event event,
+static int isis_instance_mpls_te_router_address_modify(enum nb_event event,
                                              const struct lyd_node *dnode,
                                              union nb_resource *resource)
 {
        struct in_addr value;
-       struct listnode *node;
        struct isis_area *area;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       yang_dnode_get_ipv4(&value, dnode, NULL);
-       isisMplsTE.router_id.s_addr = value.s_addr;
+       area = nb_running_get_entry(dnode, NULL, true);
        /* only proceed if MPLS-TE is enabled */
-       if (isisMplsTE.status == disable)
+       if (!IS_MPLS_TE(area->mta))
                return NB_OK;
 
-       /* Update main Router ID in isis global structure */
-       isis->router_id = value.s_addr;
+       /* Update Area Router ID */
+       yang_dnode_get_ipv4(&value, dnode, NULL);
+       area->mta->router_id.s_addr = value.s_addr;
+
        /* And re-schedule LSP update */
-       for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
-               if (listcount(area->area_addrs) > 0)
-                       lsp_regenerate_schedule(area, area->is_type, 0);
+       if (listcount(area->area_addrs) > 0)
+               lsp_regenerate_schedule(area, area->is_type, 0);
 
        return NB_OK;
 }
 
-static int isis_mpls_te_router_address_delete(enum nb_event event,
+static int isis_instance_mpls_te_router_address_destroy(enum nb_event event,
                                              const struct lyd_node *dnode)
 {
-       struct listnode *node;
        struct isis_area *area;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       isisMplsTE.router_id.s_addr = INADDR_ANY;
+       area = nb_running_get_entry(dnode, NULL, true);
        /* only proceed if MPLS-TE is enabled */
-       if (isisMplsTE.status == disable)
+       if (!IS_MPLS_TE(area->mta))
                return NB_OK;
 
-       /* Update main Router ID in isis global structure */
-       isis->router_id = 0;
+       /* Reset Area Router ID */
+       area->mta->router_id.s_addr = INADDR_ANY;
+
        /* And re-schedule LSP update */
-       for (ALL_LIST_ELEMENTS_RO(isis->area_list, node, area))
-               if (listcount(area->area_addrs) > 0)
-                       lsp_regenerate_schedule(area, area->is_type, 0);
+       if (listcount(area->area_addrs) > 0)
+               lsp_regenerate_schedule(area, area->is_type, 0);
 
        return NB_OK;
 }
@@ -1659,15 +1540,15 @@ static int lib_interface_isis_create(enum nb_event event,
                abort();
        }
 
-       ifp = yang_dnode_get_entry(dnode, true);
+       ifp = nb_running_get_entry(dnode, NULL, true);
        circuit = isis_circuit_create(area, ifp);
        assert(circuit->state == C_STATE_CONF || circuit->state == C_STATE_UP);
-       yang_dnode_set_entry(dnode, circuit);
+       nb_running_set_entry(dnode, circuit);
 
        return NB_OK;
 }
 
-static int lib_interface_isis_delete(enum nb_event event,
+static int lib_interface_isis_destroy(enum nb_event event,
                                     const struct lyd_node *dnode)
 {
        struct isis_circuit *circuit;
@@ -1675,7 +1556,7 @@ static int lib_interface_isis_delete(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_unset_entry(dnode);
        if (!circuit)
                return NB_ERR_INCONSISTENCY;
        /* delete circuit through csm changes */
@@ -1771,7 +1652,7 @@ static int lib_interface_isis_circuit_type_modify(enum nb_event event,
        case NB_EV_ABORT:
                break;
        case NB_EV_APPLY:
-               circuit = yang_dnode_get_entry(dnode, true);
+               circuit = nb_running_get_entry(dnode, NULL, true);
                isis_circuit_is_type_set(circuit, circ_type);
                break;
        }
@@ -1782,37 +1663,20 @@ static int lib_interface_isis_circuit_type_modify(enum nb_event event,
 /*
  * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv4-routing
  */
-static int lib_interface_isis_ipv4_routing_create(enum nb_event event,
+static int lib_interface_isis_ipv4_routing_modify(enum nb_event event,
                                                  const struct lyd_node *dnode,
                                                  union nb_resource *resource)
 {
-       bool ipv6;
+       bool ipv4, ipv6;
        struct isis_circuit *circuit;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
-       ipv6 = yang_dnode_exists(dnode, "../ipv6-routing");
-       isis_circuit_af_set(circuit, true, ipv6);
-
-       return NB_OK;
-}
-
-static int lib_interface_isis_ipv4_routing_delete(enum nb_event event,
-                                                 const struct lyd_node *dnode)
-{
-       bool ipv6;
-       struct isis_circuit *circuit;
-
-       if (event != NB_EV_APPLY)
-               return NB_OK;
-
-       circuit = yang_dnode_get_entry(dnode, true);
-       if (circuit && circuit->area) {
-               ipv6 = yang_dnode_exists(dnode, "../ipv6-routing");
-               isis_circuit_af_set(circuit, false, ipv6);
-       }
+       circuit = nb_running_get_entry(dnode, NULL, true);
+       ipv4 = yang_dnode_get_bool(dnode, NULL);
+       ipv6 = yang_dnode_get_bool(dnode, "../ipv6-routing");
+       isis_circuit_af_set(circuit, ipv4, ipv6);
 
        return NB_OK;
 }
@@ -1820,37 +1684,20 @@ static int lib_interface_isis_ipv4_routing_delete(enum nb_event event,
 /*
  * XPath: /frr-interface:lib/interface/frr-isisd:isis/ipv6-routing
  */
-static int lib_interface_isis_ipv6_routing_create(enum nb_event event,
+static int lib_interface_isis_ipv6_routing_modify(enum nb_event event,
                                                  const struct lyd_node *dnode,
                                                  union nb_resource *resource)
 {
-       bool ipv4;
+       bool ipv4, ipv6;
        struct isis_circuit *circuit;
 
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
-       ipv4 = yang_dnode_exists(dnode, "../ipv6-routing");
-       isis_circuit_af_set(circuit, ipv4, true);
-
-       return NB_OK;
-}
-
-static int lib_interface_isis_ipv6_routing_delete(enum nb_event event,
-                                                 const struct lyd_node *dnode)
-{
-       bool ipv4;
-       struct isis_circuit *circuit;
-
-       if (event != NB_EV_APPLY)
-               return NB_OK;
-
-       circuit = yang_dnode_get_entry(dnode, true);
-       if (circuit->area) {
-               ipv4 = yang_dnode_exists(dnode, "../ipv4-routing");
-               isis_circuit_af_set(circuit, ipv4, false);
-       }
+       circuit = nb_running_get_entry(dnode, NULL, true);
+       ipv4 = yang_dnode_exists(dnode, "../ipv4-routing");
+       ipv6 = yang_dnode_get_bool(dnode, NULL);
+       isis_circuit_af_set(circuit, ipv4, ipv6);
 
        return NB_OK;
 }
@@ -1868,7 +1715,7 @@ lib_interface_isis_csnp_interval_level_1_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        circuit->csnp_interval[0] = yang_dnode_get_uint16(dnode, NULL);
 
        return NB_OK;
@@ -1887,7 +1734,7 @@ lib_interface_isis_csnp_interval_level_2_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        circuit->csnp_interval[1] = yang_dnode_get_uint16(dnode, NULL);
 
        return NB_OK;
@@ -1906,7 +1753,7 @@ lib_interface_isis_psnp_interval_level_1_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        circuit->psnp_interval[0] = yang_dnode_get_uint16(dnode, NULL);
 
        return NB_OK;
@@ -1925,7 +1772,7 @@ lib_interface_isis_psnp_interval_level_2_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        circuit->psnp_interval[1] = yang_dnode_get_uint16(dnode, NULL);
 
        return NB_OK;
@@ -1943,7 +1790,7 @@ static int lib_interface_isis_hello_padding_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        circuit->pad_hellos = yang_dnode_get_bool(dnode, NULL);
 
        return NB_OK;
@@ -1963,7 +1810,7 @@ lib_interface_isis_hello_interval_level_1_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        interval = yang_dnode_get_uint32(dnode, NULL);
        circuit->hello_interval[0] = interval;
 
@@ -1984,7 +1831,7 @@ lib_interface_isis_hello_interval_level_2_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        interval = yang_dnode_get_uint32(dnode, NULL);
        circuit->hello_interval[1] = interval;
 
@@ -2005,7 +1852,7 @@ lib_interface_isis_hello_multiplier_level_1_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        multi = yang_dnode_get_uint16(dnode, NULL);
        circuit->hello_multiplier[0] = multi;
 
@@ -2026,7 +1873,7 @@ lib_interface_isis_hello_multiplier_level_2_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        multi = yang_dnode_get_uint16(dnode, NULL);
        circuit->hello_multiplier[1] = multi;
 
@@ -2047,7 +1894,7 @@ lib_interface_isis_metric_level_1_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        met = yang_dnode_get_uint32(dnode, NULL);
        isis_circuit_metric_set(circuit, IS_LEVEL_1, met);
 
@@ -2068,7 +1915,7 @@ lib_interface_isis_metric_level_2_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        met = yang_dnode_get_uint32(dnode, NULL);
        isis_circuit_metric_set(circuit, IS_LEVEL_2, met);
 
@@ -2088,7 +1935,7 @@ lib_interface_isis_priority_level_1_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        circuit->priority[0] = yang_dnode_get_uint8(dnode, NULL);
 
        return NB_OK;
@@ -2107,7 +1954,7 @@ lib_interface_isis_priority_level_2_modify(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        circuit->priority[1] = yang_dnode_get_uint8(dnode, NULL);
 
        return NB_OK;
@@ -2125,14 +1972,13 @@ static int lib_interface_isis_network_type_modify(enum nb_event event,
 
        switch (event) {
        case NB_EV_VALIDATE:
-               circuit = yang_dnode_get_entry(dnode, false);
+               circuit = nb_running_get_entry(dnode, NULL, false);
                if (!circuit)
                        break;
-               if (circuit->circ_type == CIRCUIT_T_LOOPBACK
-                   || circuit->circ_type == CIRCUIT_T_UNKNOWN) {
+               if (circuit->circ_type == CIRCUIT_T_LOOPBACK) {
                        flog_warn(
                                EC_LIB_NB_CB_CONFIG_VALIDATE,
-                               "Cannot change network type on unknown or loopback interface");
+                               "Cannot change network type on loopback interface");
                        return NB_ERR_VALIDATION;
                }
                if (net_type == CIRCUIT_T_BROADCAST
@@ -2148,7 +1994,7 @@ static int lib_interface_isis_network_type_modify(enum nb_event event,
        case NB_EV_ABORT:
                break;
        case NB_EV_APPLY:
-               circuit = yang_dnode_get_entry(dnode, true);
+               circuit = nb_running_get_entry(dnode, NULL, true);
                isis_circuit_circ_type_set(circuit, net_type);
                break;
        }
@@ -2156,76 +2002,44 @@ static int lib_interface_isis_network_type_modify(enum nb_event event,
        return NB_OK;
 }
 
-static int lib_interface_isis_network_type_delete(enum nb_event event,
-                                                 const struct lyd_node *dnode)
-{
-       /* FIXME: This cannot be done in FRR. Not sure what the intended
-        * behavior is.
-        */
-       return NB_OK;
-}
-
 /*
  * XPath: /frr-interface:lib/interface/frr-isisd:isis/passive
  */
-static int lib_interface_isis_passive_create(enum nb_event event,
+static int lib_interface_isis_passive_modify(enum nb_event event,
                                             const struct lyd_node *dnode,
                                             union nb_resource *resource)
 {
        struct isis_circuit *circuit;
        struct isis_area *area;
-
-       if (event != NB_EV_APPLY)
-               return NB_OK;
-
-       circuit = yang_dnode_get_entry(dnode, true);
-       if (circuit->state != C_STATE_UP) {
-               circuit->is_passive = true;
-       } else {
-               area = circuit->area;
-               isis_csm_state_change(ISIS_DISABLE, circuit, area);
-               circuit->is_passive = true;
-               isis_csm_state_change(ISIS_ENABLE, circuit, area);
-       }
-
-       return NB_OK;
-}
-
-static int lib_interface_isis_passive_delete(enum nb_event event,
-                                            const struct lyd_node *dnode)
-{
-       struct isis_circuit *circuit;
-       struct isis_area *area;
        struct interface *ifp;
+       bool passive = yang_dnode_get_bool(dnode, NULL);
 
-       switch (event) {
-       case NB_EV_VALIDATE:
-               circuit = yang_dnode_get_entry(dnode, false);
+       /* validation only applies if we are setting passive to false */
+       if (!passive && event == NB_EV_VALIDATE) {
+               circuit = nb_running_get_entry(dnode, NULL, false);
                if (!circuit)
-                       break;
+                       return NB_OK;
                ifp = circuit->interface;
                if (!ifp)
-                       break;
+                       return NB_OK;
                if (if_is_loopback(ifp)) {
                        flog_warn(EC_LIB_NB_CB_CONFIG_VALIDATE,
                                  "Loopback is always passive");
                        return NB_ERR_VALIDATION;
                }
-               break;
-       case NB_EV_PREPARE:
-       case NB_EV_ABORT:
-               break;
-       case NB_EV_APPLY:
-               circuit = yang_dnode_get_entry(dnode, true);
-               if (circuit->state != C_STATE_UP) {
-                       circuit->is_passive = false;
-               } else {
-                       area = circuit->area;
-                       isis_csm_state_change(ISIS_DISABLE, circuit, area);
-                       circuit->is_passive = false;
-                       isis_csm_state_change(ISIS_ENABLE, circuit, area);
-               }
-               break;
+       }
+
+       if (event != NB_EV_APPLY)
+               return NB_OK;
+
+       circuit = nb_running_get_entry(dnode, NULL, true);
+       if (circuit->state != C_STATE_UP) {
+               circuit->is_passive = passive;
+       } else {
+               area = circuit->area;
+               isis_csm_state_change(ISIS_DISABLE, circuit, area);
+               circuit->is_passive = passive;
+               isis_csm_state_change(ISIS_ENABLE, circuit, area);
        }
 
        return NB_OK;
@@ -2241,7 +2055,7 @@ static int lib_interface_isis_password_create(enum nb_event event,
        return NB_OK;
 }
 
-static int lib_interface_isis_password_delete(enum nb_event event,
+static int lib_interface_isis_password_destroy(enum nb_event event,
                                              const struct lyd_node *dnode)
 {
        struct isis_circuit *circuit;
@@ -2249,7 +2063,7 @@ static int lib_interface_isis_password_delete(enum nb_event event,
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        isis_circuit_passwd_unset(circuit);
 
        return NB_OK;
@@ -2270,9 +2084,9 @@ lib_interface_isis_password_password_modify(enum nb_event event,
                return NB_OK;
 
        password = yang_dnode_get_string(dnode, NULL);
-       circuit = yang_dnode_get_entry(dnode, true);
-       circuit->passwd.len = strlen(password);
-       strncpy((char *)circuit->passwd.passwd, password, 255);
+       circuit = nb_running_get_entry(dnode, NULL, true);
+
+       isis_circuit_passwd_set(circuit, circuit->passwd.type, password);
 
        return NB_OK;
 }
@@ -2292,7 +2106,7 @@ lib_interface_isis_password_password_type_modify(enum nb_event event,
                return NB_OK;
 
        pass_type = yang_dnode_get_enum(dnode, NULL);
-       circuit = yang_dnode_get_entry(dnode, true);
+       circuit = nb_running_get_entry(dnode, NULL, true);
        circuit->passwd.type = pass_type;
 
        return NB_OK;
@@ -2302,7 +2116,7 @@ lib_interface_isis_password_password_type_modify(enum nb_event event,
  * XPath:
  * /frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake
  */
-static int lib_interface_isis_disable_three_way_handshake_create(
+static int lib_interface_isis_disable_three_way_handshake_modify(
        enum nb_event event, const struct lyd_node *dnode,
        union nb_resource *resource)
 {
@@ -2311,22 +2125,8 @@ static int lib_interface_isis_disable_three_way_handshake_create(
        if (event != NB_EV_APPLY)
                return NB_OK;
 
-       circuit = yang_dnode_get_entry(dnode, true);
-       circuit->disable_threeway_adj = true;
-
-       return NB_OK;
-}
-
-static int lib_interface_isis_disable_three_way_handshake_delete(
-       enum nb_event event, const struct lyd_node *dnode)
-{
-       struct isis_circuit *circuit;
-
-       if (event != NB_EV_APPLY)
-               return NB_OK;
-
-       circuit = yang_dnode_get_entry(dnode, true);
-       circuit->disable_threeway_adj = false;
+       circuit = nb_running_get_entry(dnode, NULL, true);
+       circuit->disable_threeway_adj = yang_dnode_get_bool(dnode, NULL);
 
        return NB_OK;
 }
@@ -2343,7 +2143,7 @@ static int lib_interface_isis_multi_topology_common(
 
        switch (event) {
        case NB_EV_VALIDATE:
-               circuit = yang_dnode_get_entry(dnode, false);
+               circuit = nb_running_get_entry(dnode, NULL, false);
                if (circuit && circuit->area && circuit->area->oldmetric) {
                        flog_warn(
                                EC_LIB_NB_CB_CONFIG_VALIDATE,
@@ -2355,7 +2155,7 @@ static int lib_interface_isis_multi_topology_common(
        case NB_EV_ABORT:
                break;
        case NB_EV_APPLY:
-               circuit = yang_dnode_get_entry(dnode, true);
+               circuit = nb_running_get_entry(dnode, NULL, true);
                value = yang_dnode_get_bool(dnode, NULL);
                isis_circuit_mt_enabled_set(circuit, mtid, value);
                break;
@@ -2913,6 +2713,28 @@ void isis_notif_seqno_skipped(const struct isis_circuit *circuit,
        nb_notification_send(xpath, arguments);
 }
 
+/*
+ * XPath:
+ * /frr-isisd:own-lsp-purge
+ */
+void isis_notif_own_lsp_purge(const struct isis_circuit *circuit,
+                             const char *lsp_id)
+{
+       const char *xpath = "/frr-isisd:own-lsp-purge";
+       struct list *arguments = yang_data_list_new();
+       char xpath_arg[XPATH_MAXLEN];
+       struct yang_data *data;
+       struct isis_area *area = circuit->area;
+
+       notif_prep_instance_hdr(xpath, area, "default", arguments);
+       notif_prepr_iface_hdr(xpath, circuit, arguments);
+       snprintf(xpath_arg, sizeof(xpath_arg), "%s/lsp-id", xpath);
+       data = yang_data_new_string(xpath_arg, lsp_id);
+       listnode_add(arguments, data);
+
+       nb_notification_send(xpath, arguments);
+}
+
 /* clang-format off */
 const struct frr_yang_module_info frr_isisd_info = {
        .name = "frr-isisd",
@@ -2920,7 +2742,7 @@ const struct frr_yang_module_info frr_isisd_info = {
                {
                        .xpath = "/frr-isisd:isis/instance",
                        .cbs.create = isis_instance_create,
-                       .cbs.delete = isis_instance_delete,
+                       .cbs.destroy = isis_instance_destroy,
                        .cbs.cli_show = cli_show_router_isis,
                        .priority = NB_DFLT_PRIORITY - 1,
                },
@@ -2932,7 +2754,7 @@ const struct frr_yang_module_info frr_isisd_info = {
                {
                        .xpath = "/frr-isisd:isis/instance/area-address",
                        .cbs.create = isis_instance_area_address_create,
-                       .cbs.delete = isis_instance_area_address_delete,
+                       .cbs.destroy = isis_instance_area_address_destroy,
                        .cbs.cli_show = cli_show_isis_area_address,
                },
                {
@@ -2942,14 +2764,12 @@ const struct frr_yang_module_info frr_isisd_info = {
                },
                {
                        .xpath = "/frr-isisd:isis/instance/attached",
-                       .cbs.create = isis_instance_attached_create,
-                       .cbs.delete = isis_instance_attached_delete,
+                       .cbs.modify = isis_instance_attached_modify,
                        .cbs.cli_show = cli_show_isis_attached,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/overload",
-                       .cbs.create = isis_instance_overload_create,
-                       .cbs.delete = isis_instance_overload_delete,
+                       .cbs.modify = isis_instance_overload_modify,
                        .cbs.cli_show = cli_show_isis_overload,
                },
                {
@@ -2959,8 +2779,7 @@ const struct frr_yang_module_info frr_isisd_info = {
                },
                {
                        .xpath = "/frr-isisd:isis/instance/purge-originator",
-                       .cbs.create = isis_instance_purge_originator_create,
-                       .cbs.delete = isis_instance_purge_originator_delete,
+                       .cbs.modify = isis_instance_purge_originator_modify,
                        .cbs.cli_show = cli_show_isis_purge_origin,
                },
                {
@@ -3007,7 +2826,7 @@ const struct frr_yang_module_info frr_isisd_info = {
                {
                        .xpath = "/frr-isisd:isis/instance/spf/ietf-backoff-delay",
                        .cbs.create = isis_instance_spf_ietf_backoff_delay_create,
-                       .cbs.delete = isis_instance_spf_ietf_backoff_delay_delete,
+                       .cbs.destroy = isis_instance_spf_ietf_backoff_delay_destroy,
                        .cbs.apply_finish = ietf_backoff_delay_apply_finish,
                        .cbs.cli_show = cli_show_isis_spf_ietf_backoff,
                },
@@ -3046,7 +2865,7 @@ const struct frr_yang_module_info frr_isisd_info = {
                {
                        .xpath = "/frr-isisd:isis/instance/area-password",
                        .cbs.create = isis_instance_area_password_create,
-                       .cbs.delete = isis_instance_area_password_delete,
+                       .cbs.destroy = isis_instance_area_password_destroy,
                        .cbs.apply_finish = area_password_apply_finish,
                        .cbs.cli_show = cli_show_isis_area_pwd,
                },
@@ -3065,7 +2884,7 @@ const struct frr_yang_module_info frr_isisd_info = {
                {
                        .xpath = "/frr-isisd:isis/instance/domain-password",
                        .cbs.create = isis_instance_domain_password_create,
-                       .cbs.delete = isis_instance_domain_password_delete,
+                       .cbs.destroy = isis_instance_domain_password_destroy,
                        .cbs.apply_finish = domain_password_apply_finish,
                        .cbs.cli_show = cli_show_isis_domain_pwd,
                },
@@ -3084,169 +2903,156 @@ const struct frr_yang_module_info frr_isisd_info = {
                {
                        .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4",
                        .cbs.create = isis_instance_default_information_originate_ipv4_create,
-                       .cbs.delete = isis_instance_default_information_originate_ipv4_delete,
+                       .cbs.destroy = isis_instance_default_information_originate_ipv4_destroy,
                        .cbs.apply_finish = default_info_origin_ipv4_apply_finish,
                        .cbs.cli_show = cli_show_isis_def_origin_ipv4,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/always",
-                       .cbs.create = isis_instance_default_information_originate_ipv4_always_create,
-                       .cbs.delete = isis_instance_default_information_originate_ipv4_always_delete,
+                       .cbs.modify = isis_instance_default_information_originate_ipv4_always_modify,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/route-map",
                        .cbs.modify = isis_instance_default_information_originate_ipv4_route_map_modify,
-                       .cbs.delete = isis_instance_default_information_originate_ipv4_route_map_delete,
+                       .cbs.destroy = isis_instance_default_information_originate_ipv4_route_map_destroy,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/metric",
                        .cbs.modify = isis_instance_default_information_originate_ipv4_metric_modify,
-                       .cbs.delete = isis_instance_default_information_originate_ipv4_metric_delete,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6",
                        .cbs.create = isis_instance_default_information_originate_ipv6_create,
-                       .cbs.delete = isis_instance_default_information_originate_ipv6_delete,
+                       .cbs.destroy = isis_instance_default_information_originate_ipv6_destroy,
                        .cbs.apply_finish = default_info_origin_ipv6_apply_finish,
                        .cbs.cli_show = cli_show_isis_def_origin_ipv6,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/always",
-                       .cbs.create = isis_instance_default_information_originate_ipv6_always_create,
-                       .cbs.delete = isis_instance_default_information_originate_ipv6_always_delete,
+                       .cbs.modify = isis_instance_default_information_originate_ipv6_always_modify,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/route-map",
                        .cbs.modify = isis_instance_default_information_originate_ipv6_route_map_modify,
-                       .cbs.delete = isis_instance_default_information_originate_ipv6_route_map_delete,
+                       .cbs.destroy = isis_instance_default_information_originate_ipv6_route_map_destroy,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/metric",
                        .cbs.modify = isis_instance_default_information_originate_ipv6_metric_modify,
-                       .cbs.delete = isis_instance_default_information_originate_ipv6_metric_delete,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/redistribute/ipv4",
                        .cbs.create = isis_instance_redistribute_ipv4_create,
-                       .cbs.delete = isis_instance_redistribute_ipv4_delete,
+                       .cbs.destroy = isis_instance_redistribute_ipv4_destroy,
                        .cbs.apply_finish = redistribute_ipv4_apply_finish,
                        .cbs.cli_show = cli_show_isis_redistribute_ipv4,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/route-map",
                        .cbs.modify = isis_instance_redistribute_ipv4_route_map_modify,
-                       .cbs.delete = isis_instance_redistribute_ipv4_route_map_delete,
+                       .cbs.destroy = isis_instance_redistribute_ipv4_route_map_destroy,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/metric",
                        .cbs.modify = isis_instance_redistribute_ipv4_metric_modify,
-                       .cbs.delete = isis_instance_redistribute_ipv4_metric_delete,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/redistribute/ipv6",
                        .cbs.create = isis_instance_redistribute_ipv6_create,
-                       .cbs.delete = isis_instance_redistribute_ipv6_delete,
+                       .cbs.destroy = isis_instance_redistribute_ipv6_destroy,
                        .cbs.apply_finish = redistribute_ipv6_apply_finish,
                        .cbs.cli_show = cli_show_isis_redistribute_ipv6,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/route-map",
                        .cbs.modify = isis_instance_redistribute_ipv6_route_map_modify,
-                       .cbs.delete = isis_instance_redistribute_ipv6_route_map_delete,
+                       .cbs.destroy = isis_instance_redistribute_ipv6_route_map_destroy,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/metric",
                        .cbs.modify = isis_instance_redistribute_ipv6_metric_modify,
-                       .cbs.delete = isis_instance_redistribute_ipv6_metric_delete,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast",
                        .cbs.create = isis_instance_multi_topology_ipv4_multicast_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv4_multicast_delete,
+                       .cbs.destroy = isis_instance_multi_topology_ipv4_multicast_destroy,
                        .cbs.cli_show = cli_show_isis_mt_ipv4_multicast,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast/overload",
-                       .cbs.create = isis_instance_multi_topology_ipv4_multicast_overload_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv4_multicast_overload_delete,
+                       .cbs.modify = isis_instance_multi_topology_ipv4_multicast_overload_modify,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management",
                        .cbs.create = isis_instance_multi_topology_ipv4_management_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv4_management_delete,
+                       .cbs.destroy = isis_instance_multi_topology_ipv4_management_destroy,
                        .cbs.cli_show = cli_show_isis_mt_ipv4_mgmt,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-management/overload",
-                       .cbs.create = isis_instance_multi_topology_ipv4_management_overload_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv4_management_overload_delete,
+                       .cbs.modify = isis_instance_multi_topology_ipv4_management_overload_modify,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast",
                        .cbs.create = isis_instance_multi_topology_ipv6_unicast_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv6_unicast_delete,
+                       .cbs.destroy = isis_instance_multi_topology_ipv6_unicast_destroy,
                        .cbs.cli_show = cli_show_isis_mt_ipv6_unicast,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-unicast/overload",
-                       .cbs.create = isis_instance_multi_topology_ipv6_unicast_overload_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv6_unicast_overload_delete,
+                       .cbs.modify = isis_instance_multi_topology_ipv6_unicast_overload_modify,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast",
                        .cbs.create = isis_instance_multi_topology_ipv6_multicast_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv6_multicast_delete,
+                       .cbs.destroy = isis_instance_multi_topology_ipv6_multicast_destroy,
                        .cbs.cli_show = cli_show_isis_mt_ipv6_multicast,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-multicast/overload",
-                       .cbs.create = isis_instance_multi_topology_ipv6_multicast_overload_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv6_multicast_overload_delete,
+                       .cbs.modify = isis_instance_multi_topology_ipv6_multicast_overload_modify,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management",
                        .cbs.create = isis_instance_multi_topology_ipv6_management_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv6_management_delete,
+                       .cbs.destroy = isis_instance_multi_topology_ipv6_management_destroy,
                        .cbs.cli_show = cli_show_isis_mt_ipv6_mgmt,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-management/overload",
-                       .cbs.create = isis_instance_multi_topology_ipv6_management_overload_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv6_management_overload_delete,
+                       .cbs.modify = isis_instance_multi_topology_ipv6_management_overload_modify,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc",
                        .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_delete,
+                       .cbs.destroy = isis_instance_multi_topology_ipv6_dstsrc_destroy,
                        .cbs.cli_show = cli_show_isis_mt_ipv6_dstsrc,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/multi-topology/ipv6-dstsrc/overload",
-                       .cbs.create = isis_instance_multi_topology_ipv6_dstsrc_overload_create,
-                       .cbs.delete = isis_instance_multi_topology_ipv6_dstsrc_overload_delete,
+                       .cbs.modify = isis_instance_multi_topology_ipv6_dstsrc_overload_modify,
                },
                {
                        .xpath = "/frr-isisd:isis/instance/log-adjacency-changes",
-                       .cbs.create = isis_instance_log_adjacency_changes_create,
-                       .cbs.delete = isis_instance_log_adjacency_changes_delete,
+                       .cbs.modify = isis_instance_log_adjacency_changes_modify,
                        .cbs.cli_show = cli_show_isis_log_adjacency,
                },
                {
-                       .xpath = "/frr-isisd:isis/mpls-te",
-                       .cbs.create = isis_mpls_te_create,
-                       .cbs.delete = isis_mpls_te_delete,
+                       .xpath = "/frr-isisd:isis/instance/mpls-te",
+                       .cbs.create = isis_instance_mpls_te_create,
+                       .cbs.destroy = isis_instance_mpls_te_destroy,
                        .cbs.cli_show = cli_show_isis_mpls_te,
                },
                {
-                       .xpath = "/frr-isisd:isis/mpls-te/router-address",
-                       .cbs.modify = isis_mpls_te_router_address_modify,
-                       .cbs.delete = isis_mpls_te_router_address_delete,
+                       .xpath = "/frr-isisd:isis/instance/mpls-te/router-address",
+                       .cbs.modify = isis_instance_mpls_te_router_address_modify,
+                       .cbs.destroy = isis_instance_mpls_te_router_address_destroy,
                        .cbs.cli_show = cli_show_isis_mpls_te_router_addr,
                },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis",
                        .cbs.create = lib_interface_isis_create,
-                       .cbs.delete = lib_interface_isis_delete,
+                       .cbs.destroy = lib_interface_isis_destroy,
                },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/area-tag",
@@ -3259,14 +3065,12 @@ const struct frr_yang_module_info frr_isisd_info = {
                },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv4-routing",
-                       .cbs.create = lib_interface_isis_ipv4_routing_create,
-                       .cbs.delete = lib_interface_isis_ipv4_routing_delete,
+                       .cbs.modify = lib_interface_isis_ipv4_routing_modify,
                        .cbs.cli_show = cli_show_ip_isis_ipv4,
                },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/ipv6-routing",
-                       .cbs.create = lib_interface_isis_ipv6_routing_create,
-                       .cbs.delete = lib_interface_isis_ipv6_routing_delete,
+                       .cbs.modify = lib_interface_isis_ipv6_routing_modify,
                        .cbs.cli_show = cli_show_ip_isis_ipv6,
                },
                {
@@ -3349,19 +3153,17 @@ const struct frr_yang_module_info frr_isisd_info = {
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/network-type",
                        .cbs.modify = lib_interface_isis_network_type_modify,
-                       .cbs.delete = lib_interface_isis_network_type_delete,
                        .cbs.cli_show = cli_show_ip_isis_network_type,
                },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/passive",
-                       .cbs.create = lib_interface_isis_passive_create,
-                       .cbs.delete = lib_interface_isis_passive_delete,
+                       .cbs.modify = lib_interface_isis_passive_modify,
                        .cbs.cli_show = cli_show_ip_isis_passive,
                },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/password",
                        .cbs.create = lib_interface_isis_password_create,
-                       .cbs.delete = lib_interface_isis_password_delete,
+                       .cbs.destroy = lib_interface_isis_password_destroy,
                        .cbs.cli_show = cli_show_ip_isis_password,
                },
                {
@@ -3374,8 +3176,7 @@ const struct frr_yang_module_info frr_isisd_info = {
                },
                {
                        .xpath = "/frr-interface:lib/interface/frr-isisd:isis/disable-three-way-handshake",
-                       .cbs.create = lib_interface_isis_disable_three_way_handshake_create,
-                       .cbs.delete = lib_interface_isis_disable_three_way_handshake_delete,
+                       .cbs.modify = lib_interface_isis_disable_three_way_handshake_modify,
                        .cbs.cli_show = cli_show_ip_isis_threeway_shake,
                },
                {