diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c
index e8b16ca48074e0c3cc9052376dc0e39541b25491..a37ec44751e94af546a1510ac1e7266d65ae925a 100644
--- a/common/utils/LOG/log.c
+++ b/common/utils/LOG/log.c
@@ -78,40 +78,87 @@ volatile int log_mem_write_flag=0;
 volatile int log_mem_write_side=0;
 static char * log_mem_filename;
 
-const mapping log_level_names[] = {{"error", OAILOG_ERR},
+static mapping log_level_names[] = {{"error", OAILOG_ERR},
                                    {"warn", OAILOG_WARNING},
                                    {"analysis", OAILOG_ANALYSIS},
                                    {"info", OAILOG_INFO},
                                    {"debug", OAILOG_DEBUG},
                                    {"trace", OAILOG_TRACE},
                                    {NULL, -1}};
+mapping * log_level_names_ptr(void)
+{
+  return log_level_names;
+}
 
-const mapping log_options[] = {{"nocolor", FLAG_NOCOLOR},
-                               {"level", FLAG_LEVEL},
-                               {"thread", FLAG_THREAD},
-                               {"line_num", FLAG_FILE_LINE},
-                               {"function", FLAG_FUNCT},
-                               {"time", FLAG_TIME},
-                               {"thread_id", FLAG_THREAD_ID},
-                               {"wall_clock", FLAG_REAL_TIME},
-                               {NULL, -1}};
 
-const mapping log_maskmap[] = LOG_MASKMAP_INIT;
+/** @defgroup _log_format Defined log format
+ *  @ingroup _macro
+ *  @brief Macro of log formats defined by LOG
+ * @{*/
+static const unsigned int FLAG_NOCOLOR = 1; /*!< \brief use colors in log messages, depending on level */
+static const unsigned int FLAG_THREAD = 1 << 1; /*!< \brief display thread name in log messages */
+static const unsigned int FLAG_LEVEL = 1 << 2; /*!< \brief display log level in log messages */
+static const unsigned int FLAG_FUNCT = 1 << 3;
+static const unsigned int FLAG_FILE_LINE = 1 << 4;
+static const unsigned int FLAG_TIME = 1 << 5;
+static const unsigned int FLAG_THREAD_ID = 1 << 6;
+static const unsigned int FLAG_REAL_TIME = 1 << 7;
+static const unsigned int FLAG_INITIALIZED = 1 << 8;
+
+/** @}*/
+static mapping log_options[] = {{"nocolor", FLAG_NOCOLOR},
+                                      {"level", FLAG_LEVEL},
+                                      {"thread", FLAG_THREAD},
+                                      {"line_num", FLAG_FILE_LINE},
+                                      {"function", FLAG_FUNCT},
+                                      {"time", FLAG_TIME},
+                                      {"thread_id", FLAG_THREAD_ID},
+                                      {"wall_clock", FLAG_REAL_TIME},
+                                      {NULL, -1}};
+mapping * log_option_names_ptr(void)
+{
+  return log_options;
+}
+
+static mapping log_maskmap[] = {{"PRACH", DEBUG_PRACH},
+                               {"RU", DEBUG_RU},
+                               {"UE_PHYPROC", DEBUG_UE_PHYPROC},
+                               {"LTEESTIM", DEBUG_LTEESTIM},
+                               {"DLCELLSPEC", DEBUG_DLCELLSPEC},
+                               {"ULSCH", DEBUG_ULSCH},
+                               {"RRC", DEBUG_RRC},
+                               {"PDCP", DEBUG_PDCP},
+                               {"DFT", DEBUG_DFT},
+                               {"ASN1", DEBUG_ASN1},
+                               {"CTRLSOCKET", DEBUG_CTRLSOCKET},
+                               {"SECURITY", DEBUG_SECURITY},
+                               {"NAS", DEBUG_NAS},
+                               {"RLC", DEBUG_RLC},
+                               {"DLSCH_DECOD", DEBUG_DLSCH_DECOD},
+                               {"UE_TIMING", UE_TIMING},
+                               {NULL, -1}};
+mapping * log_maskmap_ptr(void)
+{
+  return log_maskmap;
+}
 
+/* .log_format = 0x13 uncolored standard messages
+ * .log_format = 0x93 colored standard messages */
+/* keep white space in first position; switching it to 0 allows colors to be disabled*/
+static const char *const LOG_RED = "\033[1;31m"; /*!< \brief VT100 sequence for bold red foreground */
+static const char *const LOG_GREEN = "\033[32m"; /*!< \brief VT100 sequence for green foreground */
+static const char *const LOG_ORANGE = "\033[93m"; /*!< \brief VT100 sequence for orange foreground */
+static const char *const LOG_BLUE = "\033[34m"; /*!< \brief VT100 sequence for blue foreground */
+static const char *const LOG_CYBL = "\033[40;36m"; /*!< \brief VT100 sequence for cyan foreground on black background */
+static const char *const LOG_RESET = "\033[0m"; /*!< \brief VT100 sequence for reset (black) foreground */
 static const char *const log_level_highlight_start[] =
     {LOG_RED, LOG_ORANGE, LOG_GREEN, "", LOG_BLUE, LOG_CYBL}; /*!< \brief Optional start-format strings for highlighting */
+
 static const char *const log_level_highlight_end[] =
     {LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */
 static void log_output_memory(log_component_t *c, const char *file, const char *func, int line, int comp, int level, const char* format,va_list args);
 
-
-int write_file_matlab(const char *fname,
-		              const char *vname,
-					  void *data,
-					  int length,
-					  int dec,
-					  unsigned int format,
-            int multiVec)
+int write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, unsigned int format, int multiVec)
 {
   FILE *fp=NULL;
   int i;
@@ -281,15 +328,15 @@ int write_file_matlab(const char *fname,
 }
 
 /* get log parameters from configuration file */
-void  log_getconfig(log_t *g_log)
+void log_getconfig(log_t *g_log)
 {
   char *gloglevel = NULL;
   int consolelog = 0;
   paramdef_t logparams_defaults[] = LOG_GLOBALPARAMS_DESC;
   paramdef_t logparams_level[MAX_LOG_PREDEF_COMPONENTS];
   paramdef_t logparams_logfile[MAX_LOG_PREDEF_COMPONENTS];
-  paramdef_t logparams_debug[sizeof(log_maskmap)/sizeof(mapping)];
-  paramdef_t logparams_dump[sizeof(log_maskmap)/sizeof(mapping)];
+  paramdef_t logparams_debug[sizeofArray(log_maskmap)];
+  paramdef_t logparams_dump[sizeofArray(log_maskmap)];
   int ret = config_get(config_get_if(), logparams_defaults, sizeofArray(logparams_defaults), CONFIG_STRING_LOG_PREFIX);
 
   if (ret <0) {
@@ -311,10 +358,10 @@ void  log_getconfig(log_t *g_log)
   }
 
   /* build the parameter array for setting per component log level and infile options */
-  memset(logparams_level,    0, sizeof(paramdef_t)*MAX_LOG_PREDEF_COMPONENTS);
-  memset(logparams_logfile,  0, sizeof(paramdef_t)*MAX_LOG_PREDEF_COMPONENTS);
+  memset(logparams_level, 0, sizeof(logparams_level));
+  memset(logparams_logfile, 0, sizeof(logparams_logfile));
 
-  for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_PREDEF_COMPONENTS; i++) {
+  for (int i = 0; i < MAX_LOG_PREDEF_COMPONENTS; i++) {
     if(g_log->log_component[i].name == NULL) {
       g_log->log_component[i].name = malloc(17);
       sprintf((char *)g_log->log_component[i].name,"comp%i?",i);
@@ -348,11 +395,11 @@ void  log_getconfig(log_t *g_log)
   config_get(config_get_if(), logparams_logfile, MAX_LOG_PREDEF_COMPONENTS, CONFIG_STRING_LOG_PREFIX);
 
   /* now set the log levels and infile option, according to what we read */
-  for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_PREDEF_COMPONENTS; i++) {
-    g_log->log_component[i].level = map_str_to_int(log_level_names,    *(logparams_level[i].strptr));
+  for (int i = 0; i < MAX_LOG_PREDEF_COMPONENTS; i++) {
+    g_log->log_component[i].level = map_str_to_int(log_level_names, *logparams_level[i].strptr);
     set_log(i, g_log->log_component[i].level);
 
-    if (*(logparams_logfile[i].uptr) == 1)
+    if (*logparams_logfile[i].uptr == 1)
       set_component_filelog(i);
   }
 
@@ -393,16 +440,10 @@ void  log_getconfig(log_t *g_log)
   set_glog_onlinelog(consolelog);
 }
 
-int register_log_component(char *name,
-                           char *fext,
-                           int compidx)
+int register_log_component(const char *name, const char *fext, int compidx)
 {
   int computed_compidx=compidx;
 
-  if (strlen(fext) > 3) {
-    fext[3]=0;  /* limit log file extension to 3 chars */
-  }
-
   if (compidx < 0) { /* this is not a pre-defined component */
     for (int i = MAX_LOG_PREDEF_COMPONENTS; i< MAX_LOG_COMPONENTS; i++) {
       if (g_log->log_component[i].name == NULL) {
@@ -416,8 +457,9 @@ int register_log_component(char *name,
     g_log->log_component[computed_compidx].name = strdup(name);
     g_log->log_component[computed_compidx].stream = stdout;
     g_log->log_component[computed_compidx].filelog = 0;
-    g_log->log_rarely_used[computed_compidx].filelog_name = malloc(strlen(name) + 16); /* /tmp/<name>.%s  */
-    sprintf(g_log->log_rarely_used[computed_compidx].filelog_name, "/tmp/%s.%s", name, fext);
+    g_log->log_rarely_used[computed_compidx].filelog_name = calloc(1, strlen(name) + 16); /* /tmp/<name>.%s  */
+    sprintf(g_log->log_rarely_used[computed_compidx].filelog_name, "/tmp/%s.", name);
+    strncat(g_log->log_rarely_used[computed_compidx].filelog_name, fext, 3);
   } else {
     fprintf(stderr,"{LOG} %s %d Couldn't register component %s\n",__FILE__,__LINE__,name);
   }
@@ -450,7 +492,6 @@ int isLogInitDone (void)
 
 int logInit (void)
 {
-  int i;
   g_log = calloc(1, sizeof(log_t));
 
   if (g_log == NULL) {
@@ -458,69 +499,17 @@ int logInit (void)
     exit(EXIT_FAILURE);
   }
 
-  memset(g_log,0,sizeof(log_t));
-  register_log_component("PHY","log",PHY);
-  register_log_component("MAC","log",MAC);
-  register_log_component("OPT","log",OPT);
-  register_log_component("RLC","log",RLC);
-  register_log_component("PDCP","log",PDCP);
-  register_log_component("RRC","log",RRC);
-  register_log_component("OMG","csv",OMG);
-  register_log_component("OTG","log",OTG);
-  register_log_component("OTG_LATENCY","dat",OTG_LATENCY);
-  register_log_component("OTG_LATENCY_BG","dat",OTG_LATENCY_BG);
-  register_log_component("OTG_GP","dat",OTG_GP);
-  register_log_component("OTG_GP_BG","dat",OTG_GP_BG);
-  register_log_component("OTG_JITTER","dat",OTG_JITTER);
-  register_log_component("PERF","",PERF);
-  register_log_component("OIP","",OIP);
-  register_log_component("OCM","log",OCM);
-  register_log_component("HW","",HW);
-  register_log_component("OSA","",OSA);
-  register_log_component("eRAL","",RAL_ENB);
-  register_log_component("mRAL","",RAL_UE);
-  register_log_component("ENB_APP","log",ENB_APP);
-  register_log_component("MCE_APP","log",MCE_APP);
-  register_log_component("MME_APP","log",MME_APP);
-  register_log_component("TMR","",TMR);
-  register_log_component("EMU","log",EMU);
-  register_log_component("USIM","txt",USIM);
-  register_log_component("SIM","txt",SIM);
-  /* following log component are used for the localization*/
-  register_log_component("LOCALIZE","log",LOCALIZE);
-  register_log_component("NAS","log",NAS);
-  register_log_component("UDP","",UDP_);
-  register_log_component("GTPU","",GTPU);
-  register_log_component("SDAP","",SDAP);
-  register_log_component("S1AP","",S1AP);
-  register_log_component("F1AP","",F1AP);
-  register_log_component("E1AP","",E1AP);
-  register_log_component("M2AP","",M2AP);
-  register_log_component("M3AP","",M3AP);
-  register_log_component("SCTP","",SCTP);
-  register_log_component("X2AP","",X2AP);
-  register_log_component("LOADER","log",LOADER);
-  register_log_component("ASN1","log",ASN1);
-  register_log_component("NFAPI_VNF","log",NFAPI_VNF);
-  register_log_component("NFAPI_PNF","log",NFAPI_PNF);
-  register_log_component("GNB_APP","log",GNB_APP);
-  register_log_component("NR_RRC","log",NR_RRC);
-  register_log_component("NR_MAC","log",NR_MAC);
-  register_log_component("NR_MAC_DCI", "log", NR_MAC_DCI);
-  register_log_component("NR_PHY_DCI", "log", NR_PHY_DCI);
-  register_log_component("NR_PHY","log",NR_PHY);
-  register_log_component("NGAP","",NGAP);
-  register_log_component("ITTI","log",ITTI);
-  register_log_component("UTIL","log",UTIL);
+  for (int i = 0; i < MAX_LOG_PREDEF_COMPONENTS; i++)
+    register_log_component(comp_name[i], comp_extension[i], i);
 
   for (int i=0 ; log_level_names[i].name != NULL ; i++)
-    g_log->level2string[i]           = toupper(log_level_names[i].name[0]); // uppercased first letter of level name
-
+    g_log->level2string[i] = toupper(log_level_names[i].name[0]); // uppercased first letter of level name
+  
   g_log->filelog_name = "/tmp/openair.log";
   log_getconfig(g_log);
 
   // set all unused component items to 0, they are for non predefined components
-  for (i=MAX_LOG_PREDEF_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
+  for (int i=MAX_LOG_PREDEF_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
     memset(&(g_log->log_component[i]),0,sizeof(log_component_t));
   }
 
@@ -547,7 +536,7 @@ static inline int log_header(log_component_t *c,
 			     int line,
 			     int level)
 {
-  int flag = g_log->flag; // | c->flag;
+  int flag = g_log->flag;
 
   char threadname[64];
   if (flag & FLAG_THREAD ) {
@@ -637,7 +626,7 @@ void log_dump(int component,
   va_list args;
   char *wbuf;
   log_component_t *c = &g_log->log_component[component];
-  int flag = g_log->flag; // | c->flag;
+  int flag = g_log->flag;
 
   switch(datatype) {
     case LOG_DUMP_DOUBLE:
@@ -681,8 +670,7 @@ int set_log(int component,
 		    int level)
 {
   /* Checking parameters */
-  DevCheck((component >= MIN_LOG_COMPONENTS) && (component < MAX_LOG_COMPONENTS),
-           component, MIN_LOG_COMPONENTS, MAX_LOG_COMPONENTS);
+  DevCheck((component >= 0) && (component < MAX_LOG_COMPONENTS), component, 0, MAX_LOG_COMPONENTS);
   DevCheck((level < NUM_LOG_LEVEL) && (level >= OAILOG_DISABLE), level, NUM_LOG_LEVEL,
            OAILOG_ERR);
 
@@ -693,8 +681,6 @@ int set_log(int component,
   return 0;
 }
 
-
-
 void set_glog(int level)
 {
   for (int c=0; c< MAX_LOG_COMPONENTS; c++ ) {
@@ -715,6 +701,7 @@ void set_glog_onlinelog(int enable)
     }
   }
 }
+
 void set_glog_filelog(int enable)
 {
   static FILE *fptr;
@@ -750,6 +737,7 @@ void set_component_filelog(int comp)
   g_log->log_component[comp].print = fprintf;
   g_log->log_component[comp].filelog =  1;
 }
+
 void close_component_filelog(int comp)
 {
   g_log->log_component[comp].filelog =  0;
@@ -786,40 +774,19 @@ int map_str_to_int(const mapping *map, const char *str)
 /* map an int to a string. Takes a mapping array and a value */
 char *map_int_to_str(const mapping *map, const int val)
 {
-  while (1) {
-    if (map->name == NULL) {
-      return NULL;
-    }
-
+  while (map->name) {
     if (map->value == val) {
       return map->name;
     }
-
     map++;
   }
-}
-
-int is_newline(char *str,
-		       int size)
-{
-  int i;
-
-  for (  i = 0; i < size; i++ ) {
-    if ( str[i] == '\n' ) {
-      return 1;
-    }
-  }
-
-  /* if we get all the way to here, there must not have been a newline! */
-  return 0;
+  return NULL;
 }
 
 void logClean (void)
 {
-  int i;
-
   if(isLogInitDone()) {
-    for (i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
+    for (int i = 0; i < MAX_LOG_COMPONENTS; i++) {
       close_component_filelog(i);
     }
   }
@@ -894,7 +861,7 @@ static void log_output_memory(log_component_t *c, const char *file, const char *
       len = MAX_LOG_TOTAL;
     }
   }
-  if (!((g_log->flag /*| c->flag*/) & FLAG_NOCOLOR)) {
+  if (!((g_log->flag) & FLAG_NOCOLOR)) {
     int n = snprintf(log_buffer+len, MAX_LOG_TOTAL-len, "%s", log_level_highlight_end[level]);
     if (n > 0) {
       len += n;
@@ -948,12 +915,12 @@ int logInit_log_mem (char * filename)
 {
   log_mem_flag = 1;
   log_mem_filename = filename; // in present code, the parameter is safe permanent pointer
-  log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
-  log_mem_d[0].buf_index = 0;
-  log_mem_d[0].enable_flag = 1;
-  log_mem_d[1].buf_p = malloc(LOG_MEM_SIZE);
-  log_mem_d[1].buf_index = 0;
-  log_mem_d[1].enable_flag = 1;
+  for (log_mem_cnt_t *ptr = log_mem_d; ptr < log_mem_d + sizeofArray(log_mem_d); ptr++)
+    *ptr = (log_mem_cnt_t){
+        .buf_p = malloc(LOG_MEM_SIZE),
+        .buf_index = 0,
+        .enable_flag = 1,
+    };
   log_mem_side = 0;
   if ((pthread_mutex_init(&log_mem_lock, NULL) != 0) || (pthread_cond_init(&log_mem_notify, NULL) != 0)) {
     log_mem_d[1].enable_flag=0;
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index a7aec508259a40e259c4102bc03b4f32b5332638..249dab5580e653e1de3580bbe9f7e6c58894c331 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -85,31 +85,6 @@ extern "C" {
 #define NUM_LOG_LEVEL 6 /*!< \brief the number of message levels users have with LOG (OAILOG_DISABLE is not available to user as a level, so it is not included)*/
 /** @}*/
 
-/** @defgroup _log_format Defined log format
- *  @ingroup _macro
- *  @brief Macro of log formats defined by LOG
- * @{*/
-
-/* .log_format = 0x13 uncolored standard messages
- * .log_format = 0x93 colored standard messages */
-/* keep white space in first position; switching it to 0 allows colors to be disabled*/
-#define LOG_RED "\033[1;31m"  /*!< \brief VT100 sequence for bold red foreground */
-#define LOG_GREEN "\033[32m"  /*!< \brief VT100 sequence for green foreground */
-#define LOG_ORANGE "\033[93m"   /*!< \brief VT100 sequence for orange foreground */
-#define LOG_BLUE "\033[34m" /*!< \brief VT100 sequence for blue foreground */
-#define LOG_CYBL "\033[40;36m"  /*!< \brief VT100 sequence for cyan foreground on black background */
-#define LOG_RESET "\033[0m" /*!< \brief VT100 sequence for reset (black) foreground */
-#define FLAG_NOCOLOR     0x0001  /*!< \brief use colors in log messages, depending on level */
-#define FLAG_THREAD      0x0008  /*!< \brief display thread name in log messages */
-#define FLAG_LEVEL       0x0010  /*!< \brief display log level in log messages */
-#define FLAG_FUNCT       0x0020
-#define FLAG_FILE_LINE   0x0040
-#define FLAG_TIME        0x0100
-#define FLAG_THREAD_ID   0x0200
-#define FLAG_REAL_TIME   0x0400
-#define FLAG_INITIALIZED 0x8000
-/** @}*/
-
 #define SET_LOG_OPTION(O)   g_log->flag = (g_log->flag | O)
 #define CLEAR_LOG_OPTION(O) g_log->flag = (g_log->flag & (~O))
 
@@ -138,92 +113,73 @@ extern "C" {
 #define DEBUG_DLSCH_DECOD  (1<<14)
 #define UE_TIMING          (1<<20)
 
-
-#define LOG_MASKMAP_INIT {\
-    {"PRACH",       DEBUG_PRACH},\
-    {"RU",          DEBUG_RU},\
-    {"UE_PHYPROC",  DEBUG_UE_PHYPROC},\
-    {"LTEESTIM",    DEBUG_LTEESTIM},\
-    {"DLCELLSPEC",  DEBUG_DLCELLSPEC},\
-    {"ULSCH",       DEBUG_ULSCH},\
-    {"RRC",         DEBUG_RRC},\
-    {"PDCP",        DEBUG_PDCP},\
-    {"DFT",         DEBUG_DFT},\
-    {"ASN1",        DEBUG_ASN1},\
-    {"CTRLSOCKET",  DEBUG_CTRLSOCKET},\
-    {"SECURITY",    DEBUG_SECURITY},\
-    {"NAS",         DEBUG_NAS},\
-    {"RLC",         DEBUG_RLC},\
-    {"DLSCH_DECOD", DEBUG_DLSCH_DECOD},\
-    {"UE_TIMING",   UE_TIMING},\
-    {NULL,-1}\
-  }
-
 #define SET_LOG_DEBUG(B)   g_log->debug_mask = (g_log->debug_mask | B)
 #define CLEAR_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask & (~B))
 
 #define SET_LOG_DUMP(B)   g_log->dump_mask = (g_log->dump_mask | B)
 #define CLEAR_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask & (~B))
 
-typedef enum {
-  MIN_LOG_COMPONENTS = 0,
-  PHY = MIN_LOG_COMPONENTS,
-  MAC,
-  EMU,
-  SIM,
-  OMG,
-  OPT,
-  OTG,
-  OTG_LATENCY,
-  OTG_LATENCY_BG,
-  OTG_GP,
-  OTG_GP_BG,
-  OTG_JITTER,
-  RLC,
-  PDCP,
-  RRC,
-  NAS,
-  PERF,
-  OIP,
-  CLI,
-  OCM,
-  UDP_,
-  GTPU,
-  SDAP,
-  SPGW,
-  S1AP,
-  F1AP,
-  E1AP,
-  SCTP,
-  HW,
-  OSA,
-  RAL_ENB,
-  RAL_UE,
-  ENB_APP,
-  MCE_APP,
-  MME_APP,
-  TMR,
-  USIM,
-  LOCALIZE,
-  F1U,
-  X2AP,
-  M2AP,
-  M3AP,
-  NGAP,
-  GNB_APP,
-  NR_RRC,
-  NR_MAC,
-  NR_MAC_DCI,
-  NR_PHY_DCI,
-  NR_PHY,
-  LOADER,
-  ASN1,
-  NFAPI_VNF,
-  NFAPI_PNF,
-  ITTI,
-  UTIL,
-  MAX_LOG_PREDEF_COMPONENTS,
-} comp_name_t;
+#define FOREACH_COMP(COMP_DEF)  \
+  COMP_DEF(PHY, log)            \
+  COMP_DEF(MAC, log)            \
+  COMP_DEF(EMU, log)            \
+  COMP_DEF(SIM, txt)            \
+  COMP_DEF(OMG, csv)            \
+  COMP_DEF(OPT, log)            \
+  COMP_DEF(OTG, log)            \
+  COMP_DEF(OTG_LATENCY, dat)    \
+  COMP_DEF(OTG_LATENCY_BG, dat) \
+  COMP_DEF(OTG_GP, dat)         \
+  COMP_DEF(OTG_GP_BG, dat)      \
+  COMP_DEF(OTG_JITTER, dat)     \
+  COMP_DEF(RLC, )               \
+  COMP_DEF(PDCP, )              \
+  COMP_DEF(RRC, )               \
+  COMP_DEF(NAS, log)            \
+  COMP_DEF(OIP, )               \
+  COMP_DEF(CLI, )               \
+  COMP_DEF(OCM, )               \
+  COMP_DEF(GTPU, )              \
+  COMP_DEF(SDAP, )              \
+  COMP_DEF(SPGW, )              \
+  COMP_DEF(S1AP, )              \
+  COMP_DEF(F1AP, )              \
+  COMP_DEF(E1AP, )              \
+  COMP_DEF(SCTP, )              \
+  COMP_DEF(HW, )                \
+  COMP_DEF(OSA, )               \
+  COMP_DEF(ENB_APP, log)        \
+  COMP_DEF(MCE_APP, log)        \
+  COMP_DEF(MME_APP, log)        \
+  COMP_DEF(TMR, )               \
+  COMP_DEF(USIM, log)           \
+  COMP_DEF(F1U, )               \
+  COMP_DEF(X2AP, )              \
+  COMP_DEF(M2AP, )              \
+  COMP_DEF(M3AP, )              \
+  COMP_DEF(NGAP, )              \
+  COMP_DEF(GNB_APP, log)        \
+  COMP_DEF(NR_RRC, log)         \
+  COMP_DEF(NR_MAC, log)         \
+  COMP_DEF(NR_MAC_DCI, log)         \
+  COMP_DEF(NR_PHY_DCI, log)         \
+  COMP_DEF(NR_PHY, log)         \
+  COMP_DEF(LOADER, log)         \
+  COMP_DEF(ASN1, log)           \
+  COMP_DEF(NFAPI_VNF, log)      \
+  COMP_DEF(NFAPI_PNF, log)      \
+  COMP_DEF(ITTI, log)           \
+  COMP_DEF(UTIL, log)           \
+  COMP_DEF(MAX_LOG_PREDEF_COMPONENTS, )
+
+#define COMP_ENUM(comp, file_extension) comp,
+typedef enum { FOREACH_COMP(COMP_ENUM) } comp_name_t;
+
+#define COMP_TEXT(comp, file_extension) #comp,
+static const char *const comp_name[] = {FOREACH_COMP(COMP_TEXT)};
+
+#define COMP_EXTENSION(comp, file_extension) #file_extension,
+static const char *const comp_extension[] = {FOREACH_COMP(COMP_EXTENSION)};
 
 #define MAX_LOG_DYNALLOC_COMPONENTS 20
 #define MAX_LOG_COMPONENTS (MAX_LOG_PREDEF_COMPONENTS + MAX_LOG_DYNALLOC_COMPONENTS)
@@ -242,7 +198,7 @@ typedef struct {
 
 typedef struct  {
   const char        *name;
-  int               level;
+  int level;
   int filelog;
   FILE              *stream;
   log_vprint_func_t vprint;
@@ -282,6 +238,9 @@ void log_dump(int component, void *buffer, int buffsize,int datatype, const char
 int  set_log(int component, int level);
 void set_glog(int level);
 
+mapping * log_level_names_ptr(void);
+mapping * log_option_names_ptr(void);
+mapping * log_maskmap_ptr(void);
 void set_glog_onlinelog(int enable);
 void set_glog_filelog(int enable);
 void set_component_filelog(int comp);
@@ -290,9 +249,8 @@ void set_component_consolelog(int comp);
 int map_str_to_int(const mapping *map, const char *str);
 char *map_int_to_str(const mapping *map, const int val);
 void logClean (void);
-int  is_newline( char *str, int size);
 
-int register_log_component(char *name, char *fext, int compidx);
+int register_log_component(const char *name, const char *fext, int compidx);
 
 int logInit_log_mem(char*);
 void close_log_mem(void);
diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.c b/common/utils/telnetsrv/telnetsrv_proccmd.c
index bf2a9a4e8cc01e295043adb7cc254f16cf0bdeaa..4255b209560a0ba5752ebc46bc3916dbb59c7ca6 100644
--- a/common/utils/telnetsrv/telnetsrv_proccmd.c
+++ b/common/utils/telnetsrv/telnetsrv_proccmd.c
@@ -256,6 +256,9 @@ void print_threads(char *buf, int debug, telnet_printfunc_t prnt)
 int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfunc_t prnt)
 {
   webdatadef_t *logsdata = (webdatadef_t *)data;
+  const mapping *const log_level_names = log_level_names_ptr();
+  const mapping *const log_options = log_option_names_ptr();
+  const mapping *log_maskmap = log_maskmap_ptr();
   if (strncmp(cmdbuff, "set", 3) == 0) {
     telnet_printfunc_t printfunc = (prnt != NULL) ? prnt : (telnet_printfunc_t)printf;
     if (strcasestr(cmdbuff, "loglvl") != NULL) {
@@ -274,7 +277,7 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
                 logsdata->lines[0].val[0],
                 logsdata->lines[0].val[1],
                 enabled ? "enabled" : "disabled",
-                loginfile ? g_log->log_component[logsdata->numlines].filelog_name : "stdout");
+                loginfile ? g_log->log_rarely_used[logsdata->numlines].filelog_name : "stdout");
     }
     if (strcasestr(cmdbuff, "logopt") != NULL) {
       int optbit = map_str_to_int(log_options, logsdata->lines[0].val[0]);
@@ -329,12 +332,14 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
       snprintf(logsdata->columns[3].coltitle, TELNET_CMD_MAXSIZE, "in file");
       logsdata->columns[3].coltype = TELNET_CHECKVAL_BOOL;
 
-      for (int i = MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
+      for (int i = 0; i < MAX_LOG_COMPONENTS; i++) {
         if (g_log->log_component[i].name != NULL) {
           logsdata->numlines++;
           logsdata->lines[i].val[0] = (char *)(g_log->log_component[i].name);
 
-          logsdata->lines[i].val[1] = map_int_to_str(log_level_names, (g_log->log_component[i].level >= 0) ? g_log->log_component[i].level : g_log->log_component[i].savedlevel);
+          logsdata->lines[i].val[1] = map_int_to_str(
+              log_level_names,
+              (g_log->log_component[i].level >= 0) ? g_log->log_component[i].level : g_log->log_rarely_used[i].savedlevel);
           logsdata->lines[i].val[2] = (g_log->log_component[i].level >= 0) ? "true" : "false";
           logsdata->lines[i].val[3] = (g_log->log_component[i].filelog > 0) ? "true" : "false";
         }
@@ -353,7 +358,7 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
 
       for (int i = 0; log_maskmap[i].name != NULL; i++) {
         logsdata->numlines++;
-        logsdata->lines[i].val[0] = log_maskmap[i].name;
+        logsdata->lines[i].val[0] = (char *)log_maskmap[i].name;
         logsdata->lines[i].val[1] = (g_log->debug_mask & log_maskmap[i].value) ? "true" : "false";
         logsdata->lines[i].val[2] = (g_log->dump_mask & log_maskmap[i].value) ? "true" : "false";
       }
@@ -370,7 +375,7 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
 
       for (int i = 0; log_options[i].name != NULL; i++) {
         logsdata->numlines++;
-        logsdata->lines[i].val[0] = log_options[i].name;
+        logsdata->lines[i].val[0] = (char *)log_options[i].name;
         logsdata->lines[i].val[1] = (g_log->flag & log_options[i].value) ? "true" : "false";
       }
     }
@@ -395,17 +400,23 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
    }
    if (strcasestr(buf,"loglvl") != NULL) {
        prnt("\n               component level  enabled   output\n");
-       for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
-            if (g_log->log_component[i].name != NULL) {
-               prnt("%02i %17.17s:%10.10s    %s      %s\n",i ,g_log->log_component[i].name, 
-	             map_int_to_str(log_level_names,(g_log->log_component[i].level>=0)?g_log->log_component[i].level:g_log->log_component[i].savedlevel),
-                     ((g_log->log_component[i].level>=0)?"Y":"N"),
-                     ((g_log->log_component[i].filelog>0)?g_log->log_component[i].filelog_name:"stdout"));
-           }
+       const mapping *const log_level_names = log_level_names_ptr();
+       for (int i = 0; i < MAX_LOG_COMPONENTS; i++) {
+         if (g_log->log_component[i].name != NULL) {
+           prnt("%02i %17.17s:%10.10s    %s      %s\n",
+                i,
+                g_log->log_component[i].name,
+                map_int_to_str(
+                    log_level_names,
+                    (g_log->log_component[i].level >= 0) ? g_log->log_component[i].level : g_log->log_rarely_used[i].savedlevel),
+                ((g_log->log_component[i].level >= 0) ? "Y" : "N"),
+                ((g_log->log_component[i].filelog > 0) ? g_log->log_rarely_used[i].filelog_name : "stdout"));
+         }
        }
    }
    if (strcasestr(buf,"logopt") != NULL) {
        prnt("\n               option      enabled\n");
+       const mapping *const log_options = log_option_names_ptr();
        for (int i=0; log_options[i].name != NULL; i++) {
                prnt("%02i %17.17s %10.10s \n",i ,log_options[i].name, 
                      ((g_log->flag & log_options[i].value)?"Y":"N") );
@@ -413,6 +424,7 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
    }
    if (strcasestr(buf,"dbgopt") != NULL) {
        prnt("\n               module  debug dumpfile\n");
+       const mapping *log_maskmap = log_maskmap_ptr();
        for (int i=0; log_maskmap[i].name != NULL ; i++) {
                prnt("%02i %17.17s %5.5s   %5.5s\n",i ,log_maskmap[i].name, 
 	             ((g_log->debug_mask &  log_maskmap[i].value)?"Y":"N"),
@@ -528,7 +540,9 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
    
    if (debug > 0)
        prnt( "proccmd_log received %s\n   s=%i sub command %s\n",buf,s,((logsubcmd==NULL)?"":logsubcmd));
-
+   const mapping *const log_level_names = log_level_names_ptr();
+   const mapping *const log_options = log_option_names_ptr();
+   const mapping *log_maskmap = log_maskmap_ptr();
    if (s == 1 && logsubcmd != NULL) {
       if (strcasestr(logsubcmd,"online") != NULL) {
           if (strcasestr(buf,"noonline") != NULL) {
@@ -540,21 +554,21 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
           }
       }
       else if (strcasestr(logsubcmd,"show") != NULL) {
-          prnt("Available log levels: \n   ");
-          for (int i=0; log_level_names[i].name != NULL; i++)
-             prnt("%s ",log_level_names[i].name);
-          prnt("\n\n");
-          prnt("Available display options: \n   ");
-          for (int i=0; log_options[i].name != NULL; i++)
-             prnt("%s ",log_options[i].name);
-          prnt("\n\n");
-          prnt("Available debug and dump options: \n   ");
-          for (int i=0; log_maskmap[i].name != NULL; i++)
-             prnt("%s ",log_maskmap[i].name);
-          prnt("\n\n");
-   	  proccmd_show("loglvl",debug,prnt);
-   	  proccmd_show("logopt",debug,prnt);
-   	  proccmd_show("dbgopt",debug,prnt);
+        prnt("Available log levels: \n   ");
+        for (int i = 0; log_level_names[i].name != NULL; i++)
+          prnt("%s ", log_level_names[i].name);
+        prnt("\n\n");
+        prnt("Available display options: \n   ");
+        for (int i = 0; log_options[i].name != NULL; i++)
+          prnt("%s ", log_options[i].name);
+        prnt("\n\n");
+        prnt("Available debug and dump options: \n   ");
+        for (int i = 0; log_maskmap[i].name != NULL; i++)
+          prnt("%s ", log_maskmap[i].name);
+        prnt("\n\n");
+        proccmd_show("loglvl", debug, prnt);
+        proccmd_show("logopt", debug, prnt);
+        proccmd_show("dbgopt", debug, prnt);
       }
       else if (strcasestr(logsubcmd,"help") != NULL) {
           prnt(PROCCMD_LOG_HELP_STRING);
@@ -569,40 +583,40 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
 
       l=sscanf(logsubcmd,"%m[^'_']_%ms",&logparam,&opt);
       if (l == 2 && strcmp(logparam,"print") == 0){
-         optbit=map_str_to_int(log_options,opt);
-         if (optbit < 0) {
-            prnt("option %s unknown\n",opt);
-         } else {
-            if (idx1 > 0)    
-                SET_LOG_OPTION(optbit);
-            else
-                CLEAR_LOG_OPTION(optbit);
-            proccmd_show("logopt",debug,prnt);
-         }
+        optbit = map_str_to_int(log_options, opt);
+        if (optbit < 0) {
+          prnt("option %s unknown\n", opt);
+        } else {
+          if (idx1 > 0)
+            SET_LOG_OPTION(optbit);
+          else
+            CLEAR_LOG_OPTION(optbit);
+          proccmd_show("logopt", debug, prnt);
+        }
       }
       else if (l == 2 && strcmp(logparam,"debug") == 0){
-         optbit=map_str_to_int(log_maskmap,opt);
-         if (optbit < 0) {
-            prnt("module %s unknown\n",opt);
-         } else {
-            if (idx1 > 0)    
-                SET_LOG_DEBUG(optbit);
-            else
-                CLEAR_LOG_DEBUG(optbit);
-            proccmd_show("dbgopt",debug,prnt);
-         }
+        optbit = map_str_to_int(log_maskmap, opt);
+        if (optbit < 0) {
+          prnt("module %s unknown\n", opt);
+        } else {
+          if (idx1 > 0)
+            SET_LOG_DEBUG(optbit);
+          else
+            CLEAR_LOG_DEBUG(optbit);
+          proccmd_show("dbgopt", debug, prnt);
+        }
       }  
        else if (l == 2 && strcmp(logparam,"dump") == 0){
-         optbit=map_str_to_int(log_maskmap,opt);
-         if (optbit < 0) {
-            prnt("module %s unknown\n",opt);
-         } else {
-            if (idx1 > 0)    
-                SET_LOG_DUMP(optbit);
-            else
-                CLEAR_LOG_DUMP(optbit);
-            proccmd_show("dump", debug, prnt);
-         }
+        optbit = map_str_to_int(log_maskmap, opt);
+        if (optbit < 0) {
+          prnt("module %s unknown\n", opt);
+        } else {
+          if (idx1 > 0)
+            SET_LOG_DUMP(optbit);
+          else
+            CLEAR_LOG_DUMP(optbit);
+          proccmd_show("dump", debug, prnt);
+        }
       }       
       if (logparam != NULL) free(logparam);
       if (opt != NULL)      free(opt); 
@@ -620,11 +634,11 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
           prnt("l=%i, %s %s\n",l,((logparam==NULL)?"\"\"":logparam), ((tmpstr==NULL)?"\"\"":tmpstr));
       if (l ==2 ) {
          if (strcmp(logparam,"level") == 0) {
-             level=map_str_to_int(log_level_names,tmpstr);
-             if (level < 0) {
-                 prnt("level %s unknown\n",tmpstr);
-                 level=OAILOG_DISABLE - 1;
-              }
+           level = map_str_to_int(log_level_names, tmpstr);
+           if (level < 0) {
+             prnt("level %s unknown\n", tmpstr);
+             level = OAILOG_DISABLE - 1;
+           }
          } else {
              prnt("%s%s unknown log sub command \n",logparam, tmpstr);
          }
@@ -650,7 +664,7 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
         if (level >= OAILOG_DISABLE)
            set_log(i, level);
         else if ( enable == 1)
-           set_log(i,g_log->log_component[i].savedlevel);
+          set_log(i, g_log->log_rarely_used[i].savedlevel);
         else if ( filelog == 1 ) {
            set_component_filelog(i);
         } else if ( filelog == 0 ) {
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c
index 69d355533a18508874188afc404f087b19ec2920..5aa5e33304aeb402e0102a47bf96fd52c078c259 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_sequence_manager.c
@@ -27,7 +27,7 @@
 */
 
 #include "pdcp_sequence_manager.h"
-#include "common/utils//LOG/log.h"
+#include "common/utils/LOG/log.h"
 #include "pdcp_util.h"
 
 /*