diff --git a/src/nat_porttrigger.c b/src/nat_porttrigger.c
index 919ace6aad5657fb080ad2eb342c7245c6f3eb7e..2fb5f76b5b178efb37d9d95ba55d819080e56e58 100644
--- a/src/nat_porttrigger.c
+++ b/src/nat_porttrigger.c
@@ -18,52 +18,40 @@
 /*#Device.NAT.PortTrigger.{i}.!UCI:port-trigger/port_trigger/dmmap_port_trigger*/
 int browseNATPortTriggerInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
 {
-	struct uci_section *p = NULL;
-	struct dm_data data = {0};
-	char *name = NULL;
-	char *buf = NULL;
-
-	uci_foreach_sections("port-trigger", "port_trigger", p) {
-		int inst = 0;
-		dmuci_get_section_name(section_name(p),&name);
-		if (name) {
-			sscanf(name, "port_trigger_%d",&inst);
-			if (inst == 0) {
-				continue;
-			}
-			dmasprintf(&buf, "%d", inst);
-			data.config_section = p;
-			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&data, buf) == DM_STOP)
-				break;
-		}
+	struct dm_data *curr_data = NULL;
+	LIST_HEAD(dup_list);
+	char *inst = NULL;
+
+	synchronize_specific_config_sections_with_dmmap("port-trigger", "port_trigger", "dmmap_port_trigger", &dup_list);
+	list_for_each_entry(curr_data, &dup_list, list) {
+
+		inst = handle_instance(dmctx, parent_node, curr_data->dmmap_section, "port_trigger_instance", "port_trigger_alias");
+
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)curr_data, inst) == DM_STOP)
+			break;
 	}
+	free_dmmap_config_dup_list(&dup_list);
 
 	return 0;
 }
 
 static int browseNATPortTriggerRuleInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance)
 {
-	struct uci_section *p = NULL;
-	struct dm_data data = {0};
-	char *name = NULL;
-	char *buf = NULL;
-	int parent_inst = (int)strtol(prev_instance, NULL, 10);
-
-	uci_foreach_sections("port-trigger", "rule", p) {
-		int inst = 0;
-		int ptg_inst = 0;
-		dmuci_get_section_name(section_name(p), &name);
-		if (name) {
-			sscanf(name, "port_trigger_%d_rule_%d",&ptg_inst, &inst);
-			if ((inst == 0) || (ptg_inst != parent_inst))
-				continue;
-			dmasprintf(&buf, "%d", inst);
-			data.config_section = p;
-
-			if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)&data, buf) == DM_STOP)
-				break;
-		}
+	struct dm_data *curr_data = NULL;
+	LIST_HEAD(dup_list);
+	char *inst = NULL;
+
+	synchronize_specific_config_sections_with_dmmap_eq("port-trigger", "rule", "dmmap_port_trigger",
+			"port_trigger", section_name(((struct dm_data *)prev_data)->config_section), &dup_list);
+	list_for_each_entry(curr_data, &dup_list, list) {
+
+		inst = handle_instance(dmctx, parent_node, curr_data->dmmap_section, "rule_instance", "rule_alias");
+
+		if (DM_LINK_INST_OBJ(dmctx, parent_node, (void *)curr_data, inst) == DM_STOP)
+			break;
 	}
+	free_dmmap_config_dup_list(&dup_list);
+
 	return 0;
 }
 
@@ -72,16 +60,17 @@ static int browseNATPortTriggerRuleInst(struct dmctx *dmctx, DMNODE *parent_node
 **************************************************************/
 int addObjNATPortTrigger(char *refparam, struct dmctx *ctx, void *data, char **instance)
 {
-	struct uci_section *s = NULL;
-	char port_trigger_name[16] = {0};
-	char name[16] = {0};
+	struct uci_section *s = NULL, *dmmap_s = NULL;
+	char port_trigger_name[32] = {0};
 
 	snprintf(port_trigger_name, sizeof(port_trigger_name), "port_trigger_%s", *instance);
-	snprintf(name, sizeof(name), "trigger_%s", *instance);
 
 	dmuci_add_section("port-trigger", "port_trigger", &s);
 	dmuci_rename_section_by_section(s, port_trigger_name);
-	dmuci_set_value_by_section(s, "name", name);
+
+	dmuci_add_section_bbfdm("dmmap_port_trigger", "port_trigger", &dmmap_s);
+	dmuci_set_value_by_section(dmmap_s, "section_name", port_trigger_name);
+	dmuci_set_value_by_section(dmmap_s, "port_trigger_instance", *instance);
 
 	return 0;
 }
@@ -89,31 +78,37 @@ int addObjNATPortTrigger(char *refparam, struct dmctx *ctx, void *data, char **i
 int delObjNATPortTrigger(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
 {
 	struct uci_section *s = NULL, *stmp = NULL;
-	char *name = NULL;
 
-	dmuci_get_value_by_section_string(((struct dm_data *)data)->config_section, "name", &name);
-	uci_foreach_option_eq_safe("port-trigger", "rule", "port_trigger", name, stmp, s) {
+	uci_foreach_option_eq_safe("port-trigger", "rule", "port_trigger", section_name(((struct dm_data *)data)->config_section), stmp, s) {
+		struct uci_section *dmmap_s = NULL;
+
+		/* remove dmmap section related to each rule section */
+		get_dmmap_section_of_config_section("dmmap_port_trigger", "rule", section_name(s), &dmmap_s);
+		dmuci_delete_by_section(dmmap_s, NULL, NULL);
+
 		dmuci_delete_by_section(s, NULL, NULL);
 	}
 
 	dmuci_delete_by_section(((struct dm_data *)data)->config_section, NULL, NULL);
+	dmuci_delete_by_section(((struct dm_data *)data)->dmmap_section, NULL, NULL);
+
 	return 0;
 }
 
 static int addObjNATPortTriggerRule(char *refparam, struct dmctx *ctx, void *data, char **instance)
 {
-	struct uci_section *port_trigger = ((struct dm_data *)data)->config_section;
-	struct uci_section *s = NULL;
-	char s_name[50] = {0};
-	char *name = NULL;
+	struct uci_section *s = NULL, *dmmap_s = NULL;
+	char s_name[64] = {0};
 
-	snprintf(s_name, sizeof(s_name), "%s_rule_%s", section_name(port_trigger),*instance);
+	snprintf(s_name, sizeof(s_name), "%s_rule_%s", section_name(((struct dm_data *)data)->config_section), *instance);
 
 	dmuci_add_section("port-trigger", "rule", &s);
 	dmuci_rename_section_by_section(s, s_name);
+	dmuci_set_value_by_section(s, "port_trigger", section_name(((struct dm_data *)data)->config_section));
 
-	dmuci_get_value_by_section_string(((struct dm_data *)data)->config_section, "name", &name);
-	dmuci_set_value_by_section(s, "port_trigger", name);
+	dmuci_add_section_bbfdm("dmmap_port_trigger", "rule", &dmmap_s);
+	dmuci_set_value_by_section(dmmap_s, "section_name", s_name);
+	dmuci_set_value_by_section(dmmap_s, "rule_instance", *instance);
 
 	return 0;
 }
@@ -121,6 +116,7 @@ static int addObjNATPortTriggerRule(char *refparam, struct dmctx *ctx, void *dat
 static int delObjNATPortTriggerRule(char *refparam, struct dmctx *ctx, void *data, char *instance, unsigned char del_action)
 {
 	dmuci_delete_by_section(((struct dm_data *)data)->config_section, NULL, NULL);
+	dmuci_delete_by_section(((struct dm_data *)data)->dmmap_section, NULL, NULL);
 	return 0;
 }
 
@@ -137,8 +133,12 @@ int get_NAT_PortTriggerNumberOfEntries(char *refparam, struct dmctx *ctx, void *
 
 static int get_NATPortTrigger_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
 {
-	dmuci_get_section_name(section_name(((struct dm_data *)data)->config_section),value);
-	return 0;
+	return bbf_get_alias(ctx, ((struct dm_data *)data)->dmmap_section, "port_trigger_alias", instance, value);
+}
+
+static int set_NATPortTrigger_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	return bbf_set_alias(ctx, ((struct dm_data *)data)->dmmap_section, "port_trigger_alias", instance, value);
 }
 
 static int get_NATPortTrigger_Enable(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
@@ -382,8 +382,12 @@ static int get_NATPortTrigger_RuleNumberOfEntries(char *refparam, struct dmctx *
 
 static int get_NATPortTriggerRule_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
 {
-	dmuci_get_section_name(section_name(((struct dm_data *)data)->config_section),value);
-	return 0;
+	return bbf_get_alias(ctx, ((struct dm_data *)data)->dmmap_section, "rule_alias", instance, value);
+}
+
+static int set_NATPortTriggerRule_Alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
+{
+	return bbf_set_alias(ctx, ((struct dm_data *)data)->dmmap_section, "rule_alias", instance, value);
 }
 
 static int get_NATPortTriggerRule_Port(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
@@ -463,7 +467,7 @@ static int set_NATPortTriggerRule_Protocol(char *refparam, struct dmctx *ctx, vo
 
 DMLEAF tNATPortTriggerParams[] = {
 /* PARAM, permission, type, getvalue, setvalue, bbfdm_type */
-{"Alias", &DMREAD, DMT_STRING, get_NATPortTrigger_Alias, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE},
+{"Alias", &DMWRITE, DMT_STRING, get_NATPortTrigger_Alias, set_NATPortTrigger_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE},
 {"Enable", &DMWRITE, DMT_BOOL, get_NATPortTrigger_Enable, set_NATPortTrigger_Enable, BBFDM_BOTH},
 {"Status", &DMREAD, DMT_STRING, get_NATPortTrigger_Status, NULL, BBFDM_BOTH},
 {"Origin", &DMWRITE, DMT_STRING, get_NATPortTrigger_Origin, set_NATPortTrigger_Origin, BBFDM_BOTH},
@@ -481,7 +485,7 @@ DMLEAF tNATPortTriggerParams[] = {
 /* *** Device.NAT.PortTrigger.{i}.Rule.{i}. *** */
 DMLEAF tNATPortTriggerRuleParams[] = {
 /* PARAM, permission, type, getvalue, setvalue, bbfdm_type */
-{"Alias", &DMREAD, DMT_STRING, get_NATPortTriggerRule_Alias, NULL, BBFDM_BOTH, DM_FLAG_UNIQUE},
+{"Alias", &DMREAD, DMT_STRING, get_NATPortTriggerRule_Alias, set_NATPortTriggerRule_Alias, BBFDM_BOTH, DM_FLAG_UNIQUE},
 {"Port", &DMWRITE, DMT_UNINT, get_NATPortTriggerRule_Port, set_NATPortTriggerRule_Port, BBFDM_BOTH},
 {"PortEndRange", &DMWRITE, DMT_UNINT, get_NATPortTriggerRule_PortEndRange, set_NATPortTriggerRule_PortEndRange, BBFDM_BOTH},
 {"Protocol", &DMWRITE, DMT_STRING, get_NATPortTriggerRule_Protocol, set_NATPortTriggerRule_Protocol, BBFDM_BOTH},