diff --git a/bbf_plugin/atm.c b/bbf_plugin/atm.c
index 33bb5f61334d6bb137e593362ce398466a099762..a63be61c885bf29b71068625ea8629f19a218ec1 100644
--- a/bbf_plugin/atm.c
+++ b/bbf_plugin/atm.c
@@ -237,13 +237,11 @@ static int get_atm_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch
 
 		snprintf(atm_file, sizeof(atm_file), "/sys/class/net/atm%ld", DM_STRTOL(instance) - 1);
 		if (folder_exists(atm_file))
-			adm_entry_get_reference_param(ctx, "Device.DSL.Channel.*.Name", instance, value);
+			_bbfdm_get_references(ctx, "Device.DSL.Channel.", "Name", instance, value);
+
 
 		// Store LowerLayers value
 		dmuci_set_value_by_section(((struct dm_data *)data)->config_section, "LowerLayers", *value);
-	} else {
-		if (!adm_entry_object_exists(ctx, *value))
-			*value = "";
 	}
 
 	return 0;
@@ -253,7 +251,7 @@ static int set_atm_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch
 {
 	struct dm_reference reference = {0};
 
-	bbf_get_reference_args(value, &reference);
+	bbfdm_get_reference_linker(ctx, value, &reference);
 
 	switch (action) {
 		case VALUECHECK:
diff --git a/bbf_plugin/dsl.c b/bbf_plugin/dsl.c
index fbd0d099e86a23fe34d11dfe363213358d416405..bd1b7fede22f2f891b0963dedc1c939cf54fc208 100644
--- a/bbf_plugin/dsl.c
+++ b/bbf_plugin/dsl.c
@@ -876,7 +876,7 @@ static int get_DSLChannel_Name(char *refparam, struct dmctx *ctx, void *data, ch
 static int get_DSLChannel_LowerLayers(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
 {
 	char *id = dmjson_get_value(((struct dm_data *)data)->json_object, 1, "id");
-	adm_entry_get_reference_param(ctx, "Device.DSL.Line.*.Name", id, value);
+	_bbfdm_get_references(ctx, "Device.DSL.Line.", "Name", id, value);
 	return 0;
 }
 
diff --git a/bbf_plugin/ptm.c b/bbf_plugin/ptm.c
index c5f094fc0c06fd1161c22e28da1e620f775b4f44..3e995351e02777e2ba7adad670328ca1852a7653 100644
--- a/bbf_plugin/ptm.c
+++ b/bbf_plugin/ptm.c
@@ -164,26 +164,22 @@ static int get_ptm_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch
 	dmuci_get_value_by_section_string(((struct dm_data *)data)->dmmap_section, "LowerLayers", value);
 
 	if ((*value)[0] == '\0') {
+		char buf[1024] = {0};
 		char ptm_file[128] = {0};
 
-		adm_entry_get_reference_param(ctx, "Device.FAST.Line.*.Status", "Up", value);
-		if (DM_STRLEN(*value))
-			return 0;
+		bbfdm_get_references(ctx, MATCH_FIRST, "Device.FAST.Line.", "Status", "Up", buf, sizeof(buf));
 
 		snprintf(ptm_file, sizeof(ptm_file), "/sys/class/net/ptm%ld", DM_STRTOL(instance) - 1);
 		if (folder_exists(ptm_file)) {
-			adm_entry_get_reference_param(ctx, "Device.DSL.Channel.*.Name", "1", value);
-			if (DM_STRLEN(*value))
-				return 0;
+			bbfdm_get_references(ctx, MATCH_FIRST, "Device.DSL.Channel.", "Name", "1", buf, sizeof(buf));
 		}
 
-		adm_entry_get_reference_param(ctx, "Device.FAST.Line.*.Name", "1", value);
+		bbfdm_get_references(ctx, MATCH_FIRST, "Device.FAST.Line.", "Name", "1", buf, sizeof(buf));
+
+		*value = dmstrdup(buf);
 
 		// Store LowerLayers value
-		dmuci_set_value_by_section(((struct dm_data *)data)->dmmap_section, "LowerLayers", *value);
-	} else {
-		if (!adm_entry_object_exists(ctx, *value))
-			*value = "";
+		dmuci_set_value_by_section(((struct dm_data *)data)->dmmap_section, "LowerLayers", buf);
 	}
 
 	return 0;
@@ -193,7 +189,7 @@ static int set_ptm_lower_layer(char *refparam, struct dmctx *ctx, void *data, ch
 {
 	struct dm_reference reference = {0};
 
-	bbf_get_reference_args(value, &reference);
+	bbfdm_get_reference_linker(ctx, value, &reference);
 
 	switch (action) {
 		case VALUECHECK: