diff --git a/cmake_targets/nas_sim_tools/CMakeLists.txt b/cmake_targets/nas_sim_tools/CMakeLists.txt
index 966c928a2b531f0d46374bd2adc43c66e0584a71..025c35c441879624e97ca6daa8a7ade386a0b936 100644
--- a/cmake_targets/nas_sim_tools/CMakeLists.txt
+++ b/cmake_targets/nas_sim_tools/CMakeLists.txt
@@ -22,6 +22,7 @@ set(conf2uedata_SRC
     ${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/conf_parser.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 338d1b11ef0a39effd47da01f21c893616093b13..b162979dc22f372b41353f18295f63a2549b920f 100644
--- a/openair3/NAS/TOOLS/conf2uedata.c
+++ b/openair3/NAS/TOOLS/conf2uedata.c
@@ -4,13 +4,8 @@
 #include <getopt.h>
 
 #include "conf2uedata.h"
-#include "memory.h"
-#include "utils.h"
 #include "display.h"
-#include "fs.h"
-#include "conf_emm.h"
-#include "conf_user_data.h"
-#include "conf_usim.h"
+#include "conf_parser.h"
 
 int main(int argc, char**argv) {
 	int option;
@@ -56,108 +51,6 @@ int main(int argc, char**argv) {
 	exit(0);
 }
 
-bool parse_config_file(const char *output_dir, const char *conf_filename) {
-	int rc = true;
-    int ret;
-    int ue_nb = 0;
-    config_setting_t *root_setting = NULL;
-    config_setting_t *ue_setting = NULL;
-    config_setting_t *all_plmn_setting = NULL;
-    char user[10];
-    config_t cfg;
-
-	networks_t networks;;
-
-    ret = get_config_from_file(conf_filename, &cfg);
-    if (ret == false) {
-        exit(1);
-    }
-
-    root_setting = config_root_setting(&cfg);
-    ue_nb = config_setting_length(root_setting) - 1;
-
-    all_plmn_setting = config_setting_get_member(root_setting, PLMN);
-    if (all_plmn_setting == NULL) {
-        printf("NO PLMN SECTION...EXITING...\n");
-        return (false);
-    }
-
-    if ( parse_plmns(all_plmn_setting, &networks) == false ) {
-        return false;
-    }
-
-    for (int i = 0; i < ue_nb; i++) {
-	    emm_nvdata_t emm_data;
-
-	    user_nvdata_t user_data;
-	    user_data_conf_t user_data_conf;
-
-	    usim_data_t usim_data;
-	    usim_data_conf_t usim_data_conf;
-
-		user_plmns_t user_plmns;
-
-        sprintf(user, "%s%d", UE, i);
-
-        ue_setting = config_setting_get_member(root_setting, user);
-        if (ue_setting == NULL) {
-            printf("Check UE%d settings\n", i);
-            return false;
-        }
-
-        if ( parse_user_plmns_conf(ue_setting, i, &user_plmns, &usim_data_conf.hplmn, networks) == false ) {
-            return false;
-        }
-
-        rc = parse_ue_user_data(ue_setting, i, &user_data_conf);
-        if (rc != true) {
-            printf("Problem in USER section for UE%d. EXITING...\n", i);
-            return false;
-        }
-        gen_user_data(&user_data_conf, &user_data);
-        write_user_data(output_dir, i, &user_data);
-
-        rc = parse_ue_sim_param(ue_setting, i, &usim_data_conf);
-        if (rc != true) {
-            printf("Problem in SIM section for UE%d. EXITING...\n", i);
-            return false;
-        }
-        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, networks);
-        write_emm_data(output_dir, i, &emm_data);
-
-		user_plmns_free(&user_plmns);
-
-     }
-    free(networks.items);
-	networks.size=0;
-    config_destroy(&cfg);
-	return(true);
-}
-
-bool get_config_from_file(const char *filename, config_t *config) {
-    config_init(config);
-    if (filename == NULL) {
-        // XXX write error message ?
-        return(false);
-    }
-
-    /* Read the file. If there is an error, report it and exit. */
-    if (!config_read_file(config, filename)) {
-        fprintf(stderr, "Cant read config file '%s': %s\n", filename,
-                config_error_text(config));
-        if ( config_error_type(config) == CONFIG_ERR_PARSE ) {
-            fprintf(stderr, "This is line %d\n", config_error_line(config));
-        }
-        config_destroy(config);
-        return (false);
-    }
-    return true;
-}
-
 /*
  * Displays command line usage
  */
diff --git a/openair3/NAS/TOOLS/conf2uedata.h b/openair3/NAS/TOOLS/conf2uedata.h
index b97116eaa9ee443a69f3704ca230b88a7e4ff265..ed56a22718fb96ba16c892d089d0ba1560a77a3b 100644
--- a/openair3/NAS/TOOLS/conf2uedata.h
+++ b/openair3/NAS/TOOLS/conf2uedata.h
@@ -1,16 +1,6 @@
 #ifndef _CONF2UEDATA_H
 #define _CONF2UEDATA_H
 
-#include <libconfig.h>
-
-#include "usim_api.h"
-#include "conf_network.h"
-
-#define UE "UE"
-
-bool get_config_from_file(const char *filename, config_t *config);
-bool parse_config_file(const char *output_dir, const char *filename);
-
 void _display_usage(void);
 
 #endif // _CONF2UEDATA_H
diff --git a/openair3/NAS/TOOLS/conf_emm.h b/openair3/NAS/TOOLS/conf_emm.h
index 32506acdb5c9c7472023a2aa6f307b1c4b524c88..a7b97c5da27e34bd8a20861e272eb4f4c3b1e20b 100644
--- a/openair3/NAS/TOOLS/conf_emm.h
+++ b/openair3/NAS/TOOLS/conf_emm.h
@@ -1,8 +1,8 @@
 #ifndef _CONF_EMM_H
 #define _CONF_EMM_H
 
-#include "conf2uedata.h"
 #include "emmData.h"
+#include "conf_network.h"
 
 void gen_emm_data(emm_nvdata_t *emm_data, const char *hplmn, const char *msin, int ehplmn_count, const networks_t networks);
 bool write_emm_data(const char *directory, int user_id, emm_nvdata_t *emm_data);
diff --git a/openair3/NAS/TOOLS/conf_parser.c b/openair3/NAS/TOOLS/conf_parser.c
new file mode 100644
index 0000000000000000000000000000000000000000..816c5c6ec9e8838dab5468d12c216e757d27184b
--- /dev/null
+++ b/openair3/NAS/TOOLS/conf_parser.c
@@ -0,0 +1,110 @@
+#include "conf_parser.h"
+
+#include "conf_network.h"
+#include "conf_emm.h"
+#include "conf_usim.h"
+#include "conf_user_data.h"
+#include "conf_user_plmn.h"
+
+bool parse_config_file(const char *output_dir, const char *conf_filename) {
+	int rc = true;
+    int ret;
+    int ue_nb = 0;
+    config_setting_t *root_setting = NULL;
+    config_setting_t *ue_setting = NULL;
+    config_setting_t *all_plmn_setting = NULL;
+    char user[10];
+    config_t cfg;
+
+	networks_t networks;;
+
+    ret = get_config_from_file(conf_filename, &cfg);
+    if (ret == false) {
+        exit(1);
+    }
+
+    root_setting = config_root_setting(&cfg);
+    ue_nb = config_setting_length(root_setting) - 1;
+
+    all_plmn_setting = config_setting_get_member(root_setting, PLMN);
+    if (all_plmn_setting == NULL) {
+        printf("NO PLMN SECTION...EXITING...\n");
+        return (false);
+    }
+
+    if ( parse_plmns(all_plmn_setting, &networks) == false ) {
+        return false;
+    }
+
+    for (int i = 0; i < ue_nb; i++) {
+	    emm_nvdata_t emm_data;
+
+	    user_nvdata_t user_data;
+	    user_data_conf_t user_data_conf;
+
+	    usim_data_t usim_data;
+	    usim_data_conf_t usim_data_conf;
+
+		user_plmns_t user_plmns;
+
+        sprintf(user, "%s%d", UE, i);
+
+        ue_setting = config_setting_get_member(root_setting, user);
+        if (ue_setting == NULL) {
+            printf("Check UE%d settings\n", i);
+            return false;
+        }
+
+        if ( parse_user_plmns_conf(ue_setting, i, &user_plmns, &usim_data_conf.hplmn, networks) == false ) {
+            return false;
+        }
+
+        rc = parse_ue_user_data(ue_setting, i, &user_data_conf);
+        if (rc != true) {
+            printf("Problem in USER section for UE%d. EXITING...\n", i);
+            return false;
+        }
+        gen_user_data(&user_data_conf, &user_data);
+        write_user_data(output_dir, i, &user_data);
+
+        rc = parse_ue_sim_param(ue_setting, i, &usim_data_conf);
+        if (rc != true) {
+            printf("Problem in SIM section for UE%d. EXITING...\n", i);
+            return false;
+        }
+        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, networks);
+        write_emm_data(output_dir, i, &emm_data);
+
+		user_plmns_free(&user_plmns);
+
+     }
+    free(networks.items);
+	networks.size=0;
+    config_destroy(&cfg);
+	return(true);
+}
+
+bool get_config_from_file(const char *filename, config_t *config) {
+    config_init(config);
+    if (filename == NULL) {
+        // XXX write error message ?
+        return(false);
+    }
+
+    /* Read the file. If there is an error, report it and exit. */
+    if (!config_read_file(config, filename)) {
+        fprintf(stderr, "Cant read config file '%s': %s\n", filename,
+                config_error_text(config));
+        if ( config_error_type(config) == CONFIG_ERR_PARSE ) {
+            fprintf(stderr, "This is line %d\n", config_error_line(config));
+        }
+        config_destroy(config);
+        return (false);
+    }
+    return true;
+}
+
diff --git a/openair3/NAS/TOOLS/conf_parser.h b/openair3/NAS/TOOLS/conf_parser.h
new file mode 100644
index 0000000000000000000000000000000000000000..4e160ab73ab957885e717a0a152fc786b26687d0
--- /dev/null
+++ b/openair3/NAS/TOOLS/conf_parser.h
@@ -0,0 +1,12 @@
+#ifndef _CONF_PARSER_H
+#define _CONF_PARSER_H
+
+#include <stdbool.h>
+#include <libconfig.h>
+
+#define UE "UE"
+
+bool get_config_from_file(const char *filename, config_t *config);
+bool parse_config_file(const char *output_dir, const char *filename);
+
+#endif
diff --git a/openair3/NAS/TOOLS/conf_usim.c b/openair3/NAS/TOOLS/conf_usim.c
index 5418f01932209b8d9850fd0007af4b9ad908d0c4..50043632759cc9afda4b52cf30bb05f2484a32fc 100644
--- a/openair3/NAS/TOOLS/conf_usim.c
+++ b/openair3/NAS/TOOLS/conf_usim.c
@@ -5,7 +5,6 @@
 #include "utils.h"
 #include "conf_emm.h"
 #include "fs.h"
-#include "conf2uedata.h"
 #include "conf_usim.h"
 
 bool parse_ue_sim_param(config_setting_t *ue_setting, int user_id, usim_data_conf_t *u) {