diff --git a/openair3/NAS/TOOLS/conf2uedata.c b/openair3/NAS/TOOLS/conf2uedata.c
index 197c6394548be8cecea66883ed178976d2b23848..44005b9dd18a178fd962379cd0cf2a772063a620 100644
--- a/openair3/NAS/TOOLS/conf2uedata.c
+++ b/openair3/NAS/TOOLS/conf2uedata.c
@@ -12,11 +12,6 @@
 #include "conf_user_data.h"
 #include "conf_usim.h"
 
-int plmn_nb = 0;
-
-plmn_conf_param_t* user_plmn_list=NULL;
-network_record_t* user_network_record_list = NULL;
-
 int main(int argc, char**argv) {
 	int option;
     const char* conf_file = NULL;
@@ -71,6 +66,8 @@ int parse_config_file(const char *output_dir, const char *conf_filename) {
     char user[10];
     config_t cfg;
 
+	networks_t networks;;
+
     ret = get_config_from_file(conf_filename, &cfg);
     if (ret == EXIT_FAILURE) {
         exit(1);
@@ -85,11 +82,10 @@ int parse_config_file(const char *output_dir, const char *conf_filename) {
         return (EXIT_FAILURE);
     }
 
-    rc = parse_plmns(all_plmn_setting);
+    rc = parse_plmns(all_plmn_setting, &networks);
     if (rc == EXIT_FAILURE) {
         return rc;
     }
-    fill_network_record_list();
 
     for (int i = 0; i < ue_nb; i++) {
 	    emm_nvdata_t emm_data;
@@ -110,7 +106,7 @@ int parse_config_file(const char *output_dir, const char *conf_filename) {
             return EXIT_FAILURE;
         }
 
-        rc = parse_user_plmns_conf(ue_setting, i, &user_plmns, &usim_data_conf.hplmn);
+        rc = parse_user_plmns_conf(ue_setting, i, &user_plmns, &usim_data_conf.hplmn, networks);
         if (rc != EXIT_SUCCESS) {
             return EXIT_FAILURE;
         }
@@ -128,13 +124,16 @@ int parse_config_file(const char *output_dir, const char *conf_filename) {
             printf("Problem in SIM section for UE%d. EXITING...\n", i);
             return EXIT_FAILURE;
         }
-        gen_usim_data(&usim_data_conf, &usim_data, &user_plmns);
+        gen_usim_data(&usim_data_conf, &usim_data, &user_plmns, networks);
         write_usim_data(output_dir, i, &usim_data);
 
-        gen_emm_data(&emm_data, usim_data_conf.hplmn, usim_data_conf.msin, user_plmns.equivalents_home.size);
+        gen_emm_data(&emm_data, usim_data_conf.hplmn, usim_data_conf.msin,
+                     user_plmns.equivalents_home.size, networks);
         write_emm_data(output_dir, i, &emm_data);
 
      }
+    free(networks.items);
+	networks.size=0;
     config_destroy(&cfg);
 	return(EXIT_SUCCESS);
 }
@@ -160,52 +159,52 @@ int get_config_from_file(const char *filename, config_t *config) {
 }
 
 
-int parse_plmn_param(config_setting_t *plmn_setting, int index) {
+int parse_plmn_param(config_setting_t *plmn_setting, plmn_conf_param_t *conf) {
 	int rc = 0;
-	rc = config_setting_lookup_string(plmn_setting,
-	FULLNAME, &user_plmn_list[index].fullname);
+	rc = config_setting_lookup_string(plmn_setting, FULLNAME, &conf->fullname);
 	if (rc != 1) {
-		printf("Check PLMN%d FULLNAME. Exiting\n", index);
+		printf("Error on FULLNAME\n");
 		return EXIT_FAILURE;
 	}
-	rc = config_setting_lookup_string(plmn_setting,
-	SHORTNAME, &user_plmn_list[index].shortname);
+	rc = config_setting_lookup_string(plmn_setting, SHORTNAME, &conf->shortname);
 	if (rc != 1) {
-		printf("Check PLMN%d SHORTNAME. Exiting\n", index);
+		printf("Error on SHORTNAME\n");
 		return EXIT_FAILURE;
 	}
-	rc = config_setting_lookup_string(plmn_setting,
-	MNC, &user_plmn_list[index].mnc);
-	if (rc != 1 || strlen(user_plmn_list[index].mnc) > 3
-			|| strlen(user_plmn_list[index].mnc) < 2) {
-		printf("Check PLMN%d MNC. Exiting\n", index);
+	rc = config_setting_lookup_string(plmn_setting, MNC, &conf->mnc);
+	if (rc != 1 || strlen(conf->mnc) > 3
+			|| strlen(conf->mnc) < 2) {
+		printf("Error ond MNC. Exiting\n");
 		return EXIT_FAILURE;
 	}
-	rc = config_setting_lookup_string(plmn_setting,
-	MCC, &user_plmn_list[index].mcc);
-	if (rc != 1 || strlen(user_plmn_list[index].mcc) != 3) {
-		printf("Check PLMN%d MCC. Exiting\n", index);
+	rc = config_setting_lookup_string(plmn_setting, MCC, &conf->mcc);
+	if (rc != 1 || strlen(conf->mcc) != 3) {
+		printf("Error on MCC\n");
 		return EXIT_FAILURE;
 	}
 	return EXIT_SUCCESS;
 }
 
-int parse_plmns(config_setting_t *all_plmn_setting) {
+int parse_plmns(config_setting_t *all_plmn_setting, networks_t *networks) {
 	config_setting_t *plmn_setting = NULL;
 	char plmn[10];
 	int rc = EXIT_SUCCESS;
-	plmn_nb = config_setting_length(all_plmn_setting);
-	user_plmn_list = malloc(sizeof(plmn_conf_param_t) * plmn_nb);
-	user_network_record_list = malloc(sizeof(network_record_t) * plmn_nb);
-	for (int i = 0; i < plmn_nb; i++) {
-		memset(&user_network_record_list[i], 0xff, sizeof(network_record_t));
-		memset(&user_plmn_list[i], 0xff, sizeof(plmn_conf_param_t));
+	int size = 0;
+
+	size = config_setting_length(all_plmn_setting);
+
+	networks->size = size;
+	networks->items = malloc(sizeof(network_t) * size);
+	for (int i = 0; i < size; i++) {
+		memset(&networks->items[i].record, 0xff, sizeof(network_record_t));
 	}
-	for (int i = 0; i < plmn_nb; i++) {
+
+	for (int i = 0; i < networks->size; i++) {
+		network_t *network = &networks->items[i];
 		sprintf(plmn, "%s%d", PLMN, i);
 		plmn_setting = config_setting_get_member(all_plmn_setting, plmn);
 		if (plmn_setting != NULL) {
-			rc = parse_plmn_param(plmn_setting, i);
+			rc = parse_plmn_param(plmn_setting, &network->conf);
 			if (rc == EXIT_FAILURE) {
 				return rc;
 			}
@@ -213,12 +212,15 @@ int parse_plmns(config_setting_t *all_plmn_setting) {
 			printf("Problem in PLMN%d. Exiting...\n", i);
 			return EXIT_FAILURE;
 		}
+		gen_network_record_from_conf(&network->conf, &network->record);
+		network->plmn = network->record.plmn;
 	}
 	return rc;
 }
 
 int parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
-                          user_plmns_t *user_plmns, const char **h) {
+                          user_plmns_t *user_plmns, const char **h,
+                          const networks_t networks) {
 	int nb_errors = 0;
 	const char *hplmn;
 
@@ -227,21 +229,21 @@ int parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
 		return EXIT_FAILURE;
 	}
 	hplmn = *h;
-	if (get_plmn_index(hplmn) == -1) {
+	if (get_plmn_index(hplmn, networks) == -1) {
 		printf("HPLMN for UE%d is not defined in PLMN section. Exiting\n",
 				user_id);
 		return EXIT_FAILURE;
 	}
 
-	if ( parse_Xplmn(ue_setting, UCPLMN, user_id, &user_plmns->users_controlled) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, UCPLMN, user_id, &user_plmns->users_controlled, networks) == EXIT_FAILURE )
 		nb_errors++;
-	if ( parse_Xplmn(ue_setting, OPLMN, user_id, &user_plmns->operators) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, OPLMN, user_id, &user_plmns->operators, networks) == EXIT_FAILURE )
 		nb_errors++;
-	if ( parse_Xplmn(ue_setting, OCPLMN, user_id, &user_plmns->operators_controlled) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, OCPLMN, user_id, &user_plmns->operators_controlled, networks) == EXIT_FAILURE )
 		nb_errors++;
-	if ( parse_Xplmn(ue_setting, FPLMN, user_id, &user_plmns->forbiddens) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, FPLMN, user_id, &user_plmns->forbiddens, networks) == EXIT_FAILURE )
 		nb_errors++;
-	if ( parse_Xplmn(ue_setting, EHPLMN, user_id, &user_plmns->equivalents_home) == EXIT_FAILURE )
+	if ( parse_Xplmn(ue_setting, EHPLMN, user_id, &user_plmns->equivalents_home, networks) == EXIT_FAILURE )
 		nb_errors++;
 
 	if ( nb_errors > 0 )
@@ -250,7 +252,7 @@ int parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
 }
 
 int parse_Xplmn(config_setting_t *ue_setting, const char *section,
-               int user_id, plmns_list *plmns) {
+               int user_id, plmns_list *plmns, const networks_t networks) {
 	int rc;
 	int item_count;
 	config_setting_t *setting;
@@ -269,7 +271,7 @@ int parse_Xplmn(config_setting_t *ue_setting, const char *section,
 			printf("Check %s section for UE%d. Exiting\n", section, user_id);
 			return EXIT_FAILURE;
 		}
-		rc = get_plmn_index(mccmnc);
+		rc = get_plmn_index(mccmnc, networks);
 		if (rc == -1) {
 			printf("The PLMN %s is not defined in PLMN section. Exiting...\n",
 					mccmnc);
@@ -283,16 +285,16 @@ int parse_Xplmn(config_setting_t *ue_setting, const char *section,
 	return EXIT_SUCCESS;
 }
 
-int get_plmn_index(const char * mccmnc) {
+int get_plmn_index(const char * mccmnc, const networks_t networks) {
 	char mcc[4];
 	char mnc[strlen(mccmnc) - 2];
 	strncpy(mcc, mccmnc, 3);
 	mcc[3] = '\0';
 	strncpy(mnc, mccmnc + 3, 3);
 	mnc[strlen(mccmnc) - 3] = '\0';
-	for (int i = 0; i < plmn_nb; i++) {
-		if (strcmp(user_plmn_list[i].mcc, mcc) == 0) {
-			if (strcmp(user_plmn_list[i].mnc, mnc) == 0) {
+	for (int i = 0; i < networks.size; i++) {
+		if (strcmp(networks.items[i].conf.mcc, mcc) == 0) {
+			if (strcmp(networks.items[i].conf.mnc, mnc) == 0) {
 				return i;
 			}
 		}
@@ -300,7 +302,6 @@ int get_plmn_index(const char * mccmnc) {
 	return -1;
 }
 
-
 plmn_t make_plmn_from_conf(const plmn_conf_param_t *plmn_conf) {
 	plmn_t plmn;
 	char num[6];
@@ -320,21 +321,17 @@ plmn_t make_plmn_from_conf(const plmn_conf_param_t *plmn_conf) {
 	return plmn;
 }
 
-void fill_network_record_list() {
-	for (int i = 0; i < plmn_nb; i++) {
-		strcpy(user_network_record_list[i].fullname,
-				user_plmn_list[i].fullname);
-		strcpy(user_network_record_list[i].shortname,
-				user_plmn_list[i].shortname);
+void gen_network_record_from_conf(const plmn_conf_param_t *conf, network_record_t *record) {
+		strcpy(record->fullname, conf->fullname);
+		strcpy(record->shortname, conf->shortname);
 
 		char num[6];
-		sprintf(num, "%s%s", user_plmn_list[i].mcc, user_plmn_list[i].mnc);
-		user_network_record_list[i].num = atoi(num);
+		sprintf(num, "%s%s", conf->mcc, conf->mnc);
+		record->num = atoi(num);
 
-		user_network_record_list[i].plmn = make_plmn_from_conf(&user_plmn_list[i]);
-		user_network_record_list[i].tac_end = 0xfffd;
-		user_network_record_list[i].tac_start = 0x0001;
-	}
+		record->plmn = make_plmn_from_conf(conf);
+		record->tac_end = 0xfffd;
+		record->tac_start = 0x0001;
 }
 
 /*
diff --git a/openair3/NAS/TOOLS/conf2uedata.h b/openair3/NAS/TOOLS/conf2uedata.h
index 21cc2c3fbd9e2f48af6a777f7a8db3d428089784..3693aafffb7f512228aad4d5b789832f6666d4b6 100644
--- a/openair3/NAS/TOOLS/conf2uedata.h
+++ b/openair3/NAS/TOOLS/conf2uedata.h
@@ -56,24 +56,31 @@ typedef struct {
     plmns_list equivalents_home;
 } user_plmns_t;
 
-extern int plmn_nb;
+typedef struct {
+    plmn_conf_param_t conf;
+    network_record_t record;
+    plmn_t plmn;
+} network_t;
 
-extern plmn_conf_param_t* user_plmn_list;
-extern network_record_t* user_network_record_list;
+typedef struct {
+    int size;
+    network_t *items;
+} networks_t;
 
 int get_config_from_file(const char *filename, config_t *config);
 int parse_config_file(const char *output_dir, const char *filename);
 
 void _display_usage(void);
-void fill_network_record_list(void);
+void gen_network_record_from_conf(const plmn_conf_param_t *conf, network_record_t *record);
 
-int parse_plmn_param(config_setting_t *plmn_setting, int index);
-int parse_plmns(config_setting_t *all_plmn_setting);
-int get_plmn_index(const char * mccmnc);
+int parse_plmn_param(config_setting_t *plmn_setting, plmn_conf_param_t *conf);
+int parse_plmns(config_setting_t *all_plmn_setting, networks_t *plmns);
+int get_plmn_index(const char * mccmnc, const networks_t networks);
 int parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
-                          user_plmns_t *user_plmns, const char **h);
+                          user_plmns_t *user_plmns, const char **h,
+                          const networks_t networks);
 int parse_Xplmn(config_setting_t *ue_setting, const char *section,
-               int user_id, plmns_list *plmns);
+               int user_id, plmns_list *plmns, const networks_t networks);
 
 
 #endif // _CONF2UEDATA_H
diff --git a/openair3/NAS/TOOLS/conf_emm.c b/openair3/NAS/TOOLS/conf_emm.c
index bc9f3441ae2418df51a9932f9e05cde0bd6e2a8d..04debda412189944d49aa458a54ef3fff2208f3d 100644
--- a/openair3/NAS/TOOLS/conf_emm.c
+++ b/openair3/NAS/TOOLS/conf_emm.c
@@ -1,26 +1,26 @@
 #include <string.h>
 
-#include "conf2uedata.h"
 #include "memory.h"
 #include "conf_emm.h"
 #include "fs.h"
 
-void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin, int ehplmn_count) {
+void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin, int ehplmn_count, const networks_t networks) {
 	memset(emm_data, 0, sizeof(emm_nvdata_t));
-	int hplmn_index = get_plmn_index(hplmn);
+	int hplmn_index = get_plmn_index(hplmn, networks);
+	plmn_conf_param_t *conf = &networks.items[hplmn_index].conf;
 	emm_data->imsi.length = 8;
-	emm_data->imsi.u.num.parity = get_msin_parity(msin, user_plmn_list[hplmn_index].mcc, user_plmn_list[hplmn_index].mnc);
-	emm_data->imsi.u.num.digit1 = user_plmn_list[hplmn_index].mcc[0];
-	emm_data->imsi.u.num.digit2 = user_plmn_list[hplmn_index].mcc[1];
-	emm_data->imsi.u.num.digit3 = user_plmn_list[hplmn_index].mcc[2];
+	emm_data->imsi.u.num.parity = get_msin_parity(msin, conf->mcc, conf->mnc);
+	emm_data->imsi.u.num.digit1 = conf->mcc[0];
+	emm_data->imsi.u.num.digit2 = conf->mcc[1];
+	emm_data->imsi.u.num.digit3 = conf->mcc[2];
 
-	emm_data->imsi.u.num.digit4 = user_plmn_list[hplmn_index].mnc[0];
-	emm_data->imsi.u.num.digit5 = user_plmn_list[hplmn_index].mnc[1];
+	emm_data->imsi.u.num.digit4 = conf->mnc[0];
+	emm_data->imsi.u.num.digit5 = conf->mnc[1];
 
-	if (strlen(user_plmn_list[hplmn_index].mnc) == 3) {
-		emm_data->rplmn.MNCdigit3 = user_plmn_list[hplmn_index].mnc[2];
+	if (strlen(conf->mnc) == 3) {
+		emm_data->rplmn.MNCdigit3 = conf->mnc[2];
 
-		emm_data->imsi.u.num.digit6 = user_plmn_list[hplmn_index].mnc[2];
+		emm_data->imsi.u.num.digit6 = conf->mnc[2];
 		emm_data->imsi.u.num.digit7 = msin[0];
 		emm_data->imsi.u.num.digit8 = msin[1];
 		emm_data->imsi.u.num.digit9 = msin[2];
@@ -47,11 +47,11 @@ void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin, i
 
 	}
 
-	emm_data->rplmn.MCCdigit1 = user_plmn_list[hplmn_index].mcc[0];
-	emm_data->rplmn.MCCdigit2 = user_plmn_list[hplmn_index].mcc[1];
-	emm_data->rplmn.MCCdigit3 = user_plmn_list[hplmn_index].mcc[2];
-	emm_data->rplmn.MNCdigit1 = user_plmn_list[hplmn_index].mnc[0];
-	emm_data->rplmn.MNCdigit2 = user_plmn_list[hplmn_index].mnc[1];
+	emm_data->rplmn.MCCdigit1 = conf->mcc[0];
+	emm_data->rplmn.MCCdigit2 = conf->mcc[1];
+	emm_data->rplmn.MCCdigit3 = conf->mcc[2];
+	emm_data->rplmn.MNCdigit1 = conf->mnc[0];
+	emm_data->rplmn.MNCdigit2 = conf->mnc[1];
 
 	emm_data->eplmn.n_plmns = ehplmn_count;
 }
diff --git a/openair3/NAS/TOOLS/conf_emm.h b/openair3/NAS/TOOLS/conf_emm.h
index c405e026123450bc5f6ca7fd184d1c147c0f00ff..0b5f7370913100363f9cbce9a7c76c4c8cdc3abd 100644
--- a/openair3/NAS/TOOLS/conf_emm.h
+++ b/openair3/NAS/TOOLS/conf_emm.h
@@ -1,10 +1,10 @@
 #ifndef _CONF_EMM_H
 #define _CONF_EMM_H
 
+#include "conf2uedata.h"
 #include "emmData.h"
 
-void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin,
-                  int ehplmn_count);
+void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin, int ehplmn_count, const networks_t networks);
 int write_emm_data(const char *directory, int user_id, emm_nvdata_t *emm_data);
 int get_msin_parity(const char * msin, const char *mcc, const char *mnc);
 
diff --git a/openair3/NAS/TOOLS/conf_usim.c b/openair3/NAS/TOOLS/conf_usim.c
index 8b1a80ad52b79fd090b482946451d0e25d43bea5..da2c44dc23c7a9e896d048a89d7bf7bf7efcaad7 100644
--- a/openair3/NAS/TOOLS/conf_usim.c
+++ b/openair3/NAS/TOOLS/conf_usim.c
@@ -41,22 +41,23 @@ int parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf
 }
 
 void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
-                   const user_plmns_t *user_plmns) {
-    int hplmn_index = get_plmn_index(u->hplmn);
+                   const user_plmns_t *user_plmns, const networks_t networks) {
+    int hplmn_index = get_plmn_index(u->hplmn, networks);
+	const plmn_conf_param_t *conf = &networks.items[hplmn_index].conf;
 	memset(usim_data, 0, sizeof(usim_data_t));
 	usim_data->imsi.length = 8;
 	usim_data->imsi.u.num.parity = get_msin_parity(u->msin,
-		user_plmn_list[hplmn_index].mcc,
-		user_plmn_list[hplmn_index].mnc);
+		conf->mcc,
+		conf->mnc);
 
-	usim_data->imsi.u.num.digit1 = user_plmn_list[hplmn_index].mcc[0];
-	usim_data->imsi.u.num.digit2 = user_plmn_list[hplmn_index].mcc[1];
-	usim_data->imsi.u.num.digit3 = user_plmn_list[hplmn_index].mcc[2];
+	usim_data->imsi.u.num.digit1 = conf->mcc[0];
+	usim_data->imsi.u.num.digit2 = conf->mcc[1];
+	usim_data->imsi.u.num.digit3 = conf->mcc[2];
 
-	usim_data->imsi.u.num.digit4 = user_plmn_list[hplmn_index].mnc[0];
-	usim_data->imsi.u.num.digit5 = user_plmn_list[hplmn_index].mnc[1];
+	usim_data->imsi.u.num.digit4 = conf->mnc[0];
+	usim_data->imsi.u.num.digit5 = conf->mnc[1];
 
-	if (strlen(user_plmn_list[hplmn_index].mnc) == 2) {
+	if (strlen(conf->mnc) == 2) {
 		usim_data->imsi.u.num.digit6 = u->msin[0];
 		usim_data->imsi.u.num.digit7 = u->msin[1];
 		usim_data->imsi.u.num.digit8 = u->msin[2];
@@ -68,7 +69,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 		usim_data->imsi.u.num.digit14 = u->msin[8];
 		usim_data->imsi.u.num.digit15 = u->msin[9];
 	} else {
-		usim_data->imsi.u.num.digit6 = user_plmn_list[hplmn_index].mnc[2];
+		usim_data->imsi.u.num.digit6 = conf->mnc[2];
 		usim_data->imsi.u.num.digit7 = u->msin[0];
 		usim_data->imsi.u.num.digit8 = u->msin[1];
 		usim_data->imsi.u.num.digit9 = u->msin[2];
@@ -99,7 +100,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	}
 	if (user_plmns->forbiddens.size > 0) {
 		for (int i = 0; i < user_plmns->forbiddens.size; i++) {
-			usim_data->fplmn[i] = user_network_record_list[user_plmns->forbiddens.items[i]].plmn;
+			usim_data->fplmn[i] = networks.items[user_plmns->forbiddens.items[i]].plmn;
 		}
 	}
 
@@ -107,7 +108,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	 * Location Information
 	 */
 	usim_data->loci.tmsi = DEFAULT_TMSI;
-	usim_data->loci.lai.plmn = user_network_record_list[hplmn_index].plmn;
+	usim_data->loci.lai.plmn = networks.items[hplmn_index].plmn;
 	usim_data->loci.lai.lac = DEFAULT_LAC;
 	usim_data->loci.status = USIM_LOCI_NOT_UPDATED;
 	/*
@@ -117,7 +118,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	usim_data->psloci.signature[0] = 0x01;
 	usim_data->psloci.signature[1] = 0x02;
 	usim_data->psloci.signature[2] = 0x03;
-	usim_data->psloci.rai.plmn = user_network_record_list[hplmn_index].plmn;
+	usim_data->psloci.rai.plmn = networks.items[hplmn_index].plmn;
 	usim_data->psloci.rai.lac = DEFAULT_LAC;
 	usim_data->psloci.rai.rac = DEFAULT_RAC;
 	usim_data->psloci.status = USIM_PSLOCI_NOT_UPDATED;
@@ -126,7 +127,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	 */
 	usim_data->ad.UE_Operation_Mode = USIM_NORMAL_MODE;
 	usim_data->ad.Additional_Info = 0xffff;
-	usim_data->ad.MNC_Length = strlen(user_plmn_list[hplmn_index].mnc);
+	usim_data->ad.MNC_Length = strlen(conf->mnc);
 	/*
 	 * EPS NAS security context
 	 */
@@ -185,7 +186,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	 * PLMN Network Name and Operator PLMN List
 	 */
 	for (int i = 0; i < user_plmns->operators.size; i++) {
-		network_record_t record = user_network_record_list[user_plmns->operators.items[i]];
+		network_record_t record = networks.items[user_plmns->operators.items[i]].record;
 		usim_data->pnn[i].fullname.type = USIM_PNN_FULLNAME_TAG;
 		usim_data->pnn[i].fullname.length = strlen(record.fullname);
 		strncpy((char*) usim_data->pnn[i].fullname.value, record.fullname,
@@ -209,7 +210,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	 * List of Equivalent HPLMNs
 	 */
 	for (int i = 0; i < user_plmns->equivalents_home.size; i++) {
-		usim_data->ehplmn[i] = user_network_record_list[user_plmns->equivalents_home.items[i]].plmn;
+		usim_data->ehplmn[i] = networks.items[user_plmns->equivalents_home.items[i]].plmn;
 	}
 	if (user_plmns->equivalents_home.size < USIM_EHPLMN_MAX) {
 		for (int i = user_plmns->equivalents_home.size; i < USIM_EHPLMN_MAX; i++) {
@@ -219,7 +220,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	/*
 	 * Home PLMN Selector with Access Technology
 	 */
-	usim_data->hplmn.plmn = user_network_record_list[hplmn_index].plmn;
+	usim_data->hplmn.plmn = networks.items[hplmn_index].plmn;
 	usim_data->hplmn.AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN | USIM_ACT_EUTRAN);
 
 	/*
@@ -230,7 +231,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	}
 	if (user_plmns->users_controlled.size > 0) {
 		for (int i = 0; i < user_plmns->users_controlled.size; i++) {
-			usim_data->plmn[i].plmn = user_network_record_list[user_plmns->users_controlled.items[i]].plmn;
+			usim_data->plmn[i].plmn = networks.items[user_plmns->users_controlled.items[i]].plmn;
 		}
 	}
 
@@ -241,7 +242,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	}
 	if (user_plmns->operators_controlled.size > 0) {
 		for (int i = 0; i < user_plmns->operators_controlled.size; i++) {
-			usim_data->oplmn[i].plmn = user_network_record_list[user_plmns->operators_controlled.items[i]].plmn;
+			usim_data->oplmn[i].plmn = networks.items[user_plmns->operators_controlled.items[i]].plmn;
 			usim_data->oplmn[i].AcT = (USIM_ACT_GSM | USIM_ACT_UTRAN
 					| USIM_ACT_EUTRAN);
 		}
@@ -250,7 +251,7 @@ void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
 	 * EPS Location Information
 	 */
 	usim_data->epsloci.guti.gummei.plmn =
-			user_network_record_list[hplmn_index].plmn;
+			networks.items[hplmn_index].plmn;
 	usim_data->epsloci.guti.gummei.MMEgid = DEFAULT_MME_ID;
 	usim_data->epsloci.guti.gummei.MMEcode = DEFAULT_MME_CODE;
 	usim_data->epsloci.guti.m_tmsi = DEFAULT_M_TMSI;
diff --git a/openair3/NAS/TOOLS/conf_usim.h b/openair3/NAS/TOOLS/conf_usim.h
index 5018be81483d9706ebd0e931aacf0a6ae07beec0..90b3a9e4183ec17ccca80ba3c635c9b984d4d175 100644
--- a/openair3/NAS/TOOLS/conf_usim.h
+++ b/openair3/NAS/TOOLS/conf_usim.h
@@ -41,6 +41,6 @@ typedef struct {
 int parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u);
 int write_usim_data(const char *directory, int user_id, usim_data_t *usim_data);
 void gen_usim_data(usim_data_conf_t *u, usim_data_t *usim_data,
-                   const user_plmns_t *user_plmns);
+                   const user_plmns_t *user_plmns, const networks_t networks);
 
 #endif