diff --git a/cmake_targets/nas_sim_tools/CMakeLists.txt b/cmake_targets/nas_sim_tools/CMakeLists.txt
index 1bf158a904725364d3b2f565cd0a8ff035f986f7..966c928a2b531f0d46374bd2adc43c66e0584a71 100644
--- a/cmake_targets/nas_sim_tools/CMakeLists.txt
+++ b/cmake_targets/nas_sim_tools/CMakeLists.txt
@@ -21,6 +21,7 @@ set(conf2uedata_SRC
     ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_user_data.c
     ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_usim.c
     ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_network.c
+    ${OPENAIR_DIR}/openair3/NAS/TOOLS/conf_user_plmn.c
     ${OPENAIR_DIR}/openair3/NAS/TOOLS/fs.c
     ${OPENAIR_DIR}/openair3/NAS/TOOLS/display.c
     ${OPENAIR_DIR}/openair3/NAS/UE/API/USIM/usim_api.c
diff --git a/openair3/NAS/TOOLS/conf2uedata.c b/openair3/NAS/TOOLS/conf2uedata.c
index 853bca3d8872ba7f9e311198af0290f2288797b3..5112d737ac58c11b187eab9f937607f68cab075a 100644
--- a/openair3/NAS/TOOLS/conf2uedata.c
+++ b/openair3/NAS/TOOLS/conf2uedata.c
@@ -105,8 +105,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, networks);
-        if (rc != EXIT_SUCCESS) {
+        if ( parse_user_plmns_conf(ue_setting, i, &user_plmns, &usim_data_conf.hplmn, networks) == false ) {
             return EXIT_FAILURE;
         }
 
@@ -130,6 +129,8 @@ int parse_config_file(const char *output_dir, const char *conf_filename) {
                      user_plmns.equivalents_home.size, networks);
         write_emm_data(output_dir, i, &emm_data);
 
+		user_plmns_free(&user_plmns);
+
      }
     free(networks.items);
 	networks.size=0;
@@ -157,74 +158,6 @@ int get_config_from_file(const char *filename, config_t *config) {
     return EXIT_SUCCESS;
 }
 
-
-int parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
-                          user_plmns_t *user_plmns, const char **h,
-                          const networks_t networks) {
-	int nb_errors = 0;
-	const char *hplmn;
-
-	if ( config_setting_lookup_string(ue_setting, HPLMN, h) != 1 ) {
-		printf("Check HPLMN section for UE%d. Exiting\n", user_id);
-		return EXIT_FAILURE;
-	}
-	hplmn = *h;
-	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, networks) == EXIT_FAILURE )
-		nb_errors++;
-	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, networks) == EXIT_FAILURE )
-		nb_errors++;
-	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, networks) == EXIT_FAILURE )
-		nb_errors++;
-
-	if ( nb_errors > 0 )
-		return EXIT_FAILURE;
-	return EXIT_SUCCESS;
-}
-
-int parse_Xplmn(config_setting_t *ue_setting, const char *section,
-               int user_id, plmns_list *plmns, const networks_t networks) {
-	int rc;
-	int item_count;
-	config_setting_t *setting;
-
-	setting = config_setting_get_member(ue_setting, section);
-	if (setting == NULL) {
-		printf("Check %s section for UE%d. Exiting\n", section, user_id);
-		return EXIT_FAILURE;
-	}
-
-	item_count = config_setting_length(setting);
-	int *datas = malloc(item_count * sizeof(int));
-	for (int i = 0; i < item_count; i++) {
-		const char *mccmnc = config_setting_get_string_elem(setting, i);
-		if (mccmnc == NULL) {
-			printf("Check %s section for UE%d. Exiting\n", section, user_id);
-			return EXIT_FAILURE;
-		}
-		rc = get_plmn_index(mccmnc, networks);
-		if (rc == -1) {
-			printf("The PLMN %s is not defined in PLMN section. Exiting...\n",
-					mccmnc);
-			return EXIT_FAILURE;
-		}
-		datas[i] = rc;
-	}
-
-	plmns->size = item_count;
-	plmns->items = datas;
-	return EXIT_SUCCESS;
-}
-
 /*
  * Displays command line usage
  */
diff --git a/openair3/NAS/TOOLS/conf2uedata.h b/openair3/NAS/TOOLS/conf2uedata.h
index f7afdde0c46b622310cefaa166918554a6ea0d32..d43dbce50050ab5be3e7c85e5a5245ef28b76e61 100644
--- a/openair3/NAS/TOOLS/conf2uedata.h
+++ b/openair3/NAS/TOOLS/conf2uedata.h
@@ -8,36 +8,9 @@
 
 #define UE "UE"
 
-#define HPLMN "HPLMN"
-#define UCPLMN "UCPLMN_LIST"
-#define OPLMN "OPLMN_LIST"
-#define OCPLMN "OCPLMN_LIST"
-#define FPLMN "FPLMN_LIST"
-#define EHPLMN "EHPLMN_LIST"
-
-typedef struct {
-    int size;
-    int *items;
-} plmns_list;
-
-typedef struct {
-    plmns_list users_controlled;
-    plmns_list operators;
-    plmns_list operators_controlled;
-    plmns_list forbiddens;
-    plmns_list equivalents_home;
-} user_plmns_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);
 
-int parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
-                          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, const networks_t networks);
-
-
 #endif // _CONF2UEDATA_H
diff --git a/openair3/NAS/TOOLS/conf_user_plmn.c b/openair3/NAS/TOOLS/conf_user_plmn.c
new file mode 100644
index 0000000000000000000000000000000000000000..3b3c6dd3e6c1f2759d06e39274d711de512f0e96
--- /dev/null
+++ b/openair3/NAS/TOOLS/conf_user_plmn.c
@@ -0,0 +1,81 @@
+#include <stdlib.h>
+#include <string.h>
+#include "conf_user_plmn.h"
+
+bool parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
+                          user_plmns_t *user_plmns, const char **h,
+                          const networks_t networks) {
+	int nb_errors = 0;
+	const char *hplmn;
+
+	if ( config_setting_lookup_string(ue_setting, HPLMN, h) != 1 ) {
+		printf("Check HPLMN section for UE%d. Exiting\n", user_id);
+		return false;
+	}
+	hplmn = *h;
+	if (get_plmn_index(hplmn, networks) == -1) {
+		printf("HPLMN for UE%d is not defined in PLMN section. Exiting\n",
+				user_id);
+		return false;
+	}
+
+	if ( parse_Xplmn(ue_setting, UCPLMN, user_id, &user_plmns->users_controlled, networks) == false )
+		nb_errors++;
+	if ( parse_Xplmn(ue_setting, OPLMN, user_id, &user_plmns->operators, networks) == false )
+		nb_errors++;
+	if ( parse_Xplmn(ue_setting, OCPLMN, user_id, &user_plmns->operators_controlled, networks) == false )
+		nb_errors++;
+	if ( parse_Xplmn(ue_setting, FPLMN, user_id, &user_plmns->forbiddens, networks) == false )
+		nb_errors++;
+	if ( parse_Xplmn(ue_setting, EHPLMN, user_id, &user_plmns->equivalents_home, networks) == false )
+		nb_errors++;
+
+	if ( nb_errors > 0 )
+		return false;
+	return true;
+}
+
+bool parse_Xplmn(config_setting_t *ue_setting, const char *section,
+               int user_id, plmns_list *plmns, const networks_t networks) {
+	int rc;
+	int item_count;
+	config_setting_t *setting;
+
+	setting = config_setting_get_member(ue_setting, section);
+	if (setting == NULL) {
+		printf("Check %s section for UE%d. Exiting\n", section, user_id);
+		return false;
+	}
+
+	item_count = config_setting_length(setting);
+	int *datas = malloc(item_count * sizeof(int));
+	for (int i = 0; i < item_count; i++) {
+		const char *mccmnc = config_setting_get_string_elem(setting, i);
+		if (mccmnc == NULL) {
+			printf("Check %s section for UE%d. Exiting\n", section, user_id);
+			free(datas);
+			return false;
+		}
+		rc = get_plmn_index(mccmnc, networks);
+		if (rc == -1) {
+			printf("The PLMN %s is not defined in PLMN section. Exiting...\n",
+					mccmnc);
+			free(datas);
+			return false;
+		}
+		datas[i] = rc;
+	}
+
+	plmns->size = item_count;
+	plmns->items = datas;
+	return true;
+}
+
+void user_plmns_free(user_plmns_t *user_plmns) {
+	free(user_plmns->users_controlled.items);
+	free(user_plmns->operators.items);
+	free(user_plmns->operators_controlled.items);
+	free(user_plmns->forbiddens.items);
+	free(user_plmns->equivalents_home.items);
+	memset(user_plmns, 0, sizeof(user_plmns_t));
+}
diff --git a/openair3/NAS/TOOLS/conf_user_plmn.h b/openair3/NAS/TOOLS/conf_user_plmn.h
new file mode 100644
index 0000000000000000000000000000000000000000..561767b6c4823471171e1bd5e628707d88581b23
--- /dev/null
+++ b/openair3/NAS/TOOLS/conf_user_plmn.h
@@ -0,0 +1,37 @@
+#ifndef _CONF_USER_H
+#define _CONF_USER_H
+
+#include <stdbool.h>
+#include <libconfig.h>
+#include "conf_network.h"
+
+#define HPLMN "HPLMN"
+#define UCPLMN "UCPLMN_LIST"
+#define OPLMN "OPLMN_LIST"
+#define OCPLMN "OCPLMN_LIST"
+#define FPLMN "FPLMN_LIST"
+#define EHPLMN "EHPLMN_LIST"
+
+typedef struct {
+    int size;
+    int *items;
+} plmns_list;
+
+typedef struct {
+    plmns_list users_controlled;
+    plmns_list operators;
+    plmns_list operators_controlled;
+    plmns_list forbiddens;
+    plmns_list equivalents_home;
+} user_plmns_t;
+
+bool parse_user_plmns_conf(config_setting_t *ue_setting, int user_id,
+                          user_plmns_t *user_plmns, const char **h,
+                          const networks_t networks);
+
+bool parse_Xplmn(config_setting_t *ue_setting, const char *section,
+               int user_id, plmns_list *plmns, const networks_t networks);
+
+void user_plmns_free(user_plmns_t *user_plmns);
+
+#endif
diff --git a/openair3/NAS/TOOLS/conf_usim.h b/openair3/NAS/TOOLS/conf_usim.h
index 90b3a9e4183ec17ccca80ba3c635c9b984d4d175..71e6c63d6b4bb16dba737de2c702db91c2fd31e8 100644
--- a/openair3/NAS/TOOLS/conf_usim.h
+++ b/openair3/NAS/TOOLS/conf_usim.h
@@ -3,6 +3,7 @@
 
 #include <libconfig.h>
 #include "usim_api.h"
+#include "conf_user_plmn.h"
 
 #define SIM "SIM"
 #define MSIN "MSIN"